66class OpenSSL ::TestPKCS7 < OpenSSL ::TestCase
77 def setup
88 super
9- @rsa1024 = Fixtures . pkey ( "rsa1024" )
10- @rsa2048 = Fixtures . pkey ( "rsa2048" )
11- ca = OpenSSL ::X509 ::Name . parse ( "/DC=org/DC=ruby-lang/CN=CA" )
12- ee1 = OpenSSL ::X509 ::Name . parse ( "/DC=org/DC=ruby-lang/CN=EE1" )
13- ee2 = OpenSSL ::X509 ::Name . parse ( "/DC=org/DC=ruby-lang/CN=EE2" )
9+ @ca_key = Fixtures . pkey ( "rsa-1" )
10+ @ee1_key = Fixtures . pkey ( "rsa-2" )
11+ @ee2_key = Fixtures . pkey ( "rsa-3" )
12+ ca = OpenSSL ::X509 ::Name . new ( [ [ "CN" , "CA" ] ] )
13+ ee1 = OpenSSL ::X509 ::Name . new ( [ [ "CN" , "EE1" ] ] )
14+ ee2 = OpenSSL ::X509 ::Name . new ( [ [ "CN" , "EE2" ] ] )
1415
1516 ca_exts = [
16- [ "basicConstraints" , "CA:TRUE" , true ] ,
17- [ "keyUsage" , "keyCertSign, cRLSign" , true ] ,
18- [ "subjectKeyIdentifier" , "hash" , false ] ,
19- [ "authorityKeyIdentifier" , "keyid:always" , false ] ,
17+ [ "basicConstraints" , "CA:TRUE" , true ] ,
18+ [ "keyUsage" , "keyCertSign, cRLSign" , true ] ,
19+ [ "subjectKeyIdentifier" , "hash" , false ] ,
20+ [ "authorityKeyIdentifier" , "keyid:always" , false ] ,
2021 ]
21- @ca_cert = issue_cert ( ca , @rsa2048 , 1 , ca_exts , nil , nil )
22+ @ca_cert = issue_cert ( ca , @ca_key , 1 , ca_exts , nil , nil )
2223 ee_exts = [
23- [ "keyUsage" , "Non Repudiation, Digital Signature, Key Encipherment" , true ] ,
24- [ "authorityKeyIdentifier" , "keyid:always" , false ] ,
25- [ "extendedKeyUsage" , "clientAuth, emailProtection, codeSigning" , false ] ,
24+ [ "keyUsage" , "nonRepudiation, digitalSignature, keyEncipherment" , true ] ,
25+ [ "authorityKeyIdentifier" , "keyid:always" , false ] ,
26+ [ "extendedKeyUsage" , "clientAuth, emailProtection, codeSigning" , false ] ,
2627 ]
27- @ee1_cert = issue_cert ( ee1 , @rsa1024 , 2 , ee_exts , @ca_cert , @rsa2048 )
28- @ee2_cert = issue_cert ( ee2 , @rsa1024 , 3 , ee_exts , @ca_cert , @rsa2048 )
28+ @ee1_cert = issue_cert ( ee1 , @ee1_key , 2 , ee_exts , @ca_cert , @ca_key )
29+ @ee2_cert = issue_cert ( ee2 , @ee2_key , 3 , ee_exts , @ca_cert , @ca_key )
2930 end
3031
3132 def test_signed
3233 store = OpenSSL ::X509 ::Store . new
3334 store . add_cert ( @ca_cert )
35+
36+ data = "aaaaa\n bbbbb\n ccccc\n "
3437 ca_certs = [ @ca_cert ]
38+ tmp = OpenSSL ::PKCS7 . sign ( @ee1_cert , @ee1_key , data , ca_certs )
39+ # TODO: #data contains untranslated content
40+ assert_equal ( "aaaaa\n bbbbb\n ccccc\n " , tmp . data )
41+ assert_nil ( tmp . error_string )
3542
36- data = "aaaaa\r \n bbbbb\r \n ccccc\r \n "
37- tmp = OpenSSL ::PKCS7 . sign ( @ee1_cert , @rsa1024 , data , ca_certs )
3843 p7 = OpenSSL ::PKCS7 . new ( tmp . to_der )
44+ assert_nil ( p7 . data )
45+ assert_nil ( p7 . error_string )
46+
47+ assert_true ( p7 . verify ( [ ] , store ) )
48+ # AWS-LC does not appear to convert to CRLF automatically
49+ assert_equal ( "aaaaa\r \n bbbbb\r \n ccccc\r \n " , p7 . data ) unless aws_lc?
50+ assert_nil ( p7 . error_string )
51+
3952 certs = p7 . certificates
40- signers = p7 . signers
41- assert ( p7 . verify ( [ ] , store ) )
42- assert_equal ( data , p7 . data )
4353 assert_equal ( 2 , certs . size )
44- assert_equal ( @ee1_cert . subject . to_s , certs [ 0 ] . subject . to_s )
45- assert_equal ( @ca_cert . subject . to_s , certs [ 1 ] . subject . to_s )
54+ assert_equal ( @ee1_cert . subject , certs [ 0 ] . subject )
55+ assert_equal ( @ca_cert . subject , certs [ 1 ] . subject )
56+
57+ signers = p7 . signers
4658 assert_equal ( 1 , signers . size )
4759 assert_equal ( @ee1_cert . serial , signers [ 0 ] . serial )
48- assert_equal ( @ee1_cert . issuer . to_s , signers [ 0 ] . issuer . to_s )
60+ assert_equal ( @ee1_cert . issuer , signers [ 0 ] . issuer )
4961 # AWS-LC does not generate authenticatedAttributes
5062 assert_in_delta ( Time . now , signers [ 0 ] . signed_time , 10 ) unless aws_lc?
5163
64+ assert_false ( p7 . verify ( [ @ca_cert ] , OpenSSL ::X509 ::Store . new ) )
65+ end
66+
67+ def test_signed_flags
68+ store = OpenSSL ::X509 ::Store . new
69+ store . add_cert ( @ca_cert )
70+
5271 # Normally OpenSSL tries to translate the supplied content into canonical
5372 # MIME format (e.g. a newline character is converted into CR+LF).
5473 # If the content is a binary, PKCS7::BINARY flag should be used.
55-
74+ #
75+ # PKCS7::NOATTR flag suppresses authenticatedAttributes.
5676 data = "aaaaa\n bbbbb\n ccccc\n "
5777 flag = OpenSSL ::PKCS7 ::BINARY | OpenSSL ::PKCS7 ::NOATTR
58- tmp = OpenSSL ::PKCS7 . sign ( @ee1_cert , @rsa1024 , data , ca_certs , flag )
78+ tmp = OpenSSL ::PKCS7 . sign ( @ee1_cert , @ee1_key , data , [ @ca_cert ] , flag )
5979 p7 = OpenSSL ::PKCS7 . new ( tmp . to_der )
60- certs = p7 . certificates
61- signers = p7 . signers
62- assert ( p7 . verify ( [ ] , store ) )
80+
81+ assert_true ( p7 . verify ( [ ] , store ) )
6382 assert_equal ( data , p7 . data )
83+
84+ certs = p7 . certificates
6485 assert_equal ( 2 , certs . size )
65- assert_equal ( @ee1_cert . subject . to_s , certs [ 0 ] . subject . to_s )
66- assert_equal ( @ca_cert . subject . to_s , certs [ 1 ] . subject . to_s )
86+ assert_equal ( @ee1_cert . subject , certs [ 0 ] . subject )
87+ assert_equal ( @ca_cert . subject , certs [ 1 ] . subject )
88+
89+ signers = p7 . signers
6790 assert_equal ( 1 , signers . size )
6891 assert_equal ( @ee1_cert . serial , signers [ 0 ] . serial )
69- assert_equal ( @ee1_cert . issuer . to_s , signers [ 0 ] . issuer . to_s )
92+ assert_equal ( @ee1_cert . issuer , signers [ 0 ] . issuer )
7093 assert_raise ( OpenSSL ::PKCS7 ::PKCS7Error ) { signers [ 0 ] . signed_time }
94+ end
95+
96+ def test_signed_multiple_signers
97+ store = OpenSSL ::X509 ::Store . new
98+ store . add_cert ( @ca_cert )
7199
72100 # A signed-data which have multiple signatures can be created
73101 # through the following steps.
74102 # 1. create two signed-data
75103 # 2. copy signerInfo and certificate from one to another
76-
77- tmp1 = OpenSSL ::PKCS7 . sign ( @ee1_cert , @rsa1024 , data , [ ] , flag )
78- tmp2 = OpenSSL ::PKCS7 . sign ( @ee2_cert , @rsa1024 , data , [ ] , flag )
104+ data = "aaaaa \r \n bbbbb \r \n ccccc \r \n "
105+ tmp1 = OpenSSL ::PKCS7 . sign ( @ee1_cert , @ee1_key , data )
106+ tmp2 = OpenSSL ::PKCS7 . sign ( @ee2_cert , @ee2_key , data )
79107 tmp1 . add_signer ( tmp2 . signers [ 0 ] )
80108 tmp1 . add_certificate ( @ee2_cert )
81109
82110 p7 = OpenSSL ::PKCS7 . new ( tmp1 . to_der )
83- certs = p7 . certificates
84- signers = p7 . signers
85- assert ( p7 . verify ( [ ] , store ) )
111+ assert_true ( p7 . verify ( [ ] , store ) )
86112 assert_equal ( data , p7 . data )
113+
114+ certs = p7 . certificates
87115 assert_equal ( 2 , certs . size )
116+
117+ signers = p7 . signers
88118 assert_equal ( 2 , signers . size )
89119 assert_equal ( @ee1_cert . serial , signers [ 0 ] . serial )
90- assert_equal ( @ee1_cert . issuer . to_s , signers [ 0 ] . issuer . to_s )
120+ assert_equal ( @ee1_cert . issuer , signers [ 0 ] . issuer )
91121 assert_equal ( @ee2_cert . serial , signers [ 1 ] . serial )
92- assert_equal ( @ee2_cert . issuer . to_s , signers [ 1 ] . issuer . to_s )
122+ assert_equal ( @ee2_cert . issuer , signers [ 1 ] . issuer )
93123 end
94124
95125 def test_signed_add_signer
96126 data = "aaaaa\n bbbbb\n ccccc\n "
97- psi = OpenSSL ::PKCS7 ::SignerInfo . new ( @ee1_cert , @rsa1024 , "sha256" )
127+ psi = OpenSSL ::PKCS7 ::SignerInfo . new ( @ee1_cert , @ee1_key , "sha256" )
98128 p7 = OpenSSL ::PKCS7 . new
99129 p7 . type = :signed
100130 p7 . add_signer ( psi )
@@ -113,27 +143,33 @@ def test_signed_add_signer
113143 def test_detached_sign
114144 store = OpenSSL ::X509 ::Store . new
115145 store . add_cert ( @ca_cert )
116- ca_certs = [ @ca_cert ]
117146
118147 data = "aaaaa\n bbbbb\n ccccc\n "
148+ ca_certs = [ @ca_cert ]
119149 flag = OpenSSL ::PKCS7 ::BINARY |OpenSSL ::PKCS7 ::DETACHED
120- tmp = OpenSSL ::PKCS7 . sign ( @ee1_cert , @rsa1024 , data , ca_certs , flag )
150+ tmp = OpenSSL ::PKCS7 . sign ( @ee1_cert , @ee1_key , data , ca_certs , flag )
121151 p7 = OpenSSL ::PKCS7 . new ( tmp . to_der )
122- assert_nothing_raised do
123- OpenSSL ::ASN1 . decode ( p7 )
124- end
152+ assert_predicate ( p7 , :detached? )
153+ assert_true ( p7 . detached )
125154
126- certs = p7 . certificates
127- signers = p7 . signers
128- assert ( !p7 . verify ( [ ] , store ) )
129- assert ( p7 . verify ( [ ] , store , data ) )
155+ assert_false ( p7 . verify ( [ ] , store ) )
156+ # FIXME: Should it be nil?
157+ assert_equal ( "" , p7 . data )
158+ assert_match ( /no content|NO_CONTENT/ , p7 . error_string )
159+
160+ assert_true ( p7 . verify ( [ ] , store , data ) )
130161 assert_equal ( data , p7 . data )
162+ assert_nil ( p7 . error_string )
163+
164+ certs = p7 . certificates
131165 assert_equal ( 2 , certs . size )
132- assert_equal ( @ee1_cert . subject . to_s , certs [ 0 ] . subject . to_s )
133- assert_equal ( @ca_cert . subject . to_s , certs [ 1 ] . subject . to_s )
166+ assert_equal ( @ee1_cert . subject , certs [ 0 ] . subject )
167+ assert_equal ( @ca_cert . subject , certs [ 1 ] . subject )
168+
169+ signers = p7 . signers
134170 assert_equal ( 1 , signers . size )
135171 assert_equal ( @ee1_cert . serial , signers [ 0 ] . serial )
136- assert_equal ( @ee1_cert . issuer . to_s , signers [ 0 ] . issuer . to_s )
172+ assert_equal ( @ee1_cert . issuer , signers [ 0 ] . issuer )
137173 end
138174
139175 def test_signed_authenticated_attributes
@@ -181,6 +217,8 @@ def test_signed_authenticated_attributes
181217 end
182218
183219 def test_enveloped
220+ omit_on_fips # PKCS #1 v1.5 padding
221+
184222 certs = [ @ee1_cert , @ee2_cert ]
185223 cipher = OpenSSL ::Cipher ::AES . new ( "128-CBC" )
186224 data = "aaaaa\n bbbbb\n ccccc\n "
@@ -191,15 +229,20 @@ def test_enveloped
191229 assert_equal ( :enveloped , p7 . type )
192230 assert_equal ( 2 , recip . size )
193231
194- assert_equal ( @ca_cert . subject . to_s , recip [ 0 ] . issuer . to_s )
195- assert_equal ( 2 , recip [ 0 ] . serial )
196- assert_equal ( data , p7 . decrypt ( @rsa1024 , @ee1_cert ) )
232+ assert_equal ( @ca_cert . subject , recip [ 0 ] . issuer )
233+ assert_equal ( @ee1_cert . serial , recip [ 0 ] . serial )
234+ assert_equal ( 16 , @ee1_key . decrypt ( recip [ 0 ] . enc_key ) . size )
235+ assert_equal ( data , p7 . decrypt ( @ee1_key , @ee1_cert ) )
197236
198- assert_equal ( @ca_cert . subject . to_s , recip [ 1 ] . issuer . to_s )
199- assert_equal ( 3 , recip [ 1 ] . serial )
200- assert_equal ( data , p7 . decrypt ( @rsa1024 , @ee2_cert ) )
237+ assert_equal ( @ca_cert . subject , recip [ 1 ] . issuer )
238+ assert_equal ( @ee2_cert . serial , recip [ 1 ] . serial )
239+ assert_equal ( data , p7 . decrypt ( @ee2_key , @ee2_cert ) )
201240
202- assert_equal ( data , p7 . decrypt ( @rsa1024 ) )
241+ assert_equal ( data , p7 . decrypt ( @ee1_key ) )
242+
243+ assert_raise ( OpenSSL ::PKCS7 ::PKCS7Error ) {
244+ p7 . decrypt ( @ca_key , @ca_cert )
245+ }
203246
204247 # Default cipher has been removed in v3.3
205248 assert_raise_with_message ( ArgumentError , /RC2-40-CBC/ ) {
@@ -232,7 +275,8 @@ def test_data
232275 # PKCS7#verify can't distinguish verification failure and other errors
233276 store = OpenSSL ::X509 ::Store . new
234277 assert_equal ( false , p7 . verify ( [ @ee1_cert ] , store ) )
235- assert_raise ( OpenSSL ::PKCS7 ::PKCS7Error ) { p7 . decrypt ( @rsa1024 ) }
278+ assert_match ( /wrong content type|WRONG_CONTENT_TYPE/ , p7 . error_string )
279+ assert_raise ( OpenSSL ::PKCS7 ::PKCS7Error ) { p7 . decrypt ( @ee1_key ) }
236280 end
237281
238282 def test_empty_signed_data_ruby_bug_19974
@@ -293,7 +337,7 @@ def test_smime
293337 ca_certs = [ @ca_cert ]
294338
295339 data = "aaaaa\r \n bbbbb\r \n ccccc\r \n "
296- tmp = OpenSSL ::PKCS7 . sign ( @ee1_cert , @rsa1024 , data , ca_certs )
340+ tmp = OpenSSL ::PKCS7 . sign ( @ee1_cert , @ee1_key , data , ca_certs )
297341 p7 = OpenSSL ::PKCS7 . new ( tmp . to_der )
298342 smime = OpenSSL ::PKCS7 . write_smime ( p7 )
299343 assert_equal ( true , smime . start_with? ( <<END ) )
@@ -355,6 +399,8 @@ def test_degenerate_pkcs7
355399 end
356400
357401 def test_decode_ber_constructed_string
402+ omit_on_fips # PKCS #1 v1.5 padding
403+
358404 p7 = OpenSSL ::PKCS7 . encrypt ( [ @ee1_cert ] , "content" , "aes-128-cbc" )
359405
360406 # Make an equivalent BER to p7.to_der. Here we convert the encryptedContent
@@ -378,8 +424,8 @@ def test_decode_ber_constructed_string
378424 assert_not_equal ( p7 . to_der , asn1 . to_der )
379425 assert_equal ( p7 . to_der , OpenSSL ::PKCS7 . new ( asn1 . to_der ) . to_der )
380426
381- assert_equal ( "content" , OpenSSL ::PKCS7 . new ( p7 . to_der ) . decrypt ( @rsa1024 ) )
382- assert_equal ( "content" , OpenSSL ::PKCS7 . new ( asn1 . to_der ) . decrypt ( @rsa1024 ) )
427+ assert_equal ( "content" , OpenSSL ::PKCS7 . new ( p7 . to_der ) . decrypt ( @ee1_key ) )
428+ assert_equal ( "content" , OpenSSL ::PKCS7 . new ( asn1 . to_der ) . decrypt ( @ee1_key ) )
383429 end
384430end
385431
0 commit comments