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