5 // Created by Jens Alfke on 4/9/09.
6 // Copyright 2009 Jens Alfke. All rights reserved.
10 #import "MYCrypto_Private.h"
13 @implementation MYIdentity
16 /** Creates a MYIdentity object for an existing Keychain identity reference. */
17 + (MYIdentity*) identityWithIdentityRef: (SecIdentityRef)identityRef {
18 return [[[self alloc] initWithIdentityRef: identityRef] autorelease];
21 - (id) initWithIdentityRef: (SecIdentityRef)identityRef {
23 SecCertificateRef certificateRef;
24 if (!check(SecIdentityCopyCertificate(identityRef, &certificateRef), @"SecIdentityCopyCertificate")) {
28 self = [super initWithCertificateRef: certificateRef];
30 _identityRef = identityRef;
31 CFRetain(identityRef);
33 CFRelease(certificateRef);
39 - (id) initWithCertificateRef: (SecCertificateRef)certificateRef {
40 self = [super initWithCertificateRef: certificateRef];
42 if (!check(SecIdentityCreateWithCertificate(NULL, certificateRef, &_identityRef),
43 @"SecIdentityCreateWithCertificate")) {
54 if (_identityRef) CFRelease(_identityRef);
60 if (_identityRef) CFRelease(_identityRef);
65 @synthesize identityRef=_identityRef;
67 - (MYPrivateKey*) privateKey {
68 SecKeyRef keyRef = NULL;
69 if (!check(SecIdentityCopyPrivateKey(_identityRef, &keyRef), @"SecIdentityCopyPrivateKey"))
71 MYPrivateKey *privateKey = [[MYPrivateKey alloc] _initWithKeyRef: keyRef
72 publicKey: self.publicKey];
74 return [privateKey autorelease];
80 + (MYIdentity*) preferredIdentityForName: (NSString*)name
83 SecIdentityRef identityRef;
84 OSStatus err = SecIdentityCopyPreference((CFStringRef)name, 0, NULL, &identityRef);
85 if (err==errKCItemNotFound || !check(err,@"SecIdentityCopyPreference") || !identityRef)
87 return [self identityWithIdentityRef: identityRef];
90 - (BOOL) makePreferredIdentityForName: (NSString*)name {
92 return check(SecIdentitySetPreference(_identityRef, (CFStringRef)name, 0),
93 @"SecIdentitySetPreference");
96 #endif !TARGET_OS_IPHONE