MYCertificate.m
author snej@snej.local
Thu Apr 09 22:46:48 2009 -0700 (2009-04-09)
changeset 6 2d7692f9b6b4
parent 0 0a6527af039b
child 8 4c0eafa7b233
permissions -rw-r--r--
Updated the README for the 0.1 release.
     1 //
     2 //  MYCertificate.m
     3 //  MYCrypto
     4 //
     5 //  Created by Jens Alfke on 3/26/09.
     6 //  Copyright 2009 Jens Alfke. All rights reserved.
     7 //
     8 
     9 #import "MYCertificate.h"
    10 #import "MYCrypto_Private.h"
    11 
    12 #if !MYCRYPTO_USE_IPHONE_API
    13 
    14 
    15 @implementation MYCertificate
    16 
    17 
    18 /** Creates a MYCertificate object for an existing Keychain certificate reference. */
    19 - (id) initWithCertificateRef: (SecCertificateRef)certificateRef {
    20     self = [super initWithKeychainItemRef: (SecKeychainItemRef)certificateRef];
    21     if (self) {
    22         _certificateRef = certificateRef;     // superclass has already CFRetained it
    23     }
    24     return self;
    25 }
    26 
    27 /** Creates a MYCertificate object from exported key data, but does not add it to any keychain. */
    28 - (id) initWithCertificateData: (NSData*)data
    29                           type: (CSSM_CERT_TYPE) type
    30                       encoding: (CSSM_CERT_ENCODING) encoding
    31 {
    32     Assert(data);
    33     CSSM_DATA cssmData = {.Data=(void*)data.bytes, .Length=data.length};
    34     SecCertificateRef certificateRef = NULL;
    35     if (!check(SecCertificateCreateFromData(&cssmData, type, encoding, &certificateRef),
    36         @"SecCertificateCreateFromData")) {
    37         [self release];
    38         return nil;
    39     }
    40     self = [self initWithCertificateRef: certificateRef];
    41     CFRelease(certificateRef);
    42     return self;
    43 }
    44 
    45 - (id) initWithCertificateData: (NSData*)data {
    46     return [self initWithCertificateData: data 
    47                                     type: CSSM_CERT_X_509v3 
    48                                 encoding: CSSM_CERT_ENCODING_BER];
    49 }
    50 
    51 + (MYCertificate*) preferredCertificateForName: (NSString*)name {
    52     SecCertificateRef certRef = NULL;
    53     if (!check(SecCertificateCopyPreference((CFStringRef)name, 0, &certRef),
    54                @"SecCertificateCopyPreference"))
    55         return nil;
    56     return [[[MYCertificate alloc] initWithCertificateRef: certRef] autorelease];
    57 }
    58 
    59 - (BOOL) setPreferredCertificateForName: (NSString*)name {
    60     return check(SecCertificateSetPreference(_certificateRef, (CFStringRef)name, 0, NULL),
    61                  @"SecCertificateSetPreference");
    62 }
    63 
    64 @synthesize certificateRef=_certificateRef;
    65 
    66 - (NSData*) certificateData {
    67     CSSM_DATA cssmData;
    68     if (!check(SecCertificateGetData(_certificateRef, &cssmData),
    69                @"SecCertificateGetData"))
    70         return nil;
    71     return [NSData dataWithBytes: cssmData.Data length: cssmData.Length];
    72 }
    73 
    74 - (MYPublicKey*) publicKey {
    75     SecKeyRef keyRef = NULL;
    76     if (!check(SecCertificateCopyPublicKey(_certificateRef, &keyRef),
    77                @"SecCertificateCopyPublicKey") || !keyRef)
    78         return nil;
    79     MYPublicKey *key = [[[MYPublicKey alloc] initWithKeyRef: keyRef] autorelease];
    80     CFRelease(keyRef);
    81     return key;
    82 }
    83 
    84 - (NSString*) commonName {
    85     CFStringRef name = NULL;
    86     if (!check(SecCertificateCopyCommonName(_certificateRef, &name),
    87                @"SecCertificateCopyCommonName") || !name)
    88         return nil;
    89     return [(id)CFMakeCollectable(name) autorelease];
    90 }
    91 
    92 - (NSArray*) emailAddresses {
    93     CFArrayRef addrs = NULL;
    94     if (!check(SecCertificateCopyEmailAddresses(_certificateRef, &addrs),
    95                @"SecCertificateCopyEmailAddresses") || !addrs)
    96         return nil;
    97     return [(id)CFMakeCollectable(addrs) autorelease];
    98 }
    99 
   100 
   101 @end
   102 
   103 
   104 #endif !MYCRYPTO_USE_IPHONE_API