@@ -119,8 +119,44 @@ class ASN1Utils {
119
119
return false ;
120
120
}
121
121
122
- static Uint8List getBytesFromPEMString (String pem,
123
- {bool checkHeader = true }) {
122
+ ///
123
+ /// Calculates the indefinite length of the ASN1 object.
124
+ /// Throws an [ArgumentError] if the end of content octets is not found.
125
+ ///
126
+ static int calculateIndefiniteLength (Uint8List bytes, int startPosition) {
127
+ var currentPosition = startPosition;
128
+ var indefiniteLengthObjects = 0 ;
129
+ while (currentPosition < bytes.length - 1 ) {
130
+ if (bytes[currentPosition] == 0x00 && bytes[currentPosition + 1 ] == 0x00 ) {
131
+ indefiniteLengthObjects-- ;
132
+ if (indefiniteLengthObjects == 0 ) {
133
+ return currentPosition - startPosition;
134
+ }
135
+ currentPosition += 2 ;
136
+ } else {
137
+ final nextLength = ASN1Utils .decodeLength (bytes.sublist (currentPosition));
138
+ final valueStartPosition =
139
+ ASN1Utils .calculateValueStartPosition (bytes.sublist (currentPosition));
140
+ if (nextLength == 0 ) {
141
+ throw ArgumentError ('Invalid length of zero.' );
142
+ }
143
+ if (valueStartPosition <= 0 ) {
144
+ throw ArgumentError ('Invalid value start position: $valueStartPosition ' );
145
+ }
146
+
147
+ if (nextLength == - 1 ) {
148
+ indefiniteLengthObjects++ ;
149
+ currentPosition += valueStartPosition;
150
+ } else {
151
+ currentPosition += valueStartPosition + nextLength;
152
+ }
153
+ }
154
+ }
155
+
156
+ throw ArgumentError ('End of content octets not found' );
157
+ }
158
+
159
+ static Uint8List getBytesFromPEMString (String pem, {bool checkHeader = true }) {
124
160
var lines = LineSplitter .split (pem)
125
161
.map ((line) => line.trim ())
126
162
.where ((line) => line.isNotEmpty)
@@ -141,8 +177,7 @@ class ASN1Utils {
141
177
return Uint8List .fromList (base64Decode (base64));
142
178
}
143
179
144
- static ECPrivateKey ecPrivateKeyFromDerBytes (Uint8List bytes,
145
- {bool pkcs8 = false }) {
180
+ static ECPrivateKey ecPrivateKeyFromDerBytes (Uint8List bytes, {bool pkcs8 = false }) {
146
181
var asn1Parser = ASN1Parser (bytes);
147
182
var topLevelSeq = asn1Parser.nextObject () as ASN1Sequence ;
148
183
var curveName;
@@ -160,23 +195,20 @@ class ASN1Utils {
160
195
var octetString = topLevelSeq.elements! .elementAt (2 ) as ASN1OctetString ;
161
196
asn1Parser = ASN1Parser (octetString.valueBytes);
162
197
var octetStringSeq = asn1Parser.nextObject () as ASN1Sequence ;
163
- var octetStringKeyData =
164
- octetStringSeq.elements! .elementAt (1 ) as ASN1OctetString ;
198
+ var octetStringKeyData = octetStringSeq.elements! .elementAt (1 ) as ASN1OctetString ;
165
199
166
200
x = octetStringKeyData.valueBytes! ;
167
201
} else {
168
202
// Parse the SEC1 format
169
- var privateKeyAsOctetString =
170
- topLevelSeq.elements! .elementAt (1 ) as ASN1OctetString ;
203
+ var privateKeyAsOctetString = topLevelSeq.elements! .elementAt (1 ) as ASN1OctetString ;
171
204
var choice = topLevelSeq.elements! .elementAt (2 );
172
205
var s = ASN1Sequence ();
173
206
var parser = ASN1Parser (choice.valueBytes);
174
207
while (parser.hasNext ()) {
175
208
s.add (parser.nextObject ());
176
209
}
177
210
var curveNameOi = s.elements! .elementAt (0 ) as ASN1ObjectIdentifier ;
178
- var data = ObjectIdentifiers .getIdentifierByIdentifier (
179
- curveNameOi.objectIdentifierAsString);
211
+ var data = ObjectIdentifiers .getIdentifierByIdentifier (curveNameOi.objectIdentifierAsString);
180
212
if (data != null ) {
181
213
curveName = data['readableName' ];
182
214
}
0 commit comments