|
1 | 1 | # coding: US-ASCII
|
| 2 | +require File.expand_path('../test_helper', File.dirname(__FILE__)) |
2 | 3 |
|
3 | 4 | module PKCS7Test
|
4 | 5 | class TestPKCS7 < TestCase
|
@@ -889,5 +890,98 @@ def test_enveloped
|
889 | 890 | end
|
890 | 891 |
|
891 | 892 | end
|
| 893 | + |
| 894 | + # NOTE: based on MRI's test_pkcs7.rb |
| 895 | + class TestOpenSSL < TestCase |
| 896 | + def setup |
| 897 | + @rsa1024 = Fixtures.pkey("rsa1024") |
| 898 | + @rsa2048 = Fixtures.pkey("rsa2048") |
| 899 | + ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA") |
| 900 | + ee1 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE1") |
| 901 | + ee2 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE2") |
| 902 | + |
| 903 | + ca_exts = [ |
| 904 | + ["basicConstraints","CA:TRUE",true], |
| 905 | + ["keyUsage","keyCertSign, cRLSign",true], |
| 906 | + ["subjectKeyIdentifier","hash",false], |
| 907 | + ["authorityKeyIdentifier","keyid:always",false], |
| 908 | + ] |
| 909 | + @ca_cert = issue_cert(ca, @rsa2048, 1, ca_exts, nil, nil) |
| 910 | + ee_exts = [ |
| 911 | + ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true], |
| 912 | + ["authorityKeyIdentifier","keyid:always",false], |
| 913 | + ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false], |
| 914 | + ] |
| 915 | + @ee1_cert = issue_cert(ee1, @rsa1024, 2, ee_exts, @ca_cert, @rsa2048) |
| 916 | + @ee2_cert = issue_cert(ee2, @rsa1024, 3, ee_exts, @ca_cert, @rsa2048) |
| 917 | + end |
| 918 | + |
| 919 | + def test_signed |
| 920 | + store = OpenSSL::X509::Store.new |
| 921 | + store.add_cert(@ca_cert) |
| 922 | + ca_certs = [@ca_cert] |
| 923 | + |
| 924 | + data = "aaaaa\r\nbbbbb\r\nccccc\r\n" |
| 925 | + tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs) |
| 926 | + p7 = OpenSSL::PKCS7.new(tmp.to_der) |
| 927 | + certs = p7.certificates |
| 928 | + signers = p7.signers |
| 929 | + assert(p7.verify([], store)) |
| 930 | + assert_equal(data, p7.data) |
| 931 | + assert_equal(2, certs.size) |
| 932 | + assert_equal(@ee1_cert.subject.to_s, certs[0].subject.to_s) |
| 933 | + assert_equal(@ca_cert.subject.to_s, certs[1].subject.to_s) |
| 934 | + assert_equal(1, signers.size) |
| 935 | + assert_equal(@ee1_cert.serial, signers[0].serial) |
| 936 | + assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s) |
| 937 | + |
| 938 | + # Normally OpenSSL tries to translate the supplied content into canonical |
| 939 | + # MIME format (e.g. a newline character is converted into CR+LF). |
| 940 | + # If the content is a binary, PKCS7::BINARY flag should be used. |
| 941 | + |
| 942 | + data = "aaaaa\nbbbbb\nccccc\n" |
| 943 | + flag = OpenSSL::PKCS7::BINARY |
| 944 | + tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs, flag) |
| 945 | + assert_equal OpenSSL::PKCS7, tmp.class |
| 946 | + |
| 947 | + p7 = OpenSSL::PKCS7.new(tmp.to_der) |
| 948 | + certs = p7.certificates |
| 949 | + signers = p7.signers |
| 950 | + assert(p7.verify([], store)) |
| 951 | + assert_equal(data, p7.data) |
| 952 | + assert_equal(2, certs.size) |
| 953 | + assert_equal(@ee1_cert.subject.to_s, certs[0].subject.to_s) |
| 954 | + assert_equal(@ca_cert.subject.to_s, certs[1].subject.to_s) |
| 955 | + assert_equal(1, signers.size) |
| 956 | + assert_equal(@ee1_cert.serial, signers[0].serial) |
| 957 | + assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s) |
| 958 | + |
| 959 | + # A signed-data which have multiple signatures can be created |
| 960 | + # through the following steps. |
| 961 | + # 1. create two signed-data |
| 962 | + # 2. copy signerInfo and certificate from one to another |
| 963 | + |
| 964 | + tmp1 = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, [], flag) |
| 965 | + tmp2 = OpenSSL::PKCS7.sign(@ee2_cert, @rsa1024, data, [], flag) |
| 966 | + tmp1.add_signer(tmp2.signers[0]) |
| 967 | + tmp1.add_certificate(@ee2_cert) |
| 968 | + |
| 969 | + p7 = OpenSSL::PKCS7.new(tmp1.to_der) |
| 970 | + certs = p7.certificates |
| 971 | + signers = p7.signers |
| 972 | + assert(p7.verify([], store)) |
| 973 | + assert_equal(data, p7.data) |
| 974 | + assert_equal(2, certs.size) |
| 975 | + assert_equal(2, signers.size) |
| 976 | + assert_equal(@ee1_cert.serial, signers[0].serial) |
| 977 | + assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s) |
| 978 | + assert_equal(@ee2_cert.serial, signers[1].serial) |
| 979 | + assert_equal(@ee2_cert.issuer.to_s, signers[1].issuer.to_s) |
| 980 | + |
| 981 | + assert signers[0].signed_time |
| 982 | + assert_equal Time, signers[1].signed_time.class |
| 983 | + end |
| 984 | + |
| 985 | + end |
892 | 986 | end
|
893 | 987 |
|
0 commit comments