int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, const unsigned char *key, size_t keylen, BIO *dcont, BIO *out, unsigned int flags) { BIO *cont; int r; if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_encrypted) { CMSerr(CMS_F_CMS_ENCRYPTEDDATA_DECRYPT, CMS_R_TYPE_NOT_ENCRYPTED_DATA); return 0; } if (!dcont && !check_content(cms)) return 0; if (CMS_EncryptedData_set1_key(cms, NULL, key, keylen) <= 0) return 0; cont = CMS_dataInit(cms, dcont); if (!cont) return 0; r = cms_copy_content(out, cont, flags); do_free_upto(cont, dcont); return r; }
/* CMS streaming support */ static int cms_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg) { ASN1_STREAM_ARG *sarg = exarg; CMS_ContentInfo *cms = NULL; if (pval) cms = (CMS_ContentInfo *)*pval; else return 1; switch (operation) { case ASN1_OP_STREAM_PRE: if (CMS_stream(&sarg->boundary, cms) <= 0) return 0; case ASN1_OP_DETACHED_PRE: sarg->ndef_bio = CMS_dataInit(cms, sarg->out); if (!sarg->ndef_bio) return 0; break; case ASN1_OP_STREAM_POST: case ASN1_OP_DETACHED_POST: if (CMS_dataFinal(cms, sarg->ndef_bio) <= 0) return 0; break; } return 1; }
static int openssl_cms_datainit(lua_State *L) { CMS_ContentInfo *cms = CHECK_OBJECT(1, CMS_ContentInfo, "openssl.cms"); BIO* icont = load_bio_object(L, 2); icont = CMS_dataInit(cms, icont); PUSH_OBJECT(icont, "openssl.bio"); return 1; }
int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags) { BIO *cont; int r; if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_data) { CMSerr(CMS_F_CMS_DATA, CMS_R_TYPE_NOT_DATA); return 0; } cont = CMS_dataInit(cms, NULL); if (!cont) return 0; r = cms_copy_content(out, cont, flags); BIO_free_all(cont); return r; }
/* Callback for int_smime_write_ASN1 */ static int cms_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, const ASN1_ITEM *it) { CMS_ContentInfo *cms = (CMS_ContentInfo *)val; BIO *tmpbio, *cmsbio; int r = 0; if (!(flags & SMIME_DETACHED)) { SMIME_crlf_copy(data, out, flags); return 1; } /* Let CMS code prepend any needed BIOs */ cmsbio = CMS_dataInit(cms, out); if (!cmsbio) return 0; /* Copy data across, passing through filter BIOs for processing */ SMIME_crlf_copy(data, cmsbio, flags); /* Finalize structure */ if (CMS_dataFinal(cms, cmsbio) <= 0) goto err; r = 1; err: /* Now remove any digests prepended to the BIO */ while (cmsbio != out) { tmpbio = BIO_pop(cmsbio); BIO_free(cmsbio); cmsbio = tmpbio; } return r; }
int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, unsigned int flags) { BIO *cont; int r; if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_digest) { CMSerr(CMS_F_CMS_DIGEST_VERIFY, CMS_R_TYPE_NOT_DIGESTED_DATA); return 0; } if (!dcont && !check_content(cms)) return 0; cont = CMS_dataInit(cms, dcont); if (!cont) return 0; r = cms_copy_content(out, cont, flags); if (r) r = cms_DigestedData_do_final(cms, cont, 1); do_free_upto(cont, dcont); return r; }