Livt packages
Livt.Crypto
Version 1.0.5
Fixed-size cryptographic components for Livt, including AES, ChaCha20, SHA, MACs, and key derivation.
Published files (69)
tests/mac/HmacSha512Test.lvt
namespace Livt.Crypto.Tests.Mac
using Livt.Crypto.Mac
// Tests for HmacSha512 (RFC 2104 / RFC 4231 test vectors).
@Test component HmacSha512Test
{
hmac: HmacSha512
new()
{
this.hmac = new HmacSha512()
}
// RFC 4231 Test Case 1 — key = 20 x 0x0b, data = "Hi There" (8 bytes).
//
// Inner SHA-512 input: k_ipad (128 B) || "Hi There" (8 B) = 136 B total.
// k_ipad[128] = 0x3d*20 || 0x36*108
//
// Inner block 2 (128 B) = "Hi There" || 0x80 || 0x00*103 || be128(1088)
// where 136*8 = 1088 = 0x440
//
// Expected HMAC-SHA-512:
// 87 aa 7c de a5 ef 61 9d 4f f0 b4 24 1a 1d 6c b0
// 23 79 f4 e2 ce 4e c2 78 7a d0 b3 05 45 e1 7c de
// da a8 33 b7 d6 b8 a7 02 03 8b 27 4e ae a3 f4 e4
// be 9d 91 4e eb 61 f1 70 2e 69 6c 20 3a 12 68 54
@Test fn TestRfc4231Tc1()
{
var key: byte[64] = [
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
this.hmac.SetKey(key)
this.hmac.Init()
// "Hi There" (8 B) then SHA-512 padding to 136 bytes.
// 136*8 = 1088 = 0x0000000000000000_0000000000000440 (128-bit big-endian).
var msg2: byte[128] = [
0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40]
this.hmac.ProcessBlock(msg2)
var result: byte[64] = this.hmac.GetHmac()
assert result[0] == 0x87; assert result[1] == 0xaa; assert result[2] == 0x7c; assert result[3] == 0xde
assert result[4] == 0xa5; assert result[5] == 0xef; assert result[6] == 0x61; assert result[7] == 0x9d
assert result[8] == 0x4f; assert result[9] == 0xf0; assert result[10] == 0xb4; assert result[11] == 0x24
assert result[12] == 0x1a; assert result[13] == 0x1d; assert result[14] == 0x6c; assert result[15] == 0xb0
assert result[16] == 0x23; assert result[17] == 0x79; assert result[18] == 0xf4; assert result[19] == 0xe2
assert result[20] == 0xce; assert result[21] == 0x4e; assert result[22] == 0xc2; assert result[23] == 0x78
assert result[24] == 0x7a; assert result[25] == 0xd0; assert result[26] == 0xb3; assert result[27] == 0x05
assert result[28] == 0x45; assert result[29] == 0xe1; assert result[30] == 0x7c; assert result[31] == 0xde
assert result[32] == 0xda; assert result[33] == 0xa8; assert result[34] == 0x33; assert result[35] == 0xb7
assert result[36] == 0xd6; assert result[37] == 0xb8; assert result[38] == 0xa7; assert result[39] == 0x02
assert result[40] == 0x03; assert result[41] == 0x8b; assert result[42] == 0x27; assert result[43] == 0x4e
assert result[44] == 0xae; assert result[45] == 0xa3; assert result[46] == 0xf4; assert result[47] == 0xe4
assert result[48] == 0xbe; assert result[49] == 0x9d; assert result[50] == 0x91; assert result[51] == 0x4e
assert result[52] == 0xeb; assert result[53] == 0x61; assert result[54] == 0xf1; assert result[55] == 0x70
assert result[56] == 0x2e; assert result[57] == 0x69; assert result[58] == 0x6c; assert result[59] == 0x20
assert result[60] == 0x3a; assert result[61] == 0x12; assert result[62] == 0x68; assert result[63] == 0x54
}
// RFC 4231 Test Case 2 — key = "Jefe" (4 bytes),
// data = "what do ya want for nothing?" (28 bytes).
//
// Inner SHA-512 input: k_ipad (128 B) || data (28 B) = 156 B total.
// k_ipad bytes: 0x4a^0x36=0x7c, 0x65^0x36=0x53, 0x66^0x36=0x50, 0x65^0x36=0x53, 0x36*124
//
// Inner block 2 (128 B) = data || 0x80 || 0x00*83 || be128(1248)
// where 156*8 = 1248 = 0x4e0
//
// Expected HMAC-SHA-512:
// 16 4b 7a 7b fc f8 19 e2 e3 95 fb e7 3b 56 e0 a3
// 87 bd 64 22 2e 83 1f d6 10 27 0c d7 ea 25 05 54
// 97 58 bf 75 c0 5a 99 4a 6d 03 4f 65 f8 f0 e6 fd
// ca ea b1 a3 4d 4a 6b 4b 63 6e 07 0a 38 bc e7 37
@Test fn TestRfc4231Tc2()
{
var key: byte[64] = [
0x4a, 0x65, 0x66, 0x65, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
this.hmac.SetKey(key)
this.hmac.Init()
// "what do ya want for nothing?" (28 B) then SHA-512 padding to 156 bytes.
// 156*8 = 1248 = 0x0000000000000000_00000000000004e0 (128-bit big-endian).
var msg2: byte[128] = [
0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20,
0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20,
0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68,
0x69, 0x6e, 0x67, 0x3f, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xe0]
this.hmac.ProcessBlock(msg2)
var result: byte[64] = this.hmac.GetHmac()
assert result[0] == 0x16; assert result[1] == 0x4b; assert result[2] == 0x7a; assert result[3] == 0x7b
assert result[4] == 0xfc; assert result[5] == 0xf8; assert result[6] == 0x19; assert result[7] == 0xe2
assert result[8] == 0xe3; assert result[9] == 0x95; assert result[10] == 0xfb; assert result[11] == 0xe7
assert result[12] == 0x3b; assert result[13] == 0x56; assert result[14] == 0xe0; assert result[15] == 0xa3
assert result[16] == 0x87; assert result[17] == 0xbd; assert result[18] == 0x64; assert result[19] == 0x22
assert result[20] == 0x2e; assert result[21] == 0x83; assert result[22] == 0x1f; assert result[23] == 0xd6
assert result[24] == 0x10; assert result[25] == 0x27; assert result[26] == 0x0c; assert result[27] == 0xd7
assert result[28] == 0xea; assert result[29] == 0x25; assert result[30] == 0x05; assert result[31] == 0x54
assert result[32] == 0x97; assert result[33] == 0x58; assert result[34] == 0xbf; assert result[35] == 0x75
assert result[36] == 0xc0; assert result[37] == 0x5a; assert result[38] == 0x99; assert result[39] == 0x4a
assert result[40] == 0x6d; assert result[41] == 0x03; assert result[42] == 0x4f; assert result[43] == 0x65
assert result[44] == 0xf8; assert result[45] == 0xf0; assert result[46] == 0xe6; assert result[47] == 0xfd
assert result[48] == 0xca; assert result[49] == 0xea; assert result[50] == 0xb1; assert result[51] == 0xa3
assert result[52] == 0x4d; assert result[53] == 0x4a; assert result[54] == 0x6b; assert result[55] == 0x4b
assert result[56] == 0x63; assert result[57] == 0x6e; assert result[58] == 0x07; assert result[59] == 0x0a
assert result[60] == 0x38; assert result[61] == 0xbc; assert result[62] == 0xe7; assert result[63] == 0x37
}
}