Skip to content

Commit 1a2f62d

Browse files
committed
Implement OpenSSL::PKey#size
1 parent 5af1eda commit 1a2f62d

File tree

4 files changed

+42
-0
lines changed

4 files changed

+42
-0
lines changed

ext/openssl/extconf.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ def find_openssl_library
159159
have_func("EVP_MD_CTX_get_pkey_ctx(NULL)", evp_h)
160160
have_func("EVP_PKEY_eq(NULL, NULL)", evp_h)
161161
have_func("EVP_PKEY_dup(NULL)", evp_h)
162+
have_func("EVP_PKEY_get_size", evp_h)
162163

163164
# added in 3.2.0
164165
have_func("SSL_get0_group_name(NULL)", ssl_h)

ext/openssl/openssl_missing.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,8 @@
2929
# define EVP_PKEY_eq(a, b) EVP_PKEY_cmp(a, b)
3030
#endif
3131

32+
#ifndef HAVE_EVP_PKEY_GET_SIZE
33+
# define EVP_PKEY_get_size(x) EVP_PKEY_size(x)
34+
#endif
35+
3236
#endif /* _OSSL_OPENSSL_MISSING_H_ */

ext/openssl/ossl_pkey.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,28 @@ ossl_pkey_compare(VALUE self, VALUE other)
10741074
ossl_raise(ePKeyError, "EVP_PKEY_eq");
10751075
}
10761076

1077+
/*
1078+
* call-seq:
1079+
* pkey.size -> integer
1080+
*
1081+
* Get the key size in bytes
1082+
*
1083+
* == Example
1084+
* rsa_key = OpenSSL::PKey::RSA.new(pem_encoded_private_key)
1085+
*
1086+
* rsa_key.size => 512
1087+
*/
1088+
static VALUE
1089+
ossl_pkey_size(VALUE self) {
1090+
int ret = 0;
1091+
EVP_PKEY *selfPKey;
1092+
1093+
GetPKey(self, selfPKey);
1094+
ret = EVP_PKEY_get_size(selfPKey);
1095+
1096+
return INT2NUM(ret);
1097+
}
1098+
10771099
/*
10781100
* call-seq:
10791101
* pkey.sign(digest, data [, options]) -> string
@@ -1760,6 +1782,7 @@ Init_ossl_pkey(void)
17601782
rb_define_method(cPKey, "raw_private_key", ossl_pkey_raw_private_key, 0);
17611783
rb_define_method(cPKey, "raw_public_key", ossl_pkey_raw_public_key, 0);
17621784
rb_define_method(cPKey, "compare?", ossl_pkey_compare, 1);
1785+
rb_define_method(cPKey, "size", ossl_pkey_size, 0);
17631786

17641787
rb_define_method(cPKey, "sign", ossl_pkey_sign, -1);
17651788
rb_define_method(cPKey, "verify", ossl_pkey_verify, -1);

test/openssl/test_pkey.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,20 @@ def test_compare?
310310
end
311311
end
312312

313+
def test_size
314+
key1 = Fixtures.pkey("rsa-1")
315+
key2 = Fixtures.pkey("rsa-2")
316+
key3 = Fixtures.pkey("p256")
317+
318+
assert_equal(512, key1.size)
319+
assert_equal(512, key2.size)
320+
assert_equal(72, key3.size)
321+
322+
# Should match the number of bits of the public component for RSA keys
323+
assert_equal(key1.n.num_bits / 8, key1.size)
324+
assert_equal(key1.n.num_bits / 8, key2.size)
325+
end
326+
313327
def test_to_text
314328
rsa = Fixtures.pkey("rsa-1")
315329
assert_include rsa.to_text, "publicExponent"

0 commit comments

Comments
 (0)