Skip to content

Commit 4f902d4

Browse files
authored
Merge pull request #876 from rhenium/ky/pkcs7-fix-test-rhel-9
pkcs7: fix test failure on RHEL 9
2 parents 5f1d395 + b32406b commit 4f902d4

File tree

1 file changed

+77
-76
lines changed

1 file changed

+77
-76
lines changed

test/openssl/test_pkcs7.rb

Lines changed: 77 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ def test_signed
4646
assert_equal(1, signers.size)
4747
assert_equal(@ee1_cert.serial, signers[0].serial)
4848
assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
49+
# AWS-LC does not generate authenticatedAttributes
50+
assert_in_delta(Time.now, signers[0].signed_time, 10) unless aws_lc?
4951

5052
# Normally OpenSSL tries to translate the supplied content into canonical
5153
# MIME format (e.g. a newline character is converted into CR+LF).
5254
# If the content is a binary, PKCS7::BINARY flag should be used.
5355

5456
data = "aaaaa\nbbbbb\nccccc\n"
55-
flag = OpenSSL::PKCS7::BINARY
57+
flag = OpenSSL::PKCS7::BINARY | OpenSSL::PKCS7::NOATTR
5658
tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs, flag)
5759
p7 = OpenSSL::PKCS7.new(tmp.to_der)
5860
certs = p7.certificates
@@ -65,6 +67,7 @@ def test_signed
6567
assert_equal(1, signers.size)
6668
assert_equal(@ee1_cert.serial, signers[0].serial)
6769
assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
70+
assert_raise(OpenSSL::PKCS7::PKCS7Error) { signers[0].signed_time }
6871

6972
# A signed-data which have multiple signatures can be created
7073
# through the following steps.
@@ -133,6 +136,50 @@ def test_detached_sign
133136
assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
134137
end
135138

139+
def test_signed_authenticated_attributes
140+
# Using static PEM data because AWS-LC does not support generating one
141+
# with authenticatedAttributes.
142+
#
143+
# p7 was generated with OpenSSL 3.4.1 with this program with commandline
144+
# "faketime 2025-04-03Z ruby prog.rb":
145+
#
146+
# require_relative "test/openssl/utils"
147+
# include OpenSSL::TestUtils
148+
# key = Fixtures.pkey("p256")
149+
# cert = issue_cert(OpenSSL::X509::Name.new([["CN", "cert"]]), key, 1, [], nil, nil)
150+
# p7 = OpenSSL::PKCS7.sign(cert, key, "content", [])
151+
# puts p7.to_pem
152+
p7 = OpenSSL::PKCS7.new(<<~EOF)
153+
-----BEGIN PKCS7-----
154+
MIICvgYJKoZIhvcNAQcCoIICrzCCAqsCAQExDzANBglghkgBZQMEAgEFADAWBgkq
155+
hkiG9w0BBwGgCQQHY29udGVudKCCAQ4wggEKMIGxoAMCAQICAQEwCgYIKoZIzj0E
156+
AwIwDzENMAsGA1UEAwwEY2VydDAeFw0yNTA0MDIyMzAwMDFaFw0yNTA0MDMwMTAw
157+
MDFaMA8xDTALBgNVBAMMBGNlcnQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQW
158+
CWTZz6hVQgpDrh5kb1uEs09YHuVJn8CsrjV4bLnADNT/QbnVe20J4FSX4xqFm2f1
159+
87Ukp0XiomZLf11eekQ2MAoGCCqGSM49BAMCA0gAMEUCIEg1fDI8b3hZAArgniVk
160+
HeM6puwgcMh5NXwvJ9x0unVmAiEAppecVTSQ+yEPyBG415Og6sK+RC78pcByEC81
161+
C/QSwRYxggFpMIIBZQIBATAUMA8xDTALBgNVBAMMBGNlcnQCAQEwDQYJYIZIAWUD
162+
BAIBBQCggeQwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUx
163+
DxcNMjUwNDAzMDAwMDAxWjAvBgkqhkiG9w0BCQQxIgQg7XACtDnprIRfIjV9gius
164+
FERzD722AW0+yUMil7nsn3MweQYJKoZIhvcNAQkPMWwwajALBglghkgBZQMEASow
165+
CwYJYIZIAWUDBAEWMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzAOBggqhkiG9w0D
166+
AgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgwCgYI
167+
KoZIzj0EAwIESDBGAiEAssymc28HySAhg+XeWIpSbtzkwycr2JG6dzHRZ+vn0ocC
168+
IQCJVpo1FTLZOHSc9UpjS+VKR4cg50Iz0HiPyo6hwjCrwA==
169+
-----END PKCS7-----
170+
EOF
171+
172+
cert = p7.certificates[0]
173+
store = OpenSSL::X509::Store.new.tap { |store|
174+
store.time = Time.utc(2025, 4, 3)
175+
store.add_cert(cert)
176+
}
177+
assert_equal(true, p7.verify([], store))
178+
assert_equal(1, p7.signers.size)
179+
signer = p7.signers[0]
180+
assert_in_delta(Time.utc(2025, 4, 3), signer.signed_time, 10)
181+
end
182+
136183
def test_enveloped
137184
certs = [@ee1_cert, @ee2_cert]
138185
cipher = OpenSSL::Cipher::AES.new("128-CBC")
@@ -204,7 +251,7 @@ def test_empty_signed_data_ruby_bug_19974
204251
end
205252

206253
def test_graceful_parsing_failure #[ruby-core:43250]
207-
contents = File.read(__FILE__)
254+
contents = "not a valid PKCS #7 PEM block"
208255
assert_raise(ArgumentError) { OpenSSL::PKCS7.new(contents) }
209256
end
210257

@@ -307,80 +354,34 @@ def test_degenerate_pkcs7
307354
end
308355
end
309356

310-
def test_split_content
311-
pend "AWS-LC ASN.1 parsers has no current support for parsing indefinite BER constructed strings" if aws_lc?
312-
313-
pki_message_pem = <<END
314-
-----BEGIN PKCS7-----
315-
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
354-
-----END PKCS7-----
355-
END
356-
pki_message_content_pem = <<END
357-
-----BEGIN PKCS7-----
358-
MIIDawYJKoZIhvcNAQcDoIIDXDCCA1gCAQAxggEQMIIBDAIBADB1MHAxEDAOBgNV
359-
BAoMB2V4YW1wbGUxFzAVBgNVBAMMDlRBUk1BQyBST09UIENBMSIwIAYJKoZIhvcN
360-
AQkBFhNzb21lb25lQGV4YW1wbGUub3JnMQswCQYDVQQGEwJVUzESMBAGA1UEBwwJ
361-
VG93biBIYWxsAgFmMA0GCSqGSIb3DQEBAQUABIGAbKV17HvGYRtRRBNz1QLpW763
362-
UedhVj5KXi70o4BJGM04lItAgt6aFC9SruZjpWr1gCYKCaRSAg273DeGTQwsDoZ8
363-
6CPXzBpptYLz0MteQXYYWUaPZT+xmvx4NgDyk9P9MoT7JifsPrtXuzqCRFXhGdu8
364-
d/ru+OWxhHLvKH+bYekwggI9BgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECBNs2U5m
365-
Msd/gIICGFOnLq/EAc9Nv+HjKR3ZVPSJMq0TImjGf5Mvc3nDgI572Hdo2aku0YXM
366-
6WjSWkpYtxpg7Cqxfl6hPSefLPUnBqlIoM2qbrE7MSKEVD6+2bW9GqYPFVg4qQLL
367-
sOxnxJIMfOvLFfd7guL+iLH424XfiUUxaf8EdZE4u2IEl4REvkS1FoEGwyA4BEGM
368-
SeVPedQCbZ0qY7Pc2tmZE3XfEUhIsyStG0Nb6i6AKcAFYGapbgE6kAB0gwsYcHlW
369-
MOvsvdAfcTq6jwtHlO1s68qtvkWquTQ9lpX+fzddUUNxEHSqv5eU3oo6fT3Vj5ZF
370-
IVlaA5ThZMrI5PgRPuwJM4GL8/VLwY5mbDLFqn/irGeEvP99J3S87ornLLunjpxS
371-
y1/AymcVep2H32Tj82WS/IRQXBOzz4EnQRJGszKxAV6tY+Zje3sWyTTgObhlsiTQ
372-
TDgnvtSW8RvVHqKrwgkxxEsRHg7u8UdzZ0jg+O5+3F8B6/NWMyts0OaFqT9wvI8y
373-
O7VIy3dUtGdz7Hde6Ggp/iTn1LbgdJ3N8Hzxf1j6NMWUKHVsadvwpRJbUeqq9c3+
374-
QuxsJi8wWemxxQCE+tPyc1dP+ej5/M7bERbSOHMGgX03758IvP7A/fy2DjGPv2+l
375-
AwlEke0Uze1367QKgxM0nc3SZDlptY7zPIJC5saWXb8Rt2bw2JxEBOTavrp+ZwJ8
376-
tcH961onq8Tme2ICaCzk
377-
-----END PKCS7-----
378-
END
379-
pki_msg = OpenSSL::PKCS7.new(pki_message_pem)
380-
store = OpenSSL::X509::Store.new
381-
assert_equal(true, pki_msg.verify(nil, store, nil, OpenSSL::PKCS7::NOVERIFY))
382-
p7enc = OpenSSL::PKCS7.new(pki_msg.data)
383-
assert_equal(pki_message_content_pem, p7enc.to_pem)
357+
def test_decode_ber_constructed_string
358+
pend "AWS-LC ASN.1 parsers has no current support for parsing indefinite BER constructed strings" if aws_lc?
359+
360+
p7 = OpenSSL::PKCS7.encrypt([@ee1_cert], "content", "aes-128-cbc")
361+
362+
# Make an equivalent BER to p7.to_der. Here we convert the encryptedContent
363+
# field of EncryptedContentInfo into a constructed encoding using the
364+
# indefinite length form.
365+
# See https://www.rfc-editor.org/rfc/rfc2315#section-10.1
366+
asn1 = OpenSSL::ASN1.decode(p7.to_der)
367+
asn1.indefinite_length = true
368+
enveloped_data_explicit_tag = asn1.value[1]
369+
enveloped_data_explicit_tag.indefinite_length = true
370+
enveloped_data = enveloped_data_explicit_tag.value[0]
371+
enveloped_data.indefinite_length = true
372+
encrypted_content_info = enveloped_data.value[2]
373+
encrypted_content_info.indefinite_length = true
374+
orig = encrypted_content_info.value[2]
375+
encrypted_content_info.value[2] = OpenSSL::ASN1::ASN1Data.new([
376+
OpenSSL::ASN1::OctetString(orig.value[...5]),
377+
OpenSSL::ASN1::OctetString(orig.value[5...]),
378+
], 0, :CONTEXT_SPECIFIC).tap { |x| x.indefinite_length = true }
379+
380+
assert_not_equal(p7.to_der, asn1.to_der)
381+
assert_equal(p7.to_der, OpenSSL::PKCS7.new(asn1.to_der).to_der)
382+
383+
assert_equal("content", OpenSSL::PKCS7.new(p7.to_der).decrypt(@rsa1024))
384+
assert_equal("content", OpenSSL::PKCS7.new(asn1.to_der).decrypt(@rsa1024))
384385
end
385386
end
386387

0 commit comments

Comments
 (0)