static OSStatus cmsSetupEncoder( CMSEncoderRef cmsEncoder) { OSStatus ortn; ASSERT(cmsEncoder->arena == NULL); ASSERT(cmsEncoder->encoder == NULL); ortn = SecArenaPoolCreate(1024, &cmsEncoder->arena); if(ortn) { return cmsRtnToOSStatus(ortn); } ortn = SecCmsEncoderCreate(cmsEncoder->cmsMsg, NULL, NULL, // no callback &cmsEncoder->encoderOut, // data goes here cmsEncoder->arena, NULL, NULL, // no password callback (right?) NULL, NULL, // decrypt key callback NULL, NULL, // detached digests &cmsEncoder->encoder); if(ortn) { return cmsRtnToOSStatus(ortn); } return errSecSuccess; }
/* * Feed raw bytes of the message to be decoded into the decoder. Can be called * multiple times. */ OSStatus CMSDecoderUpdateMessage( CMSDecoderRef cmsDecoder, const void *msgBytes, size_t msgBytesLen) { if(cmsDecoder == NULL) { return errSecParam; } OSStatus ortn; switch(cmsDecoder->decState) { case DS_Init: /* First time through; set up */ ASSERT(cmsDecoder->decoder == NULL); ASSERT(cmsDecoder->arena == NULL); ortn = SecArenaPoolCreate(1024, &cmsDecoder->arena); if(ortn) { return cmsRtnToOSStatus(ortn); } ortn = SecCmsDecoderCreate(cmsDecoder->arena, NULL, NULL, NULL, NULL, NULL, NULL, &cmsDecoder->decoder); if(ortn) { ortn = cmsRtnToOSStatus(ortn); CSSM_PERROR("SecCmsDecoderCreate", ortn); return ortn; } cmsDecoder->decState = DS_Updating; break; case DS_Updating: ASSERT(cmsDecoder->decoder != NULL); break; case DS_Final: /* Too late for another update */ return errSecParam; default: dprintf("CMSDecoderUpdateMessage: bad decState\n"); return errSecInternalComponent; } /* FIXME - CFIndex same size as size_t on 64bit? */ ortn = SecCmsDecoderUpdate(cmsDecoder->decoder, msgBytes, (CFIndex)msgBytesLen); if(ortn) { ortn = cmsRtnToOSStatus(ortn, errSecUnknownFormat); CSSM_PERROR("SecCmsDecoderUpdate", ortn); } return ortn; }