Fix up Rubinius specific library specs.
[rbx.git] / lib / digest / sha2.rb
blob83a285fcefaed388336e20f6261cae643c35c151
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>
7 # All rights reserved.  You can redistribute and/or modify it under the same
8 # terms as Ruby.
10 #   $Id: sha2.rb 11708 2007-02-12 23:01:19Z shyouhei $
12 require 'digest'
13 require 'ext/digest/sha2/sha2'
15 Digest.create :SHA256, 'rbx_Digest_SHA256_Init', 'rbx_Digest_SHA256_Update',
16               'rbx_Digest_SHA256_Finish', (4 * 8 + 8 + 64), 64, 32
18 Digest.create :SHA384, 'rbx_Digest_SHA384_Init', 'rbx_Digest_SHA384_Update',
19               'rbx_Digest_SHA384_Finish', (8 * 8 + 8 * 2 + 128), 128, 48
21 Digest.create :SHA512, 'rbx_Digest_SHA512_Init', 'rbx_Digest_SHA512_Update',
22               'rbx_Digest_SHA512_Finish', (8 * 8 + 8 * 2 + 128), 128, 64
24 module Digest
25   #
26   # A meta digest provider class for SHA256, SHA384 and SHA512.
27   #
28   class SHA2
30     include Digest::Class
32     # call-seq:
33     #     Digest::SHA2.new(bitlen = 256) -> digest_obj
34     #
35     # Creates a new SHA2 hash object with a given bit length.
36     def initialize(bitlen = 256)
37       case bitlen
38       when 256
39         @sha2 = Digest::SHA256.new
40       when 384
41         @sha2 = Digest::SHA384.new
42       when 512
43         @sha2 = Digest::SHA512.new
44       else
45         raise ArgumentError, "unsupported bit length: %s" % bitlen.inspect
46       end
47       @bitlen = bitlen
48     end
50     # :nodoc:
51     def reset
52       @sha2.reset
53       self
54     end
56     # :nodoc:
57     def update(str)
58       @sha2.update(str)
59       self
60     end
61     alias << update
63     def finish
64       @sha2.digest!
65     end
66     private :finish
68     def block_length
69       @sha2.block_length
70     end
72     def digest_length
73       @sha2.digest_length
74     end
76     # :nodoc:
77     def initialize_copy(other)
78       @sha2 = other.instance_eval { @sha2.clone }
79     end
81     # :nodoc:
82     def inspect
83       "#<%s:%d %s>" % [self.class.name, @bitlen, hexdigest]
84     end
85   end
86 end