Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ CopyConstructedOctetString() [2/2]

static int System.Formats.Asn1.AsnDecoder.CopyConstructedOctetString ( ReadOnlySpan< byte > source,
AsnEncodingRules ruleSet,
Span< byte > destination,
bool write,
bool isIndefinite,
out int bytesRead )
inlinestaticprivate

Definition at line 1281 of file AsnDecoder.cs.

1282 {
1283 bytesRead = 0;
1284 int num = 1000;
1286 Stack<(int, int, bool, int)> stack = null;
1287 int num2 = 0;
1288 Asn1Tag asn1Tag = Asn1Tag.ConstructedBitString;
1290 while (true)
1291 {
1292 if (!readOnlySpan.IsEmpty)
1293 {
1295 if (asn1Tag == Asn1Tag.PrimitiveOctetString)
1296 {
1297 if (ruleSet == AsnEncodingRules.CER && num != 1000)
1298 {
1299 throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer);
1300 }
1302 int num3 = bytesRead2 + readOnlySpan2.Length;
1304 bytesRead += num3;
1305 num2 += readOnlySpan2.Length;
1306 num = readOnlySpan2.Length;
1307 if (ruleSet == AsnEncodingRules.CER && num > 1000)
1308 {
1309 throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer);
1310 }
1311 if (write)
1312 {
1314 destination2 = destination2.Slice(readOnlySpan2.Length);
1315 }
1316 continue;
1317 }
1318 if (!(asn1Tag == Asn1Tag.EndOfContents && isIndefinite))
1319 {
1320 if (asn1Tag == Asn1Tag.ConstructedOctetString)
1321 {
1322 if (ruleSet == AsnEncodingRules.CER)
1323 {
1324 throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer);
1325 }
1326 if (stack == null)
1327 {
1328 stack = new Stack<(int, int, bool, int)>();
1329 }
1330 if (!source.Overlaps(readOnlySpan, out var elementOffset))
1331 {
1332 throw new AsnContentException();
1333 }
1334 stack.Push((elementOffset, readOnlySpan.Length, isIndefinite, bytesRead));
1337 isIndefinite = !contentsLength.HasValue;
1338 continue;
1339 }
1340 throw new AsnContentException();
1341 }
1344 if (stack != null && stack.Count > 0)
1345 {
1346 (int, int, bool, int) tuple = stack.Pop();
1347 int item = tuple.Item1;
1348 int item2 = tuple.Item2;
1349 bool item3 = tuple.Item3;
1350 int item4 = tuple.Item4;
1351 readOnlySpan = source.Slice(item, item2).Slice(bytesRead);
1352 bytesRead += item4;
1354 continue;
1355 }
1356 }
1357 if (isIndefinite && asn1Tag != Asn1Tag.EndOfContents)
1358 {
1359 throw new AsnContentException();
1360 }
1361 if (stack == null || stack.Count <= 0)
1362 {
1363 break;
1364 }
1365 (int, int, bool, int) tuple2 = stack.Pop();
1366 int item5 = tuple2.Item1;
1367 int item6 = tuple2.Item2;
1368 bool item7 = tuple2.Item3;
1369 int item8 = tuple2.Item4;
1370 readOnlySpan = source.Slice(item5, item6).Slice(bytesRead);
1372 bytesRead += item8;
1373 }
1374 return num2;
1375 }
void CopyTo(KeyValuePair< TKey, TValue >[] array, int index)
static void ValidateEndOfContents(Asn1Tag tag, int? length, int headerLength)
static ReadOnlySpan< byte > Slice(ReadOnlySpan< byte > source, int offset, int length)
static Asn1Tag ReadTagAndLength(ReadOnlySpan< byte > source, AsnEncodingRules ruleSet, out int? contentsLength, out int bytesRead)
static string ContentException_InvalidUnderCerOrDer_TryBer
Definition SR.cs:56
Definition SR.cs:7

References System.Formats.Asn1.Asn1Tag.ConstructedBitString, System.Formats.Asn1.Asn1Tag.ConstructedOctetString, System.SR.ContentException_InvalidUnderCerOrDer_TryBer, System.Collections.Generic.Dictionary< TKey, TValue >.CopyTo(), System.destination, System.Formats.Asn1.Asn1Tag.EndOfContents, System.item, System.Formats.Asn1.Asn1Tag.PrimitiveOctetString, System.Formats.Asn1.AsnDecoder.ReadTagAndLength(), System.Formats.Asn1.AsnDecoder.Slice(), System.source, and System.Formats.Asn1.AsnDecoder.ValidateEndOfContents().