]> git.saurik.com Git - apple/security.git/blame - OSX/libsecurity_cms/lib/CMSEncoder.h
Security-58286.1.32.tar.gz
[apple/security.git] / OSX / libsecurity_cms / lib / CMSEncoder.h
CommitLineData
b1ab9ed8 1/*
d8f41ccd 2 * Copyright (c) 2006-2012 Apple Inc. All Rights Reserved.
b1ab9ed8
A
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/cssmtype.h>
46#include <stdint.h>
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
5c19dc3a
A
52CF_ASSUME_NONNULL_BEGIN
53
b1ab9ed8
A
54/*
55 * Opaque reference to a CMS encoder object.
56 * This is a CF object, with standard CF semantics; dispose of it
57 * with CFRelease().
58 */
5c19dc3a 59typedef struct CF_BRIDGED_TYPE(id) _CMSEncoder *CMSEncoderRef;
b1ab9ed8
A
60
61CFTypeID CMSEncoderGetTypeID(void)
62 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
63
64/*
65 * Create a CMSEncoder. Result must eventually be freed via CFRelease().
66 */
67OSStatus CMSEncoderCreate(
5c19dc3a 68 CMSEncoderRef * __nonnull CF_RETURNS_RETAINED cmsEncoderOut) /* RETURNED */
b1ab9ed8
A
69 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
70
5c19dc3a
A
71extern const CFStringRef kCMSEncoderDigestAlgorithmSHA1;
72extern const CFStringRef kCMSEncoderDigestAlgorithmSHA256;
73
74OSStatus CMSEncoderSetSignerAlgorithm(
75 CMSEncoderRef cmsEncoder,
76 CFStringRef digestAlgorithm)
77 __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_NA);
78
b1ab9ed8
A
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 */
89OSStatus CMSEncoderAddSigners(
90 CMSEncoderRef cmsEncoder,
91 CFTypeRef signerOrArray)
92 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
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 */
99OSStatus CMSEncoderCopySigners(
100 CMSEncoderRef cmsEncoder,
5c19dc3a 101 CFArrayRef * __nonnull CF_RETURNS_RETAINED signersOut) /* RETURNED */
b1ab9ed8
A
102 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
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 */
115OSStatus CMSEncoderAddRecipients(
116 CMSEncoderRef cmsEncoder,
117 CFTypeRef recipientOrArray)
118 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
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 */
126OSStatus CMSEncoderCopyRecipients(
127 CMSEncoderRef cmsEncoder,
5c19dc3a 128 CFArrayRef * __nonnull CF_RETURNS_RETAINED recipientsOut) /* RETURNED */
b1ab9ed8
A
129 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
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 */
142OSStatus CMSEncoderSetHasDetachedContent(
143 CMSEncoderRef cmsEncoder,
144 Boolean detachedContent)
145 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
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 */
153OSStatus CMSEncoderGetHasDetachedContent(
154 CMSEncoderRef cmsEncoder,
155 Boolean *detachedContentOut) /* RETURNED */
156 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
157
158/*
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
162 * as SMIME).
163 *
164 * If this is called, it must be called before the first call to
165 * CMSEncoderUpdateContent().
166 *
167 * NOTE: This function is deprecated in Mac OS X 10.7 and later;
168 * please use CMSEncoderSetEncapsulatedContentTypeOID() instead.
169 */
170OSStatus 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);
175
176/*
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
180 * as SMIME).
181 *
182 * The eContentTypeOID parameter may be specified as a CF string, e.g.:
183 * CFSTR("1.2.840.113549.1.7.1")
184 *
185 * If this is called, it must be called before the first call to
186 * CMSEncoderUpdateContent().
187 */
188OSStatus CMSEncoderSetEncapsulatedContentTypeOID(
189 CMSEncoderRef cmsEncoder,
190 CFTypeRef eContentTypeOID)
191 __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_NA);
192
193/*
194 * Obtain the eContentType OID specified in CMSEncoderSetEncapsulatedContentType().
195 * If CMSEncoderSetEncapsulatedContentType() has not been called this returns a
196 * NULL pointer.
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.
200 */
201OSStatus CMSEncoderCopyEncapsulatedContentType(
202 CMSEncoderRef cmsEncoder,
5c19dc3a 203 CFDataRef * __nonnull CF_RETURNS_RETAINED eContentTypeOut) /* RETURNED */
b1ab9ed8
A
204 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
205
206/*
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.
212 *
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
224 * this function.)
225 */
226OSStatus CMSEncoderAddSupportingCerts(
227 CMSEncoderRef cmsEncoder,
228 CFTypeRef certOrArray)
229 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
230
231/*
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.
236 */
237OSStatus CMSEncoderCopySupportingCerts(
238 CMSEncoderRef cmsEncoder,
5c19dc3a 239 CFArrayRef * __nonnull CF_RETURNS_RETAINED certsOut) /* RETURNED */
b1ab9ed8
A
240 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
241
242/*
243 * Standard signed attributes, optionally specified in
244 * CMSEncoderAddSignedAttributes().
245 */
6b200bc3 246typedef CF_OPTIONS(uint32_t, CMSSignedAttributes) {
b1ab9ed8
A
247 kCMSAttrNone = 0x0000,
248 /*
249 * S/MIME Capabilities - identifies supported signature, encryption, and
250 * digest algorithms.
251 */
252 kCMSAttrSmimeCapabilities = 0x0001,
253 /*
254 * Indicates that a cert is the preferred cert for S/MIME encryption.
255 */
256 kCMSAttrSmimeEncryptionKeyPrefs = 0x0002,
257 /*
258 * Same as kCMSSmimeEncryptionKeyPrefs, using an attribute OID preferred
259 * by Microsoft.
260 */
261 kCMSAttrSmimeMSEncryptionKeyPrefs = 0x0004,
262 /*
263 * Include the signing time.
264 */
e3d460c9
A
265 kCMSAttrSigningTime = 0x0008,
266 /*
267 * Include the Apple Codesigning Hash Agility.
268 */
269 kCMSAttrAppleCodesigningHashAgility = 0x0010
b1ab9ed8 270};
b1ab9ed8
A
271
272/*
273 * Optionally specify signed attributes. Only meaningful when creating a
274 * signed message. If this is called, it must be called before
275 * CMSEncoderUpdateContent().
276 */
277OSStatus CMSEncoderAddSignedAttributes(
278 CMSEncoderRef cmsEncoder,
279 CMSSignedAttributes signedAttributes)
280 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
281
282/*
283 * Specification of what certificates to include in a signed message.
284 */
5c19dc3a 285typedef CF_ENUM(uint32_t, CMSCertificateChainMode) {
b1ab9ed8
A
286 kCMSCertificateNone = 0, /* don't include any certificates */
287 kCMSCertificateSignerOnly, /* only include signer certificate(s) */
288 kCMSCertificateChain, /* signer certificate chain up to but not
289 * including root certiticate */
290 kCMSCertificateChainWithRoot /* signer certificate chain including root */
291};
b1ab9ed8
A
292
293/*
294 * Optionally specify which certificates, if any, to include in a
295 * signed CMS message. The default, if this is not called, is
296 * kCMSCertificateChain, in which case the signer cert plus all CA
297 * certs needed to verify the signer cert, except for the root
298 * cert, are included.
299 * If this is called, it must be called before
300 * CMSEncoderUpdateContent().
301 */
302OSStatus CMSEncoderSetCertificateChainMode(
303 CMSEncoderRef cmsEncoder,
304 CMSCertificateChainMode chainMode)
305 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
306
307/*
308 * Obtain indication of which signer certs are to be included
309 * in a signed CMS message.
310 */
311OSStatus CMSEncoderGetCertificateChainMode(
312 CMSEncoderRef cmsEncoder,
313 CMSCertificateChainMode *chainModeOut)
314 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
315
316/*
317 * Feed content bytes into the encoder.
318 * Can be called multiple times.
319 * No 'setter' routines can be called after this function has been called.
320 */
321OSStatus CMSEncoderUpdateContent(
322 CMSEncoderRef cmsEncoder,
323 const void *content,
324 size_t contentLen)
325 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
326
327/*
328 * Finish encoding the message and obtain the encoded result.
329 * Caller must CFRelease the result.
330 */
331OSStatus CMSEncoderCopyEncodedContent(
332 CMSEncoderRef cmsEncoder,
5c19dc3a 333 CFDataRef * __nonnull CF_RETURNS_RETAINED encodedContentOut) /* RETURNED */
b1ab9ed8
A
334 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
335
336/*
337 * High-level, one-shot encoder function.
338 *
339 * Inputs (all except for content optional, though at least one
340 * of {signers, recipients} must be non-NULL)
341 * ------------------------------------------------------------
342 * signers : signer identities. Either a SecIdentityRef, or a
343 * CFArray of them.
344 * recipients : recipient certificates. Either a SecCertificateRef,
345 * or a CFArray of them.
346 * eContentType : contentType for inner EncapsulatedData.
347 * detachedContent : when true, do not include the signed data in the message.
348 * signedAttributes : Specifies which standard signed attributes are to be
349 * included in the message.
350 * content : raw content to be signed and/or encrypted.
351 *
352 * Output
353 * ------
354 * encodedContent : the result of the encoding.
355 *
356 * NOTE: This function is deprecated in Mac OS X 10.7 and later;
357 * please use CMSEncodeContent() instead.
358 */
359OSStatus CMSEncode(
5c19dc3a
A
360 CFTypeRef __nullable signers,
361 CFTypeRef __nullable recipients,
362 const CSSM_OID * __nullable eContentType,
363 Boolean detachedContent,
364 CMSSignedAttributes signedAttributes,
365 const void * content,
366 size_t contentLen,
367 CFDataRef * __nonnull CF_RETURNS_RETAINED encodedContentOut) /* RETURNED */
b1ab9ed8
A
368 /* DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER; */
369 __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
370
371
372/*
373 * High-level, one-shot encoder function.
374 *
375 * Inputs (all except for content optional, though at least one
376 * of {signers, recipients} must be non-NULL)
377 * ------------------------------------------------------------
378 * signers : signer identities. Either a SecIdentityRef, or a
379 * CFArray of them.
380 * recipients : recipient certificates. Either a SecCertificateRef,
381 * or a CFArray of them.
382 * eContentTypeOID : contentType OID for inner EncapsulatedData, e.g.:
383 * CFSTR("1.2.840.113549.1.7.1")
384 * detachedContent : when true, do not include the signed data in the message.
385 * signedAttributes : Specifies which standard signed attributes are to be
386 * included in the message.
387 * content : raw content to be signed and/or encrypted.
388 *
389 * Output
390 * ------
391 * encodedContent : the result of the encoding.
392 */
393OSStatus CMSEncodeContent(
5c19dc3a
A
394 CFTypeRef __nullable signers,
395 CFTypeRef __nullable recipients,
396 CFTypeRef __nullable eContentTypeOID,
397 Boolean detachedContent,
398 CMSSignedAttributes signedAttributes,
399 const void *content,
400 size_t contentLen,
401 CFDataRef * __nullable CF_RETURNS_RETAINED encodedContentOut) /* RETURNED */
b1ab9ed8
A
402 __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_NA);
403
404OSStatus CMSEncoderCopySignerTimestamp(
405 CMSEncoderRef cmsEncoder,
406 size_t signerIndex, /* usually 0 */
407 CFAbsoluteTime *timestamp) /* RETURNED */
408 __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_NA);
409
d8f41ccd 410OSStatus CMSEncoderCopySignerTimestampWithPolicy(
5c19dc3a
A
411 CMSEncoderRef cmsEncoder,
412 CFTypeRef __nullable timeStampPolicy,
413 size_t signerIndex, /* usually 0 */
414 CFAbsoluteTime *timestamp) /* RETURNED */
d8f41ccd
A
415 __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_NA);
416
5c19dc3a
A
417CF_ASSUME_NONNULL_END
418
b1ab9ed8
A
419#ifdef __cplusplus
420}
421#endif
422
423#endif /* _CMS_ENCODER_H_ */
424