From 13772caee21345f688a65ca1fdef27c34f055b80 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 14 Oct 2021 13:23:45 +0900 Subject: Move pure ruby files under the ext/gemname/lib directory. --- ext/digest/lib/digest/sha2.rb | 142 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 ext/digest/lib/digest/sha2.rb (limited to 'ext/digest/lib') diff --git a/ext/digest/lib/digest/sha2.rb b/ext/digest/lib/digest/sha2.rb new file mode 100644 index 0000000000..f17593a206 --- /dev/null +++ b/ext/digest/lib/digest/sha2.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: false +#-- +# sha2.rb - defines Digest::SHA2 class which wraps up the SHA256, +# SHA384, and SHA512 classes. +#++ +# Copyright (c) 2006 Akinori MUSHA +# +# All rights reserved. You can redistribute and/or modify it under the same +# terms as Ruby. +# +# $Id$ + +require 'digest' +require 'digest/sha2/loader' + +module Digest + # + # A meta digest provider class for SHA256, SHA384 and SHA512. + # + # FIPS 180-2 describes SHA2 family of digest algorithms. It defines + # three algorithms: + # * one which works on chunks of 512 bits and returns a 256-bit + # digest (SHA256), + # * one which works on chunks of 1024 bits and returns a 384-bit + # digest (SHA384), + # * and one which works on chunks of 1024 bits and returns a 512-bit + # digest (SHA512). + # + # ==Examples + # require 'digest' + # + # # Compute a complete digest + # Digest::SHA2.hexdigest 'abc' # => "ba7816bf8..." + # Digest::SHA2.new(256).hexdigest 'abc' # => "ba7816bf8..." + # Digest::SHA256.hexdigest 'abc' # => "ba7816bf8..." + # + # Digest::SHA2.new(384).hexdigest 'abc' # => "cb00753f4..." + # Digest::SHA384.hexdigest 'abc' # => "cb00753f4..." + # + # Digest::SHA2.new(512).hexdigest 'abc' # => "ddaf35a19..." + # Digest::SHA512.hexdigest 'abc' # => "ddaf35a19..." + # + # # Compute digest by chunks + # sha2 = Digest::SHA2.new # =># + # sha2.update "ab" + # sha2 << "c" # alias for #update + # sha2.hexdigest # => "ba7816bf8..." + # + # # Use the same object to compute another digest + # sha2.reset + # sha2 << "message" + # sha2.hexdigest # => "ab530a13e..." + # + class SHA2 < Digest::Class + # call-seq: + # Digest::SHA2.new(bitlen = 256) -> digest_obj + # + # Create a new SHA2 hash object with a given bit length. + # + # Valid bit lengths are 256, 384 and 512. + 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 + + # call-seq: + # digest_obj.reset -> digest_obj + # + # Reset the digest to the initial state and return self. + def reset + @sha2.reset + self + end + + # call-seq: + # digest_obj.update(string) -> digest_obj + # digest_obj << string -> digest_obj + # + # Update the digest using a given _string_ and return self. + def update(str) + @sha2.update(str) + self + end + alias << update + + def finish # :nodoc: + @sha2.digest! + end + private :finish + + + # call-seq: + # digest_obj.block_length -> Integer + # + # Return the block length of the digest in bytes. + # + # Digest::SHA256.new.block_length * 8 + # # => 512 + # Digest::SHA384.new.block_length * 8 + # # => 1024 + # Digest::SHA512.new.block_length * 8 + # # => 1024 + def block_length + @sha2.block_length + end + + # call-seq: + # digest_obj.digest_length -> Integer + # + # Return the length of the hash value (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. + def digest_length + @sha2.digest_length + end + + def initialize_copy(other) # :nodoc: + @sha2 = other.instance_eval { @sha2.clone } + end + + def inspect # :nodoc: + "#<%s:%d %s>" % [self.class.name, @bitlen, hexdigest] + end + end +end -- cgit v1.2.3