* CMSEncoder.c - encode, sign, and/or encrypt CMS messages.
*/
-#include "CMSEncoder.h"
+#include <Security/CMSEncoder.h>
+#include <Security/CMSPrivate.h>
#include "CMSUtils.h"
#include <Security/SecBase.h>
#include <Security/SecCmsEncoder.h>
CMSCertificateChainMode chainMode;
CFDataRef hashAgilityAttrValue;
CFDictionaryRef hashAgilityV2AttrValues;
+ CFAbsoluteTime expirationTime;
};
static void cmsEncoderInit(CFTypeRef enc);
// CFStringRef: OID representation is a dotted-decimal string
CFStringRef inStr = (CFStringRef)inRef;
CFIndex max = CFStringGetLength(inStr) * 3;
- char buf[max];
- if (!CFStringGetCString(inStr, buf, max-1, kCFStringEncodingASCII))
+ char *buf = (char *)malloc(max);
+ if (!buf) {
+ return errSecMemoryError;
+ }
+ if (!CFStringGetCString(inStr, buf, max-1, kCFStringEncodingASCII)) {
+ free(buf);
return errSecParam;
+ }
- if(encodeOid((unsigned char *)buf, &oidData, &oidLen) != 0)
+ if (encodeOid((unsigned char *)buf, &oidData, &oidLen) != 0) {
+ free(buf);
return errSecParam;
+ }
+ free(buf);
}
else if (CFGetTypeID(inRef) == CFDataGetTypeID()) {
// CFDataRef: OID representation is in binary DER format
case kCMSCertificateChainWithRoot:
chainMode = SecCmsCMCertChainWithRoot;
break;
+ case kCMSCertificateChainWithRootOrFail:
+ chainMode = SecCmsCMCertChainWithRootOrFail;
+ break;
default:
break;
}
break;
}
}
+ if (cmsEncoder->signedAttributes & kCMSAttrAppleExpirationTime) {
+ ortn = SecCmsSignerInfoAddAppleExpirationTime(signerInfo, cmsEncoder->expirationTime);
+ if(ortn) {
+ ortn = cmsRtnToOSStatus(ortn);
+ CSSM_PERROR("SecCmsSignerInfoAddAppleExpirationTime", ortn);
+ break;
+ }
+ }
CFRELEASE(ourCert);
ourCert = NULL;
return errSecSuccess;
}
+/*
+ * Set the expiration time for a CMSEncoder.
+ * This is only used if the kCMSAttrAppleExpirationTime attribute is included.
+ */
+OSStatus CMSEncoderSetAppleExpirationTime(
+ CMSEncoderRef cmsEncoder,
+ CFAbsoluteTime time)
+{
+ if(cmsEncoder == NULL) {
+ return errSecParam;
+ }
+ if(cmsEncoder->encState != ES_Init) {
+ return errSecParam;
+ }
+ cmsEncoder->expirationTime = time;
+ return errSecSuccess;
+}
+
OSStatus CMSEncoderSetCertificateChainMode(
CMSEncoderRef cmsEncoder,
CMSCertificateChainMode chainMode)
case kCMSCertificateSignerOnly:
case kCMSCertificateChain:
case kCMSCertificateChainWithRoot:
+ case kCMSCertificateChainWithRootOrFail:
break;
default:
return errSecParam;