SecCmsMessageRef Download::GetCmsMessageFromData (CFDataRef data) { // setup decoding SecCmsDecoderRef decoderContext; int result = SecCmsDecoderCreate (NULL, NULL, NULL, NULL, NULL, NULL, NULL, &decoderContext); if (result) { MacOSError::throwMe (errSecureDownloadInvalidTicket); } result = SecCmsDecoderUpdate (decoderContext, CFDataGetBytePtr (data), CFDataGetLength (data)); if (result) { SecCmsDecoderDestroy(decoderContext); MacOSError::throwMe (errSecureDownloadInvalidTicket); } SecCmsMessageRef message; result = SecCmsDecoderFinish (decoderContext, &message); if (result) { MacOSError::throwMe (errSecureDownloadInvalidTicket); } return message; }
/* * 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; }