Skip to content

Commit df9cb6a

Browse files
authored
Merge pull request #921 from rhenium/ky/pkcs7-add-more-tests
pkcs7: clean up tests
2 parents 85ce82d + 58f0022 commit df9cb6a

File tree

3 files changed

+117
-71
lines changed

3 files changed

+117
-71
lines changed

Rakefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ Rake::TestTask.new(:test_fips_internal) do |t|
3434
'test/openssl/test_ns_spki.rb',
3535
'test/openssl/test_ocsp.rb',
3636
'test/openssl/test_pkcs12.rb',
37-
'test/openssl/test_pkcs7.rb',
3837
'test/openssl/test_ssl.rb',
3938
'test/openssl/test_ts.rb',
4039
'test/openssl/test_x509cert.rb',

ext/openssl/ossl_pkcs7.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,6 @@ ossl_pkcs7_verify(int argc, VALUE *argv, VALUE self)
770770
BIO *in, *out;
771771
PKCS7 *p7;
772772
VALUE data;
773-
const char *msg;
774773

775774
GetPKCS7(self, p7);
776775
rb_scan_args(argc, argv, "22", &certs, &store, &indata, &flags);
@@ -794,14 +793,16 @@ ossl_pkcs7_verify(int argc, VALUE *argv, VALUE self)
794793
ok = PKCS7_verify(p7, x509s, x509st, in, out, flg);
795794
BIO_free(in);
796795
sk_X509_pop_free(x509s, X509_free);
797-
if (ok < 0) ossl_raise(ePKCS7Error, "PKCS7_verify");
798-
msg = ERR_reason_error_string(ERR_peek_error());
799-
ossl_pkcs7_set_err_string(self, msg ? rb_str_new2(msg) : Qnil);
800-
ossl_clear_error();
801796
data = ossl_membio2str(out);
802797
ossl_pkcs7_set_data(self, data);
803-
804-
return (ok == 1) ? Qtrue : Qfalse;
798+
if (ok != 1) {
799+
const char *msg = ERR_reason_error_string(ERR_peek_error());
800+
ossl_pkcs7_set_err_string(self, msg ? rb_str_new_cstr(msg) : Qnil);
801+
ossl_clear_error();
802+
return Qfalse;
803+
}
804+
ossl_pkcs7_set_err_string(self, Qnil);
805+
return Qtrue;
805806
}
806807

807808
static VALUE

test/openssl/test_pkcs7.rb

Lines changed: 109 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -6,95 +6,125 @@
66
class 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\nbbbbb\nccccc\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\nbbbbb\nccccc\n", tmp.data)
41+
assert_nil(tmp.error_string)
3542

36-
data = "aaaaa\r\nbbbbb\r\nccccc\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\nbbbbb\r\nccccc\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\nbbbbb\nccccc\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\nbbbbb\r\nccccc\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\nbbbbb\nccccc\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\nbbbbb\nccccc\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\nbbbbb\nccccc\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\nbbbbb\r\nccccc\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
384430
end
385431

0 commit comments

Comments
 (0)