[前][次][番号順一覧][スレッド一覧]

ruby-changes:65514

From: Kazuki <ko1@a...>
Date: Tue, 16 Mar 2021 20:38:44 +0900 (JST)
Subject: [ruby-changes:65514] 13198d4968 (master): [ruby/openssl] hmac: implement base64digest methods

https://git.ruby-lang.org/ruby.git/commit/?id=13198d4968

From 13198d4968a6591ec423832c4bf00c56ffdb337a Mon Sep 17 00:00:00 2001
From: Kazuki Yamaguchi <k@r...>
Date: Mon, 29 Jun 2020 22:09:35 +0900
Subject: [ruby/openssl] hmac: implement base64digest methods

OpenSSL::HMAC implements the similar interface as ::Digest. Let's add
base64digest methods to OpenSSL::HMAC, too, for feature parity.

https://github.com/ruby/openssl/commit/098bcb68af
---
 ext/openssl/lib/openssl/hmac.rb | 25 +++++++++++++++++++++++++
 test/openssl/test_hmac.rb       |  4 ++++
 2 files changed, 29 insertions(+)

diff --git a/ext/openssl/lib/openssl/hmac.rb b/ext/openssl/lib/openssl/hmac.rb
index 9bc8bc8..c8c844d 100644
--- a/ext/openssl/lib/openssl/hmac.rb
+++ b/ext/openssl/lib/openssl/hmac.rb
@@ -10,6 +10,14 @@ module OpenSSL https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/hmac.rb#L10
       OpenSSL.fixed_length_secure_compare(self.digest, other.digest)
     end
 
+    # :call-seq:
+    #    hmac.base64digest -> string
+    #
+    # Returns the authentication code an a Base64-encoded string.
+    def base64digest
+      [digest].pack("m0")
+    end
+
     class << self
       # :call-seq:
       #    HMAC.digest(digest, key, data) -> aString
@@ -48,6 +56,23 @@ module OpenSSL https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/hmac.rb#L56
         hmac << data
         hmac.hexdigest
       end
+
+      # :call-seq:
+      #    HMAC.base64digest(digest, key, data) -> aString
+      #
+      # Returns the authentication code as a Base64-encoded string. The _digest_
+      # parameter specifies the digest algorithm to use. This may be a String
+      # representing the algorithm name or an instance of OpenSSL::Digest.
+      #
+      # === Example
+      #  key = 'key'
+      #  data = 'The quick brown fox jumps over the lazy dog'
+      #
+      #  hmac = OpenSSL::HMAC.base64digest('SHA1', key, data)
+      #  #=> "3nybhbi3iqa8ino29wqQcBydtNk="
+      def base64digest(digest, key, data)
+        [digest(digest, key, data)].pack("m0")
+      end
     end
   end
 end
diff --git a/test/openssl/test_hmac.rb b/test/openssl/test_hmac.rb
index 7202a59..2f53a81 100644
--- a/test/openssl/test_hmac.rb
+++ b/test/openssl/test_hmac.rb
@@ -10,12 +10,14 @@ class OpenSSL::TestHMAC < OpenSSL::TestCase https://github.com/ruby/ruby/blob/trunk/test/openssl/test_hmac.rb#L10
     hmac.update("Hi There")
     assert_equal ["9294727a3638bb1c13f48ef8158bfc9d"].pack("H*"), hmac.digest
     assert_equal "9294727a3638bb1c13f48ef8158bfc9d", hmac.hexdigest
+    assert_equal "kpRyejY4uxwT9I74FYv8nQ==", hmac.base64digest
 
     # RFC 4231 4.2. Test Case 1
     hmac = OpenSSL::HMAC.new(["0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"].pack("H*"), "SHA224")
     hmac.update("Hi There")
     assert_equal ["896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22"].pack("H*"), hmac.digest
     assert_equal "896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22", hmac.hexdigest
+    assert_equal "iW+xEoq73xloMhB81J3zP0e0sRaZErpPU2hLIg==", hmac.base64digest
   end
 
   def test_dup
@@ -57,6 +59,8 @@ class OpenSSL::TestHMAC < OpenSSL::TestCase https://github.com/ruby/ruby/blob/trunk/test/openssl/test_hmac.rb#L59
     assert_equal ["9294727a3638bb1c13f48ef8158bfc9d"].pack("H*"), digest
     hexdigest = OpenSSL::HMAC.hexdigest("MD5", key, "Hi There")
     assert_equal "9294727a3638bb1c13f48ef8158bfc9d", hexdigest
+    b64digest = OpenSSL::HMAC.base64digest("MD5", key, "Hi There")
+    assert_equal "kpRyejY4uxwT9I74FYv8nQ==", b64digest
   end
 end
 
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]