1#-- 2# sha2.rb - defines Digest::SHA2 class which wraps up the SHA256, 3# SHA384, and SHA512 classes. 4#++ 5# Copyright (c) 2006 Akinori MUSHA <knu@iDaemons.org> 6# 7# All rights reserved. You can redistribute and/or modify it under the same 8# terms as Ruby. 9# 10# $Id: sha2.rb 35293 2012-04-10 22:41:04Z drbrain $ 11 12require 'digest' 13require 'digest/sha2.so' 14 15module Digest 16 # 17 # A meta digest provider class for SHA256, SHA384 and SHA512. 18 # 19 class SHA2 < Digest::Class 20 # call-seq: 21 # Digest::SHA2.new(bitlen = 256) -> digest_obj 22 # 23 # Creates a new SHA2 hash object with a given bit length. 24 # 25 # Valid bit lengths are 256, 384 and 512. 26 def initialize(bitlen = 256) 27 case bitlen 28 when 256 29 @sha2 = Digest::SHA256.new 30 when 384 31 @sha2 = Digest::SHA384.new 32 when 512 33 @sha2 = Digest::SHA512.new 34 else 35 raise ArgumentError, "unsupported bit length: %s" % bitlen.inspect 36 end 37 @bitlen = bitlen 38 end 39 40 # call-seq: 41 # digest_obj.reset -> digest_obj 42 # 43 # Resets the digest to the initial state and returns self. 44 def reset 45 @sha2.reset 46 self 47 end 48 49 # call-seq: 50 # digest_obj.update(string) -> digest_obj 51 # digest_obj << string -> digest_obj 52 # 53 # Updates the digest using a given _string_ and returns self. 54 def update(str) 55 @sha2.update(str) 56 self 57 end 58 alias << update 59 60 def finish # :nodoc: 61 @sha2.digest! 62 end 63 private :finish 64 65 66 # call-seq: 67 # digest_obj.block_length -> Integer 68 # 69 # Returns the block length of the digest in bytes. 70 # 71 # Digest::SHA256.new.block_length * 8 72 # # => 512 73 # Digest::SHA384.new.block_length * 8 74 # # => 1024 75 # Digest::SHA512.new.block_length * 8 76 # # => 1024 77 def block_length 78 @sha2.block_length 79 end 80 81 # call-seq: 82 # digest_obj.digest_length -> Integer 83 # 84 # Returns the length of the hash value of the digest in bytes. 85 # 86 # Digest::SHA256.new.digest_length * 8 87 # # => 256 88 # Digest::SHA384.new.digest_length * 8 89 # # => 384 90 # Digest::SHA512.new.digest_length * 8 91 # # => 512 92 # 93 # For example, digests produced by Digest::SHA256 will always be 32 bytes 94 # (256 bits) in size. 95 def digest_length 96 @sha2.digest_length 97 end 98 99 def initialize_copy(other) # :nodoc: 100 @sha2 = other.instance_eval { @sha2.clone } 101 end 102 103 def inspect # :nodoc: 104 "#<%s:%d %s>" % [self.class.name, @bitlen, hexdigest] 105 end 106 end 107end 108