mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Add Sha256Generator
This commit is contained in:
parent
f9232b9f12
commit
1aa5c9438e
14 changed files with 777 additions and 15 deletions
9
src/LibHac/Crypto/Detail/HashState.cs
Normal file
9
src/LibHac/Crypto/Detail/HashState.cs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
namespace LibHac.Crypto.Detail
|
||||||
|
{
|
||||||
|
public enum HashState
|
||||||
|
{
|
||||||
|
Initial = 0,
|
||||||
|
Initialized,
|
||||||
|
Done
|
||||||
|
}
|
||||||
|
}
|
52
src/LibHac/Crypto/Detail/Sha256Impl.cs
Normal file
52
src/LibHac/Crypto/Detail/Sha256Impl.cs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using LibHac.Common;
|
||||||
|
|
||||||
|
namespace LibHac.Crypto.Detail
|
||||||
|
{
|
||||||
|
public struct Sha256Impl
|
||||||
|
{
|
||||||
|
private SHA256 _baseHash;
|
||||||
|
private HashState _state;
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
if (_state == HashState.Initial)
|
||||||
|
{
|
||||||
|
_baseHash = SHA256.Create();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_baseHash.Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
_state = HashState.Initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update(ReadOnlySpan<byte> data)
|
||||||
|
{
|
||||||
|
Debug.Assert(_state == HashState.Initialized);
|
||||||
|
|
||||||
|
using var rented = new RentedArray<byte>(data.Length);
|
||||||
|
|
||||||
|
data.CopyTo(rented.Span);
|
||||||
|
|
||||||
|
_baseHash.TransformBlock(rented.Array, 0, data.Length, null, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetHash(Span<byte> hashBuffer)
|
||||||
|
{
|
||||||
|
Debug.Assert(_state == HashState.Initialized || _state == HashState.Done);
|
||||||
|
Debug.Assert(hashBuffer.Length >= Sha256.DigestSize);
|
||||||
|
|
||||||
|
if (_state == HashState.Initialized)
|
||||||
|
{
|
||||||
|
_baseHash.TransformFinalBlock(new byte[0], 0, 0);
|
||||||
|
_state = HashState.Done;
|
||||||
|
}
|
||||||
|
|
||||||
|
_baseHash.Hash.CopyTo(hashBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
src/LibHac/Crypto/IHash.cs
Normal file
11
src/LibHac/Crypto/IHash.cs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace LibHac.Crypto
|
||||||
|
{
|
||||||
|
public interface IHash
|
||||||
|
{
|
||||||
|
void Initialize();
|
||||||
|
void Update(ReadOnlySpan<byte> data);
|
||||||
|
void GetHash(Span<byte> hashBuffer);
|
||||||
|
}
|
||||||
|
}
|
24
src/LibHac/Crypto/Sha256.cs
Normal file
24
src/LibHac/Crypto/Sha256.cs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
using System;
|
||||||
|
using LibHac.Crypto.Detail;
|
||||||
|
|
||||||
|
namespace LibHac.Crypto
|
||||||
|
{
|
||||||
|
public static class Sha256
|
||||||
|
{
|
||||||
|
public const int DigestSize = 0x20;
|
||||||
|
|
||||||
|
public static IHash CreateSha256Generator()
|
||||||
|
{
|
||||||
|
return new Sha256Generator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GenerateSha256Hash(ReadOnlySpan<byte> data, Span<byte> hashBuffer)
|
||||||
|
{
|
||||||
|
var sha256 = new Sha256Impl();
|
||||||
|
sha256.Initialize();
|
||||||
|
|
||||||
|
sha256.Update(data);
|
||||||
|
sha256.GetHash(hashBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
src/LibHac/Crypto/Sha256Generator.cs
Normal file
30
src/LibHac/Crypto/Sha256Generator.cs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
using System;
|
||||||
|
using LibHac.Crypto.Detail;
|
||||||
|
|
||||||
|
namespace LibHac.Crypto
|
||||||
|
{
|
||||||
|
public class Sha256Generator : IHash
|
||||||
|
{
|
||||||
|
private Sha256Impl _baseHash;
|
||||||
|
|
||||||
|
public Sha256Generator()
|
||||||
|
{
|
||||||
|
_baseHash = new Sha256Impl();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
_baseHash.Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update(ReadOnlySpan<byte> data)
|
||||||
|
{
|
||||||
|
_baseHash.Update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetHash(Span<byte> hashBuffer)
|
||||||
|
{
|
||||||
|
_baseHash.GetHash(hashBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,16 +6,16 @@ namespace LibHac.Tests.CryptoTests
|
||||||
public class AesCbcTests
|
public class AesCbcTests
|
||||||
{
|
{
|
||||||
public static TheoryData<EncryptionTestVector> EncryptTestVectors =
|
public static TheoryData<EncryptionTestVector> EncryptTestVectors =
|
||||||
RspReader.ReadTestVectors(true, "CBCVarKey128.rsp", "CBCVarTxt128.rsp", "CBCKeySbox128.rsp", "CBCGFSbox128.rsp");
|
RspReader.ReadEncryptionTestVectors(true, "CBCVarKey128.rsp", "CBCVarTxt128.rsp", "CBCKeySbox128.rsp", "CBCGFSbox128.rsp");
|
||||||
|
|
||||||
public static TheoryData<EncryptionTestVector> DecryptTestVectors =
|
public static TheoryData<EncryptionTestVector> DecryptTestVectors =
|
||||||
RspReader.ReadTestVectors(false, "CBCVarKey128.rsp", "CBCVarTxt128.rsp", "CBCKeySbox128.rsp", "CBCGFSbox128.rsp");
|
RspReader.ReadEncryptionTestVectors(false, "CBCVarKey128.rsp", "CBCVarTxt128.rsp", "CBCKeySbox128.rsp", "CBCGFSbox128.rsp");
|
||||||
|
|
||||||
public static TheoryData<EncryptionTestVector> EncryptMultiTestVectors =
|
public static TheoryData<EncryptionTestVector> EncryptMultiTestVectors =
|
||||||
RspReader.ReadTestVectors(true, "CBCMMT128.rsp");
|
RspReader.ReadEncryptionTestVectors(true, "CBCMMT128.rsp");
|
||||||
|
|
||||||
public static TheoryData<EncryptionTestVector> DecryptMultiTestVectors =
|
public static TheoryData<EncryptionTestVector> DecryptMultiTestVectors =
|
||||||
RspReader.ReadTestVectors(false, "CBCMMT128.rsp");
|
RspReader.ReadEncryptionTestVectors(false, "CBCMMT128.rsp");
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[MemberData(nameof(EncryptTestVectors))]
|
[MemberData(nameof(EncryptTestVectors))]
|
||||||
|
|
|
@ -5,7 +5,7 @@ namespace LibHac.Tests.CryptoTests
|
||||||
{
|
{
|
||||||
public class AesCtrTests
|
public class AesCtrTests
|
||||||
{
|
{
|
||||||
public static TheoryData<EncryptionTestVector> TestVectors = RspReader.ReadTestVectors(true, "CTR128.rsp");
|
public static TheoryData<EncryptionTestVector> TestVectors = RspReader.ReadEncryptionTestVectors(true, "CTR128.rsp");
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[MemberData(nameof(TestVectors))]
|
[MemberData(nameof(TestVectors))]
|
||||||
|
|
|
@ -6,16 +6,16 @@ namespace LibHac.Tests.CryptoTests
|
||||||
public class AesEcbTests
|
public class AesEcbTests
|
||||||
{
|
{
|
||||||
public static TheoryData<EncryptionTestVector> EncryptTestVectors =
|
public static TheoryData<EncryptionTestVector> EncryptTestVectors =
|
||||||
RspReader.ReadTestVectors(true, "ECBVarKey128.rsp", "ECBVarTxt128.rsp", "ECBKeySbox128.rsp", "ECBGFSbox128.rsp");
|
RspReader.ReadEncryptionTestVectors(true, "ECBVarKey128.rsp", "ECBVarTxt128.rsp", "ECBKeySbox128.rsp", "ECBGFSbox128.rsp");
|
||||||
|
|
||||||
public static TheoryData<EncryptionTestVector> DecryptTestVectors =
|
public static TheoryData<EncryptionTestVector> DecryptTestVectors =
|
||||||
RspReader.ReadTestVectors(false, "ECBVarKey128.rsp", "ECBVarTxt128.rsp", "ECBKeySbox128.rsp", "ECBGFSbox128.rsp");
|
RspReader.ReadEncryptionTestVectors(false, "ECBVarKey128.rsp", "ECBVarTxt128.rsp", "ECBKeySbox128.rsp", "ECBGFSbox128.rsp");
|
||||||
|
|
||||||
public static TheoryData<EncryptionTestVector> EncryptMultiTestVectors =
|
public static TheoryData<EncryptionTestVector> EncryptMultiTestVectors =
|
||||||
RspReader.ReadTestVectors(true, "ECBMMT128.rsp");
|
RspReader.ReadEncryptionTestVectors(true, "ECBMMT128.rsp");
|
||||||
|
|
||||||
public static TheoryData<EncryptionTestVector> DecryptMultiTestVectors =
|
public static TheoryData<EncryptionTestVector> DecryptMultiTestVectors =
|
||||||
RspReader.ReadTestVectors(false, "ECBMMT128.rsp");
|
RspReader.ReadEncryptionTestVectors(false, "ECBMMT128.rsp");
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[MemberData(nameof(EncryptTestVectors))]
|
[MemberData(nameof(EncryptTestVectors))]
|
||||||
|
|
|
@ -9,10 +9,10 @@ namespace LibHac.Tests.CryptoTests
|
||||||
public class AesXtsTests
|
public class AesXtsTests
|
||||||
{
|
{
|
||||||
public static TheoryData<EncryptionTestVector> EncryptTestVectors =
|
public static TheoryData<EncryptionTestVector> EncryptTestVectors =
|
||||||
RemovePartialByteTests(RspReader.ReadTestVectors(true, "XTSGenAES128.rsp"));
|
RemovePartialByteTests(RspReader.ReadEncryptionTestVectors(true, "XTSGenAES128.rsp"));
|
||||||
|
|
||||||
public static TheoryData<EncryptionTestVector> DecryptTestVectors =
|
public static TheoryData<EncryptionTestVector> DecryptTestVectors =
|
||||||
RemovePartialByteTests(RspReader.ReadTestVectors(false, "XTSGenAES128.rsp"));
|
RemovePartialByteTests(RspReader.ReadEncryptionTestVectors(false, "XTSGenAES128.rsp"));
|
||||||
|
|
||||||
// The XTS implementation only supports multiples of whole bytes
|
// The XTS implementation only supports multiples of whole bytes
|
||||||
private static TheoryData<EncryptionTestVector> RemovePartialByteTests(TheoryData<EncryptionTestVector> input)
|
private static TheoryData<EncryptionTestVector> RemovePartialByteTests(TheoryData<EncryptionTestVector> input)
|
||||||
|
|
|
@ -15,5 +15,17 @@ namespace LibHac.Tests.CryptoTests
|
||||||
|
|
||||||
Assert.Equal(expected, transformBuffer);
|
Assert.Equal(expected, transformBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static void HashTestCore(ReadOnlySpan<byte> message, byte[] expectedDigest, IHash hash)
|
||||||
|
{
|
||||||
|
|
||||||
|
var digestBuffer = new byte[Sha256.DigestSize];
|
||||||
|
|
||||||
|
hash.Initialize();
|
||||||
|
hash.Update(message);
|
||||||
|
hash.GetHash(digestBuffer);
|
||||||
|
|
||||||
|
Assert.Equal(expectedDigest, digestBuffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace LibHac.Tests.CryptoTests
|
||||||
Reader = new StreamReader(stream);
|
Reader = new StreamReader(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<EncryptionTestVector> GetTestVectors()
|
public IEnumerable<EncryptionTestVector> GetEncryptionTestVectors()
|
||||||
{
|
{
|
||||||
string line;
|
string line;
|
||||||
bool isEncryptType = false;
|
bool isEncryptType = false;
|
||||||
|
@ -83,7 +83,7 @@ namespace LibHac.Tests.CryptoTests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TheoryData<EncryptionTestVector> ReadTestVectors(bool getEncryptTests, params string[] filenames)
|
public static TheoryData<EncryptionTestVector> ReadEncryptionTestVectors(bool getEncryptTests, params string[] filenames)
|
||||||
{
|
{
|
||||||
IEnumerable<string> resourcePaths = filenames.Select(x => $"LibHac.Tests.CryptoTests.TestVectors.{x}");
|
IEnumerable<string> resourcePaths = filenames.Select(x => $"LibHac.Tests.CryptoTests.TestVectors.{x}");
|
||||||
var testVectors = new TheoryData<EncryptionTestVector>();
|
var testVectors = new TheoryData<EncryptionTestVector>();
|
||||||
|
@ -94,13 +94,80 @@ namespace LibHac.Tests.CryptoTests
|
||||||
{
|
{
|
||||||
var reader = new RspReader(stream);
|
var reader = new RspReader(stream);
|
||||||
|
|
||||||
foreach (EncryptionTestVector tv in reader.GetTestVectors().Where(x => x.Encrypt == getEncryptTests))
|
foreach (EncryptionTestVector tv in reader.GetEncryptionTestVectors().Where(x => x.Encrypt == getEncryptTests))
|
||||||
{
|
{
|
||||||
testVectors.Add(tv);
|
testVectors.Add(tv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return testVectors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<HashTestVector> GetHashTestVectors()
|
||||||
|
{
|
||||||
|
string line;
|
||||||
|
|
||||||
|
var testVector = new HashTestVector();
|
||||||
|
bool canOutputVector = false;
|
||||||
|
|
||||||
|
while ((line = Reader.ReadLine()?.Trim()) != null)
|
||||||
|
{
|
||||||
|
if (line.Length == 0)
|
||||||
|
{
|
||||||
|
if (canOutputVector)
|
||||||
|
{
|
||||||
|
yield return testVector;
|
||||||
|
|
||||||
|
testVector = new HashTestVector();
|
||||||
|
canOutputVector = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line[0] == '#') continue;
|
||||||
|
if (line[0] == '[') continue;
|
||||||
|
|
||||||
|
string[] kvp = line.Split(new[] { " = " }, StringSplitOptions.None);
|
||||||
|
if (kvp.Length != 2) throw new InvalidDataException();
|
||||||
|
|
||||||
|
canOutputVector = true;
|
||||||
|
|
||||||
|
switch (kvp[0].ToUpperInvariant())
|
||||||
|
{
|
||||||
|
case "LEN":
|
||||||
|
testVector.LengthBits = int.Parse(kvp[1]);
|
||||||
|
testVector.LengthBytes = testVector.LengthBits / 8;
|
||||||
|
break;
|
||||||
|
case "MSG":
|
||||||
|
testVector.Message = kvp[1].ToBytes();
|
||||||
|
break;
|
||||||
|
case "MD":
|
||||||
|
testVector.Digest = kvp[1].ToBytes();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TheoryData<HashTestVector> ReadHashTestVectors(params string[] filenames)
|
||||||
|
{
|
||||||
|
IEnumerable<string> resourcePaths = filenames.Select(x => $"LibHac.Tests.CryptoTests.TestVectors.{x}");
|
||||||
|
var testVectors = new TheoryData<HashTestVector>();
|
||||||
|
|
||||||
|
foreach (string path in resourcePaths)
|
||||||
|
{
|
||||||
|
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path))
|
||||||
|
{
|
||||||
|
var reader = new RspReader(stream);
|
||||||
|
|
||||||
|
foreach (HashTestVector tv in reader.GetHashTestVectors())
|
||||||
|
{
|
||||||
|
testVectors.Add(tv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return testVectors;
|
return testVectors;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,4 +182,12 @@ namespace LibHac.Tests.CryptoTests
|
||||||
public byte[] PlainText { get; set; }
|
public byte[] PlainText { get; set; }
|
||||||
public byte[] CipherText { get; set; }
|
public byte[] CipherText { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class HashTestVector
|
||||||
|
{
|
||||||
|
public int LengthBits { get; set; }
|
||||||
|
public int LengthBytes { get; set; }
|
||||||
|
public byte[] Message { get; set; }
|
||||||
|
public byte[] Digest { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
19
tests/LibHac.Tests/CryptoTests/Sha256Tests.cs
Normal file
19
tests/LibHac.Tests/CryptoTests/Sha256Tests.cs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
using System;
|
||||||
|
using LibHac.Crypto;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace LibHac.Tests.CryptoTests
|
||||||
|
{
|
||||||
|
public class Sha256Tests
|
||||||
|
{
|
||||||
|
public static TheoryData<HashTestVector> TestVectors =
|
||||||
|
RspReader.ReadHashTestVectors("SHA256ShortMsg.rsp", "SHA256LongMsg.rsp");
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[MemberData(nameof(TestVectors))]
|
||||||
|
public static void Encrypt(HashTestVector tv)
|
||||||
|
{
|
||||||
|
Common.HashTestCore(tv.Message.AsSpan(0, tv.LengthBytes), tv.Digest, Sha256.CreateSha256Generator());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
263
tests/LibHac.Tests/CryptoTests/TestVectors/SHA256LongMsg.rsp
Normal file
263
tests/LibHac.Tests/CryptoTests/TestVectors/SHA256LongMsg.rsp
Normal file
File diff suppressed because one or more lines are too long
267
tests/LibHac.Tests/CryptoTests/TestVectors/SHA256ShortMsg.rsp
Normal file
267
tests/LibHac.Tests/CryptoTests/TestVectors/SHA256ShortMsg.rsp
Normal file
|
@ -0,0 +1,267 @@
|
||||||
|
# CAVS 11.0
|
||||||
|
# "SHA-256 ShortMsg" information
|
||||||
|
# SHA-256 tests are configured for BYTE oriented implementations
|
||||||
|
# Generated on Tue Mar 15 08:23:38 2011
|
||||||
|
|
||||||
|
[L = 32]
|
||||||
|
|
||||||
|
Len = 0
|
||||||
|
Msg = 00
|
||||||
|
MD = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
|
|
||||||
|
Len = 8
|
||||||
|
Msg = d3
|
||||||
|
MD = 28969cdfa74a12c82f3bad960b0b000aca2ac329deea5c2328ebc6f2ba9802c1
|
||||||
|
|
||||||
|
Len = 16
|
||||||
|
Msg = 11af
|
||||||
|
MD = 5ca7133fa735326081558ac312c620eeca9970d1e70a4b95533d956f072d1f98
|
||||||
|
|
||||||
|
Len = 24
|
||||||
|
Msg = b4190e
|
||||||
|
MD = dff2e73091f6c05e528896c4c831b9448653dc2ff043528f6769437bc7b975c2
|
||||||
|
|
||||||
|
Len = 32
|
||||||
|
Msg = 74ba2521
|
||||||
|
MD = b16aa56be3880d18cd41e68384cf1ec8c17680c45a02b1575dc1518923ae8b0e
|
||||||
|
|
||||||
|
Len = 40
|
||||||
|
Msg = c299209682
|
||||||
|
MD = f0887fe961c9cd3beab957e8222494abb969b1ce4c6557976df8b0f6d20e9166
|
||||||
|
|
||||||
|
Len = 48
|
||||||
|
Msg = e1dc724d5621
|
||||||
|
MD = eca0a060b489636225b4fa64d267dabbe44273067ac679f20820bddc6b6a90ac
|
||||||
|
|
||||||
|
Len = 56
|
||||||
|
Msg = 06e076f5a442d5
|
||||||
|
MD = 3fd877e27450e6bbd5d74bb82f9870c64c66e109418baa8e6bbcff355e287926
|
||||||
|
|
||||||
|
Len = 64
|
||||||
|
Msg = 5738c929c4f4ccb6
|
||||||
|
MD = 963bb88f27f512777aab6c8b1a02c70ec0ad651d428f870036e1917120fb48bf
|
||||||
|
|
||||||
|
Len = 72
|
||||||
|
Msg = 3334c58075d3f4139e
|
||||||
|
MD = 078da3d77ed43bd3037a433fd0341855023793f9afd08b4b08ea1e5597ceef20
|
||||||
|
|
||||||
|
Len = 80
|
||||||
|
Msg = 74cb9381d89f5aa73368
|
||||||
|
MD = 73d6fad1caaa75b43b21733561fd3958bdc555194a037c2addec19dc2d7a52bd
|
||||||
|
|
||||||
|
Len = 88
|
||||||
|
Msg = 76ed24a0f40a41221ebfcf
|
||||||
|
MD = 044cef802901932e46dc46b2545e6c99c0fc323a0ed99b081bda4216857f38ac
|
||||||
|
|
||||||
|
Len = 96
|
||||||
|
Msg = 9baf69cba317f422fe26a9a0
|
||||||
|
MD = fe56287cd657e4afc50dba7a3a54c2a6324b886becdcd1fae473b769e551a09b
|
||||||
|
|
||||||
|
Len = 104
|
||||||
|
Msg = 68511cdb2dbbf3530d7fb61cbc
|
||||||
|
MD = af53430466715e99a602fc9f5945719b04dd24267e6a98471f7a7869bd3b4313
|
||||||
|
|
||||||
|
Len = 112
|
||||||
|
Msg = af397a8b8dd73ab702ce8e53aa9f
|
||||||
|
MD = d189498a3463b18e846b8ab1b41583b0b7efc789dad8a7fb885bbf8fb5b45c5c
|
||||||
|
|
||||||
|
Len = 120
|
||||||
|
Msg = 294af4802e5e925eb1c6cc9c724f09
|
||||||
|
MD = dcbaf335360de853b9cddfdafb90fa75567d0d3d58af8db9d764113aef570125
|
||||||
|
|
||||||
|
Len = 128
|
||||||
|
Msg = 0a27847cdc98bd6f62220b046edd762b
|
||||||
|
MD = 80c25ec1600587e7f28b18b1b18e3cdc89928e39cab3bc25e4d4a4c139bcedc4
|
||||||
|
|
||||||
|
Len = 136
|
||||||
|
Msg = 1b503fb9a73b16ada3fcf1042623ae7610
|
||||||
|
MD = d5c30315f72ed05fe519a1bf75ab5fd0ffec5ac1acb0daf66b6b769598594509
|
||||||
|
|
||||||
|
Len = 144
|
||||||
|
Msg = 59eb45bbbeb054b0b97334d53580ce03f699
|
||||||
|
MD = 32c38c54189f2357e96bd77eb00c2b9c341ebebacc2945f97804f59a93238288
|
||||||
|
|
||||||
|
Len = 152
|
||||||
|
Msg = 58e5a3259cb0b6d12c83f723379e35fd298b60
|
||||||
|
MD = 9b5b37816de8fcdf3ec10b745428708df8f391c550ea6746b2cafe019c2b6ace
|
||||||
|
|
||||||
|
Len = 160
|
||||||
|
Msg = c1ef39cee58e78f6fcdc12e058b7f902acd1a93b
|
||||||
|
MD = 6dd52b0d8b48cc8146cebd0216fbf5f6ef7eeafc0ff2ff9d1422d6345555a142
|
||||||
|
|
||||||
|
Len = 168
|
||||||
|
Msg = 9cab7d7dcaec98cb3ac6c64dd5d4470d0b103a810c
|
||||||
|
MD = 44d34809fc60d1fcafa7f37b794d1d3a765dd0d23194ebbe340f013f0c39b613
|
||||||
|
|
||||||
|
Len = 176
|
||||||
|
Msg = ea157c02ebaf1b22de221b53f2353936d2359d1e1c97
|
||||||
|
MD = 9df5c16a3f580406f07d96149303d8c408869b32053b726cf3defd241e484957
|
||||||
|
|
||||||
|
Len = 184
|
||||||
|
Msg = da999bc1f9c7acff32828a73e672d0a492f6ee895c6867
|
||||||
|
MD = 672b54e43f41ee77584bdf8bf854d97b6252c918f7ea2d26bc4097ea53a88f10
|
||||||
|
|
||||||
|
Len = 192
|
||||||
|
Msg = 47991301156d1d977c0338efbcad41004133aefbca6bcf7e
|
||||||
|
MD = feeb4b2b59fec8fdb1e55194a493d8c871757b5723675e93d3ac034b380b7fc9
|
||||||
|
|
||||||
|
Len = 200
|
||||||
|
Msg = 2e7ea84da4bc4d7cfb463e3f2c8647057afff3fbececa1d200
|
||||||
|
MD = 76e3acbc718836f2df8ad2d0d2d76f0cfa5fea0986be918f10bcee730df441b9
|
||||||
|
|
||||||
|
Len = 208
|
||||||
|
Msg = 47c770eb4549b6eff6381d62e9beb464cd98d341cc1c09981a7a
|
||||||
|
MD = 6733809c73e53666c735b3bd3daf87ebc77c72756150a616a194108d71231272
|
||||||
|
|
||||||
|
Len = 216
|
||||||
|
Msg = ac4c26d8b43b8579d8f61c9807026e83e9b586e1159bd43b851937
|
||||||
|
MD = 0e6e3c143c3a5f7f38505ed6adc9b48c18edf6dedf11635f6e8f9ac73c39fe9e
|
||||||
|
|
||||||
|
Len = 224
|
||||||
|
Msg = 0777fc1e1ca47304c2e265692838109e26aab9e5c4ae4e8600df4b1f
|
||||||
|
MD = ffb4fc03e054f8ecbc31470fc023bedcd4a406b9dd56c71da1b660dcc4842c65
|
||||||
|
|
||||||
|
Len = 232
|
||||||
|
Msg = 1a57251c431d4e6c2e06d65246a296915071a531425ecf255989422a66
|
||||||
|
MD = c644612cd326b38b1c6813b1daded34448805aef317c35f548dfb4a0d74b8106
|
||||||
|
|
||||||
|
Len = 240
|
||||||
|
Msg = 9b245fdad9baeb890d9c0d0eff816efb4ca138610bc7d78cb1a801ed3273
|
||||||
|
MD = c0e29eeeb0d3a7707947e623cdc7d1899adc70dd7861205ea5e5813954fb7957
|
||||||
|
|
||||||
|
Len = 248
|
||||||
|
Msg = 95a765809caf30ada90ad6d61c2b4b30250df0a7ce23b7753c9187f4319ce2
|
||||||
|
MD = a4139b74b102cf1e2fce229a6cd84c87501f50afa4c80feacf7d8cf5ed94f042
|
||||||
|
|
||||||
|
Len = 256
|
||||||
|
Msg = 09fc1accc230a205e4a208e64a8f204291f581a12756392da4b8c0cf5ef02b95
|
||||||
|
MD = 4f44c1c7fbebb6f9601829f3897bfd650c56fa07844be76489076356ac1886a4
|
||||||
|
|
||||||
|
Len = 264
|
||||||
|
Msg = 0546f7b8682b5b95fd32385faf25854cb3f7b40cc8fa229fbd52b16934aab388a7
|
||||||
|
MD = b31ad3cd02b10db282b3576c059b746fb24ca6f09fef69402dc90ece7421cbb7
|
||||||
|
|
||||||
|
Len = 272
|
||||||
|
Msg = b12db4a1025529b3b7b1e45c6dbc7baa8897a0576e66f64bf3f8236113a6276ee77d
|
||||||
|
MD = 1c38bf6bbfd32292d67d1d651fd9d5b623b6ec1e854406223f51d0df46968712
|
||||||
|
|
||||||
|
Len = 280
|
||||||
|
Msg = e68cb6d8c1866c0a71e7313f83dc11a5809cf5cfbeed1a587ce9c2c92e022abc1644bb
|
||||||
|
MD = c2684c0dbb85c232b6da4fb5147dd0624429ec7e657991edd95eda37a587269e
|
||||||
|
|
||||||
|
Len = 288
|
||||||
|
Msg = 4e3d8ac36d61d9e51480831155b253b37969fe7ef49db3b39926f3a00b69a36774366000
|
||||||
|
MD = bf9d5e5b5393053f055b380baed7e792ae85ad37c0ada5fd4519542ccc461cf3
|
||||||
|
|
||||||
|
Len = 296
|
||||||
|
Msg = 03b264be51e4b941864f9b70b4c958f5355aac294b4b87cb037f11f85f07eb57b3f0b89550
|
||||||
|
MD = d1f8bd684001ac5a4b67bbf79f87de524d2da99ac014dec3e4187728f4557471
|
||||||
|
|
||||||
|
Len = 304
|
||||||
|
Msg = d0fefd96787c65ffa7f910d6d0ada63d64d5c4679960e7f06aeb8c70dfef954f8e39efdb629b
|
||||||
|
MD = 49ba38db85c2796f85ffd57dd5ec337007414528ae33935b102d16a6b91ba6c1
|
||||||
|
|
||||||
|
Len = 312
|
||||||
|
Msg = b7c79d7e5f1eeccdfedf0e7bf43e730d447e607d8d1489823d09e11201a0b1258039e7bd4875b1
|
||||||
|
MD = 725e6f8d888ebaf908b7692259ab8839c3248edd22ca115bb13e025808654700
|
||||||
|
|
||||||
|
Len = 320
|
||||||
|
Msg = 64cd363ecce05fdfda2486d011a3db95b5206a19d3054046819dd0d36783955d7e5bf8ba18bf738a
|
||||||
|
MD = 32caef024f84e97c30b4a7b9d04b678b3d8a6eb2259dff5b7f7c011f090845f8
|
||||||
|
|
||||||
|
Len = 328
|
||||||
|
Msg = 6ac6c63d618eaf00d91c5e2807e83c093912b8e202f78e139703498a79c6067f54497c6127a23910a6
|
||||||
|
MD = 4bb33e7c6916e08a9b3ed6bcef790aaaee0dcf2e7a01afb056182dea2dad7d63
|
||||||
|
|
||||||
|
Len = 336
|
||||||
|
Msg = d26826db9baeaa892691b68900b96163208e806a1da077429e454fa011840951a031327e605ab82ecce2
|
||||||
|
MD = 3ac7ac6bed82fdc8cd15b746f0ee7489158192c238f371c1883c9fe90b3e2831
|
||||||
|
|
||||||
|
Len = 344
|
||||||
|
Msg = 3f7a059b65d6cb0249204aac10b9f1a4ac9e5868adebbe935a9eb5b9019e1c938bfc4e5c5378997a3947f2
|
||||||
|
MD = bfce809534eefe871273964d32f091fe756c71a7f512ef5f2300bcd57f699e74
|
||||||
|
|
||||||
|
Len = 352
|
||||||
|
Msg = 60ffcb23d6b88e485b920af81d1083f6291d06ac8ca3a965b85914bc2add40544a027fca936bbde8f359051c
|
||||||
|
MD = 1d26f3e04f89b4eaa9dbed9231bb051eef2e8311ad26fe53d0bf0b821eaf7567
|
||||||
|
|
||||||
|
Len = 360
|
||||||
|
Msg = 9ecd07b684bb9e0e6692e320cec4510ca79fcdb3a2212c26d90df65db33e692d073cc174840db797504e482eef
|
||||||
|
MD = 0ffeb644a49e787ccc6970fe29705a4f4c2bfcfe7d19741c158333ff6982cc9c
|
||||||
|
|
||||||
|
Len = 368
|
||||||
|
Msg = 9d64de7161895884e7fa3d6e9eb996e7ebe511b01fe19cd4a6b3322e80aaf52bf6447ed1854e71001f4d54f8931d
|
||||||
|
MD = d048ee1524014adf9a56e60a388277de194c694cc787fc5a1b554ea9f07abfdf
|
||||||
|
|
||||||
|
Len = 376
|
||||||
|
Msg = c4ad3c5e78d917ecb0cbbcd1c481fc2aaf232f7e289779f40e504cc309662ee96fecbd20647ef00e46199fbc482f46
|
||||||
|
MD = 50dbf40066f8d270484ee2ef6632282dfa300a85a8530eceeb0e04275e1c1efd
|
||||||
|
|
||||||
|
Len = 384
|
||||||
|
Msg = 4eef5107459bddf8f24fc7656fd4896da8711db50400c0164847f692b886ce8d7f4d67395090b3534efd7b0d298da34b
|
||||||
|
MD = 7c5d14ed83dab875ac25ce7feed6ef837d58e79dc601fb3c1fca48d4464e8b83
|
||||||
|
|
||||||
|
Len = 392
|
||||||
|
Msg = 047d2758e7c2c9623f9bdb93b6597c5e84a0cd34e610014bcb25b49ed05c7e356e98c7a672c3dddcaeb84317ef614d342f
|
||||||
|
MD = 7d53eccd03da37bf58c1962a8f0f708a5c5c447f6a7e9e26137c169d5bdd82e4
|
||||||
|
|
||||||
|
Len = 400
|
||||||
|
Msg = 3d83df37172c81afd0de115139fbf4390c22e098c5af4c5ab4852406510bc0e6cf741769f44430c5270fdae0cb849d71cbab
|
||||||
|
MD = 99dc772e91ea02d9e421d552d61901016b9fd4ad2df4a8212c1ec5ba13893ab2
|
||||||
|
|
||||||
|
Len = 408
|
||||||
|
Msg = 33fd9bc17e2b271fa04c6b93c0bdeae98654a7682d31d9b4dab7e6f32cd58f2f148a68fbe7a88c5ab1d88edccddeb30ab21e5e
|
||||||
|
MD = cefdae1a3d75e792e8698d5e71f177cc761314e9ad5df9602c6e60ae65c4c267
|
||||||
|
|
||||||
|
Len = 416
|
||||||
|
Msg = 77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc
|
||||||
|
MD = c99d64fa4dadd4bc8a389531c68b4590c6df0b9099c4d583bc00889fb7b98008
|
||||||
|
|
||||||
|
Len = 424
|
||||||
|
Msg = 45a3e6b86527f20b4537f5af96cfc5ad8777a2dde6cf7511886c5590ece24fc61b226739d207dabfe32ba6efd9ff4cd5db1bd5ead3
|
||||||
|
MD = 4d12a849047c6acd4b2eee6be35fa9051b02d21d50d419543008c1d82c427072
|
||||||
|
|
||||||
|
Len = 432
|
||||||
|
Msg = 25362a4b9d74bde6128c4fdc672305900947bc3ada9d9d316ebcf1667ad4363189937251f149c72e064a48608d940b7574b17fefc0df
|
||||||
|
MD = f8e4ccab6c979229f6066cc0cb0cfa81bb21447c16c68773be7e558e9f9d798d
|
||||||
|
|
||||||
|
Len = 440
|
||||||
|
Msg = 3ebfb06db8c38d5ba037f1363e118550aad94606e26835a01af05078533cc25f2f39573c04b632f62f68c294ab31f2a3e2a1a0d8c2be51
|
||||||
|
MD = 6595a2ef537a69ba8583dfbf7f5bec0ab1f93ce4c8ee1916eff44a93af5749c4
|
||||||
|
|
||||||
|
Len = 448
|
||||||
|
Msg = 2d52447d1244d2ebc28650e7b05654bad35b3a68eedc7f8515306b496d75f3e73385dd1b002625024b81a02f2fd6dffb6e6d561cb7d0bd7a
|
||||||
|
MD = cfb88d6faf2de3a69d36195acec2e255e2af2b7d933997f348e09f6ce5758360
|
||||||
|
|
||||||
|
Len = 456
|
||||||
|
Msg = 4cace422e4a015a75492b3b3bbfbdf3758eaff4fe504b46a26c90dacc119fa9050f603d2b58b398cad6d6d9fa922a154d9e0bc4389968274b0
|
||||||
|
MD = 4d54b2d284a6794581224e08f675541c8feab6eefa3ac1cfe5da4e03e62f72e4
|
||||||
|
|
||||||
|
Len = 464
|
||||||
|
Msg = 8620b86fbcaace4ff3c2921b8466ddd7bacae07eefef693cf17762dcabb89a84010fc9a0fb76ce1c26593ad637a61253f224d1b14a05addccabe
|
||||||
|
MD = dba490256c9720c54c612a5bd1ef573cd51dc12b3e7bd8c6db2eabe0aacb846b
|
||||||
|
|
||||||
|
Len = 472
|
||||||
|
Msg = d1be3f13febafefc14414d9fb7f693db16dc1ae270c5b647d80da8583587c1ad8cb8cb01824324411ca5ace3ca22e179a4ff4986f3f21190f3d7f3
|
||||||
|
MD = 02804978eba6e1de65afdbc6a6091ed6b1ecee51e8bff40646a251de6678b7ef
|
||||||
|
|
||||||
|
Len = 480
|
||||||
|
Msg = f499cc3f6e3cf7c312ffdfba61b1260c37129c1afb391047193367b7b2edeb579253e51d62ba6d911e7b818ccae1553f6146ea780f78e2219f629309
|
||||||
|
MD = 0b66c8b4fefebc8dc7da0bbedc1114f228aa63c37d5c30e91ab500f3eadfcec5
|
||||||
|
|
||||||
|
Len = 488
|
||||||
|
Msg = 6dd6efd6f6caa63b729aa8186e308bc1bda06307c05a2c0ae5a3684e6e460811748690dc2b58775967cfcc645fd82064b1279fdca771803db9dca0ff53
|
||||||
|
MD = c464a7bf6d180de4f744bb2fe5dc27a3f681334ffd54a9814650e60260a478e3
|
||||||
|
|
||||||
|
Len = 496
|
||||||
|
Msg = 6511a2242ddb273178e19a82c57c85cb05a6887ff2014cf1a31cb9ba5df1695aadb25c22b3c5ed51c10d047d256b8e3442842ae4e6c525f8d7a5a944af2a
|
||||||
|
MD = d6859c0b5a0b66376a24f56b2ab104286ed0078634ba19112ace0d6d60a9c1ae
|
||||||
|
|
||||||
|
Len = 504
|
||||||
|
Msg = e2f76e97606a872e317439f1a03fcd92e632e5bd4e7cbc4e97f1afc19a16fde92d77cbe546416b51640cddb92af996534dfd81edb17c4424cf1ac4d75aceeb
|
||||||
|
MD = 18041bd4665083001fba8c5411d2d748e8abbfdcdfd9218cb02b68a78e7d4c23
|
||||||
|
|
||||||
|
Len = 512
|
||||||
|
Msg = 5a86b737eaea8ee976a0a24da63e7ed7eefad18a101c1211e2b3650c5187c2a8a650547208251f6d4237e661c7bf4c77f335390394c37fa1a9f9be836ac28509
|
||||||
|
MD = 42e61e174fbb3897d6dd6cef3dd2802fe67b331953b06114a65c772859dfc1aa
|
||||||
|
|
Loading…
Reference in a new issue