25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#import "OFASN1Null.h"
#import "OFASN1NumericString.h"
#import "OFASN1OctetString.h"
#import "OFASN1PrintableString.h"
#import "OFASN1UTF8String.h"
#import "OFASN1Value.h"
#import "OFArray.h"
#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFOutOfRangeException.h"
#import "OFTruncatedDataException.h"
enum {
|
>
|
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#import "OFASN1Null.h"
#import "OFASN1NumericString.h"
#import "OFASN1OctetString.h"
#import "OFASN1PrintableString.h"
#import "OFASN1UTF8String.h"
#import "OFASN1Value.h"
#import "OFArray.h"
#import "OFSet.h"
#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFOutOfRangeException.h"
#import "OFTruncatedDataException.h"
enum {
|
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
count -= objectLength;
contents = [contents subdataWithRange:
of_range(objectLength, count)];
[ret addObject: object];
}
[ret makeImmutable];
return ret;
}
static size_t
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
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
|
count -= objectLength;
contents = [contents subdataWithRange:
of_range(objectLength, count)];
[ret addObject: object];
}
[ret makeImmutable];
return ret;
}
static OFSet *
parseSet(OFData *contents, size_t depthLimit)
{
OFMutableSet *ret = [OFMutableSet set];
size_t count = [contents count];
OFData *previousObjectData = nil;
if (depthLimit == 0)
@throw [OFOutOfRangeException exception];
while (count > 0) {
id object;
size_t objectLength;
OFData *objectData;
objectLength = parseObject(contents, &object, depthLimit);
objectData = [contents subdataWithRange:
of_range(0, objectLength)];
if (previousObjectData != nil &&
[objectData compare: previousObjectData] !=
OF_ORDERED_DESCENDING)
@throw [OFInvalidFormatException exception];
count -= objectLength;
contents = [contents subdataWithRange:
of_range(objectLength, count)];
[ret addObject: object];
previousObjectData = objectData;
}
[ret makeImmutable];
return ret;
}
static size_t
|
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
break;
case OF_ASN1_TAG_NUMBER_SEQUENCE:
if (!(tag & ASN1_TAG_CONSTRUCTED_MASK))
@throw [OFInvalidFormatException exception];
*object = parseSequence(contents, depthLimit - 1);
return bytesConsumed;
case OF_ASN1_TAG_NUMBER_NUMERIC_STRING:
valueClass = [OFASN1NumericString class];
break;
case OF_ASN1_TAG_NUMBER_PRINTABLE_STRING:
valueClass = [OFASN1PrintableString class];
break;
case OF_ASN1_TAG_NUMBER_IA5_STRING:
|
>
>
>
>
>
>
|
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
break;
case OF_ASN1_TAG_NUMBER_SEQUENCE:
if (!(tag & ASN1_TAG_CONSTRUCTED_MASK))
@throw [OFInvalidFormatException exception];
*object = parseSequence(contents, depthLimit - 1);
return bytesConsumed;
case OF_ASN1_TAG_NUMBER_SET:
if (!(tag & ASN1_TAG_CONSTRUCTED_MASK))
@throw [OFInvalidFormatException exception];
*object = parseSet(contents, depthLimit - 1);
return bytesConsumed;
case OF_ASN1_TAG_NUMBER_NUMERIC_STRING:
valueClass = [OFASN1NumericString class];
break;
case OF_ASN1_TAG_NUMBER_PRINTABLE_STRING:
valueClass = [OFASN1PrintableString class];
break;
case OF_ASN1_TAG_NUMBER_IA5_STRING:
|