MYASN1Object.m
author Jens Alfke <jens@mooseyard.com>
Tue Jun 02 13:16:28 2009 -0700 (2009-06-02)
changeset 16 c409dbc4f068
child 17 90a70925562b
permissions -rw-r--r--
* Added ASN.1 / BER / DER utilities, to be used in generating and parsing X.509 certs.
* Added Keychain user-interaction-allowed setter. Added doc comments to MYSymmetricKey.
jens@16
     1
//
jens@16
     2
//  MYASN1Object.m
jens@16
     3
//  MYCrypto-iPhone
jens@16
     4
//
jens@16
     5
//  Created by Jens Alfke on 5/28/09.
jens@16
     6
//  Copyright 2009 Jens Alfke. All rights reserved.
jens@16
     7
//
jens@16
     8
jens@16
     9
#import "MYASN1Object.h"
jens@16
    10
jens@16
    11
jens@16
    12
@implementation MYASN1Object
jens@16
    13
jens@16
    14
jens@16
    15
- (id) initWithTag: (uint32_t)tag
jens@16
    16
           ofClass: (uint8_t)tagClass 
jens@16
    17
       constructed: (BOOL)constructed
jens@16
    18
             value: (NSData*)value
jens@16
    19
{
jens@16
    20
    Assert(value);
jens@16
    21
    self = [super init];
jens@16
    22
    if (self != nil) {
jens@16
    23
        _tag = tag;
jens@16
    24
        _tagClass = tagClass;
jens@16
    25
        _constructed = constructed;
jens@16
    26
        _value = [value copy];
jens@16
    27
    }
jens@16
    28
    return self;
jens@16
    29
}
jens@16
    30
jens@16
    31
- (id) initWithTag: (uint32_t)tag
jens@16
    32
           ofClass: (uint8_t)tagClass 
jens@16
    33
        components: (NSArray*)components
jens@16
    34
{
jens@16
    35
    Assert(components);
jens@16
    36
    self = [super init];
jens@16
    37
    if (self != nil) {
jens@16
    38
        _tag = tag;
jens@16
    39
        _tagClass = tagClass;
jens@16
    40
        _constructed = YES;
jens@16
    41
        _components = [components copy];
jens@16
    42
    }
jens@16
    43
    return self;
jens@16
    44
}
jens@16
    45
jens@16
    46
- (void) dealloc
jens@16
    47
{
jens@16
    48
    [_value release];
jens@16
    49
    [_components release];
jens@16
    50
    [super dealloc];
jens@16
    51
}
jens@16
    52
jens@16
    53
jens@16
    54
@synthesize tag=_tag, tagClass=_tagClass, constructed=_constructed, value=_value, components=_components;
jens@16
    55
jens@16
    56
jens@16
    57
- (NSString*)description {
jens@16
    58
    if (_components)
jens@16
    59
        return $sprintf(@"%@[%hhu/%u/%u]%@", self.class, _tagClass,(unsigned)_constructed,_tag, _components);
jens@16
    60
    else
jens@16
    61
        return $sprintf(@"%@[%hhu/%u/%u, %u bytes]", self.class, _tagClass,(unsigned)_constructed,_tag, _value.length);
jens@16
    62
}
jens@16
    63
jens@16
    64
static void dump(id object, NSMutableString *output, NSString *indent) {
jens@16
    65
    if ([object isKindOfClass: [MYASN1Object class]]) {
jens@16
    66
        MYASN1Object *asn1Obj = object;
jens@16
    67
        [output appendFormat: @"%@%@[%hhu/%u]", indent, asn1Obj.class, asn1Obj.tagClass,asn1Obj.tag];
jens@16
    68
        if (asn1Obj.components) {
jens@16
    69
            [output appendString: @":\n"];
jens@16
    70
            NSString *subindent = [indent stringByAppendingString: @"    "];
jens@16
    71
            for (id o in asn1Obj.components)
jens@16
    72
                dump(o,output, subindent);
jens@16
    73
        } else
jens@16
    74
            [output appendFormat: @" %@\n", asn1Obj.value];
jens@16
    75
    } else if([object respondsToSelector: @selector(objectEnumerator)]) {
jens@16
    76
        [output appendString: indent];
jens@16
    77
        if ([object isKindOfClass: [NSArray class]])
jens@16
    78
            [output appendString: @"Sequence:\n"];
jens@16
    79
        else if ([object isKindOfClass: [NSSet class]])
jens@16
    80
            [output appendString: @"Set:\n"];
jens@16
    81
        else
jens@16
    82
            [output appendFormat: @"%@:\n", [object class]];
jens@16
    83
        NSString *subindent = [indent stringByAppendingString: @"    "];
jens@16
    84
        for (id o in object)
jens@16
    85
            dump(o,output, subindent);
jens@16
    86
    } else {
jens@16
    87
        [output appendFormat: @"%@%@\n", indent, object];
jens@16
    88
    }
jens@16
    89
}
jens@16
    90
jens@16
    91
+ (NSString*) dump: (id)object {
jens@16
    92
    NSMutableString *output = [NSMutableString stringWithCapacity: 512];
jens@16
    93
    dump(object,output,@"");
jens@16
    94
    return output;
jens@16
    95
}
jens@16
    96
jens@16
    97
jens@16
    98
@end
jens@16
    99
jens@16
   100
jens@16
   101
jens@16
   102
@implementation MYASN1BigInteger
jens@16
   103
jens@16
   104
@end
jens@16
   105
jens@16
   106
jens@16
   107
jens@16
   108
@implementation MYBitString
jens@16
   109
jens@16
   110
jens@16
   111
- (id)initWithBits: (NSData*)bits count: (unsigned)bitCount;
jens@16
   112
{
jens@16
   113
    Assert(bits);
jens@16
   114
    Assert(bitCount <= 8*bits.length);
jens@16
   115
    self = [super init];
jens@16
   116
    if (self != nil) {
jens@16
   117
        _bits = [bits copy];
jens@16
   118
        _bitCount = bitCount;
jens@16
   119
    }
jens@16
   120
    return self;
jens@16
   121
}
jens@16
   122
jens@16
   123
- (void) dealloc
jens@16
   124
{
jens@16
   125
    [_bits release];
jens@16
   126
    [super dealloc];
jens@16
   127
}
jens@16
   128
jens@16
   129
jens@16
   130
@synthesize bits=_bits, bitCount=_bitCount;
jens@16
   131
jens@16
   132
@end