void openssl_pkcs7_enveloped() { int len; FILE *fp; PKCS7 *p7; PKCS7_RECIP_INFO *inf; unsigned char *der, *p; const unsigned char edata[COMM_LEN] = "info...."; const unsigned char ekeys[COMM_LEN] = "key info...."; p7 = PKCS7_new(); PKCS7_set_type(p7, NID_pkcs7_enveloped); ASN1_INTEGER_set(p7->d.enveloped->version, 3); inf = PKCS7_RECIP_INFO_new(); ASN1_INTEGER_set(inf->version, 4); ASN1_INTEGER_set(inf->issuer_and_serial->serial, 888888); inf->key_enc_algor->algorithm = OBJ_nid2obj(NID_des_ede3_cbc); ASN1_OCTET_STRING_set(inf->enc_key, ekeys, 12); sk_PKCS7_RECIP_INFO_push(p7->d.enveloped->recipientinfo, inf); p7->d.enveloped->enc_data->algorithm->algorithm = OBJ_nid2obj(NID_des_ede3_cbc); p7->d.enveloped->enc_data->enc_data = ASN1_OCTET_STRING_new(); ASN1_OCTET_STRING_set(p7->d.enveloped->enc_data->enc_data, edata, 8); len = i2d_PKCS7(p7, NULL); der = (unsigned char *)malloc(len); p = der; len = i2d_PKCS7(p7, &p); fp = fopen("/tmp/test.cer", "wb"); fwrite(der, 1, len, fp); fclose(fp); free(der); PKCS7_free(p7); p7 = PKCS7_new(); PKCS7_set_type(p7, NID_pkcs7_signedAndEnveloped); len = i2d_PKCS7(p7, NULL); der = (unsigned char *)malloc(len); p = der; len = i2d_PKCS7(p7, &p); fp = fopen("/tmp/testEnv.cer", "wb"); fwrite(der, 1, len, fp); fclose(fp); PKCS7_free(p7); free(der); }
int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri) { int i; STACK_OF(PKCS7_RECIP_INFO) *sk; i=OBJ_obj2nid(p7->type); switch (i) { case NID_pkcs7_signedAndEnveloped: sk= p7->d.signed_and_enveloped->recipientinfo; break; case NID_pkcs7_enveloped: sk= p7->d.enveloped->recipientinfo; break; default: PKCS7err(PKCS7_F_PKCS7_ADD_RECIPIENT_INFO,PKCS7_R_WRONG_CONTENT_TYPE); return(0); } sk_PKCS7_RECIP_INFO_push(sk,ri); return(1); }