Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit f4457ef

Browse files
authored
Fix SignedCms handling of negative certificate serial numbers. (#30381)
The AsnSerializer normalized ReadOnlyMemory versions of Integer values to unsigned interpretations on Serialize, but Deserialize read values as-is. So signing a SignedCms with a negative-valued certificate serial, or creating an EnvelopedCms with a negative-valued recipient serial changed the representation of the serial number in the encoded file. This change fixes the serializer to do a pass-through by adding the missing "just use these bytes" method to AsnWriter. Then fixes the one place counting on this behavior, and adds a number of tests to prevent regressions.
1 parent be49d38 commit f4457ef

File tree

9 files changed

+381
-11
lines changed

9 files changed

+381
-11
lines changed

src/Common/src/System/Security/Cryptography/Asn1V2.Serializer.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -630,16 +630,7 @@ private static Serializer GetSimpleSerializer(
630630

631631
if (fieldData.TagType == UniversalTagNumber.Integer)
632632
{
633-
return (value, writer) =>
634-
{
635-
// TODO: split netstandard/netcoreapp for span usage?
636-
ReadOnlyMemory<byte> valAsMemory = (ReadOnlyMemory<byte>)value;
637-
byte[] tooBig = new byte[valAsMemory.Length + 1];
638-
valAsMemory.Span.CopyTo(tooBig.AsSpan(1));
639-
Array.Reverse(tooBig);
640-
BigInteger bigInt = new BigInteger(tooBig);
641-
writer.WriteInteger(bigInt);
642-
};
633+
return (value, writer) => writer.WriteInteger(tag, ((ReadOnlyMemory<byte>)value).Span);
643634
}
644635

645636
Debug.Fail($"No ReadOnlyMemory<byte> handler for {fieldData.TagType}");

src/Common/src/System/Security/Cryptography/AsnWriter.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ public void WriteInteger(BigInteger value)
241241
WriteIntegerCore(Asn1Tag.Integer, value);
242242
}
243243

244+
public void WriteInteger(ReadOnlySpan<byte> value)
245+
{
246+
WriteIntegerCore(Asn1Tag.Integer, value);
247+
}
248+
244249
public void WriteInteger(Asn1Tag tag, long value)
245250
{
246251
CheckUniversalTag(tag, UniversalTagNumber.Integer);
@@ -368,6 +373,42 @@ public void WriteInteger(Asn1Tag tag, BigInteger value)
368373
WriteIntegerCore(tag.AsPrimitive(), value);
369374
}
370375

376+
public void WriteInteger(Asn1Tag tag, ReadOnlySpan<byte> value)
377+
{
378+
CheckUniversalTag(tag, UniversalTagNumber.Integer);
379+
380+
WriteIntegerCore(tag.AsPrimitive(), value);
381+
}
382+
383+
private void WriteIntegerCore(Asn1Tag tag, ReadOnlySpan<byte> value)
384+
{
385+
if (value.IsEmpty)
386+
{
387+
throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding);
388+
}
389+
390+
// T-REC-X.690-201508 sec 8.3.2
391+
if (value.Length > 1)
392+
{
393+
ushort bigEndianValue = (ushort)(value[0] << 8 | value[1]);
394+
const ushort RedundancyMask = 0b1111_1111_1000_0000;
395+
ushort masked = (ushort)(bigEndianValue & RedundancyMask);
396+
397+
// If the first 9 bits are all 0 or are all 1, the value is invalid.
398+
if (masked == 0 || masked == RedundancyMask)
399+
{
400+
throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding);
401+
}
402+
}
403+
404+
Debug.Assert(!tag.IsConstructed);
405+
WriteTag(tag);
406+
WriteLength(value.Length);
407+
// WriteLength ensures the content-space
408+
value.CopyTo(_buffer.AsSpan(_offset));
409+
_offset += value.Length;
410+
}
411+
371412
// T-REC-X.690-201508 sec 8.3
372413
private void WriteIntegerCore(Asn1Tag tag, BigInteger value)
373414
{

src/System.Security.Cryptography.Encoding/tests/Asn1/Serializer/SimpleDeserialize.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,25 @@ public static void ReadIndefiniteLengthCustomTaggedStrings()
498498
Assert.Equal("020100", parsed.OctetString.ByteArrayToHex());
499499
Assert.Equal("010203", parsed.BitString.ByteArrayToHex());
500500
}
501+
502+
[Theory]
503+
[InlineData(PublicEncodingRules.BER)]
504+
// Not CER since it uses a definite encoding for the sequence.
505+
[InlineData(PublicEncodingRules.DER)]
506+
public static void ReadNegativeIntegers(PublicEncodingRules ruleSet)
507+
{
508+
byte[] inputData = (
509+
"3007" +
510+
"0201FE" +
511+
"0202FEEF").HexToByteArray();
512+
513+
BigIntegers bigIntegers = AsnSerializer.Deserialize<BigIntegers>(
514+
inputData,
515+
(AsnEncodingRules)ruleSet);
516+
517+
Assert.Equal(-2, (int)bigIntegers.First);
518+
Assert.Equal("FEEF", bigIntegers.Second.ByteArrayToHex());
519+
}
501520
}
502521

503522
// RFC 3280 / ITU-T X.509
@@ -881,4 +900,13 @@ public struct CustomTaggedBinaryStrings
881900
[ExpectedTag(1)]
882901
public ReadOnlyMemory<byte> BitString;
883902
}
903+
904+
[StructLayout(LayoutKind.Sequential)]
905+
public struct BigIntegers
906+
{
907+
public BigInteger First;
908+
909+
[Integer]
910+
public ReadOnlyMemory<byte> Second;
911+
}
884912
}

src/System.Security.Cryptography.Encoding/tests/Asn1/Serializer/SimpleSerialize.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,5 +427,20 @@ public static void WriteOptionals(string expectedHex, bool hasUtf8, bool hasIa5)
427427
Assert.Equal(expectedHex, writer.Encode().ByteArrayToHex());
428428
}
429429
}
430+
431+
[Fact]
432+
public static void WriteNegativeIntegers()
433+
{
434+
BigIntegers bigIntegers = new BigIntegers
435+
{
436+
First = -273,
437+
Second = new byte[] { 0xFE, 0xED, 0xF0, 0x0D },
438+
};
439+
440+
using (AsnWriter writer = AsnSerializer.Serialize(bigIntegers, AsnEncodingRules.DER))
441+
{
442+
Assert.Equal("300A0202FEEF0204FEEDF00D", writer.EncodeAsSpan().ByteArrayToHex());
443+
}
444+
}
430445
}
431446
}

src/System.Security.Cryptography.Encoding/tests/Asn1/Writer/WriteInteger.cs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System.Numerics;
66
using System.Security.Cryptography.Asn1;
7+
using Test.Cryptography;
78
using Xunit;
89

910
namespace System.Security.Cryptography.Tests.Asn1
@@ -279,6 +280,87 @@ public void VerifyWriteInteger_Private16_BigInteger(
279280
}
280281
}
281282

283+
[Theory]
284+
[InlineData("00")]
285+
[InlineData("01")]
286+
[InlineData("80")]
287+
[InlineData("FF")]
288+
[InlineData("0080")]
289+
[InlineData("00FF")]
290+
[InlineData("8000")]
291+
[InlineData("00F0E0D0C0B0A090807060504030201000")]
292+
[InlineData("FEFDFCFBFAF9F8F7F6F5F4F3F2F1F100")]
293+
public void VerifyWriteInteger_EncodedBytes(string valueHex)
294+
{
295+
string expectedHex = "02" + (valueHex.Length / 2).ToString("X2") + valueHex;
296+
297+
using (AsnWriter writer = new AsnWriter(AsnEncodingRules.BER))
298+
{
299+
writer.WriteInteger(valueHex.HexToByteArray());
300+
301+
Verify(writer, expectedHex);
302+
}
303+
}
304+
305+
[Theory]
306+
[InlineData("00")]
307+
[InlineData("01")]
308+
[InlineData("80")]
309+
[InlineData("FF")]
310+
[InlineData("0080")]
311+
[InlineData("00FF")]
312+
[InlineData("8000")]
313+
[InlineData("00F0E0D0C0B0A090807060504030201000")]
314+
[InlineData("FEFDFCFBFAF9F8F7F6F5F4F3F2F1F100")]
315+
public void VerifyWriteInteger_Context4_EncodedBytes(string valueHex)
316+
{
317+
string expectedHex = "84" + (valueHex.Length / 2).ToString("X2") + valueHex;
318+
319+
using (AsnWriter writer = new AsnWriter(AsnEncodingRules.BER))
320+
{
321+
writer.WriteInteger(new Asn1Tag(TagClass.ContextSpecific, 4), valueHex.HexToByteArray());
322+
323+
Verify(writer, expectedHex);
324+
}
325+
}
326+
327+
[Theory]
328+
[InlineData("")]
329+
[InlineData("0000")]
330+
[InlineData("0000000000000000000001")]
331+
[InlineData("0001")]
332+
[InlineData("007F")]
333+
[InlineData("FFFF")]
334+
[InlineData("FFFFFFFFFFFFFFFFFFFFFE")]
335+
[InlineData("FF80")]
336+
public void VerifyWriteInteger_InvalidEncodedValue_Throws(string valuHex)
337+
{
338+
using (AsnWriter writer = new AsnWriter(AsnEncodingRules.BER))
339+
{
340+
Assert.ThrowsAny<CryptographicException>(() => writer.WriteInteger(valuHex.HexToByteArray()));
341+
}
342+
}
343+
344+
[Theory]
345+
[InlineData("")]
346+
[InlineData("0000")]
347+
[InlineData("0000000000000000000001")]
348+
[InlineData("0001")]
349+
[InlineData("007F")]
350+
[InlineData("FFFF")]
351+
[InlineData("FFFFFFFFFFFFFFFFFFFFFE")]
352+
[InlineData("FF80")]
353+
public void VerifyWriteInteger_Application3_InvalidEncodedValue_Throws(string valuHex)
354+
{
355+
using (AsnWriter writer = new AsnWriter(AsnEncodingRules.BER))
356+
{
357+
Asn1Tag tag = new Asn1Tag(TagClass.Application, 3);
358+
359+
Assert.ThrowsAny<CryptographicException>(
360+
() => writer.WriteInteger(tag, valuHex.HexToByteArray()));
361+
}
362+
}
363+
282364
[Theory]
283365
[InlineData(PublicEncodingRules.BER)]
284366
[InlineData(PublicEncodingRules.CER)]

src/System.Security.Cryptography.Pkcs/src/System/Security/Cryptography/Pkcs/Rfc3161TimestampRequest.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,39 @@ public static Rfc3161TimestampRequest CreateFromHash(
250250
bool requestSignerCertificates = false,
251251
X509ExtensionCollection extensions = null)
252252
{
253+
// Normalize the nonce:
254+
if (nonce.HasValue)
255+
{
256+
ReadOnlyMemory<byte> nonceMemory = nonce.Value;
257+
ReadOnlySpan<byte> nonceSpan = nonceMemory.Span;
258+
259+
// If it's empty, or it would be negative, insert the requisite byte.
260+
if (nonceSpan.Length == 0 || nonceSpan[0] >= 0x80)
261+
{
262+
byte[] temp = new byte[nonceSpan.Length + 1];
263+
nonceSpan.CopyTo(temp.AsSpan(1));
264+
nonce = temp;
265+
}
266+
else
267+
{
268+
int slice = 0;
269+
270+
// Find all extra leading 0x00 values and trim them off.
271+
while (slice < nonceSpan.Length && nonceSpan[slice] == 0)
272+
{
273+
slice++;
274+
}
275+
276+
// Back up one if it was all zero, or we turned the number negative.
277+
if (slice == nonceSpan.Length || nonceSpan[slice] >= 0x80)
278+
{
279+
slice--;
280+
}
281+
282+
nonce = nonceMemory.Slice(slice);
283+
}
284+
}
285+
253286
var req = new Rfc3161TimeStampReq
254287
{
255288
Version = 1,

src/System.Security.Cryptography.Pkcs/tests/Certificates.cs

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ internal static class Certificates
2424
public static readonly CertLoader TwoEkuTsaCert = new CertLoaderFromRawData(RawData.TwoEkuTsaCert, RawData.TwoEkuTsaPfx, "export");
2525
public static readonly CertLoader NonCriticalTsaEku = new CertLoaderFromRawData(RawData.NonCriticalTsaEkuCert, RawData.NonCriticalTsaEkuPfx, "export");
2626
public static readonly CertLoader TlsClientServerCert = new CertLoaderFromRawData(RawData.TlsClientServerEkuCert, RawData.TlsClientServerEkuPfx, "export");
27+
public static readonly CertLoader NegativeSerialNumber = new CertLoaderFromRawData(RawData.NegativeSerialNumberCert, RawData.NegativeSerialNumberPfx, "1234");
2728

2829
// Note: the raw data is its own (nested) class to avoid problems with static field initialization ordering.
2930
private static class RawData
@@ -1200,8 +1201,113 @@ private static class RawData
12001201
"055DBE8A531FA77690A620BC5463431899B7577E3AEF0D382F31955AB5FCC951" +
12011202
"973037301F300706052B0E03021A0414F2009473DB4B8B63778E28E68613246F" +
12021203
"D53995810414A911A22D051F1BF45E7FF974C4285F6B4D880B08").HexToByteArray();
1204+
1205+
internal static readonly byte[] NegativeSerialNumberCert = (
1206+
"308202C2308201AAA0030201020210FD319CB1514B06AF49E00522277E43C830" +
1207+
"0D06092A864886F70D01010B05003014311230100603550403130953656C6620" +
1208+
"54657374301E170D3138303531343231303434385A170D313830363133323130" +
1209+
"3434395A3014311230100603550403130953656C66205465737430820122300D" +
1210+
"06092A864886F70D01010105000382010F003082010A0282010100E2D9B5C874" +
1211+
"F206A73C1FC3741C4C3669953929305CF057FF980DE2BAAEBA5CF76D34DE5BF8" +
1212+
"ED865B087BF935E31816B8B0DEDB61ABEF78D5CBC5C3389DBD815ECF7BDDC042" +
1213+
"BD21F68D9A7315671686613260B5D3505BC7C241C37C6E42C581228965B5D052" +
1214+
"B8ED3756966C6B678CDF647E5B659E5059915B16EF192BD313F6423FD487BBB4" +
1215+
"06BA70A7EDA7DBC55E15F1D93017BC92238D22DD9A15176A21F1BF7CF7AD280F" +
1216+
"7C32D76C8B136F0FBD0A89A373CF194CB5A0CF7AC1FA8098458290FD66311BB8" +
1217+
"DB17E9CB70D6668A8926F26198586C796C61EEDBFD376525130BAD2C452B6A66" +
1218+
"97AF7FE8F91408785C20DE79F4AD702197734328B4642FB898FF730203010001" +
1219+
"A310300E300C0603551D130101FF04023000300D06092A864886F70D01010B05" +
1220+
"00038201010057E4CE63680B165CD3DDAF5CC84F31CBC6C2CCDCBE33893A3FA7" +
1221+
"01781BBB9F003C0E301216F37D4E9C735F138920121983728EA88324DBEC66C7" +
1222+
"824BB25EC534C3AA5999C8A6D9393F9B04B599A94B415D0C0392E0FBE875221D" +
1223+
"A4348FE76ACBE5D845292AC475A9104052CCEF89390118E8EA8051519F423276" +
1224+
"164D8BDD5F46A8888C540DF5DD45A021593A0174BB5331223931F7756C5906A1" +
1225+
"94E7FF2EFB91D4CBFA4D1D762AE0769A07F2CC424692DB37131B2BEBDB3EE4BE" +
1226+
"07F9B1B12B5D368EC9317237CAB04D5B059F9226C972BADBB23CA747A46581D4" +
1227+
"9240E6FC0F2C8933F1844AD5F54E504DDAA3E87AE843C298DED1761035D2DFBF" +
1228+
"61E1B8F20930").HexToByteArray();
1229+
1230+
internal static readonly byte[] NegativeSerialNumberPfx = (
1231+
"308209C40201033082098406092A864886F70D010701A0820975048209713082" +
1232+
"096D3082060E06092A864886F70D010701A08205FF048205FB308205F7308205" +
1233+
"F3060B2A864886F70D010C0A0102A08204FE308204FA301C060A2A864886F70D" +
1234+
"010C0103300E0408F693A2B96616B043020207D0048204D8BEC6839AED85FA03" +
1235+
"2EAF9DED74CE6456E4DB561D9A30B8C343AF36CEA3C7F2FA55B1B7C30DBF4209" +
1236+
"58FEB61153386DCE8B81DCC756E06EC872E8B63FD6D8341123FDAE522E955357" +
1237+
"76B5A09941595C79404E68729389819D05459515314167A9E2585F3B2C8F9F24" +
1238+
"860BA42612DC492137051063A8EC8CBBC3D0ED59B92D10E6612C0C9AD5AE74DD" +
1239+
"999007CFEDA7A1AD2A2D5C25E41201F5A810D2654A3DA1648AF5D9EBBCFDFEEB" +
1240+
"FF8BC78A7BCE26EF0ECB1B0F07B33FB777160ACDF3DE00267398D771A35740AF" +
1241+
"661B189CB7394C02599417AF601231F3B6F40869E2DA8909D8A6D9565CFA389C" +
1242+
"5A002193B3CC374D973F0A587697CE6812126E3BC390093E56B671E8FA77E1C1" +
1243+
"E56AE194AD7695BED88A1139AA149F4E0875121995661B4133E9242FCAAF8A1F" +
1244+
"5721A055FC523EFEA4EEA98B6FB48EF07891B2E80D6EAC824FE9BBFBCB6A72A9" +
1245+
"52F12C3E3DE63F33F9A126BAC8FB0C7F2BF98A781598E6FE5A86409F4F22249F" +
1246+
"4A38B4670A2BF0EF93B0990AF33672CCAEFF15BB5813ECEDFDA38CA2BEEDAAA5" +
1247+
"2B880609057B3FC728F6D1964B7185A933B1526666FBC42C1B5D9A6FF3E2B3BD" +
1248+
"1BB8893BB6B9170BD4D7C6EB47C573FA90E19971017A6FAAD2B36CC746EBB238" +
1249+
"2211248404A09E2ABBC546D85B212286334E164FE24E03BAE053C3C12FA21F29" +
1250+
"FAC8A69F0EEBC688FB50834B5D7F2CB7CECC9BD5D6C06200AAC11B33AF2B6E11" +
1251+
"1F3853AEFBC086881561860093AE6C66A488BECE95CC80ECCABCFE91BDD302EC" +
1252+
"B86DF4B99530ECD707943E76ECA51E07DC109B9B788D1C0664C560352B251FCF" +
1253+
"D9F57C6C18DEDFB9B848A2A57A96B0BEB6C20FEFADAAE468D96B48AB061F6BE6" +
1254+
"194865E676009BD48E5951C534C05A4C4186DF7CF85B596E2F4FA2495440071B" +
1255+
"C13ECE7AF0E58FA13B53DF115BBAF846A5E2AF1F71B3F8AE895C62ABD90FBEBB" +
1256+
"815993D122B4B6816DF95C8097E9A1FC66F0181441B3BC3320BBABEE02004138" +
1257+
"93BBFEB480123A28B14AD4D4B8C918B851DA11C4347C8D1E46B2F211F0E6F049" +
1258+
"0674C2B1C2F6AC020D79E50A45363AD54D5CD2D6668DE917111111E380ACC015" +
1259+
"3CF5A0E3B25A4DF35305308FA2A5C0FFFFA31F6699D5F0699DD82AA5502EA6C3" +
1260+
"B6B782FDEDF5515DBA4D1FDB295A77119D49BC098D35A45E8DB2C88B7C97DD1A" +
1261+
"BB54B0D2EA27AD7B7A79D3C707C482376F8F612129C48024F4A1065BFCFAC2FE" +
1262+
"A176AAA2E0064BE2E77D9E3BCEA0AA732B59DB213A9A0EC972E376D8ACDE5BB6" +
1263+
"4C668B0E24BFE9479BE7574B07D4BEADF821769720A0B7557411826C97206B3D" +
1264+
"176262F4BBF64631ECBD31418487588773E39D46784A4361E31742333BE1DE2A" +
1265+
"BB0331011CA400795E306EDA88F82C78B6906B22E5D0CF68F9F349B9725178BA" +
1266+
"6B03D972E27C8EB376BE51206DE070FA45EE430D6CE17FD2744A7830E7A8E2C4" +
1267+
"C5033D39BFB14D74214ADE082371C49246540B0593487B0DC95BC9B887FA2222" +
1268+
"250D59EB2BB04983AD59004E3921ADCADB30E5C713B9B5FC31A6FD97D6694483" +
1269+
"2E29DAD105CF81265F8149B5EB32192CD0FA45F53621AE7A4D372ECCEC013D08" +
1270+
"B7D1BE73E5D3331236E90DE00A3AC3044F1A5462C9E84CB621A9C68C8B954824" +
1271+
"B684ED3DFC2D2839B19AF443F54ECBF3EC580BADC3CBECFDFE05BDCBA201C984" +
1272+
"C7DDE01EF79E57C5E8EAF9C1E4C8D48DCDA8C6A51F8C0DECABFC4BA6B776C4C8" +
1273+
"BA0110C6D5CEEBC7476E86D4710F5E773181E1301306092A864886F70D010915" +
1274+
"3106040401000000304F06092A864886F70D01091431421E4000380038003100" +
1275+
"3800350063003300300061006100660038003400370036003500610037003700" +
1276+
"32006600610036003400350035003900630062003400320064307906092B0601" +
1277+
"040182371101316C1E6A004D006900630072006F0073006F0066007400200045" +
1278+
"006E00680061006E006300650064002000520053004100200061006E00640020" +
1279+
"004100450053002000430072007900700074006F006700720061007000680069" +
1280+
"0063002000500072006F007600690064006500723082035706092A864886F70D" +
1281+
"010706A0820348308203440201003082033D06092A864886F70D010701301C06" +
1282+
"0A2A864886F70D010C0106300E0408EBDF03E906A5A3C1020207D08082031043" +
1283+
"B764B7A7FA6203394F0625BB0D59B39D3F28197972CBEC961476D76BE560A312" +
1284+
"1ED025A9455F39C33B2ABC1FA897EC29FAF01970321069F8CA20EE4DF6F9E98B" +
1285+
"0DCB3A290DFF4B9B1D151E4AE3AFD7D7383B40B292B0F369A47823A7C175F6CE" +
1286+
"A327283B8B33712B88F06ADDA6CD626036765E9E102E110C8E44EA75E53C5FEB" +
1287+
"661B08D7A9C06B59A35E76F293E8EFA64AF425B877D0321C13BA0079DA14D3A9" +
1288+
"A76EB69CF22E4D427A35C7391B650B822FA91FF0D3DFD1E037C34E2F1110C1A7" +
1289+
"F88A35E560422AE31203ED22BA74D1A6F8FB2AB5DA6E5E66633B7081E6F5681E" +
1290+
"DE01BD28E6DA6B6E0C1444A010DE229D6AD6E44E99400EC22EF1DD6E7E805503" +
1291+
"4B1A29ACD78F6D561E2DA35B84DA1F08BCDD0A74AF49E509744A91F4304F7EEB" +
1292+
"6231C18EC9159D31114183C0B9621AA227663AC67A5DB4B0982B539578DF0ED7" +
1293+
"6B577FD370FA4330E2DFAA015E1E6E2E4C6B71967071390D4B1CD061F567D072" +
1294+
"2BBBE027C1350B1679D1AE7DE7522AF62960403C15F1B75DC2AA0A1339051FA9" +
1295+
"E16692773046ABE0EEC29C1E6FE0ADEA33F7F878B004BC161D362ABDCD2F9992" +
1296+
"82D967B9FA46BCBF0D12CB6659FB2BABA258DE158F51F961CAD7AB5D68D6DFE8" +
1297+
"5E0DC6F043C4AB203E2F549EE0A3C2E25E13CD1462CD03AA3DB4689BA1DD0D8E" +
1298+
"D8293DA3D195901405154E98999E60BBA39A543E64963BE607BD48275508946B" +
1299+
"D27DA136C9F53C692DDC81FD3F6AD56419589716EF6F3A66A35049B29D438D5C" +
1300+
"F778961F74E954CBE1395D8A98971C30C3941CFCF2D3B8851C819D79D164FC71" +
1301+
"CA414798F4FFF3A6362A59AA17F543B5B4B2F2B7E14ED48B8ABEEB68469161B0" +
1302+
"6D2233257291C6F1B67D0BDC2422F3E04213CA29EB648219A6C3E339C1352E55" +
1303+
"F6D8749592723934693DD54F1D098DACFE9D308556B060CCC75D2F7AA8DDEC3C" +
1304+
"B1B127DE82AC8489FEFA4A9F09D49C919F703236036853D5E802975D4B3DA619" +
1305+
"EF90CF53AA38D0D646B69E75751DA833C619337722CA785477343614ACB67AF4" +
1306+
"427E3EAFAC5900F0A573512BD81F1A86A848321309156093665E39193B0867A0" +
1307+
"5C86500AF2760F8A87DB8E6E5FA2753037301F300706052B0E03021A0414AA38" +
1308+
"B6B4257EBA3E399CA9EDD87BDC1F82FBF7D70414B796F49E612D1A2B5A0DEC11" +
1309+
"608A153B5BCD4FE9").HexToByteArray();
12031310
}
12041311
}
12051312
}
12061313

1207-

0 commit comments

Comments
 (0)