2 * Copyright (c) 2002-2004,2007-2008,2010,2012-2017 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
25 * SecIdentity.c - CoreFoundation based object containing a
26 * private key, certificate tuple.
30 #include <Security/SecIdentity.h>
32 #include <CoreFoundation/CFRuntime.h>
33 #include <CoreFoundation/CFString.h>
34 #include <Security/SecCertificate.h>
35 #include <Security/SecKey.h>
37 #include <Security/SecIdentityPriv.h>
38 #include <Security/SecInternal.h>
39 #include <utilities/SecCFWrappers.h>
41 struct __SecIdentity
{
43 SecCertificateRef _certificate
;
44 SecKeyRef _privateKey
;
47 CFGiblisWithHashFor(SecIdentity
)
49 /* Static functions. */
50 static CFStringRef
SecIdentityCopyFormatDescription(CFTypeRef cf
, CFDictionaryRef formatOptions
) {
51 SecIdentityRef identity
= (SecIdentityRef
)cf
;
52 return CFStringCreateWithFormat(kCFAllocatorDefault
, NULL
,
53 CFSTR("<SecIdentityRef: %p>"), identity
);
56 static void SecIdentityDestroy(CFTypeRef cf
) {
57 SecIdentityRef identity
= (SecIdentityRef
)cf
;
58 CFReleaseNull(identity
->_certificate
);
59 CFReleaseNull(identity
->_privateKey
);
62 static Boolean
SecIdentityCompare(CFTypeRef cf1
, CFTypeRef cf2
) {
63 SecIdentityRef identity1
= (SecIdentityRef
)cf1
;
64 SecIdentityRef identity2
= (SecIdentityRef
)cf2
;
65 if (identity1
== identity2
)
69 return CFEqual(identity1
->_certificate
, identity2
->_certificate
) &&
70 CFEqual(identity1
->_privateKey
, identity2
->_privateKey
);
73 /* Hash of identity is hash of certificate plus hash of key. */
74 static CFHashCode
SecIdentityHash(CFTypeRef cf
) {
75 SecIdentityRef identity
= (SecIdentityRef
)cf
;
76 return CFHash(identity
->_certificate
) + CFHash(identity
->_privateKey
);
79 OSStatus
SecIdentityCopyCertificate(SecIdentityRef identity
,
80 SecCertificateRef
*certificateRef
) {
81 *certificateRef
= identity
->_certificate
;
82 CFRetain(*certificateRef
);
86 OSStatus
SecIdentityCopyPrivateKey(SecIdentityRef identity
,
87 SecKeyRef
*privateKeyRef
) {
88 *privateKeyRef
= identity
->_privateKey
;
89 CFRetain(*privateKeyRef
);
93 SecIdentityRef
SecIdentityCreate(CFAllocatorRef allocator
,
94 SecCertificateRef certificate
, SecKeyRef privateKey
) {
95 if (!certificate
|| CFGetTypeID(certificate
) != SecCertificateGetTypeID() ||
96 !privateKey
|| CFGetTypeID(privateKey
) != SecKeyGetTypeID()) {
99 CFIndex size
= sizeof(struct __SecIdentity
);
100 SecIdentityRef result
= (SecIdentityRef
)_CFRuntimeCreateInstance(
101 allocator
, SecIdentityGetTypeID(), size
- sizeof(CFRuntimeBase
), 0);
103 CFRetain(certificate
);
104 CFRetain(privateKey
);
105 result
->_certificate
= certificate
;
106 result
->_privateKey
= privateKey
;