static int check_signer_name(CMS_ContentInfo *cms, const char *name) { STACK_OF(CMS_SignerInfo) *infos = CMS_get0_SignerInfos(cms); STACK_OF(X509) *crts; int i, ret = 1; if ((name == NULL) || (name[0] == '\0')) return 0; crts = CMS_get1_certs(cms); for (i = 0; i < sk_CMS_SignerInfo_num(infos); ++i) { CMS_SignerInfo *si = sk_CMS_SignerInfo_value(infos, i); int j; for (j = 0; j < sk_X509_num(crts); ++j) { X509 *crt = sk_X509_value(crts, j); if (CMS_SignerInfo_cert_cmp(si, crt) == 0) { ret = check_common_name( X509_get_subject_name(crt), name); } } } sk_X509_pop_free(crts, X509_free); return ret; }
STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms) { STACK_OF(X509) *signers = NULL; STACK_OF(CMS_SignerInfo) *sinfos; CMS_SignerInfo *si; int i; sinfos = CMS_get0_SignerInfos(cms); for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { si = sk_CMS_SignerInfo_value(sinfos, i); if (si->signer) { if (!signers) { signers = sk_X509_new_null(); if (!signers) return NULL; } if (!sk_X509_push(signers, si->signer)) { sk_X509_free(signers); return NULL; } } } return signers; }
static void cms_sd_set_version(CMS_SignedData *sd) { int i; CMS_CertificateChoices *cch; CMS_RevocationInfoChoice *rch; CMS_SignerInfo *si; for (i = 0; i < sk_CMS_CertificateChoices_num(sd->certificates); i++) { cch = sk_CMS_CertificateChoices_value(sd->certificates, i); if (cch->type == CMS_CERTCHOICE_OTHER) { if (sd->version < 5) sd->version = 5; } else if (cch->type == CMS_CERTCHOICE_V2ACERT) { if (sd->version < 4) sd->version = 4; } else if (cch->type == CMS_CERTCHOICE_V1ACERT) { if (sd->version < 3) sd->version = 3; } } for (i = 0; i < sk_CMS_RevocationInfoChoice_num(sd->crls); i++) { rch = sk_CMS_RevocationInfoChoice_value(sd->crls, i); if (rch->type == CMS_REVCHOICE_OTHER) { if (sd->version < 5) sd->version = 5; } } if ((OBJ_obj2nid(sd->encapContentInfo->eContentType) != NID_pkcs7_data) && (sd->version < 3)) sd->version = 3; for (i = 0; i < sk_CMS_SignerInfo_num(sd->signerInfos); i++) { si = sk_CMS_SignerInfo_value(sd->signerInfos, i); if (si->sid->type == CMS_SIGNERINFO_KEYIDENTIFIER) { if (si->version < 3) si->version = 3; if (sd->version < 3) sd->version = 3; } else sd->version = 1; } if (sd->version < 1) sd->version = 1; }
static int cms_copy_messageDigest(CMS_ContentInfo *cms, CMS_SignerInfo *si) { STACK_OF(CMS_SignerInfo) *sinfos; CMS_SignerInfo *sitmp; int i; sinfos = CMS_get0_SignerInfos(cms); for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { ASN1_OCTET_STRING *messageDigest; sitmp = sk_CMS_SignerInfo_value(sinfos, i); if (sitmp == si) continue; if (CMS_signed_get_attr_count(sitmp) < 0) continue; if (OBJ_cmp(si->digestAlgorithm->algorithm, sitmp->digestAlgorithm->algorithm)) continue; messageDigest = CMS_signed_get0_data_by_OBJ(sitmp, OBJ_nid2obj(NID_pkcs9_messageDigest), -3, V_ASN1_OCTET_STRING); if (!messageDigest) { CMSerr(CMS_F_CMS_COPY_MESSAGEDIGEST, CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE); return 0; } if (CMS_signed_add1_attr_by_NID(si, NID_pkcs9_messageDigest, V_ASN1_OCTET_STRING, messageDigest, -1)) return 1; else return 0; } CMSerr(CMS_F_CMS_COPY_MESSAGEDIGEST, CMS_R_NO_MATCHING_DIGEST); return 0; }