2006-10-20 08:48:35 -04:00
|
|
|
#--
|
|
|
|
# sha2.rb - defines Digest::SHA2 class which wraps up the SHA256,
|
|
|
|
# SHA384, and SHA512 classes.
|
|
|
|
#++
|
|
|
|
# Copyright (c) 2006 Akinori MUSHA <knu@iDaemons.org>
|
|
|
|
#
|
|
|
|
# All rights reserved. You can redistribute and/or modify it under the same
|
|
|
|
# terms as Ruby.
|
|
|
|
#
|
|
|
|
# $Id$
|
|
|
|
|
|
|
|
require 'digest'
|
2009-08-06 08:18:38 -04:00
|
|
|
require 'digest/sha2.so'
|
2006-10-20 08:48:35 -04:00
|
|
|
|
|
|
|
module Digest
|
|
|
|
#
|
|
|
|
# A meta digest provider class for SHA256, SHA384 and SHA512.
|
|
|
|
#
|
|
|
|
class SHA2 < Digest::Class
|
|
|
|
# call-seq:
|
2011-05-16 16:52:55 -04:00
|
|
|
# Digest::SHA2.new(bitlen = 256) -> digest_obj
|
2006-10-20 08:48:35 -04:00
|
|
|
#
|
|
|
|
# Creates a new SHA2 hash object with a given bit length.
|
2011-05-16 16:52:55 -04:00
|
|
|
#
|
|
|
|
# Valid bit lengths are 256, 384 and 512.
|
2006-10-20 08:48:35 -04:00
|
|
|
def initialize(bitlen = 256)
|
|
|
|
case bitlen
|
|
|
|
when 256
|
|
|
|
@sha2 = Digest::SHA256.new
|
|
|
|
when 384
|
|
|
|
@sha2 = Digest::SHA384.new
|
|
|
|
when 512
|
|
|
|
@sha2 = Digest::SHA512.new
|
|
|
|
else
|
|
|
|
raise ArgumentError, "unsupported bit length: %s" % bitlen.inspect
|
|
|
|
end
|
|
|
|
@bitlen = bitlen
|
|
|
|
end
|
|
|
|
|
2011-05-16 16:52:55 -04:00
|
|
|
# call-seq:
|
|
|
|
# digest_obj.reset -> digest_obj
|
|
|
|
#
|
|
|
|
# Resets the digest to the initial state and returns self.
|
2006-10-20 08:48:35 -04:00
|
|
|
def reset
|
|
|
|
@sha2.reset
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
2011-05-16 16:52:55 -04:00
|
|
|
# call-seq:
|
|
|
|
# digest_obj.update(string) -> digest_obj
|
|
|
|
# digest_obj << string -> digest_obj
|
|
|
|
#
|
|
|
|
# Updates the digest using a given _string_ and returns self.
|
2006-10-20 08:48:35 -04:00
|
|
|
def update(str)
|
|
|
|
@sha2.update(str)
|
|
|
|
self
|
|
|
|
end
|
|
|
|
alias << update
|
|
|
|
|
2011-05-16 16:52:55 -04:00
|
|
|
def finish # :nodoc:
|
2006-10-20 08:48:35 -04:00
|
|
|
@sha2.digest!
|
|
|
|
end
|
|
|
|
private :finish
|
|
|
|
|
2011-05-16 16:52:55 -04:00
|
|
|
|
|
|
|
# call-seq:
|
|
|
|
# digest_obj.block_length -> Integer
|
|
|
|
#
|
|
|
|
# Returns the block length of the digest in bytes.
|
|
|
|
#
|
|
|
|
# Digest::SHA256.new.digest_length * 8
|
|
|
|
# # => 512
|
|
|
|
# Digest::SHA384.new.digest_length * 8
|
|
|
|
# # => 1024
|
|
|
|
# Digest::SHA512.new.digest_length * 8
|
|
|
|
# # => 1024
|
2006-10-20 08:48:35 -04:00
|
|
|
def block_length
|
|
|
|
@sha2.block_length
|
|
|
|
end
|
|
|
|
|
2011-05-16 16:52:55 -04:00
|
|
|
# call-seq:
|
|
|
|
# digest_obj.digest_length -> Integer
|
|
|
|
#
|
|
|
|
# Returns the length of the hash value of the digest in bytes.
|
|
|
|
#
|
|
|
|
# Digest::SHA256.new.digest_length * 8
|
|
|
|
# # => 256
|
|
|
|
# Digest::SHA384.new.digest_length * 8
|
|
|
|
# # => 384
|
|
|
|
# Digest::SHA512.new.digest_length * 8
|
|
|
|
# # => 512
|
|
|
|
#
|
|
|
|
# For example, digests produced by Digest::SHA256 will always be 32 bytes
|
|
|
|
# (256 bits) in size.
|
2006-10-20 08:48:35 -04:00
|
|
|
def digest_length
|
|
|
|
@sha2.digest_length
|
|
|
|
end
|
|
|
|
|
2011-05-16 16:52:55 -04:00
|
|
|
def initialize_copy(other) # :nodoc:
|
2006-10-20 09:01:55 -04:00
|
|
|
@sha2 = other.instance_eval { @sha2.clone }
|
2006-10-20 08:48:35 -04:00
|
|
|
end
|
|
|
|
|
2011-05-16 16:52:55 -04:00
|
|
|
def inspect # :nodoc:
|
2006-10-20 08:48:35 -04:00
|
|
|
"#<%s:%d %s>" % [self.class.name, @bitlen, hexdigest]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|