Whew! MYParsedCertificate can now generate certs from scratch. Also added improvements and fixes to the BER/DER codecs.
5 // Created by Jens Alfke on 5/28/09.
6 // Copyright 2009 Jens Alfke. All rights reserved.
9 #import "MYASN1Object.h"
12 @implementation MYASN1Object
15 - (id) initWithTag: (uint32_t)tag
16 ofClass: (uint8_t)tagClass
17 constructed: (BOOL)constructed
25 _constructed = constructed;
26 _value = [value copy];
31 - (id) initWithTag: (uint32_t)tag
32 ofClass: (uint8_t)tagClass
33 components: (NSArray*)components
41 _components = [components copy];
49 [_components release];
54 @synthesize tag=_tag, tagClass=_tagClass, constructed=_constructed, value=_value, components=_components;
57 - (NSString*)description {
59 return $sprintf(@"%@[%hhu/%u/%u]%@", self.class, _tagClass,(unsigned)_constructed,_tag, _components);
61 return $sprintf(@"%@[%hhu/%u/%u, %u bytes]", self.class, _tagClass,(unsigned)_constructed,_tag, _value.length);
64 - (BOOL) isEqual: (id)object {
65 return [object isKindOfClass: [MYASN1Object class]]
67 && _tagClass==[object tagClass]
68 && _constructed==[object constructed]
69 && $equal(_value,[object value])
70 && $equal(_components,[object components]);
73 static void dump(id object, NSMutableString *output, NSString *indent) {
74 if ([object isKindOfClass: [MYASN1Object class]]) {
75 MYASN1Object *asn1Obj = object;
76 [output appendFormat: @"%@%@[%hhu/%u]", indent, asn1Obj.class, asn1Obj.tagClass,asn1Obj.tag];
77 if (asn1Obj.components) {
78 [output appendString: @":\n"];
79 NSString *subindent = [indent stringByAppendingString: @" "];
80 for (id o in asn1Obj.components)
81 dump(o,output, subindent);
83 [output appendFormat: @" %@\n", asn1Obj.value];
84 } else if([object respondsToSelector: @selector(objectEnumerator)]) {
85 [output appendString: indent];
86 if ([object isKindOfClass: [NSArray class]])
87 [output appendString: @"Sequence:\n"];
88 else if ([object isKindOfClass: [NSSet class]])
89 [output appendString: @"Set:\n"];
91 [output appendFormat: @"%@:\n", [object class]];
92 NSString *subindent = [indent stringByAppendingString: @" "];
94 dump(o,output, subindent);
96 [output appendFormat: @"%@%@\n", indent, object];
100 + (NSString*) dump: (id)object {
101 NSMutableString *output = [NSMutableString stringWithCapacity: 512];
102 dump(object,output,@"");
111 @implementation MYASN1BigInteger
117 @implementation MYBitString
120 - (id)initWithBits: (NSData*)bits count: (unsigned)bitCount {
122 Assert(bitCount <= 8*bits.length);
126 _bitCount = bitCount;
131 + (MYBitString*) bitStringWithData: (NSData*)bits {
132 return [[[self alloc] initWithBits: bits count: 8*bits.length] autorelease];
141 @synthesize bits=_bits, bitCount=_bitCount;
143 - (NSString*) description {
144 return $sprintf(@"%@%@", [self class], _bits);
148 return _bits.hash ^ _bitCount;
151 - (BOOL) isEqual: (id)object {
152 return [object isKindOfClass: [MYBitString class]]
153 && _bitCount==[object bitCount]
154 && [_bits isEqual: [object bits]];