diff --git a/src/X509Certificate.h b/src/X509Certificate.h index 1928a6e..fa82496 100644 --- a/src/X509Certificate.h +++ b/src/X509Certificate.h @@ -41,10 +41,13 @@ @interface X509Certificate: OFObject { X509 *crt; + OFDictionary *issuer; + OFDictionary *subject; + OFDictionary *subjectAlternativeName; } #ifdef OF_HAVE_PROPERTIES -// @property (opts) Type *name; +@property (readonly) OFDictionary *issuer, *subject, *subjectAlternativeName; #endif - initWithFile: (OFString*)file; diff --git a/src/X509Certificate.m b/src/X509Certificate.m index fa4a928..1f21796 100644 --- a/src/X509Certificate.m +++ b/src/X509Certificate.m @@ -26,6 +26,7 @@ #import "X509Certificate.h" #import +#import #import #import #import @@ -79,6 +80,10 @@ - (void)dealloc { + [issuer release]; + [subject release]; + [subjectAlternativeName release]; + if (crt != NULL) X509_free(crt); @@ -87,18 +92,29 @@ - (OFDictionary*)issuer { - X509_NAME *name = X509_get_issuer_name(crt); - return [self X509_dictionaryFromX509Name: name]; + if (issuer == nil) { + X509_NAME *name = X509_get_issuer_name(crt); + issuer = [[self X509_dictionaryFromX509Name: name] retain]; + } + + return issuer; } - (OFDictionary*)subject { - X509_NAME *name = X509_get_subject_name(crt); - return [self X509_dictionaryFromX509Name: name]; + if (subject == nil) { + X509_NAME *name = X509_get_subject_name(crt); + subject = [[self X509_dictionaryFromX509Name: name] retain]; + } + + return subject; } - (OFDictionary*)subjectAlternativeName { + if (subjectAlternativeName != nil) + return subjectAlternativeName; + int i = -1, j; OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFMutableDictionary *ret = [OFMutableDictionary dictionary]; @@ -222,7 +238,7 @@ [ret retain]; [pool release]; - return [ret autorelease]; + return (subjectAlternativeName = ret); } - (OFDictionary*)X509_dictionaryFromX509Name: (X509_NAME*)name