@@ -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\n bbbbb\n ccccc\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- MIIHSwYJKoZIhvcNAQcCoIIHPDCCBzgCAQExCzAJBgUrDgMCGgUAMIIDiAYJKoZI
316- hvcNAQcBoIIDeQSCA3UwgAYJKoZIhvcNAQcDoIAwgAIBADGCARAwggEMAgEAMHUw
317- cDEQMA4GA1UECgwHZXhhbXBsZTEXMBUGA1UEAwwOVEFSTUFDIFJPT1QgQ0ExIjAg
318- BgkqhkiG9w0BCQEWE3NvbWVvbmVAZXhhbXBsZS5vcmcxCzAJBgNVBAYTAlVTMRIw
319- EAYDVQQHDAlUb3duIEhhbGwCAWYwDQYJKoZIhvcNAQEBBQAEgYBspXXse8ZhG1FE
320- E3PVAulbvrdR52FWPkpeLvSjgEkYzTiUi0CC3poUL1Ku5mOlavWAJgoJpFICDbvc
321- N4ZNDCwOhnzoI9fMGmm1gvPQy15BdhhZRo9lP7Ga/Hg2APKT0/0yhPsmJ+w+u1e7
322- OoJEVeEZ27x3+u745bGEcu8of5th6TCABgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcE
323- CBNs2U5mMsd/oIAEggIQU6cur8QBz02/4eMpHdlU9IkyrRMiaMZ/ky9zecOAjnvY
324- d2jZqS7RhczpaNJaSli3GmDsKrF+XqE9J58s9ScGqUigzapusTsxIoRUPr7Ztb0a
325- pg8VWDipAsuw7GfEkgx868sV93uC4v6Isfjbhd+JRTFp/wR1kTi7YgSXhES+RLUW
326- gQbDIDgEQYxJ5U951AJtnSpjs9za2ZkTdd8RSEizJK0bQ1vqLoApwAVgZqluATqQ
327- AHSDCxhweVYw6+y90B9xOrqPC0eU7Wzryq2+Raq5ND2Wlf5/N11RQ3EQdKq/l5Te
328- ijp9PdWPlkUhWVoDlOFkysjk+BE+7AkzgYvz9UvBjmZsMsWqf+KsZ4S8/30ndLzu
329- iucsu6eOnFLLX8DKZxV6nYffZOPzZZL8hFBcE7PPgSdBEkazMrEBXq1j5mN7exbJ
330- NOA5uGWyJNBMOCe+1JbxG9UeoqvCCTHESxEeDu7xR3NnSOD47n7cXwHr81YzK2zQ
331- 5oWpP3C8jzI7tUjLd1S0Z3Psd17oaCn+JOfUtuB0nc3wfPF/WPo0xZQodWxp2/Cl
332- EltR6qr1zf5C7GwmLzBZ6bHFAIT60/JzV0/56Pn8ztsRFtI4cwaBfTfvnwi8/sD9
333- /LYOMY+/b6UDCUSR7RTN7XfrtAqDEzSdzdJkOWm1jvM8gkLmxpZdvxG3ZvDYnEQE
334- 5Nq+un5nAny1wf3rWierBAjE5ntiAmgs5AAAAAAAAAAAAACgggHqMIIB5jCCAU+g
335- AwIBAgIBATANBgkqhkiG9w0BAQUFADAvMS0wKwYDVQQDEyQwQUM5RjAyNi1EQ0VB
336- LTRDMTItOTEyNy1DMEZEN0QyQThCNUEwHhcNMTIxMDE5MDk0NTQ3WhcNMTMxMDE5
337- MDk0NTQ3WjAvMS0wKwYDVQQDEyQwQUM5RjAyNi1EQ0VBLTRDMTItOTEyNy1DMEZE
338- N0QyQThCNUEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALTsTNyGIsKvyw56
339- WI3Gll/RmjsupkrdEtPbx7OjS9MEgyhOAf9+u6CV0LJGHpy7HUeROykF6xpbSdCm
340- Mr6kNObl5N0ljOb8OmV4atKjmGg1rWawDLyDQ9Dtuby+dzfHtzAzP+J/3ZoOtSqq
341- AHVTnCclU1pm/uHN0HZ5nL5iLJTvAgMBAAGjEjAQMA4GA1UdDwEB/wQEAwIFoDAN
342- BgkqhkiG9w0BAQUFAAOBgQA8K+BouEV04HRTdMZd3akjTQOm6aEGW4nIRnYIf8ZV
343- mvUpLirVlX/unKtJinhGisFGpuYLMpemx17cnGkBeLCQRvHQjC+ho7l8/LOGheMS
344- nvu0XHhvmJtRbm8MKHhogwZqHFDnXonvjyqhnhEtK5F2Fimcce3MoF2QtEe0UWv/
345- 8DGCAaowggGmAgEBMDQwLzEtMCsGA1UEAxMkMEFDOUYwMjYtRENFQS00QzEyLTkx
346- MjctQzBGRDdEMkE4QjVBAgEBMAkGBSsOAwIaBQCggc0wEgYKYIZIAYb4RQEJAjEE
347- EwIxOTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
348- MjEwMTkwOTQ1NDdaMCAGCmCGSAGG+EUBCQUxEgQQ2EFUJdQNwQDxclIQ8qNyYzAj
349- BgkqhkiG9w0BCQQxFgQUy8GFXPpAwRJUT3rdvNC9Pn+4eoswOAYKYIZIAYb4RQEJ
350- BzEqEygwRkU3QzJEQTVEMDc2NzFFOTcxNDlCNUE3MDRCMERDNkM4MDYwRDJBMA0G
351- CSqGSIb3DQEBAQUABIGAWUNdzvU2iiQOtihBwF0h48Nnw/2qX8uRjg6CVTOMcGji
352- BxjUMifEbT//KJwljshl4y3yBLqeVYLOd04k6aKSdjgdZnrnUPI6p5tL5PfJkTAE
353- L6qflZ9YCU5erE4T5U98hCQBMh4nOYxgaTjnZzhpkKQuEiKq/755cjzTzlI/eok=
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
385386end
386387
0 commit comments