aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2019-10-31 16:23:48 +1300
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2019-11-01 09:42:10 +1300
commit27f1eab0c178bb74e2a961283fa9c6e49fa8d500 (patch)
tree34813621ec3be0dee3ebcefd38cca1a6a4404951
parent72bd9fe74e62db205865d19a9ddea2e1b89fcf37 (diff)
downloadruby-openssl-27f1eab0c178bb74e2a961283fa9c6e49fa8d500.tar.gz
Add support for SHA3. Resolves #272.
-rw-r--r--lib/openssl/digest.rb24
-rw-r--r--test/test_digest.rb33
2 files changed, 43 insertions, 14 deletions
diff --git a/lib/openssl/digest.rb b/lib/openssl/digest.rb
index b6744de6..d283c98b 100644
--- a/lib/openssl/digest.rb
+++ b/lib/openssl/digest.rb
@@ -15,11 +15,18 @@
module OpenSSL
class Digest
- alg = %w(MD2 MD4 MD5 MDC2 RIPEMD160 SHA1 SHA224 SHA256 SHA384 SHA512)
+ ALGORITHMS = %w(MD4 MD5 MDC2 RIPEMD160 SHA1 SHA224 SHA256 SHA384 SHA512)
+
if OPENSSL_VERSION_NUMBER < 0x10100000
- alg += %w(DSS DSS1 SHA)
+ ALGORITHMS.concat %w(DSS DSS1 SHA)
+ end
+
+ if !OPENSSL_VERSION.include?("LibreSSL") && OPENSSL_VERSION_NUMBER > 0x10101000
+ ALGORITHMS.concat %w(SHA3-224 SHA3-256 SHA3-384 SHA3-512)
end
+ ALGORITHMS.freeze
+
# Return the hash value computed with _name_ Digest. _name_ is either the
# long name or short name of a supported digest algorithm.
#
@@ -35,17 +42,20 @@ module OpenSSL
super(data, name)
end
- alg.each{|name|
+ ALGORITHMS.each do |name|
klass = Class.new(self) {
define_method(:initialize, ->(data = nil) {super(name, data)})
}
+
singleton = (class << klass; self; end)
+
singleton.class_eval{
- define_method(:digest){|data| new.digest(data) }
- define_method(:hexdigest){|data| new.hexdigest(data) }
+ define_method(:digest) {|data| new.digest(data)}
+ define_method(:hexdigest) {|data| new.hexdigest(data)}
}
- const_set(name, klass)
- }
+
+ const_set(name.tr('-', '_'), klass)
+ end
# Deprecated.
#
diff --git a/test/test_digest.rb b/test/test_digest.rb
index 2cb878b6..fed8991e 100644
--- a/test/test_digest.rb
+++ b/test/test_digest.rb
@@ -53,14 +53,21 @@ class OpenSSL::TestDigest < OpenSSL::TestCase
assert_equal(dig1, dig2, "reset")
end
- def test_digest_constants
- algs = %w(MD4 MD5 RIPEMD160 SHA1 SHA224 SHA256 SHA384 SHA512)
- if !libressl? && !openssl?(1, 1, 0)
- algs += %w(DSS1 SHA)
+ def test_required_digests
+ algorithms = OpenSSL::Digest::ALGORITHMS
+ required = %w{MD4 MD5 RIPEMD160 SHA1 SHA224 SHA256 SHA384 SHA512}
+
+ required.each do |name|
+ assert_include(algorithms, name)
end
- algs.each do |alg|
- assert_not_nil(OpenSSL::Digest.new(alg))
- klass = OpenSSL::Digest.const_get(alg)
+ end
+
+ def test_digest_constants
+ algorithms = OpenSSL::Digest::ALGORITHMS
+
+ algorithms.each do |name|
+ assert_not_nil(OpenSSL::Digest.new(name))
+ klass = OpenSSL::Digest.const_get(name)
assert_not_nil(klass.new)
end
end
@@ -91,6 +98,18 @@ class OpenSSL::TestDigest < OpenSSL::TestCase
assert_equal(sha512_a, encode16(OpenSSL::Digest::SHA512.digest("a")))
end
+ def test_sha3
+ pend "SHA3 is not implemented" unless OpenSSL::Digest.const_defined?(:SHA3_224)
+ s224 = '6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7'
+ s256 = 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a'
+ s384 = '0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004'
+ s512 = 'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26'
+ assert_equal(OpenSSL::Digest::SHA3_224.hexdigest(""), s224)
+ assert_equal(OpenSSL::Digest::SHA3_256.hexdigest(""), s256)
+ assert_equal(OpenSSL::Digest::SHA3_384.hexdigest(""), s384)
+ assert_equal(OpenSSL::Digest::SHA3_512.hexdigest(""), s512)
+ end
+
def test_digest_by_oid_and_name_sha2
check_digest(OpenSSL::ASN1::ObjectId.new("SHA224"))
check_digest(OpenSSL::ASN1::ObjectId.new("SHA256"))