2 // MYCertificate-iPhone.m
5 // Created by Jens Alfke on 3/30/09.
6 // Copyright 2009 Jens Alfke. All rights reserved.
9 #import "MYCertificate.h"
10 #import "MYCrypto_Private.h"
12 #if MYCRYPTO_USE_IPHONE_API
15 @implementation MYCertificate
18 + (MYCertificate*) certificateWithCertificateRef: (SecCertificateRef)certificateRef {
19 return [[[self alloc] initWithCertificateRef: certificateRef] autorelease];
22 /** Creates a MYCertificate object for an existing Keychain certificate reference. */
23 - (id) initWithCertificateRef: (SecCertificateRef)certificateRef {
24 self = [super initWithKeychainItemRef: (SecKeychainItemRef)certificateRef];
26 _certificateRef = certificateRef; // superclass has already CFRetained it
31 /** Creates a MYCertificate object from exported key data, but does not add it to any keychain. */
32 - (id) initWithCertificateData: (NSData*)data
34 SecCertificateRef certificateRef = SecCertificateCreateWithData(NULL, (CFDataRef)data);
35 self = [self initWithCertificateRef: certificateRef];
36 CFRelease(certificateRef);
41 - (BOOL)isEqualToCertificate:(MYCertificate*)cert {
42 return [self isEqual: cert] || [self.certificateData isEqual: cert.certificateData];
45 @synthesize certificateRef=_certificateRef;
47 - (NSData*) certificateData {
48 CFDataRef data = SecCertificateCopyData(_certificateRef);
49 return data ?[(id)CFMakeCollectable(data) autorelease] :nil;
52 - (MYPublicKey*) publicKey {
53 SecTrustRef trust = NULL;
54 SecPolicyRef policy = SecPolicyCreateBasicX509();
55 OSStatus err = SecTrustCreateWithCertificates((CFArrayRef)$array((id)_certificateRef),
59 if (!check(err,@"SecTrustCreateWithCertificates"))
62 MYPublicKey *key = nil;
63 SecKeyRef keyRef = SecTrustCopyPublicKey(trust);
65 key = [[[MYPublicKey alloc] initWithKeyRef: keyRef] autorelease];
73 - (NSString*) commonName {
74 CFStringRef name = SecCertificateCopySubjectSummary(_certificateRef);
75 return name ?[(id)CFMakeCollectable(name) autorelease] :nil;
81 #endif MYCRYPTO_USE_IPHONE_API