]>
Commit | Line | Data |
---|---|---|
b1ab9ed8 A |
1 | /* |
2 | * Copyright (c) 2002-2009 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 | * SecKeyPriv.h - SPIs to SecKeyRef objects. | |
24 | */ | |
25 | ||
26 | /*! | |
27 | @header SecKeyPriv | |
28 | The functions provided in SecKeyPriv.h implement and manage a particular | |
29 | type of keychain item that represents a key. A key can be stored in a | |
30 | keychain, but a key can also be a transient object. | |
31 | ||
32 | You can use a key as a keychain item in most functions. | |
33 | */ | |
34 | ||
35 | #ifndef _SECURITY_SECKEYPRIV_H_ | |
36 | #define _SECURITY_SECKEYPRIV_H_ | |
37 | ||
38 | #include <Security/SecKey.h> | |
39 | #include <Security/x509defs.h> | |
40 | #include <Security/SecAsn1Types.h> | |
41 | #include <AvailabilityMacros.h> | |
42 | ||
43 | #if defined(__cplusplus) | |
44 | extern "C" { | |
45 | #endif | |
46 | ||
427c49bc A |
47 | typedef struct SecRSAPublicKeyParams { |
48 | uint8_t *modulus; /* modulus */ | |
49 | CFIndex modulusLength; | |
50 | uint8_t *exponent; /* public exponent */ | |
51 | CFIndex exponentLength; | |
52 | } SecRSAPublicKeyParams; | |
53 | ||
b1ab9ed8 A |
54 | typedef uint32_t SecKeyEncoding; |
55 | enum { | |
56 | /* Typically only used for symmetric keys. */ | |
57 | kSecKeyEncodingRaw = 0, | |
58 | ||
59 | /* RSA keys are DER-encoded according to PKCS1. */ | |
60 | kSecKeyEncodingPkcs1 = 1, | |
61 | ||
62 | /* RSA keys are DER-encoded according to PKCS1 with Apple Extensions. */ | |
63 | kSecKeyEncodingApplePkcs1 = 2, | |
64 | ||
65 | /* RSA public key in SecRSAPublicKeyParams format. keyData is a pointer | |
66 | to a SecRSAPublicKeyParams and keyDataLength is | |
67 | sizeof(SecRSAPublicKeyParams). */ | |
68 | kSecKeyEncodingRSAPublicParams = 3, | |
69 | }; | |
70 | ||
71 | typedef OSStatus (*SecKeyInitMethod)(SecKeyRef, const uint8_t *, CFIndex, | |
72 | SecKeyEncoding); | |
73 | typedef void *(*SecKeyCopyMethod)(SecKeyRef); | |
74 | typedef void (*SecKeyDestroyMethod)(SecKeyRef); | |
75 | typedef void (*SecKeyDeleteMethod)(SecKeyRef); | |
76 | typedef void (*SecKeyShowMethod)(SecKeyRef); | |
77 | typedef OSStatus (*SecKeyRawSignMethod)(SecKeyRef key, SecPadding padding, | |
78 | const uint8_t *dataToSign, size_t dataToSignLen, | |
79 | uint8_t *sig, size_t *sigLen); | |
80 | typedef OSStatus (*SecKeyRawVerifyMethod)( | |
81 | SecKeyRef key, SecPadding padding, const uint8_t *signedData, | |
82 | size_t signedDataLen, const uint8_t *sig, size_t sigLen); | |
83 | typedef OSStatus (*SecKeyEncryptMethod)(SecKeyRef key, SecPadding padding, | |
84 | const uint8_t *plainText, size_t plainTextLen, | |
85 | uint8_t *cipherText, size_t *cipherTextLen); | |
86 | typedef OSStatus (*SecKeyDecryptMethod)(SecKeyRef key, SecPadding padding, | |
87 | const uint8_t *cipherText, size_t cipherTextLen, | |
88 | uint8_t *plainText, size_t *plainTextLen); | |
89 | typedef size_t (*SecKeyBlockSizeMethod)(SecKeyRef key); | |
90 | typedef CFDictionaryRef (*SecKeyCopyDictionaryMethod)(SecKeyRef key); | |
91 | ||
92 | typedef struct { | |
93 | const char *name; | |
94 | SecKeyInitMethod init; | |
95 | SecKeyCopyMethod copy; | |
96 | SecKeyDestroyMethod destroy; | |
97 | SecKeyDeleteMethod remove; | |
98 | SecKeyShowMethod show; | |
99 | SecKeyRawSignMethod rawSign; | |
100 | SecKeyRawVerifyMethod rawVerify; | |
101 | SecKeyEncryptMethod encrypt; | |
102 | SecKeyDecryptMethod decrypt; | |
103 | SecKeyBlockSizeMethod blockSize; | |
104 | SecKeyCopyDictionaryMethod copyDictionary; | |
105 | /* If known, the number of bytes to allocate for the key field in the SecKey struct. */ | |
106 | int extraBytes; | |
107 | } SecKeyDescriptor; | |
108 | ||
109 | /*! | |
110 | @function SecKeyGetAlgorithmID | |
111 | @abstract Returns a pointer to a CSSM_X509_ALGORITHM_IDENTIFIER structure for the given key. | |
112 | @param key A key reference. | |
113 | @param algid On return, a pointer to a CSSM_X509_ALGORITHM_IDENTIFIER structure. | |
114 | @result A result code. See "Security Error Codes" (SecBase.h). | |
115 | */ | |
116 | OSStatus SecKeyGetAlgorithmID(SecKeyRef key, const CSSM_X509_ALGORITHM_IDENTIFIER **algid) | |
117 | DEPRECATED_IN_MAC_OS_X_VERSION_10_8_AND_LATER; | |
118 | ||
119 | enum { | |
120 | kSecNullAlgorithmID = 0, | |
121 | kSecRSAAlgorithmID = 1, | |
122 | kSecDSAAlgorithmID = 2, /* unsupported, just here for reference. */ | |
123 | kSecECDSAAlgorithmID = 3, | |
124 | }; | |
125 | ||
126 | /*! | |
127 | @function SecKeyGetAlgorithmId | |
128 | @abstract Returns an enumerated constant value which identifies the algorithm for the given key. | |
129 | @param key A key reference. | |
130 | @result An algorithm identifier. | |
131 | */ | |
132 | CFIndex SecKeyGetAlgorithmId(SecKeyRef key) | |
133 | __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_NA); | |
134 | ||
135 | /*! | |
136 | @function SecKeyGetStrengthInBits | |
137 | @abstract Returns key strength in bits for the given key. | |
138 | @param key A key reference. | |
139 | @param algid A pointer to a CSSM_X509_ALGORITHM_IDENTIFIER structure, as returned from a call to SecKeyGetAlgorithmID. | |
140 | @param strength On return, the key strength in bits. | |
141 | @result A result code. See "Security Error Codes" (SecBase.h). | |
142 | */ | |
143 | OSStatus SecKeyGetStrengthInBits(SecKeyRef key, const CSSM_X509_ALGORITHM_IDENTIFIER *algid, unsigned int *strength); | |
144 | ||
145 | /*! | |
146 | @function SecKeyImportPair | |
147 | @abstract Takes an asymmetric key pair and stores it in the keychain specified by the keychain parameter. | |
148 | @param keychainRef A reference to the keychain in which to store the private and public key items. Specify NULL for the default keychain. | |
149 | @param publicCssmKey A CSSM_KEY which is valid for the CSP returned by SecKeychainGetCSPHandle(). This may be a normal key or reference key. | |
150 | @param privateCssmKey A CSSM_KEY which is valid for the CSP returned by SecKeychainGetCSPHandle(). This may be a normal key or reference key. | |
151 | @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. | |
152 | @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. | |
153 | @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. | |
154 | @result A result code. See "Security Error Codes" (SecBase.h). | |
155 | @deprecated in 10.5 and later. Use the SecKeychainItemImport function instead; see <Security/SecImportExport.h> | |
156 | */ | |
157 | OSStatus SecKeyImportPair( | |
158 | SecKeychainRef keychainRef, | |
159 | const CSSM_KEY *publicCssmKey, | |
160 | const CSSM_KEY *privateCssmKey, | |
161 | SecAccessRef initialAccess, | |
162 | SecKeyRef* publicKey, | |
163 | SecKeyRef* privateKey) | |
164 | DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER; | |
165 | ||
166 | /*! | |
167 | @function SecKeyCreate | |
168 | @abstract Create a key reference from the supplied key data. | |
169 | @param allocator CFAllocator to allocate the key data. Pass NULL to use the default allocator. | |
170 | @param keyClass A descriptor for the particular class of key that is being created. | |
171 | @param keyData Data from which to create the key. Specify the format of this data in the encoding parameter. | |
172 | @param keyDataLength Length of the data pointed to by keyData. | |
173 | @param encoding A value of type SecKeyEncoding which describes the format of keyData. | |
174 | @result A key reference. | |
175 | @discussion Warning: this function is NOT intended for use outside the Security stack in its current state. <rdar://3201885> | |
176 | IMPORTANT: on Mac OS X 10.5 and earlier, the SecKeyCreate function had a different parameter list. | |
177 | The current parameter list matches the iPhone OS implementation. Existing clients of this function | |
178 | on Mac OS X (and there should not be any outside the Security stack, per the warning above) must | |
179 | migrate to the replacement function, SecKeyCreateWithCSSMKey. | |
180 | */ | |
181 | SecKeyRef SecKeyCreate(CFAllocatorRef allocator, | |
182 | const SecKeyDescriptor *keyClass, const uint8_t *keyData, | |
183 | CFIndex keyDataLength, SecKeyEncoding encoding); | |
184 | ||
185 | /*! | |
186 | @function SecKeyCreateWithCSSMKey | |
187 | @abstract Generate a temporary floating key reference for a CSSM_KEY. | |
188 | @param key A pointer to a CSSM_KEY structure. | |
189 | @param keyRef On return, a key reference. | |
190 | @result A result code. See "Security Error Codes" (SecBase.h). | |
191 | @discussion Warning: this function is NOT intended for use outside the Security stack in its current state. <rdar://3201885> | |
192 | */ | |
193 | OSStatus SecKeyCreateWithCSSMKey(const CSSM_KEY *key, SecKeyRef* keyRef); | |
194 | ||
195 | /*! | |
196 | @enum Dictionary key constants for SecKeyGeneratePair API. | |
197 | @discussion Predefined key constants used to get or set values in a dictionary. | |
198 | @constant kSecPrivateKeyAttrs The value for this key is a CFDictionaryRef | |
199 | containing attributes specific for the private key to be generated. | |
200 | @constant kSecPublicKeyAttrs The value for this key is a CFDictionaryRef | |
201 | containing attributes specific for the public key to be generated. | |
202 | */ | |
203 | extern CFTypeRef kSecPrivateKeyAttrs; | |
204 | extern CFTypeRef kSecPublicKeyAttrs; | |
205 | ||
206 | /*! | |
207 | @function SecKeyGeneratePair | |
208 | @abstract Generate a private/public keypair. | |
209 | @param parameters A dictionary containing one or more key-value pairs. | |
210 | See the discussion sections below for a complete overview of options. | |
211 | @param publicKey On return, a SecKeyRef reference to the public key. | |
212 | @param privateKey On return, a SecKeyRef reference to the private key. | |
213 | @result A result code. See "Security Error Codes" (SecBase.h). | |
214 | @discussion In order to generate a keypair the parameters dictionary must | |
215 | at least contain the following keys: | |
216 | ||
217 | * kSecAttrKeyType with a value being kSecAttrKeyTypeRSA or any other | |
218 | kSecAttrKeyType defined in SecItem.h | |
219 | * kSecAttrKeySizeInBits with a value being a CFNumberRef or CFStringRef | |
220 | containing the requested key size in bits. Example sizes for RSA | |
221 | keys are: 512, 768, 1024, 2048. | |
222 | ||
223 | The values below may be set either in the top-level dictionary or in a | |
224 | dictionary that is the value of the kSecPrivateKeyAttrs or | |
225 | kSecPublicKeyAttrs key in the top-level dictionary. Setting these | |
226 | attributes explicitly will override the defaults below. See SecItem.h | |
227 | for detailed information on these attributes including the types of | |
228 | the values. | |
229 | ||
230 | * kSecAttrLabel default NULL | |
231 | * kSecAttrIsPermanent if this key is present and has a Boolean | |
232 | value of true, the key or key pair will be added to the default | |
233 | keychain. | |
234 | * kSecAttrApplicationTag default NULL | |
235 | * kSecAttrEffectiveKeySize default NULL same as kSecAttrKeySizeInBits | |
236 | * kSecAttrCanEncrypt default false for private keys, true for public keys | |
237 | * kSecAttrCanDecrypt default true for private keys, false for public keys | |
238 | * kSecAttrCanDerive default true | |
239 | * kSecAttrCanSign default true for private keys, false for public keys | |
240 | * kSecAttrCanVerify default false for private keys, true for public keys | |
241 | * kSecAttrCanWrap default false for private keys, true for public keys | |
242 | * kSecAttrCanUnwrap default true for private keys, false for public keys | |
243 | ||
244 | */ | |
245 | OSStatus SecKeyGeneratePair(CFDictionaryRef parameters, | |
246 | SecKeyRef *publicKey, SecKeyRef *privateKey); | |
247 | ||
248 | ||
249 | /*! | |
250 | @function SecKeyRawSign | |
251 | @abstract Given a private key and data to sign, generate a digital signature. | |
252 | @param key Private key with which to sign. | |
253 | @param padding See Padding Types above, typically kSecPaddingPKCS1SHA1. | |
254 | @param dataToSign The data to be signed, typically the digest of the actual data. | |
255 | @param dataToSignLen Length of dataToSign in bytes. | |
256 | @param sig Pointer to buffer in which the signature will be returned. | |
257 | @param sigLen IN/OUT maximum length of sig buffer on input, actualy length of sig on output. | |
258 | @result A result code. See "Security Error Codes" (SecBase.h). | |
259 | @discussion If the padding argument is kSecPaddingPKCS1, PKCS1 padding | |
260 | will be performed prior to signing. If this argument is kSecPaddingNone, | |
261 | the incoming data will be signed "as is". | |
262 | ||
263 | When PKCS1 padding is performed, the maximum length of data that can | |
264 | be signed is the value returned by SecKeyGetBlockSize() - 11. | |
265 | ||
266 | NOTE: The behavior this function with kSecPaddingNone is undefined if the | |
267 | first byte of dataToSign is zero; there is no way to verify leading zeroes | |
268 | as they are discarded during the calculation. | |
269 | ||
270 | If you want to generate a proper PKCS1 style signature with DER encoding of | |
271 | the digest type - and the dataToSign is a SHA1 digest - use kSecPaddingPKCS1SHA1. | |
272 | */ | |
273 | OSStatus SecKeyRawSign( | |
274 | SecKeyRef key, | |
275 | SecPadding padding, | |
276 | const uint8_t *dataToSign, | |
277 | size_t dataToSignLen, | |
278 | uint8_t *sig, | |
279 | size_t *sigLen); | |
280 | ||
281 | ||
282 | /*! | |
283 | @function SecKeyRawVerify | |
284 | @abstract Given a public key, data which has been signed, and a signature, verify the signature. | |
285 | @param key Public key with which to verify the signature. | |
286 | @param padding See Padding Types above, typically kSecPaddingPKCS1SHA1. | |
287 | @param signedData The data over which sig is being verified, typically the digest of the actual data. | |
288 | @param signedDataLen Length of signedData in bytes. | |
289 | @param sig Pointer to the signature to verify. | |
290 | @param sigLen Length of sig in bytes. | |
291 | @result A result code. See "Security Error Codes" (SecBase.h). | |
292 | @discussion If the padding argument is kSecPaddingPKCS1, PKCS1 padding | |
293 | will be checked during verification. If this argument is kSecPaddingNone, | |
294 | the incoming data will be compared directly to sig. | |
295 | ||
296 | If you are verifying a proper PKCS1-style signature, with DER encoding of the digest | |
297 | type - and the signedData is a SHA1 digest - use kSecPaddingPKCS1SHA1. | |
298 | */ | |
299 | OSStatus SecKeyRawVerify( | |
300 | SecKeyRef key, | |
301 | SecPadding padding, | |
302 | const uint8_t *signedData, | |
303 | size_t signedDataLen, | |
304 | const uint8_t *sig, | |
305 | size_t sigLen); | |
306 | ||
307 | ||
308 | /*! | |
309 | @function SecKeyEncrypt | |
310 | @abstract Encrypt a block of plaintext. | |
311 | @param key Public key with which to encrypt the data. | |
312 | @param padding See Padding Types above, typically kSecPaddingPKCS1. | |
313 | @param plainText The data to encrypt. | |
314 | @param plainTextLen Length of plainText in bytes, this must be less | |
315 | or equal to the value returned by SecKeyGetBlockSize(). | |
316 | @param cipherText Pointer to the output buffer. | |
317 | @param cipherTextLen On input, specifies how much space is available at | |
318 | cipherText; on return, it is the actual number of cipherText bytes written. | |
319 | @result A result code. See "Security Error Codes" (SecBase.h). | |
320 | @discussion If the padding argument is kSecPaddingPKCS1, PKCS1 padding | |
321 | will be performed prior to encryption. If this argument is kSecPaddingNone, | |
322 | the incoming data will be encrypted "as is". | |
323 | ||
324 | When PKCS1 padding is performed, the maximum length of data that can | |
325 | be encrypted is the value returned by SecKeyGetBlockSize() - 11. | |
326 | ||
327 | When memory usage is a critical issue, note that the input buffer | |
328 | (plainText) can be the same as the output buffer (cipherText). | |
329 | */ | |
330 | OSStatus SecKeyEncrypt( | |
331 | SecKeyRef key, | |
332 | SecPadding padding, | |
333 | const uint8_t *plainText, | |
334 | size_t plainTextLen, | |
335 | uint8_t *cipherText, | |
336 | size_t *cipherTextLen); | |
337 | ||
338 | ||
339 | /*! | |
340 | @function SecKeyDecrypt | |
341 | @abstract Decrypt a block of ciphertext. | |
342 | @param key Private key with which to decrypt the data. | |
343 | @param padding See SecPadding types above; typically kSecPaddingPKCS1. | |
344 | @param cipherText The data to decrypt. | |
345 | @param cipherTextLen Length of cipherText in bytes; this must be less | |
346 | or equal to the value returned by SecKeyGetBlockSize(). | |
347 | @param plainText Pointer to the output buffer. | |
348 | @param plainTextLen On input, specifies how much space is available at | |
349 | plainText; on return, it is the actual number of plainText bytes written. | |
350 | @result A result code. See "Security Error Codes" (SecBase.h). | |
351 | @discussion If the padding argument is kSecPaddingPKCS1, PKCS1 padding | |
352 | will be removed after decryption. If this argument is kSecPaddingNone, | |
353 | the decrypted data will be returned "as is". | |
354 | ||
355 | When memory usage is a critical issue, note that the input buffer | |
356 | (plainText) can be the same as the output buffer (cipherText). | |
357 | */ | |
358 | OSStatus SecKeyDecrypt( | |
359 | SecKeyRef key, /* Private key */ | |
360 | SecPadding padding, /* kSecPaddingNone, kSecPaddingPKCS1, kSecPaddingOAEP */ | |
361 | const uint8_t *cipherText, | |
362 | size_t cipherTextLen, /* length of cipherText */ | |
363 | uint8_t *plainText, | |
364 | size_t *plainTextLen); /* IN/OUT */ | |
365 | ||
366 | OSStatus SecKeyVerifyDigest( | |
367 | SecKeyRef key, /* Private key */ | |
368 | const SecAsn1AlgId *algId, /* algorithm oid/params */ | |
369 | const uint8_t *digestData, /* signature over this digest */ | |
370 | size_t digestDataLen, /* length of dataToDigest */ | |
371 | const uint8_t *sig, /* signature to verify */ | |
372 | size_t sigLen); /* length of sig */ | |
373 | ||
374 | OSStatus SecKeySignDigest( | |
375 | SecKeyRef key, /* Private key */ | |
376 | const SecAsn1AlgId *algId, /* algorithm oid/params */ | |
377 | const uint8_t *digestData, /* signature over this digest */ | |
378 | size_t digestDataLen, /* length of digestData */ | |
379 | uint8_t *sig, /* signature, RETURNED */ | |
380 | size_t *sigLen); /* IN/OUT */ | |
381 | ||
382 | ||
383 | /* These are the named curves we support. These values come from RFC 4492 | |
384 | section 5.1.1, with the exception of SSL_Curve_None which means | |
385 | "ECDSA not negotiated". */ | |
386 | typedef enum | |
387 | { | |
388 | kSecECCurveNone = -1, | |
389 | kSecECCurveSecp256r1 = 23, | |
390 | kSecECCurveSecp384r1 = 24, | |
391 | kSecECCurveSecp521r1 = 25 | |
392 | } SecECNamedCurve; | |
393 | ||
394 | /* Return a named curve enum for ecPrivateKey. */ | |
395 | SecECNamedCurve SecECKeyGetNamedCurve(SecKeyRef ecPrivateKey); | |
396 | CFDataRef SecECKeyCopyPublicBits(SecKeyRef key); | |
397 | ||
398 | /* Given an RSA public key in encoded form return a SecKeyRef representing | |
399 | that key. Supported encodings are kSecKeyEncodingPkcs1. */ | |
400 | SecKeyRef SecKeyCreateRSAPublicKey(CFAllocatorRef allocator, | |
401 | const uint8_t *keyData, CFIndex keyDataLength, | |
402 | SecKeyEncoding encoding); | |
403 | ||
404 | CFDataRef SecKeyCopyModulus(SecKeyRef rsaPublicKey); | |
405 | CFDataRef SecKeyCopyExponent(SecKeyRef rsaPublicKey); | |
406 | ||
427c49bc A |
407 | /*! |
408 | @function SecKeyCopyPublicBytes | |
409 | @abstract Gets the bits of a public key | |
410 | @param key Key to retrieve the bits. | |
411 | @param publicBytes An out parameter to receive the public key bits | |
412 | @result Errors if any when retrieving the public key bits.. | |
413 | */ | |
414 | OSStatus SecKeyCopyPublicBytes(SecKeyRef key, CFDataRef* publicBytes); | |
415 | ||
416 | /*! | |
417 | @function SecKeyCreatePublicFromPrivate | |
418 | @abstract Create a public SecKeyRef from a private SecKeyRef | |
419 | @param privateKey The private SecKeyRef for which you want the public key | |
420 | @result A public SecKeyRef, or NULL if the conversion failed | |
421 | @discussion This is a "best attempt" function, hence the SPI nature. If the public | |
422 | key bits are not in memory, it attempts to load from the keychain. If the public | |
423 | key was not tracked on the keychain, it will fail. | |
424 | */ | |
425 | SecKeyRef SecKeyCreatePublicFromPrivate(SecKeyRef privateKey); | |
426 | ||
427 | /*! | |
428 | @function SecKeyCreateFromPublicData | |
429 | */ | |
430 | SecKeyRef SecKeyCreateFromPublicData(CFAllocatorRef allocator, CFIndex algorithmID, CFDataRef publicBytes); | |
431 | ||
432 | OSStatus SecKeyRawVerifyOSX( | |
433 | SecKeyRef key, | |
434 | SecPadding padding, | |
435 | const uint8_t *signedData, | |
436 | size_t signedDataLen, | |
437 | const uint8_t *sig, | |
438 | size_t sigLen); | |
439 | ||
b1ab9ed8 A |
440 | #if defined(__cplusplus) |
441 | } | |
442 | #endif | |
443 | ||
444 | #endif /* !_SECURITY_SECKEYPRIV_H_ */ | |
445 |