2  * Copyright (c) 2006-2012 Apple Inc. All Rights Reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. Please obtain a copy of the License at 
  10  * http://www.opensource.apple.com/apsl/ and read it before using this 
  13  * The Original Code and all software distributed under the License are 
  14  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  15  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  16  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  17  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  18  * Please see the License for the specific language governing rights and 
  19  * limitations under the License. 
  21  * @APPLE_LICENSE_HEADER_END@ 
  25  * CMSEncoder.h - encode, sign, and/or encrypt messages in the Cryptographic 
  26  *                                Message Syntax (CMS), per RFC 3852. 
  28  * A CMS message can be signed, encrypted, or both. A message can be signed by 
  29  * an arbitrary number of signers; in this module, signers are expressed as 
  30  * SecIdentityRefs. A message can be encrypted for an arbitrary number of 
  31  * recipients; recipients are expressed here as SecCertificateRefs.  
  33  * In CMS terminology, this module performs encryption using the EnvelopedData  
  34  * ContentType and signing using the SignedData ContentType. 
  36  * If the message is both signed and encrypted, it uses "nested ContentInfos"  
  37  * in CMS terminology; in this implementation, signed & encrypted messages  
  38  * are implemented as an EnvelopedData containing a SignedData.  
  41 #ifndef _CMS_ENCODER_H_ 
  42 #define _CMS_ENCODER_H_ 
  44 #include <CoreFoundation/CoreFoundation.h> 
  45 #include <Security/cssmtype.h> 
  52 CF_ASSUME_NONNULL_BEGIN
 
  55  * Opaque reference to a CMS encoder object.  
  56  * This is a CF object, with standard CF semantics; dispose of it 
  59 typedef struct CF_BRIDGED_TYPE(id
) _CMSEncoder 
*CMSEncoderRef
; 
  61 CFTypeID 
CMSEncoderGetTypeID(void) 
  62     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
  65  * Create a CMSEncoder. Result must eventually be freed via CFRelease(). 
  67 OSStatus 
CMSEncoderCreate( 
  68         CMSEncoderRef 
* __nonnull CF_RETURNS_RETAINED cmsEncoderOut
)    /* RETURNED */ 
  69         __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
  71 extern const CFStringRef kCMSEncoderDigestAlgorithmSHA1
; 
  72 extern const CFStringRef kCMSEncoderDigestAlgorithmSHA256
; 
  74 OSStatus 
CMSEncoderSetSignerAlgorithm( 
  75         CMSEncoderRef           cmsEncoder
, 
  76         CFStringRef             digestAlgorithm
) 
  77     __OSX_AVAILABLE_STARTING(__MAC_10_11
, __IPHONE_NA
); 
  80  * Specify signers of the CMS message; implies that the message will be signed.  
  82  * -- Caller can pass in one signer, as a SecIdentityRef, or an array of  
  83  *    signers, as a CFArray of SecIdentityRefs.  
  84  * -- Can be called multiple times.  
  85  * -- If the message is not to be signed, don't call this.   
  86  * -- If this is called, it must be called before the first call to  
  87  *    CMSEncoderUpdateContent(). 
  89 OSStatus 
CMSEncoderAddSigners( 
  90         CMSEncoderRef           cmsEncoder
, 
  91         CFTypeRef                       signerOrArray
) 
  92     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
  95  * Obtain an array of signers as specified in CMSEncoderSetSigners().  
  96  * Returns a NULL signers array if CMSEncoderSetSigners() has not been called.   
  97  * Caller must CFRelease the result.  
  99 OSStatus 
CMSEncoderCopySigners( 
 100         CMSEncoderRef           cmsEncoder
, 
 101         CFArrayRef 
* __nonnull CF_RETURNS_RETAINED signersOut
)          /* RETURNED */ 
 102     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 105  * Specify recipients of the message. Implies that the message will  
 108  * -- Caller can pass in one recipient, as a SecCertificateRef, or an  
 109  *    array of recipients, as a CFArray of SecCertificateRefs.  
 110  * -- Can be called multiple times.  
 111  * -- If the message is not to be encrypted, don't call this.   
 112  * -- If this is called, it must be called before the first call to  
 113  *    CMSEncoderUpdateContent(). 
 115 OSStatus 
CMSEncoderAddRecipients( 
 116         CMSEncoderRef           cmsEncoder
, 
 117         CFTypeRef                       recipientOrArray
) 
 118     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 121  * Obtain an array of recipients as specified in CMSEncoderSetRecipients().  
 122  * Returns a NULL recipients array if CMSEncoderSetRecipients() has not been  
 124  * Caller must CFRelease the result.  
 126 OSStatus 
CMSEncoderCopyRecipients( 
 127         CMSEncoderRef           cmsEncoder
, 
 128         CFArrayRef 
* __nonnull CF_RETURNS_RETAINED recipientsOut
)       /* RETURNED */ 
 129     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 132  * A signed message optionally includes the data to be signed. If the message 
 133  * is *not* to include the data to be signed, call this function with a value 
 134  * of TRUE for detachedContent. The default, if this function is not called, 
 135  * is detachedContent=FALSE, i.e., the message contains the data to be signed. 
 137  * -- Encrypted messages can not use detached content. (This restriction  
 138  *    also applies to messages that are both signed and encrypted.) 
 139  * -- If this is called, it must be called before the first call to  
 140  *    CMSEncoderUpdateContent(). 
 142 OSStatus 
CMSEncoderSetHasDetachedContent( 
 143         CMSEncoderRef           cmsEncoder
, 
 144         Boolean                 detachedContent
) 
 145     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 148  * Obtain a Boolean indicating whether the current message will have detached  
 150  * Returns the value specified in CMSEncoderHasDetachedContent() if that 
 151  * function has been called; else returns the default FALSE. 
 153 OSStatus 
CMSEncoderGetHasDetachedContent( 
 154         CMSEncoderRef           cmsEncoder
, 
 155         Boolean                 
*detachedContentOut
)    /* RETURNED */ 
 156     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 159  * Optionally specify an eContentType OID for the inner EncapsulatedData for 
 160  * a signed message. The default eContentType, used if this function is not 
 161  * called, is id-data (which is the normal eContentType for applications such 
 164  * If this is called, it must be called before the first call to  
 165  * CMSEncoderUpdateContent(). 
 167  * NOTE: This function is deprecated in Mac OS X 10.7 and later; 
 168  * please use CMSEncoderSetEncapsulatedContentTypeOID() instead. 
 170 OSStatus 
CMSEncoderSetEncapsulatedContentType( 
 171         CMSEncoderRef           cmsEncoder
, 
 172         const CSSM_OID  
*eContentType
) 
 173         /* DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER; */ 
 174     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 177  * Optionally specify an eContentType OID for the inner EncapsulatedData for 
 178  * a signed message. The default eContentTypeOID, used if this function is not 
 179  * called, is id-data (which is the normal eContentType for applications such 
 182  * The eContentTypeOID parameter may be specified as a CF string, e.g.: 
 183  * CFSTR("1.2.840.113549.1.7.1") 
 185  * If this is called, it must be called before the first call to  
 186  * CMSEncoderUpdateContent(). 
 188 OSStatus 
CMSEncoderSetEncapsulatedContentTypeOID( 
 189         CMSEncoderRef           cmsEncoder
, 
 190         CFTypeRef                       eContentTypeOID
) 
 191     __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_NA
); 
 194  * Obtain the eContentType OID specified in CMSEncoderSetEncapsulatedContentType(). 
 195  * If CMSEncoderSetEncapsulatedContentType() has not been called this returns a  
 197  * The returned OID's data is in the same format as the data provided to  
 198  * CMSEncoderSetEncapsulatedContentType;, i.e., it's the encoded content of  
 199  * the OID, not including the tag and length bytes.  
 201 OSStatus 
CMSEncoderCopyEncapsulatedContentType( 
 202         CMSEncoderRef           cmsEncoder
, 
 203         CFDataRef 
* __nonnull CF_RETURNS_RETAINED eContentTypeOut
)              /* RETURNED */ 
 204     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 207  * Signed CMS messages can contain arbitrary sets of certificates beyond those 
 208  * indicating the identity of the signer(s). This function provides a means of  
 209  * adding these other certs. For normal signed messages it is not necessary to  
 210  * call this; the signer cert(s) and the intermediate certs needed to verify the 
 211  * signer(s) will be included in the message implicitly.  
 213  * -- Caller can pass in one cert, as a SecCertificateRef, or an array of certs, 
 214  *    as a CFArray of SecCertificateRefs.  
 215  * -- If this is called, it must be called before the first call to  
 216  *    CMSEncoderUpdateContent(). 
 217  * -- There is a "special case" use of CMS messages which involves neither 
 218  *    signing nor encryption, but does include certificates. This is commonly 
 219  *    used to transport "bags" of certificates. When constructing such a  
 220  *    message, all an application needs to do is to create a CMSEncoderRef, 
 221  *    call CMSEncoderAddSupportingCerts() one or more times, and then call  
 222  *    CMSEncoderCopyEncodedContent() to get the resulting cert bag. No 'content' 
 223  *    need be specified. (This is in fact the primary intended use for 
 226 OSStatus 
CMSEncoderAddSupportingCerts( 
 227         CMSEncoderRef           cmsEncoder
, 
 228         CFTypeRef                       certOrArray
) 
 229     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 232  * Obtain the SecCertificates provided in CMSEncoderAddSupportingCerts().  
 233  * If CMSEncoderAddSupportingCerts() has not been called this will return a 
 234  * NULL value for *certs. 
 235  * Caller must CFRelease the result. 
 237 OSStatus 
CMSEncoderCopySupportingCerts( 
 238         CMSEncoderRef           cmsEncoder
, 
 239         CFArrayRef 
* __nonnull CF_RETURNS_RETAINED certsOut
)                    /* RETURNED */ 
 240     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 243  * Standard signed attributes, optionally specified in  
 244  * CMSEncoderAddSignedAttributes(). 
 246 typedef CF_ENUM(uint32_t, CMSSignedAttributes
) { 
 247         kCMSAttrNone                                            
= 0x0000, 
 249      * S/MIME Capabilities - identifies supported signature, encryption, and 
 252     kCMSAttrSmimeCapabilities                   
= 0x0001, 
 254      * Indicates that a cert is the preferred cert for S/MIME encryption. 
 256     kCMSAttrSmimeEncryptionKeyPrefs             
= 0x0002, 
 258      * Same as kCMSSmimeEncryptionKeyPrefs, using an attribute OID preferred 
 261     kCMSAttrSmimeMSEncryptionKeyPrefs   
= 0x0004, 
 263      * Include the signing time. 
 265     kCMSAttrSigningTime                                 
= 0x0008 
 269  * Optionally specify signed attributes. Only meaningful when creating a  
 270  * signed message. If this is called, it must be called before 
 271  * CMSEncoderUpdateContent(). 
 273 OSStatus 
CMSEncoderAddSignedAttributes( 
 274         CMSEncoderRef           cmsEncoder
, 
 275         CMSSignedAttributes     signedAttributes
) 
 276     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 279  * Specification of what certificates to include in a signed message. 
 281 typedef CF_ENUM(uint32_t, CMSCertificateChainMode
) { 
 282         kCMSCertificateNone 
= 0,                /* don't include any certificates */ 
 283         kCMSCertificateSignerOnly
,              /* only include signer certificate(s) */ 
 284         kCMSCertificateChain
,                   /* signer certificate chain up to but not  
 285                                                                          *   including root certiticate */  
 286         kCMSCertificateChainWithRoot    
/* signer certificate chain including root */ 
 290  * Optionally specify which certificates, if any, to include in a  
 291  * signed CMS message. The default, if this is not called, is 
 292  * kCMSCertificateChain, in which case the signer cert plus all CA 
 293  * certs needed to verify the signer cert, except for the root  
 294  * cert, are included. 
 295  * If this is called, it must be called before 
 296  * CMSEncoderUpdateContent(). 
 298 OSStatus 
CMSEncoderSetCertificateChainMode( 
 299         CMSEncoderRef                   cmsEncoder
, 
 300         CMSCertificateChainMode chainMode
) 
 301     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 304  * Obtain indication of which signer certs are to be included 
 305  * in a signed CMS message.  
 307 OSStatus 
CMSEncoderGetCertificateChainMode( 
 308         CMSEncoderRef                   cmsEncoder
, 
 309         CMSCertificateChainMode 
*chainModeOut
) 
 310     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 313  * Feed content bytes into the encoder.  
 314  * Can be called multiple times.  
 315  * No 'setter' routines can be called after this function has been called.  
 317 OSStatus 
CMSEncoderUpdateContent( 
 318         CMSEncoderRef           cmsEncoder
, 
 321     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 324  * Finish encoding the message and obtain the encoded result. 
 325  * Caller must CFRelease the result.  
 327 OSStatus 
CMSEncoderCopyEncodedContent( 
 328         CMSEncoderRef           cmsEncoder
, 
 329         CFDataRef 
* __nonnull CF_RETURNS_RETAINED encodedContentOut
)    /* RETURNED */ 
 330     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 333  * High-level, one-shot encoder function. 
 335  * Inputs (all except for content optional, though at least one  
 336  *         of {signers, recipients} must be non-NULL) 
 337  * ------------------------------------------------------------ 
 338  * signers          : signer identities. Either a SecIdentityRef, or a  
 340  * recipients       : recipient certificates. Either a SecCertificateRef,  
 341  *                    or a CFArray of them. 
 342  * eContentType     : contentType for inner EncapsulatedData. 
 343  * detachedContent  : when true, do not include the signed data in the message. 
 344  * signedAttributes : Specifies which standard signed attributes are to be  
 345  *                    included in the message.  
 346  * content          : raw content to be signed and/or encrypted. 
 350  * encodedContent   : the result of the encoding. 
 352  * NOTE: This function is deprecated in Mac OS X 10.7 and later; 
 353  * please use CMSEncodeContent() instead. 
 356         CFTypeRef __nullable        signers
, 
 357         CFTypeRef __nullable        recipients
, 
 358         const CSSM_OID 
* __nullable eContentType
, 
 359         Boolean                     detachedContent
, 
 360         CMSSignedAttributes         signedAttributes
, 
 361         const void *                content
, 
 363         CFDataRef 
* __nonnull CF_RETURNS_RETAINED encodedContentOut
)    /* RETURNED */ 
 364         /* DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER; */ 
 365     __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_NA
); 
 369  * High-level, one-shot encoder function. 
 371  * Inputs (all except for content optional, though at least one  
 372  *         of {signers, recipients} must be non-NULL) 
 373  * ------------------------------------------------------------ 
 374  * signers          : signer identities. Either a SecIdentityRef, or a  
 376  * recipients       : recipient certificates. Either a SecCertificateRef,  
 377  *                    or a CFArray of them. 
 378  * eContentTypeOID  : contentType OID for inner EncapsulatedData, e.g.: 
 379  *                    CFSTR("1.2.840.113549.1.7.1") 
 380  * detachedContent  : when true, do not include the signed data in the message. 
 381  * signedAttributes : Specifies which standard signed attributes are to be  
 382  *                    included in the message.  
 383  * content          : raw content to be signed and/or encrypted. 
 387  * encodedContent   : the result of the encoding. 
 389 OSStatus 
CMSEncodeContent( 
 390         CFTypeRef __nullable    signers
, 
 391         CFTypeRef __nullable    recipients
, 
 392         CFTypeRef __nullable    eContentTypeOID
, 
 393         Boolean                 detachedContent
, 
 394         CMSSignedAttributes     signedAttributes
, 
 397         CFDataRef 
* __nullable CF_RETURNS_RETAINED encodedContentOut
)   /* RETURNED */ 
 398     __OSX_AVAILABLE_STARTING(__MAC_10_7
, __IPHONE_NA
); 
 400 OSStatus 
CMSEncoderCopySignerTimestamp( 
 401         CMSEncoderRef           cmsEncoder
, 
 402         size_t                          signerIndex
,        /* usually 0 */ 
 403         CFAbsoluteTime      
*timestamp
)                 /* RETURNED */ 
 404     __OSX_AVAILABLE_STARTING(__MAC_10_8
, __IPHONE_NA
); 
 406 OSStatus 
CMSEncoderCopySignerTimestampWithPolicy( 
 407     CMSEncoderRef           cmsEncoder
, 
 408     CFTypeRef __nullable    timeStampPolicy
, 
 409     size_t                  signerIndex
,        /* usually 0 */ 
 410     CFAbsoluteTime          
*timestamp
)                 /* RETURNED */ 
 411     __OSX_AVAILABLE_STARTING(__MAC_10_10
, __IPHONE_NA
); 
 413 CF_ASSUME_NONNULL_END
 
 419 #endif  /* _CMS_ENCODER_H_ */