int generate_sattr_blob(pesign_context *ctx) { int rc; SECItem sa; SpcContentInfo ci; memset(&ci, '\0', sizeof (ci)); rc = generate_spc_content_info(ctx->cms_ctx, &ci); if (rc < 0) { fprintf(stderr, "Could not generate content info: %s\n", PORT_ErrorToString(PORT_GetError())); exit(1); } rc = generate_signed_attributes(ctx->cms_ctx, &sa); if (rc < 0) { fprintf(stderr, "Could not generate signed attributes: %s\n", PORT_ErrorToString(PORT_GetError())); exit(1); } return write(ctx->outsattrsfd, sa.data, sa.len); }
int generate_spc_signed_data(SECItem *sdp, cms_context *ctx) { SignedData sd; if (!sdp) return -1; memset(&sd, '\0', sizeof (sd)); if (SEC_ASN1EncodeInteger(ctx->arena, &sd.version, 1) == NULL) return -1; if (generate_algorithm_id_list(&sd.algorithms, ctx) < 0) goto err; if (generate_spc_content_info(&sd.cinfo, ctx) < 0) goto err_algorithms; if (generate_certificate_list(&sd.certificates, ctx) < 0) goto err_cinfo; sd.crls = NULL; if (generate_signerInfo_list(&sd.signerInfos, ctx) < 0) goto err_certificate_list; SECItem encoded = { 0, }; if (SEC_ASN1EncodeItem(ctx->arena, &encoded, &sd, SignedDataTemplate) == NULL) { fprintf(stderr, "Could not encode SignedData: %s\n", PORT_ErrorToString(PORT_GetError())); goto err_signer_infos; } ContentInfo sdw; memset(&sdw, '\0', sizeof (sdw)); SECOidData *oid = SECOID_FindOIDByTag(SEC_OID_PKCS7_SIGNED_DATA); memcpy(&sdw.contentType, &oid->oid, sizeof (sdw.contentType)); memcpy(&sdw.content, &encoded, sizeof (sdw.content)); SECItem wrapper = { 0, }; if (SEC_ASN1EncodeItem(ctx->arena, &wrapper, &sdw, ContentInfoTemplate) == NULL) { fprintf(stderr, "Could not encode SignedData: %s\n", PORT_ErrorToString(PORT_GetError())); goto err_signed_data; } memcpy(sdp, &wrapper, sizeof(*sdp)); return 0; err_signed_data: SECITEM_FreeItem(&encoded, PR_FALSE); err_signer_infos: free_signerInfo_list(sd.signerInfos, ctx); err_certificate_list: free_certificate_list(sd.certificates, ctx); err_cinfo: free_spc_content_info(&sd.cinfo, ctx); err_algorithms: free_algorithm_list(sd.algorithms, ctx); err: #if 0 SECITEM_FreeItem(&sd.version, PR_TRUE); #endif return -1; }