* Created class MYCertificateRequest, factored out of MYCertificateInfo.
* Added method to create a MYIdentity directly from a MYCertificateRequest.
* Added raw modulus+exponent accessor and initializer for MYPublicKey.
* Removed obsolete MYCertGen code, and the MYPrivateKey identity-creation method that used it.
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 "MYCertificateInfo.h"
11 #import "MYCrypto_Private.h"
13 #if MYCRYPTO_USE_IPHONE_API
16 @implementation MYCertificate
19 + (MYCertificate*) certificateWithCertificateRef: (SecCertificateRef)certificateRef {
20 return [[[self alloc] initWithCertificateRef: certificateRef] autorelease];
23 /** Creates a MYCertificate object for an existing Keychain certificate reference. */
24 - (id) initWithCertificateRef: (SecCertificateRef)certificateRef {
25 self = [super initWithKeychainItemRef: (SecKeychainItemRef)certificateRef];
27 _certificateRef = certificateRef; // superclass has already CFRetained it
32 /** Creates a MYCertificate object from exported key data, but does not add it to any keychain. */
33 - (id) initWithCertificateData: (NSData*)data
35 SecCertificateRef certificateRef = SecCertificateCreateWithData(NULL, (CFDataRef)data);
36 self = [self initWithCertificateRef: certificateRef];
37 CFRelease(certificateRef);
48 - (BOOL)isEqualToCertificate:(MYCertificate*)cert {
49 return [self isEqual: cert] || [self.certificateData isEqual: cert.certificateData];
52 @synthesize certificateRef=_certificateRef;
54 - (NSData*) certificateData {
55 CFDataRef data = SecCertificateCopyData(_certificateRef);
56 return data ?[(id)CFMakeCollectable(data) autorelease] :nil;
59 - (MYPublicKey*) publicKey {
60 SecTrustRef trust = NULL;
61 SecPolicyRef policy = SecPolicyCreateBasicX509();
62 OSStatus err = SecTrustCreateWithCertificates((CFArrayRef)$array((id)_certificateRef),
66 if (!check(err,@"SecTrustCreateWithCertificates"))
69 MYPublicKey *key = nil;
70 SecKeyRef keyRef = SecTrustCopyPublicKey(trust);
72 key = [[[MYPublicKey alloc] initWithKeyRef: keyRef] autorelease];
79 - (MYIdentity*) identity {
80 return [self.keychain identityWithDigest: self.publicKey.publicKeyDigest];
84 - (MYCertificateInfo*) info {
87 _info = [[MYCertificateInfo alloc] initWithCertificateData: self.certificateData
90 Warn(@"Couldn't parse certificate %@: %@", self, error);
95 - (NSString*) commonName {
96 CFStringRef name = SecCertificateCopySubjectSummary(_certificateRef);
97 return name ?[(id)CFMakeCollectable(name) autorelease] :nil;
103 #endif MYCRYPTO_USE_IPHONE_API