2 * Copyright (c) 2003 - 2006 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 RCSID("$Id: cms.c,v 1.48 2007/01/08 18:45:03 lha Exp $");
37 #define ALLOC(X, N) (X) = calloc((N), sizeof(*(X)))
38 #define ALLOC_SEQ(X, N) do { (X)->len = (N); ALLOC((X)->val, (N)); } while(0)
41 hx509_cms_wrap_ContentInfo(const heim_oid *oid,
42 const heim_octet_string *buf,
43 heim_octet_string *res)
49 memset(res, 0, sizeof(*res));
50 memset(&ci, 0, sizeof(ci));
52 ret = der_copy_oid(oid, &ci.contentType);
56 if (ci.content == NULL) {
57 free_ContentInfo(&ci);
60 ci.content->data = malloc(buf->length);
61 if (ci.content->data == NULL) {
62 free_ContentInfo(&ci);
65 memcpy(ci.content->data, buf->data, buf->length);
66 ci.content->length = buf->length;
68 ASN1_MALLOC_ENCODE(ContentInfo, res->data, res->length, &ci, &size, ret);
69 free_ContentInfo(&ci);
72 if (res->length != size)
73 _hx509_abort("internal ASN.1 encoder error");
79 hx509_cms_unwrap_ContentInfo(const heim_octet_string *in,
81 heim_octet_string *out,
88 memset(oid, 0, sizeof(*oid));
89 memset(out, 0, sizeof(*out));
91 ret = decode_ContentInfo(in->data, in->length, &ci, &size);
95 ret = der_copy_oid(&ci.contentType, oid);
97 free_ContentInfo(&ci);
101 ret = der_copy_octet_string(ci.content, out);
104 free_ContentInfo(&ci);
108 memset(out, 0, sizeof(*out));
111 *have_data = (ci.content != NULL) ? 1 : 0;
113 free_ContentInfo(&ci);
119 fill_CMSIdentifier(const hx509_cert cert, CMSIdentifier *id)
124 id->element = choice_CMSIdentifier_issuerAndSerialNumber;
125 ret = hx509_cert_get_issuer(cert, &name);
128 ret = copy_Name(&name->der_name,
129 &id->u.issuerAndSerialNumber.issuer);
130 hx509_name_free(&name);
134 ret = hx509_cert_get_serialnumber(cert,
135 &id->u.issuerAndSerialNumber.serialNumber);
140 unparse_CMSIdentifier(hx509_context context,
147 switch (id->element) {
148 case choice_CMSIdentifier_issuerAndSerialNumber: {
149 IssuerAndSerialNumber *iasn;
152 iasn = &id->u.issuerAndSerialNumber;
154 ret = _hx509_Name_to_string(&iasn->issuer, &name);
157 ret = der_print_hex_heim_integer(&iasn->serialNumber, &serial);
162 asprintf(str, "certificate issued by %s with serial number %s",
168 case choice_CMSIdentifier_subjectKeyIdentifier: {
169 KeyIdentifier *ki = &id->u.subjectKeyIdentifier;
173 len = hex_encode(ki->data, ki->length, &keyid);
177 asprintf(str, "certificate with id %s", keyid);
182 asprintf(str, "certificate have unknown CMSidentifier type");
191 find_CMSIdentifier(hx509_context context,
192 CMSIdentifier *client,
194 hx509_cert *signer_cert,
202 memset(&c, 0, sizeof(c));
203 _hx509_query_clear(&q);
207 switch (client->element) {
208 case choice_CMSIdentifier_issuerAndSerialNumber:
209 q.serial = &client->u.issuerAndSerialNumber.serialNumber;
210 q.issuer_name = &client->u.issuerAndSerialNumber.issuer;
211 q.match = HX509_QUERY_MATCH_SERIALNUMBER|HX509_QUERY_MATCH_ISSUER_NAME;
213 case choice_CMSIdentifier_subjectKeyIdentifier:
214 q.subject_id = &client->u.subjectKeyIdentifier;
215 q.match = HX509_QUERY_MATCH_SUBJECT_KEY_ID;
218 hx509_set_error_string(context, 0, HX509_CMS_NO_RECIPIENT_CERTIFICATE,
219 "unknown CMS identifier element");
220 return HX509_CMS_NO_RECIPIENT_CERTIFICATE;
225 q.match |= HX509_QUERY_MATCH_TIME;
226 q.timenow = time(NULL);
228 ret = hx509_certs_find(context, certs, &q, &cert);
229 if (ret == HX509_CERT_NOT_FOUND) {
232 ret = unparse_CMSIdentifier(context, client, &str);
234 hx509_set_error_string(context, 0,
235 HX509_CMS_NO_RECIPIENT_CERTIFICATE,
236 "Failed to find %s", str);
238 hx509_clear_error_string(context);
239 return HX509_CMS_NO_RECIPIENT_CERTIFICATE;
241 hx509_set_error_string(context, HX509_ERROR_APPEND,
242 HX509_CMS_NO_RECIPIENT_CERTIFICATE,
243 "Failed to find CMS id in cert store");
244 return HX509_CMS_NO_RECIPIENT_CERTIFICATE;
253 hx509_cms_unenvelope(hx509_context context,
258 const heim_octet_string *encryptedContent,
259 heim_oid *contentType,
260 heim_octet_string *content)
262 heim_octet_string key;
265 AlgorithmIdentifier *ai;
266 const heim_octet_string *enccontent;
267 heim_octet_string *params, params_data;
268 heim_octet_string ivec;
270 int ret, i, matched = 0, findflags = 0;
273 memset(&key, 0, sizeof(key));
274 memset(&ed, 0, sizeof(ed));
275 memset(&ivec, 0, sizeof(ivec));
276 memset(content, 0, sizeof(*content));
277 memset(contentType, 0, sizeof(*contentType));
279 if ((flags & HX509_CMS_UE_DONT_REQUIRE_KU_ENCIPHERMENT) == 0)
280 findflags |= HX509_QUERY_KU_ENCIPHERMENT;
282 ret = decode_EnvelopedData(data, length, &ed, &size);
284 hx509_set_error_string(context, 0, ret,
285 "Failed to decode EnvelopedData");
289 if (ed.recipientInfos.len == 0) {
290 ret = HX509_CMS_NO_RECIPIENT_CERTIFICATE;
291 hx509_set_error_string(context, 0, ret,
292 "No recipient info in enveloped data");
296 enccontent = ed.encryptedContentInfo.encryptedContent;
297 if (enccontent == NULL) {
298 if (encryptedContent == NULL) {
299 ret = HX509_CMS_NO_DATA_AVAILABLE;
300 hx509_set_error_string(context, 0, ret,
301 "Content missing from encrypted data");
304 enccontent = encryptedContent;
308 for (i = 0; i < ed.recipientInfos.len; i++) {
309 KeyTransRecipientInfo *ri;
313 ri = &ed.recipientInfos.val[i];
315 /* ret = search_keyset(ri,
317 * ki->keyEncryptionAlgorithm.algorithm);
320 ret = find_CMSIdentifier(context, &ri->rid, certs, &cert,
321 HX509_QUERY_PRIVATE_KEY|findflags);
325 matched = 1; /* found a matching certificate, let decrypt */
327 ret = _hx509_cert_private_decrypt(context,
329 &ri->keyEncryptionAlgorithm.algorithm,
332 hx509_cert_free(cert);
334 break; /* succuessfully decrypted cert */
336 ret2 = unparse_CMSIdentifier(context, &ri->rid, &str);
338 hx509_set_error_string(context, HX509_ERROR_APPEND, ret,
339 "Failed to decrypt with %s", str);
345 ret = HX509_CMS_NO_RECIPIENT_CERTIFICATE;
346 hx509_set_error_string(context, 0, ret,
347 "No private key matched any certificate");
352 ret = HX509_CMS_NO_RECIPIENT_CERTIFICATE;
353 hx509_set_error_string(context, HX509_ERROR_APPEND, ret,
354 "No private key decrypted the transfer key");
358 ret = der_copy_oid(&ed.encryptedContentInfo.contentType, contentType);
360 hx509_set_error_string(context, 0, ret,
361 "Failed to copy EnvelopedData content oid");
365 ai = &ed.encryptedContentInfo.contentEncryptionAlgorithm;
366 if (ai->parameters) {
367 params_data.data = ai->parameters->data;
368 params_data.length = ai->parameters->length;
369 params = ¶ms_data;
376 ret = hx509_crypto_init(context, NULL, &ai->algorithm, &crypto);
381 ret = hx509_crypto_set_params(context, crypto, params, &ivec);
383 hx509_crypto_destroy(crypto);
388 ret = hx509_crypto_set_key_data(crypto, key.data, key.length);
390 hx509_crypto_destroy(crypto);
391 hx509_set_error_string(context, 0, ret,
392 "Failed to set key for decryption "
397 ret = hx509_crypto_decrypt(crypto,
400 ivec.length ? &ivec : NULL,
402 hx509_crypto_destroy(crypto);
404 hx509_set_error_string(context, 0, ret,
405 "Failed to decrypt EnvelopedData");
412 free_EnvelopedData(&ed);
413 der_free_octet_string(&key);
415 der_free_octet_string(&ivec);
417 der_free_oid(contentType);
418 der_free_octet_string(content);
425 hx509_cms_envelope_1(hx509_context context,
429 const heim_oid *encryption_type,
430 const heim_oid *contentType,
431 heim_octet_string *content)
433 KeyTransRecipientInfo *ri;
434 heim_octet_string ivec;
435 heim_octet_string key;
436 hx509_crypto crypto = NULL;
441 memset(&ivec, 0, sizeof(ivec));
442 memset(&key, 0, sizeof(key));
443 memset(&ed, 0, sizeof(ed));
444 memset(content, 0, sizeof(*content));
446 if (encryption_type == NULL)
447 encryption_type = oid_id_aes_256_cbc();
449 ret = _hx509_check_key_usage(context, cert, 1 << 2, TRUE);
453 ret = hx509_crypto_init(context, NULL, encryption_type, &crypto);
457 ret = hx509_crypto_set_random_key(crypto, &key);
459 hx509_set_error_string(context, 0, ret,
460 "Create random key for EnvelopedData content");
464 ret = hx509_crypto_encrypt(crypto,
468 &ed.encryptedContentInfo.encryptedContent);
470 hx509_set_error_string(context, 0, ret,
471 "Failed to encrypt EnvelopedData content");
476 AlgorithmIdentifier *enc_alg;
477 enc_alg = &ed.encryptedContentInfo.contentEncryptionAlgorithm;
478 ret = der_copy_oid(encryption_type, &enc_alg->algorithm);
480 hx509_set_error_string(context, 0, ret,
481 "Failed to set crypto oid "
482 "for EnvelopedData");
485 ALLOC(enc_alg->parameters, 1);
486 if (enc_alg->parameters == NULL) {
488 hx509_set_error_string(context, 0, ret,
489 "Failed to allocate crypto paramaters "
490 "for EnvelopedData");
494 ret = hx509_crypto_get_params(context,
497 enc_alg->parameters);
503 ALLOC_SEQ(&ed.recipientInfos, 1);
504 if (ed.recipientInfos.val == NULL) {
506 hx509_set_error_string(context, 0, ret,
507 "Failed to allocate recipients info "
508 "for EnvelopedData");
512 ri = &ed.recipientInfos.val[0];
515 ret = fill_CMSIdentifier(cert, &ri->rid);
517 hx509_set_error_string(context, 0, ret,
518 "Failed to set CMS identifier info "
519 "for EnvelopedData");
523 ret = _hx509_cert_public_encrypt(context,
525 &ri->keyEncryptionAlgorithm.algorithm,
528 hx509_set_error_string(context, HX509_ERROR_APPEND, ret,
529 "Failed to encrypt transport key for "
539 ed.originatorInfo = NULL;
541 ret = der_copy_oid(contentType, &ed.encryptedContentInfo.contentType);
543 hx509_set_error_string(context, 0, ret,
544 "Failed to copy content oid for "
549 ed.unprotectedAttrs = NULL;
551 ASN1_MALLOC_ENCODE(EnvelopedData, content->data, content->length,
554 hx509_set_error_string(context, 0, ret,
555 "Failed to encode EnvelopedData");
558 if (size != content->length)
559 _hx509_abort("internal ASN.1 encoder error");
563 hx509_crypto_destroy(crypto);
565 der_free_octet_string(content);
566 der_free_octet_string(&key);
567 der_free_octet_string(&ivec);
568 free_EnvelopedData(&ed);
574 any_to_certs(hx509_context context, const SignedData *sd, hx509_certs certs)
578 if (sd->certificates == NULL)
581 for (i = 0; i < sd->certificates->len; i++) {
585 const void *p = sd->certificates->val[i].data;
586 size_t size, length = sd->certificates->val[i].length;
588 ret = decode_Certificate(p, length, &cert, &size);
590 hx509_set_error_string(context, 0, ret,
591 "Failed to decode certificate %d "
592 "in SignedData.certificates", i);
596 ret = hx509_cert_init(context, &cert, &c);
597 free_Certificate(&cert);
600 ret = hx509_certs_add(context, certs, c);
609 static const Attribute *
610 find_attribute(const CMSAttributes *attr, const heim_oid *oid)
613 for (i = 0; i < attr->len; i++)
614 if (der_heim_oid_cmp(&attr->val[i].type, oid) == 0)
615 return &attr->val[i];
620 hx509_cms_verify_signed(hx509_context context,
621 hx509_verify_ctx ctx,
625 heim_oid *contentType,
626 heim_octet_string *content,
627 hx509_certs *signer_certs)
629 SignerInfo *signer_info;
630 hx509_cert cert = NULL;
631 hx509_certs certs = NULL;
634 int ret, i, found_valid_sig;
636 *signer_certs = NULL;
637 content->data = NULL;
639 contentType->length = 0;
640 contentType->components = NULL;
642 memset(&sd, 0, sizeof(sd));
644 ret = decode_SignedData(data, length, &sd, &size);
646 hx509_set_error_string(context, 0, ret,
647 "Failed to decode SignedData");
651 if (sd.encapContentInfo.eContent == NULL) {
652 ret = HX509_CMS_NO_DATA_AVAILABLE;
653 hx509_set_error_string(context, 0, ret,
654 "No content data in SignedData");
658 ret = hx509_certs_init(context, "MEMORY:cms-cert-buffer",
663 ret = hx509_certs_init(context, "MEMORY:cms-signer-certs",
664 0, NULL, signer_certs);
668 /* XXX Check CMS version */
670 ret = any_to_certs(context, &sd, certs);
675 ret = hx509_certs_merge(context, certs, store);
680 for (found_valid_sig = 0, i = 0; i < sd.signerInfos.len; i++) {
681 heim_octet_string *signed_data;
682 const heim_oid *match_oid;
685 signer_info = &sd.signerInfos.val[i];
688 if (signer_info->signature.length == 0) {
689 ret = HX509_CMS_MISSING_SIGNER_DATA;
690 hx509_set_error_string(context, 0, ret,
691 "SignerInfo %d in SignedData "
692 "missing sigature", i);
696 ret = find_CMSIdentifier(context, &signer_info->sid, certs, &cert,
697 HX509_QUERY_KU_DIGITALSIGNATURE);
701 if (signer_info->signedAttrs) {
702 const Attribute *attr;
705 heim_octet_string os;
707 sa.val = signer_info->signedAttrs->val;
708 sa.len = signer_info->signedAttrs->len;
710 /* verify that sigature exists */
711 attr = find_attribute(&sa, oid_id_pkcs9_messageDigest());
713 ret = HX509_CRYPTO_SIGNATURE_MISSING;
714 hx509_set_error_string(context, 0, ret,
715 "SignerInfo have signed attributes "
716 "but messageDigest (signature) "
720 if (attr->value.len != 1) {
721 ret = HX509_CRYPTO_SIGNATURE_MISSING;
722 hx509_set_error_string(context, 0, ret,
723 "SignerInfo have more then one "
724 "messageDigest (signature)");
728 ret = decode_MessageDigest(attr->value.val[0].data,
729 attr->value.val[0].length,
733 hx509_set_error_string(context, 0, ret,
735 "messageDigest (signature)");
739 ret = _hx509_verify_signature(context,
741 &signer_info->digestAlgorithm,
742 sd.encapContentInfo.eContent,
744 der_free_octet_string(&os);
746 hx509_set_error_string(context, HX509_ERROR_APPEND, ret,
747 "Failed to verify messageDigest");
752 * Fetch content oid inside signedAttrs or set it to
755 attr = find_attribute(&sa, oid_id_pkcs9_contentType());
757 match_oid = oid_id_pkcs7_data();
759 if (attr->value.len != 1) {
760 ret = HX509_CMS_DATA_OID_MISMATCH;
761 hx509_set_error_string(context, 0, ret,
762 "More then one oid in signedAttrs");
766 ret = decode_ContentType(attr->value.val[0].data,
767 attr->value.val[0].length,
771 hx509_set_error_string(context, 0, ret,
773 "oid in signedAttrs");
776 match_oid = &decode_oid;
779 ALLOC(signed_data, 1);
780 if (signed_data == NULL) {
781 if (match_oid == &decode_oid)
782 der_free_oid(&decode_oid);
784 hx509_clear_error_string(context);
788 ASN1_MALLOC_ENCODE(CMSAttributes,
794 if (match_oid == &decode_oid)
795 der_free_oid(&decode_oid);
797 hx509_clear_error_string(context);
800 if (size != signed_data->length)
801 _hx509_abort("internal ASN.1 encoder error");
804 signed_data = sd.encapContentInfo.eContent;
805 match_oid = oid_id_pkcs7_data();
808 if (der_heim_oid_cmp(match_oid, &sd.encapContentInfo.eContentType)) {
809 ret = HX509_CMS_DATA_OID_MISMATCH;
810 hx509_set_error_string(context, 0, ret,
811 "Oid in message mismatch from the expected");
813 if (match_oid == &decode_oid)
814 der_free_oid(&decode_oid);
817 ret = hx509_verify_signature(context,
819 &signer_info->signatureAlgorithm,
821 &signer_info->signature);
823 hx509_set_error_string(context, HX509_ERROR_APPEND, ret,
824 "Failed to verify sigature in "
827 if (signed_data != sd.encapContentInfo.eContent) {
828 der_free_octet_string(signed_data);
834 ret = hx509_verify_path(context, ctx, cert, certs);
838 ret = hx509_certs_add(context, *signer_certs, cert);
846 hx509_cert_free(cert);
849 if (found_valid_sig == 0) {
851 ret = HX509_CMS_SIGNER_NOT_FOUND;
852 hx509_set_error_string(context, 0, ret,
853 "No signers where found");
858 ret = der_copy_oid(&sd.encapContentInfo.eContentType, contentType);
860 hx509_clear_error_string(context);
864 content->data = malloc(sd.encapContentInfo.eContent->length);
865 if (content->data == NULL) {
866 hx509_clear_error_string(context);
870 content->length = sd.encapContentInfo.eContent->length;
871 memcpy(content->data,sd.encapContentInfo.eContent->data,content->length);
874 free_SignedData(&sd);
876 hx509_certs_free(&certs);
879 hx509_certs_free(signer_certs);
880 der_free_oid(contentType);
881 der_free_octet_string(content);
888 _hx509_set_digest_alg(DigestAlgorithmIdentifier *id,
890 void *param, size_t length)
894 id->parameters = malloc(sizeof(*id->parameters));
895 if (id->parameters == NULL)
897 id->parameters->data = malloc(length);
898 if (id->parameters->data == NULL) {
899 free(id->parameters);
900 id->parameters = NULL;
903 memcpy(id->parameters->data, param, length);
904 id->parameters->length = length;
906 id->parameters = NULL;
907 ret = der_copy_oid(oid, &id->algorithm);
909 if (id->parameters) {
910 free(id->parameters->data);
911 free(id->parameters);
912 id->parameters = NULL;
920 add_one_attribute(Attribute **attr,
923 heim_octet_string *data)
928 d = realloc(*attr, sizeof((*attr)[0]) * (*len + 1));
933 ret = der_copy_oid(oid, &(*attr)[*len].type);
937 ALLOC_SEQ(&(*attr)[*len].value, 1);
938 if ((*attr)[*len].value.val == NULL) {
939 der_free_oid(&(*attr)[*len].type);
943 (*attr)[*len].value.val[0].data = data->data;
944 (*attr)[*len].value.val[0].length = data->length;
952 hx509_cms_create_signed_1(hx509_context context,
953 const heim_oid *eContentType,
954 const void *data, size_t length,
955 const AlgorithmIdentifier *digest_alg,
957 hx509_peer_info peer,
960 heim_octet_string *signed_data)
962 AlgorithmIdentifier digest;
964 SignerInfo *signer_info;
965 heim_octet_string buf;
971 memset(&sd, 0, sizeof(sd));
972 memset(&name, 0, sizeof(name));
973 memset(&path, 0, sizeof(path));
974 memset(&digest, 0, sizeof(digest));
976 if (_hx509_cert_private_key(cert) == NULL) {
977 hx509_set_error_string(context, 0, HX509_PRIVATE_KEY_MISSING,
978 "Private key missing for signing");
979 return HX509_PRIVATE_KEY_MISSING;
982 if (digest_alg == NULL) {
983 ret = hx509_crypto_select(context, HX509_SELECT_DIGEST,
984 _hx509_cert_private_key(cert), peer, &digest);
986 ret = copy_AlgorithmIdentifier(digest_alg, &digest);
988 hx509_clear_error_string(context);
993 sd.version = CMSVersion_v3;
995 der_copy_oid(eContentType, &sd.encapContentInfo.eContentType);
996 ALLOC(sd.encapContentInfo.eContent, 1);
997 if (sd.encapContentInfo.eContent == NULL) {
998 hx509_clear_error_string(context);
1003 sd.encapContentInfo.eContent->data = malloc(length);
1004 if (sd.encapContentInfo.eContent->data == NULL) {
1005 hx509_clear_error_string(context);
1009 memcpy(sd.encapContentInfo.eContent->data, data, length);
1010 sd.encapContentInfo.eContent->length = length;
1012 ALLOC_SEQ(&sd.signerInfos, 1);
1013 if (sd.signerInfos.val == NULL) {
1014 hx509_clear_error_string(context);
1019 signer_info = &sd.signerInfos.val[0];
1021 signer_info->version = 1;
1023 ret = fill_CMSIdentifier(cert, &signer_info->sid);
1025 hx509_clear_error_string(context);
1029 signer_info->signedAttrs = NULL;
1030 signer_info->unsignedAttrs = NULL;
1032 ALLOC(signer_info->signedAttrs, 1);
1033 if (signer_info->signedAttrs == NULL) {
1039 heim_octet_string data;
1041 ret = copy_AlgorithmIdentifier(&digest, &signer_info->digestAlgorithm);
1043 hx509_clear_error_string(context);
1047 ret = _hx509_create_signature(context,
1050 sd.encapContentInfo.eContent,
1054 hx509_clear_error_string(context);
1058 ASN1_MALLOC_ENCODE(MessageDigest,
1064 der_free_octet_string(&data);
1066 hx509_clear_error_string(context);
1069 if (size != buf.length)
1070 _hx509_abort("internal ASN.1 encoder error");
1072 ret = add_one_attribute(&signer_info->signedAttrs->val,
1073 &signer_info->signedAttrs->len,
1074 oid_id_pkcs9_messageDigest(),
1077 hx509_clear_error_string(context);
1083 if (der_heim_oid_cmp(eContentType, oid_id_pkcs7_data()) != 0) {
1085 ASN1_MALLOC_ENCODE(ContentType,
1093 if (size != buf.length)
1094 _hx509_abort("internal ASN.1 encoder error");
1096 ret = add_one_attribute(&signer_info->signedAttrs->val,
1097 &signer_info->signedAttrs->len,
1098 oid_id_pkcs9_contentType(),
1101 hx509_clear_error_string(context);
1109 heim_octet_string os;
1111 sa.val = signer_info->signedAttrs->val;
1112 sa.len = signer_info->signedAttrs->len;
1114 ASN1_MALLOC_ENCODE(CMSAttributes,
1121 hx509_clear_error_string(context);
1124 if (size != os.length)
1125 _hx509_abort("internal ASN.1 encoder error");
1127 ret = _hx509_create_signature(context,
1128 _hx509_cert_private_key(cert),
1129 hx509_signature_rsa_with_sha1(),
1131 &signer_info->signatureAlgorithm,
1132 &signer_info->signature);
1134 der_free_octet_string(&os);
1136 hx509_clear_error_string(context);
1141 ALLOC_SEQ(&sd.digestAlgorithms, 1);
1142 if (sd.digestAlgorithms.val == NULL) {
1144 hx509_clear_error_string(context);
1148 ret = copy_AlgorithmIdentifier(&digest, &sd.digestAlgorithms.val[0]);
1150 hx509_clear_error_string(context);
1155 * Provide best effort path
1158 _hx509_calculate_path(context,
1159 HX509_CALCULATE_PATH_NO_ANCHOR,
1167 _hx509_path_append(context, &path, cert);
1173 ALLOC(sd.certificates, 1);
1174 if (sd.certificates == NULL) {
1175 hx509_clear_error_string(context);
1179 ALLOC_SEQ(sd.certificates, path.len);
1180 if (sd.certificates->val == NULL) {
1181 hx509_clear_error_string(context);
1186 for (i = 0; i < path.len; i++) {
1187 ASN1_MALLOC_ENCODE(Certificate,
1188 sd.certificates->val[i].data,
1189 sd.certificates->val[i].length,
1190 _hx509_get_cert(path.val[i]),
1193 hx509_clear_error_string(context);
1196 if (sd.certificates->val[i].length != size)
1197 _hx509_abort("internal ASN.1 encoder error");
1201 ASN1_MALLOC_ENCODE(SignedData,
1202 signed_data->data, signed_data->length,
1205 hx509_clear_error_string(context);
1208 if (signed_data->length != size)
1209 _hx509_abort("internal ASN.1 encoder error");
1212 free_AlgorithmIdentifier(&digest);
1213 _hx509_path_free(&path);
1214 free_SignedData(&sd);
1220 hx509_cms_decrypt_encrypted(hx509_context context,
1224 heim_oid *contentType,
1225 heim_octet_string *content)
1227 heim_octet_string cont;
1228 CMSEncryptedData ed;
1229 AlgorithmIdentifier *ai;
1232 memset(content, 0, sizeof(*content));
1233 memset(&cont, 0, sizeof(cont));
1235 ret = decode_CMSEncryptedData(data, length, &ed, NULL);
1237 hx509_set_error_string(context, 0, ret,
1238 "Failed to decode CMSEncryptedData");
1242 if (ed.encryptedContentInfo.encryptedContent == NULL) {
1243 ret = HX509_CMS_NO_DATA_AVAILABLE;
1244 hx509_set_error_string(context, 0, ret,
1245 "No content in EncryptedData");
1249 ret = der_copy_oid(&ed.encryptedContentInfo.contentType, contentType);
1251 hx509_clear_error_string(context);
1255 ai = &ed.encryptedContentInfo.contentEncryptionAlgorithm;
1256 if (ai->parameters == NULL) {
1257 ret = HX509_ALG_NOT_SUPP;
1258 hx509_clear_error_string(context);
1262 ret = _hx509_pbe_decrypt(context,
1265 ed.encryptedContentInfo.encryptedContent,
1277 free_CMSEncryptedData(&ed);