17 {
18 if (pemData.
Length <
"-----BEGIN ".Length +
"-----".Length * 2 +
"-----END ".Length)
19 {
20 fields = default(PemFields);
21 return false;
22 }
23 Span<char> span = stackalloc char[256];
24 int num = 0;
25 int num2;
26 while ((num2 = pemData.IndexOfByOffset("-----BEGIN ", num)) >= 0)
27 {
28 int num3 = num2 + "-----BEGIN ".Length;
30 {
31 num = num3;
32 continue;
33 }
34 int num4 = pemData.IndexOfByOffset("-----", num3);
35 if (num4 < 0)
36 {
37 fields = default(PemFields);
38 return false;
39 }
40 Range range = num3..num4;
41 ReadOnlySpan<char> readOnlySpan = pemData;
42 ReadOnlySpan<char> readOnlySpan2 = readOnlySpan[range];
44 {
45 int num5 = num4 + "-----".Length;
46 int num6 = "-----END ".Length + readOnlySpan2.Length + "-----".Length;
47 Span<char> destination2 = ((num6 > 256) ? ((Span<char>)new char[num6]) : span);
48 ReadOnlySpan<char>
value = WritePostEB(readOnlySpan2, destination2);
49 int num7 = pemData.IndexOfByOffset(
value, num5);
50 if (num7 >= 0)
51 {
52 int num8 = num7 + num6;
54 {
55 Range range2 = num5..num7;
56 readOnlySpan = pemData;
57 if (
TryCountBase64(readOnlySpan[range2], out var base64Start, out var base64End, out var base64DecodedSize))
58 {
59 Range location = num2..num8;
60 Range base64data = (num5 + base64Start)..(num5 + base64End);
61 fields = new PemFields(range, base64data, location, base64DecodedSize);
62 return true;
63 }
64 }
65 }
66 }
67 if (num4 <= num)
68 {
69 fields = default(PemFields);
70 return false;
71 }
72 num = num4;
73 }
74 fields = default(PemFields);
75 return false;
76 static ReadOnlySpan<char> WritePostEB(ReadOnlySpan<char> label, Span<char>
destination)
77 {
78 int length =
"-----END ".Length + label.Length +
"-----".Length;
80 label.CopyTo(
destination.Slice(
"-----END ".Length));
81 "-----".CopyTo(
destination.Slice(
"-----END ".Length + label.Length));
83 }
84 }
static bool IsValidLabel(ReadOnlySpan< char > data)
static bool TryCountBase64(ReadOnlySpan< char > str, out int base64Start, out int base64End, out int base64DecodedSize)
static bool IsWhiteSpaceCharacter(char ch)