Skip to content

Commit ab4d58e

Browse files
authored
Merge pull request #538 from rhenium/ky/hmac-evp-use-raw-private-key
hmac: use EVP_PKEY_new_raw_private_key() if available
2 parents d52549a + 4293f18 commit ab4d58e

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

ext/openssl/extconf.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ def find_openssl_library
169169

170170
# added in 1.1.1
171171
have_func("EVP_PKEY_check")
172+
have_func("EVP_PKEY_new_raw_private_key")
172173

173174
# added in 3.0.0
174175
have_func("SSL_set0_tmp_dh_pkey")

ext/openssl/ossl_hmac.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,19 @@ ossl_hmac_initialize(VALUE self, VALUE key, VALUE digest)
9797

9898
GetHMAC(self, ctx);
9999
StringValue(key);
100+
#ifdef HAVE_EVP_PKEY_NEW_RAW_PRIVATE_KEY
101+
pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL,
102+
(unsigned char *)RSTRING_PTR(key),
103+
RSTRING_LENINT(key));
104+
if (!pkey)
105+
ossl_raise(eHMACError, "EVP_PKEY_new_raw_private_key");
106+
#else
100107
pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL,
101108
(unsigned char *)RSTRING_PTR(key),
102109
RSTRING_LENINT(key));
103110
if (!pkey)
104111
ossl_raise(eHMACError, "EVP_PKEY_new_mac_key");
112+
#endif
105113
if (EVP_DigestSignInit(ctx, NULL, ossl_evp_get_digestbyname(digest),
106114
NULL, pkey) != 1) {
107115
EVP_PKEY_free(pkey);

test/openssl/test_hmac.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ def test_singleton_methods
6363
b64digest = OpenSSL::HMAC.base64digest("MD5", key, "Hi There")
6464
assert_equal "kpRyejY4uxwT9I74FYv8nQ==", b64digest
6565
end
66+
67+
def test_zero_length_key
68+
# Empty string as the key
69+
hexdigest = OpenSSL::HMAC.hexdigest("SHA256", "\0"*32, "test")
70+
assert_equal "43b0cef99265f9e34c10ea9d3501926d27b39f57c6d674561d8ba236e7a819fb", hexdigest
71+
hexdigest = OpenSSL::HMAC.hexdigest("SHA256", "", "test")
72+
assert_equal "43b0cef99265f9e34c10ea9d3501926d27b39f57c6d674561d8ba236e7a819fb", hexdigest
73+
end
6674
end
6775

6876
end

0 commit comments

Comments
 (0)