Skip to content

Commit c0aac95

Browse files
authored
Merge pull request #855 from samuel40791765/aws-lc-support-2
Patch and enable tests with AWS-LC
2 parents 2bbd7ec + 8a5e461 commit c0aac95

File tree

13 files changed

+128
-58
lines changed

13 files changed

+128
-58
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ jobs:
8383
- { name-extra: 'with fips provider', openssl: openssl-3.4.0, fips-enabled: true }
8484
- { name-extra: 'with fips provider', openssl: openssl-master, fips-enabled: true }
8585
- { name-extra: 'without legacy provider', openssl: openssl-3.4.0, append-configure: 'no-legacy' }
86-
- { openssl: aws-lc-latest, skip-warnings: true, skip-tests: true } # Remove "skip-tests" once AWS-LC tests are working.
86+
- { openssl: aws-lc-latest, skip-warnings: true }
8787
steps:
8888
- name: repo checkout
8989
uses: actions/checkout@v4
@@ -160,7 +160,7 @@ jobs:
160160
- name: rake test
161161
run: bundle exec rake test TESTOPTS="-v --no-show-detail-immediately"
162162
timeout-minutes: 5
163-
if: ${{ !matrix.fips-enabled && !matrix.skip-tests }}
163+
if: ${{ !matrix.fips-enabled }}
164164

165165
# Run only the passing tests on the FIPS module as a temporary workaround.
166166
# TODO Fix other tests, and run all the tests on FIPS module.

test/openssl/test_asn1.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ def test_basic_asn1data
458458
encode_decode_test B(%w{ 81 00 }), OpenSSL::ASN1::ASN1Data.new(B(%w{}), 1, :CONTEXT_SPECIFIC)
459459
encode_decode_test B(%w{ C1 00 }), OpenSSL::ASN1::ASN1Data.new(B(%w{}), 1, :PRIVATE)
460460
encode_decode_test B(%w{ 1F 20 00 }), OpenSSL::ASN1::ASN1Data.new(B(%w{}), 32, :UNIVERSAL)
461-
encode_decode_test B(%w{ 1F C0 20 00 }), OpenSSL::ASN1::ASN1Data.new(B(%w{}), 8224, :UNIVERSAL)
461+
encode_decode_test B(%w{ 9F C0 20 00 }), OpenSSL::ASN1::ASN1Data.new(B(%w{}), 8224, :CONTEXT_SPECIFIC)
462462
encode_decode_test B(%w{ 41 02 AB CD }), OpenSSL::ASN1::ASN1Data.new(B(%w{ AB CD }), 1, :APPLICATION)
463463
encode_decode_test B(%w{ 41 81 80 } + %w{ AB CD } * 64), OpenSSL::ASN1::ASN1Data.new(B(%w{ AB CD } * 64), 1, :APPLICATION)
464464
encode_decode_test B(%w{ 41 82 01 00 } + %w{ AB CD } * 128), OpenSSL::ASN1::ASN1Data.new(B(%w{ AB CD } * 128), 1, :APPLICATION)

test/openssl/test_bn.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,8 @@ def test_argument_error
321321
end
322322

323323
def test_get_flags_and_set_flags
324+
return if aws_lc? # AWS-LC does not support BN::CONSTTIME.
325+
324326
e = OpenSSL::BN.new(999)
325327

326328
assert_equal(0, e.get_flags(OpenSSL::BN::CONSTTIME))
@@ -364,7 +366,9 @@ def test_ractor
364366
assert_equal(true, Ractor.new(@e2) { _1.negative? }.take)
365367
assert_include(128..255, Ractor.new { OpenSSL::BN.rand(8)}.take)
366368
assert_include(0...2**32, Ractor.new { OpenSSL::BN.generate_prime(32) }.take)
367-
assert_equal(0, Ractor.new { OpenSSL::BN.new(999).get_flags(OpenSSL::BN::CONSTTIME) }.take)
369+
if !aws_lc? # AWS-LC does not support BN::CONSTTIME.
370+
assert_equal(0, Ractor.new { OpenSSL::BN.new(999).get_flags(OpenSSL::BN::CONSTTIME) }.take)
371+
end
368372
# test if shareable when frozen
369373
assert Ractor.shareable?(@e1.freeze)
370374
end

test/openssl/test_config.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ def test_s_parse
4343
end
4444

4545
def test_s_parse_format
46+
# AWS-LC removed support for parsing $foo variables.
47+
return if aws_lc?
48+
4649
c = OpenSSL::Config.parse(<<__EOC__)
4750
baz =qx\t # "baz = qx"
4851
@@ -213,13 +216,15 @@ def test_get_value
213216
assert_raise(TypeError) do
214217
@it.get_value(nil, 'HOME') # not allowed unlike Config#value
215218
end
216-
# fallback to 'default' ugly...
217-
assert_equal('.', @it.get_value('unknown', 'HOME'))
219+
unless aws_lc? # AWS-LC does not support the fallback
220+
# fallback to 'default' ugly...
221+
assert_equal('.', @it.get_value('unknown', 'HOME'))
222+
end
218223
end
219224

220225
def test_get_value_ENV
221-
# LibreSSL removed support for NCONF_get_string(conf, "ENV", str)
222-
return if libressl?
226+
# LibreSSL and AWS-LC removed support for NCONF_get_string(conf, "ENV", str)
227+
return if libressl? || aws_lc?
223228

224229
key = ENV.keys.first
225230
assert_not_nil(key) # make sure we have at least one ENV var.

test/openssl/test_fips.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,16 @@ def test_fips_mode_get_is_false_on_fips_mode_disabled
2828
end
2929

3030
def test_fips_mode_is_reentrant
31+
return if aws_lc? # AWS-LC's FIPS mode is decided at compile time.
32+
3133
assert_separately(["-ropenssl"], <<~"end;")
3234
OpenSSL.fips_mode = false
3335
OpenSSL.fips_mode = false
3436
end;
3537
end
3638

3739
def test_fips_mode_get_with_fips_mode_set
38-
omit('OpenSSL is not FIPS-capable') unless OpenSSL::OPENSSL_FIPS
40+
omit('OpenSSL is not FIPS-capable') unless OpenSSL::OPENSSL_FIPS and !aws_lc? # AWS-LC's FIPS mode is decided at compile time.
3941

4042
assert_separately(["-ropenssl"], <<~"end;")
4143
begin

test/openssl/test_pkcs12.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ def test_create_with_mac_itr
178178
end
179179

180180
def test_create_with_keytype
181+
omit "AWS-LC does not support KEY_SIG and KEY_EX" if aws_lc?
182+
181183
OpenSSL::PKCS12.create(
182184
"omg",
183185
"hello",

test/openssl/test_pkcs7.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ def test_set_type_encrypted
239239
end
240240

241241
def test_smime
242+
pend "AWS-LC has no current support for SMIME with PKCS7" if aws_lc?
243+
242244
store = OpenSSL::X509::Store.new
243245
store.add_cert(@ca_cert)
244246
ca_certs = [@ca_cert]
@@ -261,6 +263,8 @@ def test_smime
261263
end
262264

263265
def test_to_text
266+
omit "AWS-LC does not support PKCS7.to_text" if aws_lc?
267+
264268
p7 = OpenSSL::PKCS7.new
265269
p7.type = "signed"
266270
assert_match(/signed/, p7.to_text)
@@ -374,7 +378,12 @@ def test_split_content
374378
store = OpenSSL::X509::Store.new
375379
pki_msg.verify(nil, store, nil, OpenSSL::PKCS7::NOVERIFY)
376380
p7enc = OpenSSL::PKCS7.new(pki_msg.data)
377-
assert_equal(pki_message_content_pem, p7enc.to_pem)
381+
# AWS-LC uses explicit OCTET STRING headers when encoding PKCS7 EncryptedContent,
382+
# while OpenSSL traditionally uses indefinite-length encoding (ASN1_TFLG_NDEF)
383+
# in its PKCS7 implementation.
384+
unless aws_lc?
385+
assert_equal(pki_message_content_pem, p7enc.to_pem)
386+
end
378387
end
379388
end
380389

test/openssl/test_pkey_dh.rb

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def test_new_generate
1919
end if ENV["OSSL_TEST_ALL"]
2020

2121
def test_new_break_on_non_fips
22-
omit_on_fips
22+
omit_on_fips if !aws_lc?
2323

2424
assert_nil(OpenSSL::PKey::DH.new(NEW_KEYLEN) { break })
2525
assert_raise(RuntimeError) do
@@ -29,6 +29,7 @@ def test_new_break_on_non_fips
2929

3030
def test_new_break_on_fips
3131
omit_on_non_fips
32+
return unless openssl? # This behavior only applies to OpenSSL.
3233

3334
# The block argument is not executed in FIPS case.
3435
# See https://github.com/ruby/openssl/issues/692 for details.
@@ -123,11 +124,22 @@ def test_params_ok?
123124
]))
124125
assert_equal(true, dh1.params_ok?)
125126

126-
dh2 = OpenSSL::PKey::DH.new(OpenSSL::ASN1::Sequence([
127-
OpenSSL::ASN1::Integer(dh0.p + 1),
128-
OpenSSL::ASN1::Integer(dh0.g)
129-
]))
130-
assert_equal(false, dh2.params_ok?)
127+
# AWS-LC automatically does parameter checks on the parsed params.
128+
if aws_lc?
129+
assert_raise(OpenSSL::PKey::DHError) {
130+
OpenSSL::PKey::DH.new(OpenSSL::ASN1::Sequence([
131+
OpenSSL::ASN1::Integer(dh0.p + 1),
132+
OpenSSL::ASN1::Integer(dh0.g)
133+
]))
134+
}
135+
else
136+
dh2 = OpenSSL::PKey::DH.new(OpenSSL::ASN1::Sequence([
137+
OpenSSL::ASN1::Integer(dh0.p + 1),
138+
OpenSSL::ASN1::Integer(dh0.g)
139+
]))
140+
assert_equal(false, dh2.params_ok?)
141+
end
142+
131143
end
132144

133145
def test_params

test/openssl/test_pkey_dsa.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,19 +92,19 @@ def test_sign_verify_raw
9292
sig = key.syssign(digest)
9393
assert_equal true, key.sysverify(digest, sig)
9494
assert_equal false, key.sysverify(digest, invalid_sig)
95-
assert_raise(OpenSSL::PKey::DSAError) { key.sysverify(digest, malformed_sig) }
95+
assert_sign_verify_false_or_error{ key.sysverify(digest, malformed_sig) }
9696
assert_equal true, key.verify_raw(nil, sig, digest)
9797
assert_equal false, key.verify_raw(nil, invalid_sig, digest)
98-
assert_raise(OpenSSL::PKey::PKeyError) { key.verify_raw(nil, malformed_sig, digest) }
98+
assert_sign_verify_false_or_error { key.verify_raw(nil, malformed_sig, digest) }
9999

100100
# Sign by #sign_raw
101101
sig = key.sign_raw(nil, digest)
102102
assert_equal true, key.sysverify(digest, sig)
103103
assert_equal false, key.sysverify(digest, invalid_sig)
104-
assert_raise(OpenSSL::PKey::DSAError) { key.sysverify(digest, malformed_sig) }
104+
assert_sign_verify_false_or_error { key.sysverify(digest, malformed_sig) }
105105
assert_equal true, key.verify_raw(nil, sig, digest)
106106
assert_equal false, key.verify_raw(nil, invalid_sig, digest)
107-
assert_raise(OpenSSL::PKey::PKeyError) { key.verify_raw(nil, malformed_sig, digest) }
107+
assert_sign_verify_false_or_error { key.verify_raw(nil, malformed_sig, digest) }
108108
end
109109

110110
def test_DSAPrivateKey

test/openssl/test_pkey_ec.rb

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,19 @@ def test_check_key
8989

9090
# Behavior of EVP_PKEY_public_check changes between OpenSSL 1.1.1 and 3.0
9191
# The public key does not match the private key
92-
key4 = OpenSSL::PKey.read(<<~EOF)
92+
ec_key_data = <<~EOF
9393
-----BEGIN EC PRIVATE KEY-----
9494
MHcCAQEEIP+TT0V8Fndsnacji9tyf6hmhHywcOWTee9XkiBeJoVloAoGCCqGSM49
9595
AwEHoUQDQgAEBkhhJIU/2/YdPSlY2I1k25xjK4trr5OXSgXvBC21PtY0HQ7lor7A
9696
jzT0giJITqmcd81fwGw5+96zLcdxTF1hVQ==
9797
-----END EC PRIVATE KEY-----
9898
EOF
99-
assert_raise(OpenSSL::PKey::ECError) { key4.check_key }
99+
if aws_lc? # AWS-LC automatically does key checks on the parsed key.
100+
assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.read(ec_key_data) }
101+
else
102+
key4 = OpenSSL::PKey.read(ec_key_data)
103+
assert_raise(OpenSSL::PKey::ECError) { key4.check_key }
104+
end
100105

101106
# EC#private_key= is deprecated in 3.0 and won't work on OpenSSL 3.0
102107
if !openssl?(3, 0, 0)
@@ -147,19 +152,19 @@ def test_sign_verify_raw
147152
sig = key.dsa_sign_asn1(data1)
148153
assert_equal true, key.dsa_verify_asn1(data1, sig)
149154
assert_equal false, key.dsa_verify_asn1(data2, sig)
150-
assert_raise(OpenSSL::PKey::ECError) { key.dsa_verify_asn1(data1, malformed_sig) }
155+
assert_sign_verify_false_or_error { key.dsa_verify_asn1(data1, malformed_sig) }
151156
assert_equal true, key.verify_raw(nil, sig, data1)
152157
assert_equal false, key.verify_raw(nil, sig, data2)
153-
assert_raise(OpenSSL::PKey::PKeyError) { key.verify_raw(nil, malformed_sig, data1) }
158+
assert_sign_verify_false_or_error { key.verify_raw(nil, malformed_sig, data1) }
154159

155160
# Sign by #sign_raw
156161
sig = key.sign_raw(nil, data1)
157162
assert_equal true, key.dsa_verify_asn1(data1, sig)
158163
assert_equal false, key.dsa_verify_asn1(data2, sig)
159-
assert_raise(OpenSSL::PKey::ECError) { key.dsa_verify_asn1(data1, malformed_sig) }
164+
assert_sign_verify_false_or_error { key.dsa_verify_asn1(data1, malformed_sig) }
160165
assert_equal true, key.verify_raw(nil, sig, data1)
161166
assert_equal false, key.verify_raw(nil, sig, data2)
162-
assert_raise(OpenSSL::PKey::PKeyError) { key.verify_raw(nil, malformed_sig, data1) }
167+
assert_sign_verify_false_or_error{ key.verify_raw(nil, malformed_sig, data1) }
163168
end
164169

165170
def test_dsa_sign_asn1_FIPS186_3
@@ -304,7 +309,10 @@ def test_ec_group
304309
assert_equal group1.to_der, group2.to_der
305310
assert_equal group1, group2
306311
group2.asn1_flag ^=OpenSSL::PKey::EC::NAMED_CURVE
307-
assert_not_equal group1.to_der, group2.to_der
312+
# AWS-LC does not support serializing explicit curves.
313+
unless aws_lc?
314+
assert_not_equal group1.to_der, group2.to_der
315+
end
308316
assert_equal group1, group2
309317

310318
group3 = group1.dup

0 commit comments

Comments
 (0)