Differences From Artifact [0b76ffb19a]:
- File src/OFASN1BitString.m — part of check-in [0509d7a844] at 2019-01-03 19:13:03 on branch trunk — Update copyright (user: js, size: 2791) [annotate] [blame] [check-ins using]
To Artifact [12624c872e]:
- File
src/OFASN1BitString.m
— part of check-in
[c60933a59b]
at
2019-02-09 17:44:00
on branch trunk
— OFASN1*: Add designated initializer
This is in preparation for DER serialization support. (user: js, size: 3589) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
25 26 27 28 29 30 31 | #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" @implementation OFASN1BitString @synthesize bitStringValue = _bitStringValue; @synthesize bitStringLength = _bitStringLength; | > > > > > > > > | > > | > > > > > > > > > > > > > > | > < | | < < > > > > > > > > > > | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" @implementation OFASN1BitString @synthesize bitStringValue = _bitStringValue; @synthesize bitStringLength = _bitStringLength; + (instancetype)bitStringWithBitStringValue: (OFData *)bitStringValue bitStringLength: (size_t)bitStringLength { return [[[self alloc] initWithBitStringValue: bitStringValue bitStringLength: bitStringLength] autorelease]; } - (instancetype)initWithBitStringValue: (OFData *)bitStringValue bitStringLength: (size_t)bitStringLength { self = [super init]; @try { if ([bitStringValue count] * [bitStringValue itemSize] != bitStringLength / 8) @throw [OFInvalidFormatException exception]; _bitStringValue = [bitStringValue copy]; _bitStringLength = bitStringLength; } @catch (id e) { [self release]; @throw e; } return self; } - (instancetype)initWithTagClass: (of_asn1_tag_class_t)tagClass tagNumber: (of_asn1_tag_number_t)tagNumber constructed: (bool)constructed DEREncodedContents: (OFData *)DEREncodedContents { void *pool = objc_autoreleasePoolPush(); OFData *bitStringValue; size_t bitStringLength; @try { unsigned char lastByteBits; size_t count = [DEREncodedContents count]; if (tagClass != OF_ASN1_TAG_CLASS_UNIVERSAL || tagNumber != OF_ASN1_TAG_NUMBER_BIT_STRING || constructed) @throw [OFInvalidArgumentException exception]; if ([DEREncodedContents itemSize] != 1 || count == 0) @throw [OFInvalidFormatException exception]; lastByteBits = *(unsigned char *)[DEREncodedContents itemAtIndex: 0]; if (count == 1 && lastByteBits != 0) @throw [OFInvalidFormatException exception]; if (SIZE_MAX / 8 < count - 1 || SIZE_MAX - (count - 1) * 8 < lastByteBits) @throw [OFOutOfRangeException exception]; bitStringLength = (count - 1) * 8 + lastByteBits; bitStringValue = [[DEREncodedContents subdataWithRange: of_range(1, count - 1)] copy]; } @catch (id e) { [self release]; @throw e; } self = [self initWithBitStringValue: bitStringValue bitStringLength: bitStringLength]; objc_autoreleasePoolPop(pool); return self; } - (instancetype)init { OF_INVALID_INIT_METHOD } - (void)dealloc { [_bitStringValue release]; [super dealloc]; } |
︙ | ︙ |