5 * Created by on 9/28/09.
6 * Copyright 2009 Apple Inc. All rights reserved.
9 #include "si-64-ossl-cms/attached_no_data_signed_data.h"
10 #include "si-64-ossl-cms/attached_signed_data.h"
11 #include "si-64-ossl-cms/detached_content.h"
12 #include "si-64-ossl-cms/detached_signed_data.h"
13 #include "si-64-ossl-cms/signer.h"
14 #include "si-64-ossl-cms/privkey.h"
16 #include <CoreFoundation/CoreFoundation.h>
17 #include <Security/SecCMS.h>
18 #include <Security/SecRSAKey.h>
19 #include <Security/SecCertificatePriv.h>
20 #include <Security/SecIdentityPriv.h>
21 #include <utilities/SecCFWrappers.h>
24 #include <AssertMacros.h>
26 #include "Security_regressions.h"
29 openssl req -new -newkey rsa:512 -x509 -nodes -subj "/O=foo/CN=bar" -out signer.pem
30 echo -n "hoi joh" > detached_content
31 openssl smime -sign -outform der -signer signer.pem -in detached_content -inkey privkey.pem -out detached_signed_data.der
32 openssl smime -nodetach -sign -outform der -signer test.pem -in detached_content -inkey privkey.pem -out attached_signed_data.der
33 openssl smime -nodetach -sign -outform der -signer test.pem -inkey privkey.pem -out attached_no_data_signed_data.der < /dev/null
35 xxd -i detached_content > detached_content.h
36 xxd -i attached_no_data_signed_data.der > attached_no_data_signed_data.h
37 xxd -i attached_signed_data.der > attached_signed_data.h
38 xxd -i detached_signed_data.der > detached_signed_data.h
40 openssl x509 -in test.pem -outform der -out signer.der
41 xxd -i signer.der > signer.h
48 35 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
52 48 NDEF: OCTET STRING {
54 50 7: OCTET STRING 'hoi joh'
64 41 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
68 54 7: OCTET STRING 'hoi joh'
77 35 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
84 41 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
92 35 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
96 48 NDEF: OCTET STRING {
107 41 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
112 : Error: Object has zero length.
120 static inline void write_data(const char * path
, CFDataRef data
)
122 int data_file
= open(path
, O_CREAT
|O_WRONLY
|O_TRUNC
, 0644);
123 write(data_file
, CFDataGetBytePtr(data
), CFDataGetLength(data
));
127 static void tests(void)
129 CFDataRef attached_signed_data
= CFDataCreateWithBytesNoCopy(kCFAllocatorDefault
, attached_signed_data_der
, attached_signed_data_der_len
, kCFAllocatorNull
);
130 CFDataRef detached_signed_data
= CFDataCreateWithBytesNoCopy(kCFAllocatorDefault
, detached_signed_data_der
, detached_signed_data_der_len
, kCFAllocatorNull
);
131 CFDataRef attached_no_data_signed_data
= CFDataCreateWithBytesNoCopy(kCFAllocatorDefault
, attached_no_data_signed_data_der
, attached_no_data_signed_data_der_len
, kCFAllocatorNull
);
132 CFDataRef detached_data
= CFDataCreateWithBytesNoCopy(kCFAllocatorDefault
, detached_content
, detached_content_len
, kCFAllocatorNull
);
133 CFDataRef no_data
= CFDataCreate(kCFAllocatorDefault
, NULL
, 0);
134 SecPolicyRef policy
= SecPolicyCreateBasicX509();
135 SecTrustRef trust
= NULL
;
137 ok_status(SecCMSVerifyCopyDataAndAttributes(attached_signed_data
, NULL
, policy
, &trust
, NULL
, NULL
), "verify attached data");
139 ok_status(SecCMSVerifyCopyDataAndAttributes(detached_signed_data
, detached_data
, policy
, &trust
, NULL
, NULL
), "verify detached data");
141 ok_status(SecCMSVerifyCopyDataAndAttributes(attached_no_data_signed_data
, NULL
, policy
, &trust
, NULL
, NULL
), "verify attached no data");
143 ok_status(SecCMSVerifyCopyDataAndAttributes(attached_no_data_signed_data
, no_data
, policy
, &trust
, NULL
, NULL
), "verify attached no data");
147 SecCertificateRef cert
= NULL
;
148 SecKeyRef privKey
= NULL
;
149 SecIdentityRef identity
= NULL
;
151 isnt(cert
= SecCertificateCreateWithBytes(NULL
, signer_der
, signer_der_len
), NULL
, "create certificate");
152 isnt(privKey
= SecKeyCreateRSAPrivateKey(NULL
, privkey_der
, privkey_der_len
, kSecKeyEncodingPkcs1
), NULL
, "create private key");
153 isnt(identity
= SecIdentityCreate(NULL
, cert
, privKey
), NULL
, "create identity");
154 CFReleaseSafe(privKey
);
156 CFMutableDataRef cms_data
= CFDataCreateMutable(kCFAllocatorDefault
, 0);
157 ok_status(SecCMSCreateSignedData(identity
, detached_data
, NULL
, NULL
, cms_data
), "create attached data");
158 //write_data("/var/tmp/attached", cms_data);
159 CFDataSetLength(cms_data
, 0);
160 CFDictionaryRef detached_cms_dict
= CFDictionaryCreate(kCFAllocatorDefault
, &kSecCMSSignDetached
, (const void **)&kCFBooleanTrue
, 1, NULL
, NULL
);
161 ok_status(SecCMSCreateSignedData(identity
, detached_data
, detached_cms_dict
, NULL
, cms_data
), "create attached data");
162 CFRelease(detached_cms_dict
);
163 //write_data("/var/tmp/detached", cms_data);
164 CFDataSetLength(cms_data
, 0);
165 ok_status(SecCMSCreateSignedData(identity
, NULL
, NULL
, NULL
, cms_data
), "create attached data");
166 //write_data("/var/tmp/empty_attached", cms_data);
168 CFReleaseSafe(cms_data
);
170 CFReleaseNull(identity
);
171 CFRelease(attached_signed_data
);
172 CFRelease(detached_signed_data
);
173 CFRelease(attached_no_data_signed_data
);
174 CFRelease(detached_data
);
179 int si_64_ossl_cms(int argc
, char *const *argv
)