]> git.saurik.com Git - apple/security.git/blob - keychain/headers/SecKeyPriv.h
Security-59754.41.1.tar.gz
[apple/security.git] / keychain / headers / SecKeyPriv.h
1 /*
2 * Copyright (c) 2006-2010,2012-2015 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 @header SecKeyPriv
26 The functions provided in SecKeyPriv.h implement and manage a particular
27 type of keychain item that represents a key. A key can be stored in a
28 keychain, but a key can also be a transient object.
29
30 You can use a key as a keychain item in most functions.
31 */
32
33 #ifndef _SECURITY_SECKEYPRIV_H_
34 #define _SECURITY_SECKEYPRIV_H_
35
36 #include <Security/SecBase.h>
37 #include <Security/SecKey.h>
38 #include <Security/SecAsn1Types.h>
39 #include <CoreFoundation/CFRuntime.h>
40
41 #if TARGET_OS_OSX
42 #include <Security/x509defs.h>
43 #endif
44
45 #if SEC_OS_OSX
46 #include <Security/SecKey.h>
47 #include <AvailabilityMacros.h>
48 #endif
49
50 __BEGIN_DECLS
51
52 typedef struct __SecDERKey {
53 uint8_t *oid;
54 CFIndex oidLength;
55
56 uint8_t *parameters;
57 CFIndex parametersLength;
58
59 /* Contents of BIT STRING in DER Encoding */
60 uint8_t *key;
61 CFIndex keyLength;
62 } SecDERKey;
63
64 typedef struct SecRSAPublicKeyParams {
65 uint8_t *modulus; /* modulus */
66 CFIndex modulusLength;
67 uint8_t *exponent; /* public exponent */
68 CFIndex exponentLength;
69 } SecRSAPublicKeyParams;
70
71 typedef uint32_t SecKeyEncoding;
72 enum {
73 /* Typically only used for symmetric keys. */
74 kSecKeyEncodingRaw = 0,
75
76 /* RSA keys are DER-encoded according to PKCS1. */
77 kSecKeyEncodingPkcs1 = 1,
78
79 /* RSA keys are DER-encoded according to PKCS1 with Apple Extensions. */
80 kSecKeyEncodingApplePkcs1 = 2,
81
82 /* RSA public key in SecRSAPublicKeyParams format. keyData is a pointer
83 to a SecRSAPublicKeyParams and keyDataLength is
84 sizeof(SecRSAPublicKeyParams). */
85 kSecKeyEncodingRSAPublicParams = 3,
86
87 /* RSA public key in SecRSAPublicKeyParams format. keyData is a pointer
88 to a SecRSAPublicKeyParams and keyDataLength is
89 sizeof(SecRSAPublicKeyParams). */
90 kSecDERKeyEncoding = 4,
91
92 /* Internal "encodings to send other data" */
93 kSecGenerateKey = 5,
94 kSecExtractPublicFromPrivate = 6,
95
96 /* Encoding came from SecKeyCopyPublicBytes for a public key,
97 or internally from a private key */
98 kSecKeyEncodingBytes = 7,
99
100 /* Handing in a private key from corecrypto directly. */
101 kSecKeyCoreCrypto = 8,
102
103 };
104
105 typedef uint32_t SecKeyWrapType;
106 enum {
107 /* wrap key in RFC3394 (AESWrap) */
108 kSecKeyWrapRFC3394 = 0,
109
110 /* wrap key in PGP style (support EC keys only right now) */
111 kSecKeyWrapPublicKeyPGP = 1,
112
113 };
114
115 typedef CF_ENUM(CFIndex, SecKeyOperationMode) {
116 kSecKeyOperationModePerform = 0,
117 kSecKeyOperationModeCheckIfSupported = 1,
118 };
119
120 typedef OSStatus (*SecKeyInitMethod)(SecKeyRef, const uint8_t *, CFIndex,
121 SecKeyEncoding);
122 typedef void (*SecKeyDestroyMethod)(SecKeyRef);
123 typedef OSStatus (*SecKeyRawSignMethod)(SecKeyRef key, SecPadding padding,
124 const uint8_t *dataToSign, size_t dataToSignLen,
125 uint8_t *sig, size_t *sigLen);
126 typedef OSStatus (*SecKeyRawVerifyMethod)(
127 SecKeyRef key, SecPadding padding, const uint8_t *signedData,
128 size_t signedDataLen, const uint8_t *sig, size_t sigLen);
129 typedef OSStatus (*SecKeyEncryptMethod)(SecKeyRef key, SecPadding padding,
130 const uint8_t *plainText, size_t plainTextLen,
131 uint8_t *cipherText, size_t *cipherTextLen);
132 typedef OSStatus (*SecKeyDecryptMethod)(SecKeyRef key, SecPadding padding,
133 const uint8_t *cipherText, size_t cipherTextLen,
134 uint8_t *plainText, size_t *plainTextLen);
135 typedef OSStatus (*SecKeyComputeMethod)(SecKeyRef key,
136 const uint8_t *pub_key, size_t pub_key_len,
137 uint8_t *computed_key, size_t *computed_key_len);
138 typedef size_t (*SecKeyBlockSizeMethod)(SecKeyRef key);
139 typedef CFDictionaryRef (*SecKeyCopyDictionaryMethod)(SecKeyRef key);
140 typedef CFIndex (*SecKeyGetAlgorithmIDMethod)(SecKeyRef key);
141 typedef OSStatus (*SecKeyCopyPublicBytesMethod)(SecKeyRef key, CFDataRef *serialization);
142 typedef CFDataRef (*SecKeyCopyWrapKeyMethod)(SecKeyRef key, SecKeyWrapType type, CFDataRef unwrappedKey, CFDictionaryRef parameters, CFDictionaryRef *outParam, CFErrorRef *error);
143 typedef CFDataRef (*SecKeyCopyUnwrapKeyMethod)(SecKeyRef key, SecKeyWrapType type, CFDataRef wrappedKey, CFDictionaryRef parameters, CFDictionaryRef *outParam, CFErrorRef *error);
144 typedef CFStringRef (*SecKeyDescribeMethod)(SecKeyRef key);
145
146 typedef CFDataRef (*SecKeyCopyExternalRepresentationMethod)(SecKeyRef key, CFErrorRef *error);
147 typedef SecKeyRef (*SecKeyCopyPublicKeyMethod)(SecKeyRef key);
148 typedef Boolean (*SecKeyIsEqualMethod)(SecKeyRef key1, SecKeyRef key2);
149 typedef SecKeyRef (*SecKeyCreateDuplicateMethod)(SecKeyRef key);
150 typedef Boolean (*SecKeySetParameterMethod)(SecKeyRef key, CFStringRef name, CFPropertyListRef value, CFErrorRef *error);
151
152 /*!
153 @abstract Performs cryptographic operation with the key.
154 @param key Key to perform the operation on.
155 @param operation Type of operation to be performed.
156 @param algorithm Algorithm identifier for the operation. Determines format of input and output data.
157 @param allAlgorithms Array of algorithms which were traversed until we got to this operation. The last member of this array is always the same as @c algorithm parameter.
158 @param mode Mode in which the operation is performed. Two available modes are checking only if the operation can be performed or actually performing the operation.
159 @param in1 First input parameter for the operation, meaningful only in ModePerform.
160 @param in2 Second input parameter for the operation, meaningful only in ModePerform.
161 @param error Error details when NULL is returned.
162 @return NULL if some failure occured. kCFNull if operation/algorithm/key combination is not supported, otherwise the result of the operation or kCFBooleanTrue in ModeCheckIfSupported.
163 */
164 typedef CFTypeRef(*SecKeyCopyOperationResultMethod)(SecKeyRef key, SecKeyOperationType operation, SecKeyAlgorithm algorithm, CFArrayRef allAlgorithms, SecKeyOperationMode mode, CFTypeRef in1, CFTypeRef in2, CFErrorRef *error);
165
166 #define kSecKeyDescriptorVersion (4)
167
168 typedef struct __SecKeyDescriptor {
169 /* Version of this SecKeyDescriptor. Must be kSecKeyDescriptorVersion. */
170 uint32_t version;
171
172 /* Name of this key class for use by SecKeyShow(). */
173 const char *name;
174
175 /* If nonzero, SecKeyCreate will allocate this many bytes for the key
176 field in the SecKeyRef it creates. If zero key is NULL and the
177 implementor can choose to dynamically allocate it in the init
178 function and free it in the destroy function. */
179 uint32_t extraBytes;
180
181 /* Called by SecKeyCreate(). */
182 SecKeyInitMethod init;
183 /* Called by destructor (final CFRelease() or gc if using). */
184 SecKeyDestroyMethod destroy;
185 /* Called by SecKeyRawSign(). */
186 SecKeyRawSignMethod rawSign;
187 /* Called by SecKeyRawVerify(). */
188 SecKeyRawVerifyMethod rawVerify;
189 /* Called by SecKeyEncrypt(). */
190 SecKeyEncryptMethod encrypt;
191 /* Called by SecKeyDecrypt(). */
192 SecKeyDecryptMethod decrypt;
193 /* Reserved for future use. */
194 SecKeyComputeMethod compute;
195 /* Called by SecKeyGetBlockSize(). */
196 SecKeyBlockSizeMethod blockSize;
197 /* Called by SecKeyCopyAttributeDictionary(), which is private. */
198 SecKeyCopyDictionaryMethod copyDictionary;
199 /* Called by SecKeyDescribeMethod(). */
200 SecKeyDescribeMethod describe;
201 #if kSecKeyDescriptorVersion > 0
202 /* Called by SecKeyCopyAttributeDictionary(), which is private. */
203 SecKeyGetAlgorithmIDMethod getAlgorithmID;
204 #endif
205 #if kSecKeyDescriptorVersion > 1
206 SecKeyCopyPublicBytesMethod copyPublic;
207 #endif
208 #if kSecKeyDescriptorVersion > 2
209 SecKeyCopyWrapKeyMethod copyWrapKey;
210 SecKeyCopyUnwrapKeyMethod copyUnwrapKey;
211 #endif
212 #if kSecKeyDescriptorVersion > 3
213 SecKeyCopyExternalRepresentationMethod copyExternalRepresentation;
214 SecKeyCopyPublicKeyMethod copyPublicKey;
215 SecKeyCopyOperationResultMethod copyOperationResult;
216 SecKeyIsEqualMethod isEqual;
217 SecKeyCreateDuplicateMethod createDuplicate;
218 SecKeySetParameterMethod setParameter;
219 #endif
220 } SecKeyDescriptor;
221
222 struct __SecKey {
223 CFRuntimeBase _base;
224
225 const SecKeyDescriptor *key_class;
226
227 /* The actual key handled by class. */
228 void *key;
229 };
230
231 /* Create a public key from a CFData containing a SubjectPublicKeyInfo in DER format. */
232 SecKeyRef SecKeyCreateFromSubjectPublicKeyInfoData(CFAllocatorRef allocator,
233 CFDataRef subjectPublicKeyInfoData);
234
235 /* Crete a SubjectPublicKeyInfo in DER format from a SecKey */
236 CFDataRef SecKeyCopySubjectPublicKeyInfo(SecKeyRef key);
237
238
239 /*!
240 @function SecKeyCreate
241 @abstract Given a private key and data to sign, generate a digital signature.
242 @param allocator allocator to use when allocating this key instance.
243 @param key_class pointer to a SecKeyDescriptor.
244 @param keyData The second argument to the init() function in the key_class.
245 @param keyDataLength The third argument to the init() function in the key_class.
246 @param encoding The fourth argument to the init() function in the key_class.
247 @result A newly allocated SecKeyRef.
248 */
249 SecKeyRef SecKeyCreate(CFAllocatorRef allocator,
250 const SecKeyDescriptor *key_class, const uint8_t *keyData,
251 CFIndex keyDataLength, SecKeyEncoding encoding);
252
253 /* Create a public key from an oid, params and keyData all in DER format. */
254 SecKeyRef SecKeyCreatePublicFromDER(CFAllocatorRef allocator,
255 const SecAsn1Oid *oid1, const SecAsn1Item *params,
256 const SecAsn1Item *keyData);
257
258 /* Create public key from private key */
259 SecKeyRef SecKeyCreatePublicFromPrivate(SecKeyRef privateKey);
260
261 /* Get Private Key (if present) by publicKey. */
262 SecKeyRef SecKeyCopyMatchingPrivateKey(SecKeyRef publicKey, CFErrorRef *error);
263
264 OSStatus SecKeyGetMatchingPrivateKeyStatus(SecKeyRef publicKey, CFErrorRef *error);
265 CFDataRef SecKeyCreatePersistentRefToMatchingPrivateKey(SecKeyRef publicKey, CFErrorRef *error);
266
267 /* Return an attribute dictionary used to find a private key by public key hash */
268 CFDictionaryRef CreatePrivateKeyMatchingQuery(SecKeyRef publicKey, bool returnPersistentRef);
269
270 /* Return a key from an attribute dictionary that was used to store this item
271 in a keychain. */
272 SecKeyRef SecKeyCreateFromAttributeDictionary(CFDictionaryRef refAttributes);
273
274 // SecAsn1AlgId is deprecated, but we still need to use it.
275 #pragma clang diagnostic push
276 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
277
278 OSStatus SecKeyDigestAndVerify(
279 SecKeyRef key, /* Public key */
280 const SecAsn1AlgId *algId, /* algorithm oid/params */
281 const uint8_t *dataToDigest, /* signature over this data */
282 size_t dataToDigestLen,/* length of dataToDigest */
283 const uint8_t *sig, /* signature to verify */
284 size_t sigLen); /* length of sig */
285
286 /* Return an attribute dictionary used to store this item in a keychain. */
287 CFDictionaryRef SecKeyCopyAttributeDictionary(SecKeyRef key);
288
289 OSStatus SecKeyDigestAndSign(
290 SecKeyRef key, /* Private key */
291 const SecAsn1AlgId *algId, /* algorithm oid/params */
292 const uint8_t *dataToDigest, /* signature over this data */
293 size_t dataToDigestLen,/* length of dataToDigest */
294 uint8_t *sig, /* signature, RETURNED */
295 size_t *sigLen); /* IN/OUT */
296
297 OSStatus SecKeyVerifyDigest(
298 SecKeyRef key, /* Private key */
299 const SecAsn1AlgId *algId, /* algorithm oid/params */
300 const uint8_t *digestData, /* signature over this digest */
301 size_t digestDataLen,/* length of dataToDigest */
302 const uint8_t *sig, /* signature to verify */
303 size_t sigLen); /* length of sig */
304
305 OSStatus SecKeySignDigest(
306 SecKeyRef key, /* Private key */
307 const SecAsn1AlgId *algId, /* algorithm oid/params */
308 const uint8_t *digestData, /* signature over this digest */
309 size_t digestDataLen,/* length of digestData */
310 uint8_t *sig, /* signature, RETURNED */
311 size_t *sigLen); /* IN/OUT */
312
313 #pragma clang diagnostic pop
314
315 OSStatus SecKeyCopyPublicBytes(SecKeyRef key, CFDataRef* serializedPublic);
316 SecKeyRef SecKeyCreateFromPublicBytes(CFAllocatorRef allocator, CFIndex algorithmID, const uint8_t *keyData, CFIndex keyDataLength);
317 SecKeyRef SecKeyCreateFromPublicData(CFAllocatorRef allocator, CFIndex algorithmID, CFDataRef serialized);
318 CFDataRef SecKeyCopyPublicKeyHash(SecKeyRef key);
319
320 /* This function directly creates an iOS-format SecKeyRef from public key bytes. */
321 SecKeyRef SecKeyCreateRSAPublicKey_ios(CFAllocatorRef allocator,
322 const uint8_t *keyData, CFIndex keyDataLength,
323 SecKeyEncoding encoding);
324
325
326 CF_RETURNS_RETAINED
327 CFDictionaryRef SecKeyGeneratePrivateAttributeDictionary(SecKeyRef key,
328 CFTypeRef keyType,
329 CFDataRef privateBlob);
330 CF_RETURNS_RETAINED
331 CFDictionaryRef SecKeyGeneratePublicAttributeDictionary(SecKeyRef key, CFTypeRef keyType);
332
333 enum {
334 kSecNullAlgorithmID = 0,
335 kSecRSAAlgorithmID = 1,
336 kSecDSAAlgorithmID = 2, /* unsupported, just here for reference. */
337 kSecECDSAAlgorithmID = 3,
338 };
339
340 /*!
341 @function SecKeyGetAlgorithmId
342 @abstract Returns an enumerated constant value which identifies the algorithm for the given key.
343 @param key A key reference.
344 @result An algorithm identifier.
345 */
346 CFIndex SecKeyGetAlgorithmId(SecKeyRef key)
347 SPI_AVAILABLE(macos(10.8), ios(9.0));
348
349 #if TARGET_OS_IPHONE
350 /*!
351 @function SecKeyGetAlgorithmID
352 @abstract Returns an enumerated constant value which identifies the algorithm for the given key.
353 @param key A key reference.
354 @result An algorithm identifier.
355 @discussion Deprecated in iOS 9.0. Note that SecKeyGetAlgorithmID also exists on OS X
356 with different arguments for CDSA-based SecKeyRefs, and returns different values.
357 For compatibility, your code should migrate to use SecKeyGetAlgorithmId instead.
358 */
359 CFIndex SecKeyGetAlgorithmID(SecKeyRef key)
360 API_DEPRECATED_WITH_REPLACEMENT("SecKeyGetAlgorithmId", ios(5.0, 9.0)) API_UNAVAILABLE(macCatalyst);
361 #endif // TARGET_OS_IPHONE
362
363 #if TARGET_OS_OSX
364 /*!
365 @function SecKeyGetAlgorithmID
366 @abstract Returns a pointer to a CSSM_X509_ALGORITHM_IDENTIFIER structure for the given key.
367 @param key A key reference.
368 @param algid On return, a pointer to a CSSM_X509_ALGORITHM_IDENTIFIER structure.
369 @result A result code. See "Security Error Codes" (SecBase.h).
370 @discussion Deprecated in OS X 10.8 and later. Continued use is strongly discouraged,
371 since there is a naming conflict with a similar function (also deprecated) on iOS that
372 had different arguments and a different return value. Use SecKeyGetAlgorithmId instead.
373 */
374 OSStatus SecKeyGetAlgorithmID(SecKeyRef key, const CSSM_X509_ALGORITHM_IDENTIFIER **algid)
375 API_DEPRECATED_WITH_REPLACEMENT("SecKeyGetAlgorithmId", macos(10.2, 10.8)) API_UNAVAILABLE(ios, tvos, watchos, bridgeos, macCatalyst);
376 #endif
377
378 #if !SEC_OS_OSX
379 typedef CF_ENUM(int, SecKeySize) {
380 kSecKeyKeySizeInBits = 0,
381 kSecKeySignatureSize = 1,
382 kSecKeyEncryptedDataSize = 2,
383 // More might belong here, but we aren't settled on how
384 // to take into account padding and/or digest types.
385 };
386
387 /*!
388 @function SecKeyGetSize
389 @abstract Returns a size in bytes.
390 @param key The key for which the block length is requested.
391 @param whichSize The size that you want evaluated.
392 @result The block length of the key in bytes.
393 @discussion If for example key is an RSA key the value returned by
394 this function is the size of the modulus.
395 */
396 size_t SecKeyGetSize(SecKeyRef key, SecKeySize whichSize)
397 __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
398 #endif
399
400 /*!
401 @function SecKeyLookupPersistentRef
402 @abstract Looks up a SecKeyRef via persistent ref.
403 @param persistentRef The persistent ref data for looking up.
404 @param lookedUpData retained SecKeyRef for the found object.
405 @result Errors when using SecItemFind for the persistent ref.
406 */
407 OSStatus SecKeyFindWithPersistentRef(CFDataRef persistentRef, SecKeyRef* lookedUpData)
408 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
409
410 /*!
411 @function SecKeyCopyPersistentRef
412 @abstract Gets a persistent reference for a key.
413 @param key Key to make a persistent ref for.
414 @param persistentRef Allocated data representing the persistent ref.
415 @result Errors when using SecItemFind for the persistent ref.
416 */
417 OSStatus SecKeyCopyPersistentRef(SecKeyRef key, CFDataRef* persistentRef)
418 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
419
420 extern const CFStringRef _kSecKeyWrapPGPSymAlg; /* CFNumber */
421 extern const CFStringRef _kSecKeyWrapPGPFingerprint; /* CFDataRef, at least 20 bytes */
422 extern const CFStringRef _kSecKeyWrapPGPWrapAlg; /* kSecKeyWrapRFC6637WrapNNN, or any of the other PGP wrap algs */
423 extern const CFStringRef _kSecKeyWrapRFC6637Flags;
424 extern const CFStringRef _kSecKeyWrapRFC6637WrapDigestSHA256KekAES128;
425 extern const CFStringRef _kSecKeyWrapRFC6637WrapDigestSHA512KekAES256;
426
427 enum { kSecKeyWrapPGPFingerprintMinSize = 20 };
428 /*!
429 @function _SecKeyCopyWrapKey
430 @abstract Wrap a key
431 */
432
433 CFDataRef
434 _SecKeyCopyWrapKey(SecKeyRef key, SecKeyWrapType type, CFDataRef unwrappedKey, CFDictionaryRef parameters, CFDictionaryRef *outParam, CFErrorRef *error)
435 __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
436
437 /*!
438 @function _SecKeyWrapKey
439 @abstract Unwrap a key
440 */
441
442 CFDataRef
443 _SecKeyCopyUnwrapKey(SecKeyRef key, SecKeyWrapType type, CFDataRef wrappedKey, CFDictionaryRef parameters, CFDictionaryRef *outParam, CFErrorRef *error)
444 __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
445
446 #if SEC_OS_OSX_INCLUDES
447 /*!
448 @function SecKeyGetStrengthInBits
449 @abstract Returns key strength in bits for the given key.
450 @param key A key reference.
451 @param algid A pointer to a CSSM_X509_ALGORITHM_IDENTIFIER structure, as returned from a call to SecKeyGetAlgorithmID.
452 @param strength On return, the key strength in bits.
453 @result A result code. See "Security Error Codes" (SecBase.h).
454 */
455 OSStatus SecKeyGetStrengthInBits(SecKeyRef key, const CSSM_X509_ALGORITHM_IDENTIFIER *algid, unsigned int *strength) API_DEPRECATED("CSSM_X509_ALGORITHM_IDENTIFIER is deprecated", macos(10.4, 10.14));
456
457 /*!
458 @function SecKeyImportPair
459 @abstract Takes an asymmetric key pair and stores it in the keychain specified by the keychain parameter.
460 @param keychainRef A reference to the keychain in which to store the private and public key items. Specify NULL for the default keychain.
461 @param publicCssmKey A CSSM_KEY which is valid for the CSP returned by SecKeychainGetCSPHandle(). This may be a normal key or reference key.
462 @param privateCssmKey A CSSM_KEY which is valid for the CSP returned by SecKeychainGetCSPHandle(). This may be a normal key or reference key.
463 @param initialAccess A SecAccess object that determines the initial access rights to the private key. The public key is given an any/any acl by default.
464 @param publicKey Optional output pointer to the keychain item reference of the imported public key. The caller must call CFRelease on this value if it is returned.
465 @param privateKey Optional output pointer to the keychain item reference of the imported private key. The caller must call CFRelease on this value if it is returned.
466 @result A result code. See "Security Error Codes" (SecBase.h).
467 @deprecated in 10.5 and later. Use the SecItemImport function instead; see <Security/SecImportExport.h>
468 */
469 OSStatus SecKeyImportPair(
470 SecKeychainRef keychainRef,
471 const CSSM_KEY *publicCssmKey,
472 const CSSM_KEY *privateCssmKey,
473 SecAccessRef initialAccess,
474 SecKeyRef* publicKey,
475 SecKeyRef* privateKey)
476 API_DEPRECATED_WITH_REPLACEMENT("SecItemImport", macos(10.0, 10.5)) API_UNAVAILABLE(ios, watchos, tvos, bridgeos, macCatalyst);
477
478 /*!
479 @function SecKeyCreate
480 @abstract Create a key reference from the supplied key data.
481 @param allocator CFAllocator to allocate the key data. Pass NULL to use the default allocator.
482 @param keyClass A descriptor for the particular class of key that is being created.
483 @param keyData Data from which to create the key. Specify the format of this data in the encoding parameter.
484 @param keyDataLength Length of the data pointed to by keyData.
485 @param encoding A value of type SecKeyEncoding which describes the format of keyData.
486 @result A key reference.
487 @discussion Warning: this function is NOT intended for use outside the Security stack in its current state. <rdar://3201885>
488 IMPORTANT: on Mac OS X 10.5 and earlier, the SecKeyCreate function had a different parameter list.
489 The current parameter list matches the iPhone OS implementation. Existing clients of this function
490 on Mac OS X (and there should not be any outside the Security stack, per the warning above) must
491 migrate to the replacement function, SecKeyCreateWithCSSMKey.
492 */
493 SecKeyRef SecKeyCreate(CFAllocatorRef allocator,
494 const SecKeyDescriptor *keyClass, const uint8_t *keyData,
495 CFIndex keyDataLength, SecKeyEncoding encoding);
496
497 /*!
498 @function SecKeyCreateWithCSSMKey
499 @abstract Generate a temporary floating key reference for a CSSM_KEY.
500 @param key A pointer to a CSSM_KEY structure.
501 @param keyRef On return, a key reference.
502 @result A result code. See "Security Error Codes" (SecBase.h).
503 @discussion Warning: this function is NOT intended for use outside the Security stack in its current state. <rdar://3201885>
504 */
505 OSStatus SecKeyCreateWithCSSMKey(const CSSM_KEY *key, SecKeyRef* keyRef) API_DEPRECATED("CSSM_KEY is deprecated", macos(10.11, 10.14));
506
507 // Alias macOS versions of this deprecated SPI to unique macOS names. Undecorated names are used for macCatalyst.
508 #define SecKeyRawSign SecKeyRawSign_macOS
509 #define SecKeyRawVerify SecKeyRawVerify_macOS
510
511 CF_IMPLICIT_BRIDGING_ENABLED
512
513 /*!
514 @function SecKeyRawSign
515 @abstract Given a private key and data to sign, generate a digital signature.
516 @param key Private key with which to sign.
517 @param padding See Padding Types above, typically kSecPaddingPKCS1SHA1.
518 @param dataToSign The data to be signed, typically the digest of the actual data.
519 @param dataToSignLen Length of dataToSign in bytes.
520 @param sig Pointer to buffer in which the signature will be returned.
521 @param sigLen IN/OUT maximum length of sig buffer on input, actualy length of sig on output.
522 @result A result code. See "Security Error Codes" (SecBase.h).
523 @discussion If the padding argument is kSecPaddingPKCS1, PKCS1 padding
524 will be performed prior to signing. If this argument is kSecPaddingNone,
525 the incoming data will be signed "as is".
526
527 When PKCS1 padding is performed, the maximum length of data that can
528 be signed is the value returned by SecKeyGetBlockSize() - 11.
529
530 NOTE: The behavior this function with kSecPaddingNone is undefined if the
531 first byte of dataToSign is zero; there is no way to verify leading zeroes
532 as they are discarded during the calculation.
533
534 If you want to generate a proper PKCS1 style signature with DER encoding of
535 the digest type - and the dataToSign is a SHA1 digest - use kSecPaddingPKCS1SHA1.
536 */
537 OSStatus SecKeyRawSign(
538 SecKeyRef key,
539 SecPadding padding,
540 const uint8_t *dataToSign,
541 size_t dataToSignLen,
542 uint8_t *sig,
543 size_t *sigLen)
544 SPI_DEPRECATED_WITH_REPLACEMENT("SecKeyCreateSignature", macos(10.7, 10.15));
545
546
547 /*!
548 @function SecKeyRawVerify
549 @abstract Given a public key, data which has been signed, and a signature, verify the signature.
550 @param key Public key with which to verify the signature.
551 @param padding See Padding Types above, typically kSecPaddingPKCS1SHA1.
552 @param signedData The data over which sig is being verified, typically the digest of the actual data.
553 @param signedDataLen Length of signedData in bytes.
554 @param sig Pointer to the signature to verify.
555 @param sigLen Length of sig in bytes.
556 @result A result code. See "Security Error Codes" (SecBase.h).
557 @discussion If the padding argument is kSecPaddingPKCS1, PKCS1 padding
558 will be checked during verification. If this argument is kSecPaddingNone,
559 the incoming data will be compared directly to sig.
560
561 If you are verifying a proper PKCS1-style signature, with DER encoding of the digest
562 type - and the signedData is a SHA1 digest - use kSecPaddingPKCS1SHA1.
563 */
564 OSStatus SecKeyRawVerify(
565 SecKeyRef key,
566 SecPadding padding,
567 const uint8_t *signedData,
568 size_t signedDataLen,
569 const uint8_t *sig,
570 size_t sigLen)
571 SPI_DEPRECATED_WITH_REPLACEMENT("SecKeyVerifySignature", macos(10.7, 10.15));
572
573 CF_IMPLICIT_BRIDGING_DISABLED
574
575 /*!
576 @function SecKeyEncrypt
577 @abstract Encrypt a block of plaintext.
578 @param key Public key with which to encrypt the data.
579 @param padding See Padding Types above, typically kSecPaddingPKCS1.
580 @param plainText The data to encrypt.
581 @param plainTextLen Length of plainText in bytes, this must be less
582 or equal to the value returned by SecKeyGetBlockSize().
583 @param cipherText Pointer to the output buffer.
584 @param cipherTextLen On input, specifies how much space is available at
585 cipherText; on return, it is the actual number of cipherText bytes written.
586 @result A result code. See "Security Error Codes" (SecBase.h).
587 @discussion If the padding argument is kSecPaddingPKCS1, PKCS1 padding
588 will be performed prior to encryption. If this argument is kSecPaddingNone,
589 the incoming data will be encrypted "as is".
590
591 When PKCS1 padding is performed, the maximum length of data that can
592 be encrypted is the value returned by SecKeyGetBlockSize() - 11.
593
594 When memory usage is a critical issue, note that the input buffer
595 (plainText) can be the same as the output buffer (cipherText).
596 */
597 OSStatus SecKeyEncrypt(
598 SecKeyRef key,
599 SecPadding padding,
600 const uint8_t *plainText,
601 size_t plainTextLen,
602 uint8_t *cipherText,
603 size_t *cipherTextLen)
604 SPI_DEPRECATED_WITH_REPLACEMENT("SecKeyCreateEncryptedData", macos(10.7, 10.15));
605
606
607 /*!
608 @function SecKeyDecrypt
609 @abstract Decrypt a block of ciphertext.
610 @param key Private key with which to decrypt the data.
611 @param padding See SecPadding types above; typically kSecPaddingPKCS1.
612 @param cipherText The data to decrypt.
613 @param cipherTextLen Length of cipherText in bytes; this must be less
614 or equal to the value returned by SecKeyGetBlockSize().
615 @param plainText Pointer to the output buffer.
616 @param plainTextLen On input, specifies how much space is available at
617 plainText; on return, it is the actual number of plainText bytes written.
618 @result A result code. See "Security Error Codes" (SecBase.h).
619 @discussion If the padding argument is kSecPaddingPKCS1, PKCS1 padding
620 will be removed after decryption. If this argument is kSecPaddingNone,
621 the decrypted data will be returned "as is".
622
623 When memory usage is a critical issue, note that the input buffer
624 (plainText) can be the same as the output buffer (cipherText).
625 */
626 OSStatus SecKeyDecrypt(
627 SecKeyRef key, /* Private key */
628 SecPadding padding, /* kSecPaddingNone, kSecPaddingPKCS1, kSecPaddingOAEP */
629 const uint8_t *cipherText,
630 size_t cipherTextLen, /* length of cipherText */
631 uint8_t *plainText,
632 size_t *plainTextLen) /* IN/OUT */
633 SPI_DEPRECATED_WITH_REPLACEMENT("SecKeyCreateDecryptedData", macos(10.7, 10.15));
634
635 // SecAsn1AlgId is deprecated, but we still need to use it.
636 #pragma clang diagnostic push
637 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
638 OSStatus SecKeyVerifyDigest(
639 SecKeyRef key, /* Private key */
640 const SecAsn1AlgId *algId, /* algorithm oid/params */
641 const uint8_t *digestData, /* signature over this digest */
642 size_t digestDataLen, /* length of dataToDigest */
643 const uint8_t *sig, /* signature to verify */
644 size_t sigLen); /* length of sig */
645
646 OSStatus SecKeySignDigest(
647 SecKeyRef key, /* Private key */
648 const SecAsn1AlgId *algId, /* algorithm oid/params */
649 const uint8_t *digestData, /* signature over this digest */
650 size_t digestDataLen, /* length of digestData */
651 uint8_t *sig, /* signature, RETURNED */
652 size_t *sigLen); /* IN/OUT */
653 #pragma clang diagnostic pop
654
655 #endif // SEC_OS_OSX_INCLUDES
656
657
658 /* These are the named curves we support. These values come from RFC 4492
659 section 5.1.1, with the exception of SSL_Curve_None which means
660 "ECDSA not negotiated". */
661 typedef enum
662 {
663 kSecECCurveNone = -1,
664 kSecECCurveSecp256r1 = 23,
665 kSecECCurveSecp384r1 = 24,
666 kSecECCurveSecp521r1 = 25
667 } SecECNamedCurve;
668
669 /* Return a named curve enum for ecPrivateKey. */
670 SecECNamedCurve SecECKeyGetNamedCurve(SecKeyRef ecPrivateKey);
671 CFDataRef SecECKeyCopyPublicBits(SecKeyRef key);
672
673 /* Given an RSA public key in encoded form return a SecKeyRef representing
674 that key. Supported encodings are kSecKeyEncodingPkcs1. */
675 SecKeyRef SecKeyCreateRSAPublicKey(CFAllocatorRef allocator,
676 const uint8_t *keyData, CFIndex keyDataLength,
677 SecKeyEncoding encoding);
678
679 CFDataRef SecKeyCopyModulus(SecKeyRef rsaPublicKey);
680 CFDataRef SecKeyCopyExponent(SecKeyRef rsaPublicKey);
681
682 /*!
683 @function SecKeyCopyPublicBytes
684 @abstract Gets the bits of a public key
685 @param key Key to retrieve the bits.
686 @param publicBytes An out parameter to receive the public key bits
687 @result Errors if any when retrieving the public key bits..
688 */
689 OSStatus SecKeyCopyPublicBytes(SecKeyRef key, CFDataRef* publicBytes);
690
691 /*!
692 @function SecKeyCreatePublicFromPrivate
693 @abstract Create a public SecKeyRef from a private SecKeyRef
694 @param privateKey The private SecKeyRef for which you want the public key
695 @result A public SecKeyRef, or NULL if the conversion failed
696 @discussion This is a "best attempt" function, hence the SPI nature. If the public
697 key bits are not in memory, it attempts to load from the keychain. If the public
698 key was not tracked on the keychain, it will fail.
699 */
700 SecKeyRef SecKeyCreatePublicFromPrivate(SecKeyRef privateKey);
701
702 /*!
703 @function SecKeyCreateFromPublicData
704 */
705 SecKeyRef SecKeyCreateFromPublicData(CFAllocatorRef allocator, CFIndex algorithmID, CFDataRef publicBytes);
706
707 #if SEC_OS_OSX_INCLUDES
708 OSStatus SecKeyRawVerifyOSX(
709 SecKeyRef key,
710 SecPadding padding,
711 const uint8_t *signedData,
712 size_t signedDataLen,
713 const uint8_t *sig,
714 size_t sigLen)
715 SPI_DEPRECATED_WITH_REPLACEMENT("SecKeyVerifySignature", macos(10.7, 10.15));
716
717 #endif // SEC_OS_OSX_INCLUDES
718
719 /*!
720 @constant kSecKeyApplePayEnabled If set to kCFBooleanTrue during SecKeyCreateRandomKey, then the SEP-based key is ApplePay-enabled,
721 which means that it can be used for ECIES to re-crypt.
722 */
723 extern const CFStringRef kSecKeyApplePayEnabled
724 SPI_AVAILABLE(macos(10.14.4), ios(12.2), tvos(12.2), watchos(5.2));
725
726 /*!
727 @constant kSecKeyEncryptionParameterSymmetricKeySizeInBits CFNumberRef with size in bits for ephemeral
728 symmetric key used for encryption/decryption.
729 */
730 extern const CFStringRef kSecKeyEncryptionParameterSymmetricKeySizeInBits
731 SPI_AVAILABLE(macos(10.14.4), ios(12.2), tvos(12.2), watchos(5.2));
732
733 /*!
734 @constant kSecKeyEncryptionParameterSymmetricAAD CFDataRef with additional authentiction data for AES-GCM encryption.
735 */
736 extern const CFStringRef kSecKeyEncryptionParameterSymmetricAAD
737 SPI_AVAILABLE(macos(10.14.4), ios(12.2), tvos(12.2), watchos(5.2));
738
739 /*!
740 @constant kSecKeyEncryptionParameterRecryptParameters Usable only for SecKeyCreateDecryptedDataWithParameters.
741 Contains dictionary with parameters for re-encryption using the same algorithm and encryption parameters
742 specified inside this dictionary.
743 */
744 extern const CFStringRef kSecKeyEncryptionParameterRecryptParameters
745 SPI_AVAILABLE(macos(10.14.4), ios(12.2), tvos(12.2), watchos(5.2));
746
747 /*!
748 @constant kSecKeyEncryptionParameterRecryptCertificate Usable only inside kSecKeyEncryptionParameterRecryptParameters.
749 Specifies certificate whose public key is used to re-crypt previously decrypted data. This parameter should contain
750 CFDataRef with X509 DER-encoded data of the certificate chain {leaf, intermediate, root}, leaf's public key is
751 to be used for re-encryption.
752 */
753 extern const CFStringRef kSecKeyEncryptionParameterRecryptCertificate
754 SPI_AVAILABLE(macos(10.14.4), ios(12.2), tvos(12.2), watchos(5.2));
755
756 /*!
757 @function SecKeyCreateEncryptedDataWithParameters
758 @abstract Encrypt a block of plaintext.
759 @param key Public key with which to encrypt the data.
760 @param algorithm One of SecKeyAlgorithm constants suitable to perform encryption with this key.
761 @param plaintext The data to encrypt. The length and format of the data must conform to chosen algorithm,
762 typically be less or equal to the value returned by SecKeyGetBlockSize().
763 @param parameters Dictionary with additional parameters for encryption. Supported parameters are:
764 - kSecKeyKeyExchangeParameterSharedInfo: additional SharedInfo value for ECIES encryptions
765 - kSecKeyEncryptionParameterSymmetricKeySizeInBits: 128 or 256, size of ephemeral AES key used for symmetric encryption
766 - kSecKeyEncryptionParameterSymmetricAAD: optional CFDataRef with additiona authentication data for AES-GCM encryption
767 @param error On error, will be populated with an error object describing the failure.
768 See "Security Error Codes" (SecBase.h).
769 @result The ciphertext represented as a CFData, or NULL on failure.
770 @discussion Encrypts plaintext data using specified key. The exact type of the operation including the format
771 of input and output data is specified by encryption algorithm.
772 */
773 CFDataRef SecKeyCreateEncryptedDataWithParameters(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef plaintext,
774 CFDictionaryRef parameters, CFErrorRef *error)
775 SPI_AVAILABLE(macos(10.14.4), ios(12.2), tvos(12.2), watchos(5.2));
776
777 /*!
778 @function SecKeyCreateDecryptedDataWithParameters
779 @abstract Decrypt a block of ciphertext.
780 @param key Private key with which to decrypt the data.
781 @param algorithm One of SecKeyAlgorithm constants suitable to perform decryption with this key.
782 @param ciphertext The data to decrypt. The length and format of the data must conform to chosen algorithm,
783 typically be less or equal to the value returned by SecKeyGetBlockSize().
784 @param parameters Dictionary with additional parameters for decryption.Supported parameters are:
785 - kSecKeyKeyExchangeParameterSharedInfo: additional SharedInfo value for ECIES encryptions
786 - kSecKeyEncryptionParameterSymmetricKeySizeInBits: 128 or 256, size of ephemeral AES key used for symmetric encryption
787 - kSecKeyEncryptionParameterSymmetricAAD: optional CFDataRef with additiona authentication data for AES-GCM encryption
788 - kSecKeyEncryptionParameterRecryptParameters: optional CFDictionaryRef with parameters for immediate re-encryption
789 of decrypted data. If present, the dictionary *must* contain at least kSecKeyEncryptionParameterRecryptCertificate parameter.
790
791 @param error On error, will be populated with an error object describing the failure.
792 See "Security Error Codes" (SecBase.h).
793 @result The plaintext represented as a CFData, or NULL on failure.
794 @discussion Decrypts ciphertext data using specified key. The exact type of the operation including the format
795 of input and output data is specified by decryption algorithm.
796 */
797 CFDataRef SecKeyCreateDecryptedDataWithParameters(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef ciphertext,
798 CFDictionaryRef parameters, CFErrorRef *error)
799 SPI_AVAILABLE(macos(10.14.4), ios(12.2), tvos(12.2), watchos(5.2));
800
801 /*!
802 @enum SecKeyAttestationKeyType
803 @abstract Defines types of builtin attestation keys.
804 */
805 typedef CF_ENUM(uint32_t, SecKeyAttestationKeyType)
806 {
807 kSecKeyAttestationKeyTypeSIK = 0,
808 kSecKeyAttestationKeyTypeGID = 1,
809 kSecKeyAttestationKeyTypeUIKCommitted SPI_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) = 2,
810 kSecKeyAttestationKeyTypeUIKProposed SPI_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0)) = 3,
811 kSecKeyAttestationKeyTypeSecureElement SPI_AVAILABLE(ios(13.0)) = 4,
812 kSecKeyAttestationKeyTypeOIKCommitted SPI_AVAILABLE(macos(10.16), ios(14.0), tvos(14.0), watchos(7.0)) = 5,
813 kSecKeyAttestationKeyTypeOIKProposed SPI_AVAILABLE(macos(10.16), ios(14.0), tvos(14.0), watchos(7.0)) = 6,
814 kSecKeyAttestationKeyTypeDAKCommitted SPI_AVAILABLE(macos(10.16), ios(14.0), tvos(14.0), watchos(7.0)) = 7,
815 kSecKeyAttestationKeyTypeDAKProposed SPI_AVAILABLE(macos(10.16), ios(14.0), tvos(14.0), watchos(7.0)) = 8,
816 } SPI_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0));
817
818 /*!
819 @function SecKeyCopyAttestationKey
820 @abstract Returns a copy of a builtin attestation key.
821
822 @param keyType Type of the requested builtin key.
823 @param error An optional pointer to a CFErrorRef. This value is set if an error occurred.
824
825 @result On success a SecKeyRef containing the requested key is returned, on failure it returns NULL.
826 */
827 SecKeyRef SecKeyCopyAttestationKey(SecKeyAttestationKeyType keyType, CFErrorRef *error)
828 SPI_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0));
829
830 /*!
831 @function SecKeyCreateAttestation
832 @abstract Attests a key with another key.
833
834 @param key The attesting key.
835 @param keyToAttest The key which is to be attested.
836 @param error An optional pointer to a CFErrorRef. This value is set if an error occurred.
837
838 @result On success a CFDataRef containing the attestation data is returned, on failure it returns NULL.
839
840 @discussion Key attestation only works for CTK SEP keys, i.e. keys created with kSecAttrTokenID=kSecAttrTokenIDSecureEnclave.
841 */
842 CFDataRef SecKeyCreateAttestation(SecKeyRef key, SecKeyRef keyToAttest, CFErrorRef *error)
843 SPI_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0));
844
845 /*!
846 @function SecKeySetParameter
847 @abstract Sets unspecified key parameter for the backend.
848
849 @param key Key to set the parameter to.
850 @param name Identifies parameter to be set.
851 @param value New value for the parameter.
852 @param error Error which gathers more information when something went wrong.
853
854 @discussion Serves as channel between SecKey client and backend for passing additional sideband data send from SecKey caller
855 to SecKey implementation backend. Parameter names and types are either generic kSecUse*** attributes or are a contract between
856 SecKey user (application) and backend and in this case are not interpreted by SecKey layer in any way.
857 */
858 Boolean SecKeySetParameter(SecKeyRef key, CFStringRef name, CFPropertyListRef value, CFErrorRef *error)
859 SPI_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0));
860
861 extern const CFStringRef kSecKeyParameterSETokenAttestationNonce
862 SPI_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0));
863
864 /*!
865 Available lifetime operations for SEP system keys.
866 */
867 typedef CF_ENUM(int, SecKeyControlLifetimeType) {
868 kSecKeyControlLifetimeTypeBump = 0,
869 kSecKeyControlLifetimeTypeCommit = 1,
870 } SPI_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0));
871
872 /*!
873 @function SecKeyControlLifetime
874 @abstract Performs key lifetime control operations for SEP system keys.
875
876 @param key Key to be controlled, currently must be either proposed or committed system UIK.
877 @param type Type of the control operation to be performed.
878 @param error Error which gathers more information when something went wrong.
879 */
880 Boolean SecKeyControlLifetime(SecKeyRef key, SecKeyControlLifetimeType type, CFErrorRef *error)
881 SPI_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0));
882
883 /*!
884 @function SecKeyCreateDuplicate
885 @abstract Creates duplicate fo the key.
886
887 @param key Source key to be duplicated
888
889 @discussion Only memory representation of the key is duplicated, so if the key is backed by keychain, only one instance
890 stays in the keychain. Duplicating key is useful for setting 'temporary' key parameters using SecKeySetParameter.
891 If the key is immutable (i.e. does not support SecKeySetParameter), calling this method is identical to calling CFRetain().
892 */
893 SecKeyRef SecKeyCreateDuplicate(SecKeyRef key)
894 SPI_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0));
895
896 /*!
897 Algorithms for converting between bigendian and core-crypto ccunit data representation.
898 */
899 extern const SecKeyAlgorithm kSecKeyAlgorithmRSASignatureRawCCUnit;
900 extern const SecKeyAlgorithm kSecKeyAlgorithmRSAEncryptionRawCCUnit;
901
902 /*!
903 Internal algorithm for RSA-MD5. We do not want to export MD5 in new API, but we need it
904 for implementing legacy interfaces.
905 */
906 extern const SecKeyAlgorithm kSecKeyAlgorithmRSASignatureDigestPKCS1v15MD5;
907 extern const SecKeyAlgorithm kSecKeyAlgorithmRSASignatureMessagePKCS1v15MD5;
908
909 /*!
910 Algorithms for interoperability with libaks smartcard support.
911 */
912 extern const SecKeyAlgorithm kSecKeyAlgorithmECIESEncryptionAKSSmartCard;
913
914 __END_DECLS
915
916 #endif /* !_SECURITY_SECKEYPRIV_H_ */