]> git.saurik.com Git - apple/security.git/blob - libsecurity_smime/lib/CMSEncoder.h
Security-58286.1.32.tar.gz
[apple/security.git] / libsecurity_smime / lib / CMSEncoder.h
1 /*
2 * Copyright (c) 2006-2012 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
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
11 * file.
12 *
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.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 /*
25 * CMSEncoder.h - encode, sign, and/or encrypt messages in the Cryptographic
26 * Message Syntax (CMS), per RFC 3852.
27 *
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.
32 *
33 * In CMS terminology, this module performs encryption using the EnvelopedData
34 * ContentType and signing using the SignedData ContentType.
35 *
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.
39 */
40
41 #ifndef _CMS_ENCODER_H_
42 #define _CMS_ENCODER_H_
43
44 #include <CoreFoundation/CoreFoundation.h>
45 #include <Security/SecCmsEncoder.h>
46 #include <Security/SecCmsDecoder.h>
47 #include <Security/SecCmsMessage.h>
48 #include <AvailabilityMacros.h>
49 #include <stdint.h>
50
51 __BEGIN_DECLS
52
53 CF_ASSUME_NONNULL_BEGIN
54
55 /*
56 * Opaque reference to a CMS encoder object.
57 * This is a CF object, with standard CF semantics; dispose of it
58 * with CFRelease().
59 */
60 typedef struct CF_BRIDGED_TYPE(id) _CMSEncoder *CMSEncoderRef;
61
62 CFTypeID CMSEncoderGetTypeID(void)
63 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
64
65 /*
66 * Create a CMSEncoder. Result must eventually be freed via CFRelease().
67 */
68 OSStatus CMSEncoderCreate(CMSEncoderRef * __nonnull CF_RETURNS_RETAINED cmsEncoderOut) /* RETURNED */
69 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
70
71 extern const CFStringRef kCMSEncoderDigestAlgorithmSHA1;
72 extern const CFStringRef kCMSEncoderDigestAlgorithmSHA256;
73
74 OSStatus CMSEncoderSetSignerAlgorithm(
75 CMSEncoderRef cmsEncoder,
76 CFStringRef digestAlgorithm)
77 __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_11_0);
78
79 /*
80 * Specify signers of the CMS message; implies that the message will be signed.
81 *
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().
88 */
89 OSStatus CMSEncoderAddSigners(
90 CMSEncoderRef cmsEncoder,
91 CFTypeRef signerOrArray)
92 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
93
94 /*
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.
98 */
99 OSStatus CMSEncoderCopySigners(
100 CMSEncoderRef cmsEncoder,
101 CFArrayRef * __nonnull CF_RETURNS_RETAINED signersOut) /* RETURNED */
102 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
103
104 /*
105 * Specify recipients of the message. Implies that the message will
106 * be encrypted.
107 *
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().
114 */
115 OSStatus CMSEncoderAddRecipients(
116 CMSEncoderRef cmsEncoder,
117 CFTypeRef recipientOrArray)
118 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
119
120 /*
121 * Obtain an array of recipients as specified in CMSEncoderSetRecipients().
122 * Returns a NULL recipients array if CMSEncoderSetRecipients() has not been
123 * called.
124 * Caller must CFRelease the result.
125 */
126 OSStatus CMSEncoderCopyRecipients(
127 CMSEncoderRef cmsEncoder,
128 CFArrayRef * __nonnull CF_RETURNS_RETAINED recipientsOut) /* RETURNED */
129 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
130
131 /*
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.
136 *
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().
141 */
142 OSStatus CMSEncoderSetHasDetachedContent(
143 CMSEncoderRef cmsEncoder,
144 Boolean detachedContent)
145 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
146
147 /*
148 * Obtain a Boolean indicating whether the current message will have detached
149 * content.
150 * Returns the value specified in CMSEncoderHasDetachedContent() if that
151 * function has been called; else returns the default FALSE.
152 */
153 OSStatus CMSEncoderGetHasDetachedContent(
154 CMSEncoderRef cmsEncoder,
155 Boolean *detachedContentOut) /* RETURNED */
156 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
157
158 /*
159 * Optionally specify an eContentType OID for the inner EncapsulatedData for
160 * a signed message. The default eContentTypeOID, used if this function is not
161 * called, is id-data (which is the normal eContentType for applications such
162 * as SMIME).
163 *
164 * The eContentTypeOID parameter may be specified as a CF string, e.g.:
165 * CFSTR("1.2.840.113549.1.7.1")
166 *
167 * If this is called, it must be called before the first call to
168 * CMSEncoderUpdateContent().
169 */
170 OSStatus CMSEncoderSetEncapsulatedContentTypeOID(
171 CMSEncoderRef cmsEncoder,
172 CFTypeRef eContentTypeOID)
173 __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_11_0);
174
175 /*
176 * Obtain the eContentType OID specified in CMSEncoderSetEncapsulatedContentType().
177 * If CMSEncoderSetEncapsulatedContentType() has not been called this returns a
178 * NULL pointer.
179 * The returned OID's data is in the same format as the data provided to
180 * CMSEncoderSetEncapsulatedContentType;, i.e., it's the encoded content of
181 * the OID, not including the tag and length bytes.
182 */
183 OSStatus CMSEncoderCopyEncapsulatedContentType(
184 CMSEncoderRef cmsEncoder,
185 CFDataRef * __nonnull CF_RETURNS_RETAINED eContentTypeOut) /* RETURNED */
186 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
187
188 /*
189 * Signed CMS messages can contain arbitrary sets of certificates beyond those
190 * indicating the identity of the signer(s). This function provides a means of
191 * adding these other certs. For normal signed messages it is not necessary to
192 * call this; the signer cert(s) and the intermediate certs needed to verify the
193 * signer(s) will be included in the message implicitly.
194 *
195 * -- Caller can pass in one cert, as a SecCertificateRef, or an array of certs,
196 * as a CFArray of SecCertificateRefs.
197 * -- If this is called, it must be called before the first call to
198 * CMSEncoderUpdateContent().
199 * -- There is a "special case" use of CMS messages which involves neither
200 * signing nor encryption, but does include certificates. This is commonly
201 * used to transport "bags" of certificates. When constructing such a
202 * message, all an application needs to do is to create a CMSEncoderRef,
203 * call CMSEncoderAddSupportingCerts() one or more times, and then call
204 * CMSEncoderCopyEncodedContent() to get the resulting cert bag. No 'content'
205 * need be specified. (This is in fact the primary intended use for
206 * this function.)
207 */
208 OSStatus CMSEncoderAddSupportingCerts(
209 CMSEncoderRef cmsEncoder,
210 CFTypeRef certOrArray)
211 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
212
213 /*
214 * Obtain the SecCertificates provided in CMSEncoderAddSupportingCerts().
215 * If CMSEncoderAddSupportingCerts() has not been called this will return a
216 * NULL value for *certs.
217 * Caller must CFRelease the result.
218 */
219 OSStatus CMSEncoderCopySupportingCerts(
220 CMSEncoderRef cmsEncoder,
221 CFArrayRef * __nonnull CF_RETURNS_RETAINED certsOut) /* RETURNED */
222 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
223
224 /*
225 * Standard signed attributes, optionally specified in
226 * CMSEncoderAddSignedAttributes().
227 */
228 typedef CF_OPTIONS(uint32_t, CMSSignedAttributes) {
229 kCMSAttrNone = 0x0000,
230 /*
231 * S/MIME Capabilities - identifies supported signature, encryption, and
232 * digest algorithms.
233 */
234 kCMSAttrSmimeCapabilities = 0x0001,
235 /*
236 * Indicates that a cert is the preferred cert for S/MIME encryption.
237 */
238 kCMSAttrSmimeEncryptionKeyPrefs = 0x0002,
239 /*
240 * Same as kCMSSmimeEncryptionKeyPrefs, using an attribute OID preferred
241 * by Microsoft.
242 */
243 kCMSAttrSmimeMSEncryptionKeyPrefs = 0x0004,
244 /*
245 * Include the signing time.
246 */
247 kCMSAttrSigningTime = 0x0008,
248 /*
249 * Include the Apple Codesigning Hash Agility.
250 */
251 kCMSAttrAppleCodesigningHashAgility = 0x0010
252 };
253
254 /*
255 * Optionally specify signed attributes. Only meaningful when creating a
256 * signed message. If this is called, it must be called before
257 * CMSEncoderUpdateContent().
258 */
259 OSStatus CMSEncoderAddSignedAttributes(
260 CMSEncoderRef cmsEncoder,
261 CMSSignedAttributes signedAttributes)
262 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
263
264 /*
265 * Specification of what certificates to include in a signed message.
266 */
267 typedef CF_ENUM(uint32_t, CMSCertificateChainMode) {
268 kCMSCertificateNone = 0, /* don't include any certificates */
269 kCMSCertificateSignerOnly, /* only include signer certificate(s) */
270 kCMSCertificateChain, /* signer certificate chain up to but not
271 * including root certiticate */
272 kCMSCertificateChainWithRoot /* signer certificate chain including root */
273 };
274
275 /*
276 * Optionally specify which certificates, if any, to include in a
277 * signed CMS message. The default, if this is not called, is
278 * kCMSCertificateChain, in which case the signer cert plus all CA
279 * certs needed to verify the signer cert, except for the root
280 * cert, are included.
281 * If this is called, it must be called before
282 * CMSEncoderUpdateContent().
283 */
284 OSStatus CMSEncoderSetCertificateChainMode(
285 CMSEncoderRef cmsEncoder,
286 CMSCertificateChainMode chainMode)
287 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
288
289 /*
290 * Obtain indication of which signer certs are to be included
291 * in a signed CMS message.
292 */
293 OSStatus CMSEncoderGetCertificateChainMode(
294 CMSEncoderRef cmsEncoder,
295 CMSCertificateChainMode *chainModeOut)
296 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
297
298 /*
299 * Feed content bytes into the encoder.
300 * Can be called multiple times.
301 * No 'setter' routines can be called after this function has been called.
302 */
303 OSStatus CMSEncoderUpdateContent(
304 CMSEncoderRef cmsEncoder,
305 const void *content,
306 size_t contentLen)
307 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
308
309 /*
310 * Finish encoding the message and obtain the encoded result.
311 * Caller must CFRelease the result.
312 */
313 OSStatus CMSEncoderCopyEncodedContent(
314 CMSEncoderRef cmsEncoder,
315 CFDataRef * __nonnull CF_RETURNS_RETAINED encodedContentOut) /* RETURNED */
316 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_11_0);
317
318 /*
319 * High-level, one-shot encoder function.
320 *
321 * Inputs (all except for content optional, though at least one
322 * of {signers, recipients} must be non-NULL)
323 * ------------------------------------------------------------
324 * signers : signer identities. Either a SecIdentityRef, or a
325 * CFArray of them.
326 * recipients : recipient certificates. Either a SecCertificateRef,
327 * or a CFArray of them.
328 * eContentTypeOID : contentType OID for inner EncapsulatedData, e.g.:
329 * CFSTR("1.2.840.113549.1.7.1")
330 * detachedContent : when true, do not include the signed data in the message.
331 * signedAttributes : Specifies which standard signed attributes are to be
332 * included in the message.
333 * content : raw content to be signed and/or encrypted.
334 *
335 * Output
336 * ------
337 * encodedContent : the result of the encoding.
338 */
339 OSStatus CMSEncodeContent(
340 CFTypeRef __nullable signers,
341 CFTypeRef __nullable recipients,
342 CFTypeRef __nullable eContentTypeOID,
343 Boolean detachedContent,
344 CMSSignedAttributes signedAttributes,
345 const void *content,
346 size_t contentLen,
347 CFDataRef * __nullable CF_RETURNS_RETAINED encodedContentOut) /* RETURNED */
348 __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_11_0);
349
350 #if TIMESTAMPING_SUPOORTED
351 OSStatus CMSEncoderCopySignerTimestamp(
352 CMSEncoderRef cmsEncoder,
353 size_t signerIndex, /* usually 0 */
354 CFAbsoluteTime *timestamp) /* RETURNED */
355 __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_NA);
356
357 OSStatus CMSEncoderCopySignerTimestampWithPolicy(
358 CMSEncoderRef cmsEncoder,
359 CFTypeRef __nullable timeStampPolicy,
360 size_t signerIndex, /* usually 0 */
361 CFAbsoluteTime *timestamp) /* RETURNED */
362 __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_NA);
363
364 void
365 CmsMessageSetTSAContext(CMSEncoderRef cmsEncoder, CFTypeRef tsaContext);
366 #endif
367
368 /*
369 * Obtain the SecCmsMessageRef associated with a CMSEncoderRef. Intended
370 * to be called after (optionally) setting the encoder's various attributes
371 * via CMSEncoderAddSigners(), CMSEncoderAddRecipients(), etc. and before
372 * the first call to CMSEncoderUpdateContent(). The returned SecCmsMessageRef
373 * will be initialized per the previously specified attributes; the caller
374 * can manipulate the SecCmsMessageRef prior to proceeding with
375 * CMSEncoderUpdateContent() calls.
376 */
377 OSStatus CMSEncoderGetCmsMessage(
378 CMSEncoderRef cmsEncoder,
379 SecCmsMessageRef _Nullable * _Nonnull cmsMessage); /* RETURNED */
380
381 /*
382 * Optionally specify a SecCmsEncoderRef to use with a CMSEncoderRef.
383 * If this is called, it must be called before the first call to
384 * CMSEncoderUpdateContent(). The CMSEncoderRef takes ownership of the
385 * incoming SecCmsEncoderRef.
386 */
387 OSStatus CMSEncoderSetEncoder(
388 CMSEncoderRef cmsEncoder,
389 SecCmsEncoderRef encoder);
390
391 /*
392 * Obtain the SecCmsEncoderRef associated with a CMSEncoderRef.
393 * Returns a NULL SecCmsEncoderRef if neither CMSEncoderSetEncoder nor
394 * CMSEncoderUpdateContent() has been called.
395 * The CMSEncoderRef retains ownership of the SecCmsEncoderRef.
396 */
397 OSStatus CMSEncoderGetEncoder(
398 CMSEncoderRef cmsEncoder,
399 SecCmsEncoderRef _Nullable * _Nonnull encoder); /* RETURNED */
400
401 /*
402 * Set the signing time for a CMSEncoder.
403 * This is only used if the kCMSAttrSigningTime attribute is included.
404 */
405 OSStatus CMSEncoderSetSigningTime(
406 CMSEncoderRef cmsEncoder,
407 CFAbsoluteTime time);
408
409 /*
410 * Set the hash agility attribute for a CMSEncoder.
411 * This is only used if the kCMSAttrAppleCodesigningHashAgility attribute
412 * is included.
413 */
414 OSStatus CMSEncoderSetAppleCodesigningHashAgility(
415 CMSEncoderRef cmsEncoder,
416 CFDataRef hashAgilityAttrValue);
417
418
419 CF_ASSUME_NONNULL_END
420
421 __END_DECLS
422
423 #endif /* _CMS_ENCODER_H_ */
424