Skip to content

Commit 20459f7

Browse files
committed
Fix test_pkey_rsa.rb in FIPS.
* Fix test_new. * Fix test_s_generate. * Fix test_new_break. * Fix test_sign_verify. Note that I created the signature text (`signature_encoded.txt`), that is used as a text to create the `signature0` in the `test_sign_verify` by the following steps with the `openssl` CLI on FIPS module. ``` $ OPENSSL_DIR="${HOME}/.local/openssl-3.4.0-dev-fips-debug-3c6e114959" $ export OPENSSL_CONF="${OPENSSL_DIR}/ssl/openssl_fips.cnf" $ echo -n "Sign me!" > data.txt $ "${OPENSSL_DIR}/bin/openssl" dgst -sha256 -sign test/openssl/fixtures/pkey/rsa2048.pem data.txt > signature.txt $ cat signature.txt | base64 > signature_encoded.txt ``` * Fix test_sign_verify_options. * Fix test_sign_verify_pss. (WIP)
1 parent 13b03ba commit 20459f7

File tree

2 files changed

+39
-25
lines changed

2 files changed

+39
-25
lines changed

Rakefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Rake::TestTask.new(:test_fips_internal) do |t|
3232
'test/openssl/test_pkey_dh.rb',
3333
'test/openssl/test_pkey_dsa.rb',
3434
'test/openssl/test_pkey_ec.rb',
35+
'test/openssl/test_pkey_rsa.rb',
3536
]
3637
t.warning = true
3738
end

test/openssl/test_pkey_rsa.rb

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,15 @@ def test_no_private_exp
1515

1616
def test_private
1717
# Generated by key size and public exponent
18-
key = OpenSSL::PKey::RSA.new(512, 3)
18+
#
19+
# SP800 requires ossl_ifc_ffc_compute_security_bits that the return value
20+
# (strength in bits) is more than equal RSA_FIPS1864_MIN_KEYGEN_STRENGTH
21+
# (112) in FIPS.
22+
# https://github.com/openssl/openssl/blob/3c6e11495975a4eda4cc5886080afed6203711ac/crypto/rsa/rsa_sp800_56b_gen.c#L176-L182
23+
# The ossl_ifc_ffc_compute_security_bits returns 112 with the argument nbits
24+
# 2048.
25+
# https://github.com/openssl/openssl/blob/3c6e11495975a4eda4cc5886080afed6203711ac/crypto/rsa/rsa_lib.c#L334-L335
26+
key = OpenSSL::PKey::RSA.new(2048, 65537)
1927
assert(key.private?)
2028

2129
# Generated by DER
@@ -46,63 +54,68 @@ def test_private
4654
end
4755

4856
def test_new
49-
key = OpenSSL::PKey::RSA.new(512)
50-
assert_equal 512, key.n.num_bits
57+
key = OpenSSL::PKey::RSA.new(2048)
58+
assert_equal 2048, key.n.num_bits
5159
assert_equal 65537, key.e
5260
assert_not_nil key.d
5361

5462
# Specify public exponent
55-
key2 = OpenSSL::PKey::RSA.new(512, 3)
56-
assert_equal 512, key2.n.num_bits
57-
assert_equal 3, key2.e
63+
key2 = OpenSSL::PKey::RSA.new(2048, 65537)
64+
assert_equal 2048, key2.n.num_bits
65+
assert_equal 65537, key2.e
5866
assert_not_nil key2.d
5967
end
6068

6169
def test_s_generate
62-
key1 = OpenSSL::PKey::RSA.generate(512)
63-
assert_equal 512, key1.n.num_bits
70+
key1 = OpenSSL::PKey::RSA.generate(2048)
71+
assert_equal 2048, key1.n.num_bits
6472
assert_equal 65537, key1.e
6573

6674
# Specify public exponent
67-
key2 = OpenSSL::PKey::RSA.generate(512, 3)
68-
assert_equal 512, key2.n.num_bits
69-
assert_equal 3, key2.e
75+
key2 = OpenSSL::PKey::RSA.generate(2048, 65537)
76+
assert_equal 2048, key2.n.num_bits
77+
assert_equal 65537, key2.e
7078
assert_not_nil key2.d
7179
end
7280

7381
def test_new_break
74-
assert_nil(OpenSSL::PKey::RSA.new(1024) { break })
82+
assert_nil(OpenSSL::PKey::RSA.new(2048) { break })
7583
assert_raise(RuntimeError) do
76-
OpenSSL::PKey::RSA.new(1024) { raise }
84+
OpenSSL::PKey::RSA.new(2048) { raise }
7785
end
7886
end
7987

8088
def test_sign_verify
81-
rsa1024 = Fixtures.pkey("rsa1024")
89+
# The ossl_rsa_check_key_size called in ossl_pkey_sign requires more than
90+
# equal 2048 bits on the argument protect = 1 in FIPS.
91+
# https://github.com/openssl/openssl/blob/3c6e11495975a4eda4cc5886080afed6203711ac/providers/common/securitycheck.c#L68-L69
92+
rsa = Fixtures.pkey("rsa2048")
8293
data = "Sign me!"
83-
signature = rsa1024.sign("SHA256", data)
84-
assert_equal true, rsa1024.verify("SHA256", signature, data)
94+
signature = rsa.sign("SHA256", data)
95+
assert_equal true, rsa.verify("SHA256", signature, data)
8596

8697
signature0 = (<<~'end;').unpack1("m")
87-
oLCgbprPvfhM4pjFQiDTFeWI9Sk+Og7Nh9TmIZ/xSxf2CGXQrptlwo7NQ28+
88-
WA6YQo8jPH4hSuyWIM4Gz4qRYiYRkl5TDMUYob94zm8Si1HxEiS9354tzvqS
89-
zS8MLW2BtNPuTubMxTItHGTnOzo9sUg0LAHVFt8kHG2NfKAw/gQ=
98+
ooy49i8aeFtkDYUU0RPDsEugGiNw4lZxpbQPnIwtdftEkka945IqKZ/MY3YSw7wKsvBZeaTy8GqL
99+
lSWLThsRFDV+UUS9zUBbQ9ygNIT8OjdV+tNL63ZpKGprczSnw4F05MQIpajNRud/8jiI9rf+Wysi
100+
WwXecjMl2FlXlLJHY4PFQZU5TiametB4VCQRMcjLo1uf26u/yRpiGaYyqn5vxs0SqNtUDM1UL6x4
101+
NHCAdqLjuFRQPjYp1vGLD3eSl4061pS8x1NVap3YGbYfGUyzZO4VfwFwf1jPdhp/OX/uZw4dGB2H
102+
gSK+q1JiDFwEE6yym5tdKovL1g1NhFYHF6gkZg==
90103
end;
91-
assert_equal true, rsa1024.verify("SHA256", signature0, data)
104+
assert_equal true, rsa.verify("SHA256", signature0, data)
92105
signature1 = signature0.succ
93-
assert_equal false, rsa1024.verify("SHA256", signature1, data)
106+
assert_equal false, rsa.verify("SHA256", signature1, data)
94107
end
95108

96109
def test_sign_verify_options
97-
key = Fixtures.pkey("rsa1024")
110+
key = Fixtures.pkey("rsa2048")
98111
data = "Sign me!"
99112
pssopts = {
100113
"rsa_padding_mode" => "pss",
101114
"rsa_pss_saltlen" => 20,
102115
"rsa_mgf1_md" => "SHA1"
103116
}
104117
sig_pss = key.sign("SHA256", data, pssopts)
105-
assert_equal 128, sig_pss.bytesize
118+
assert_equal 256, sig_pss.bytesize
106119
assert_equal true, key.verify("SHA256", sig_pss, data, pssopts)
107120
assert_equal true, key.verify_pss("SHA256", sig_pss, data,
108121
salt_length: 20, mgf1_hash: "SHA1")
@@ -175,12 +188,12 @@ def test_verify_empty_rsa
175188
end
176189

177190
def test_sign_verify_pss
178-
key = Fixtures.pkey("rsa1024")
191+
key = Fixtures.pkey("rsa2048")
179192
data = "Sign me!"
180193
invalid_data = "Sign me?"
181194

182195
signature = key.sign_pss("SHA256", data, salt_length: 20, mgf1_hash: "SHA1")
183-
assert_equal 128, signature.bytesize
196+
assert_equal 256, signature.bytesize
184197
assert_equal true,
185198
key.verify_pss("SHA256", signature, data, salt_length: 20, mgf1_hash: "SHA1")
186199
assert_equal true,

0 commit comments

Comments
 (0)