SEC_PKCS7EncoderContext * SEC_PKCS7EncoderStart (SEC_PKCS7ContentInfo *cinfo, SEC_PKCS7EncoderOutputCallback outputfn, void *outputarg, PK11SymKey *bulkkey) { SEC_PKCS7EncoderContext *p7ecx; SECStatus rv; p7ecx = sec_pkcs7_encoder_start_contexts (cinfo, bulkkey); if (p7ecx == NULL) return NULL; p7ecx->output.outputfn = outputfn; p7ecx->output.outputarg = outputarg; /* * Initialize the BER encoder. */ p7ecx->ecx = SEC_ASN1EncoderStart (cinfo, sec_PKCS7ContentInfoTemplate, sec_pkcs7_encoder_out, &(p7ecx->output)); if (p7ecx->ecx == NULL) { PORT_Free (p7ecx); return NULL; } /* * Indicate that we are streaming. We will be streaming until we * get past the contents bytes. */ SEC_ASN1EncoderSetStreaming (p7ecx->ecx); /* * The notify function will watch for the contents field. */ SEC_ASN1EncoderSetNotifyProc (p7ecx->ecx, sec_pkcs7_encoder_notify, p7ecx); /* * This will encode everything up to the content bytes. (The notify * function will then cause the encoding to stop there.) Then our * caller can start passing contents bytes to our Update, which we * will pass along. */ rv = SEC_ASN1EncoderUpdate (p7ecx->ecx, NULL, 0); if (rv != SECSuccess) { PORT_Free (p7ecx); return NULL; } return p7ecx; }
SECStatus SEC_ASN1Encode (const void *src, const SEC_ASN1Template *theTemplate, SEC_ASN1WriteProc output_proc, void *output_arg) { SEC_ASN1EncoderContext *ecx; SECStatus rv; ecx = SEC_ASN1EncoderStart (src, theTemplate, output_proc, output_arg); if (ecx == NULL) return SECFailure; rv = SEC_ASN1EncoderUpdate (ecx, NULL, 0); SEC_ASN1EncoderFinish (ecx); return rv; }