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/hash/Sha512Test.lvt

namespace Livt.Crypto.Tests.Hash
using Livt.Crypto.Hash



// Tests for Sha512 (NIST FIPS 180-4).
@Test component Sha512Test
{
    sha: Sha512

    new()
    {
        this.sha = new Sha512()
    }

    // NIST FIPS 180-4 Example: SHA-512("abc").
    // Padded single 128-byte block:
    //   61 62 63 80  [108 zeros]  [15 zeros] 18
    // Expected digest (64 bytes):
    //   dd af 35 a1  93 61 7a ba  cc 41 73 49  ae 20 41 31
    //   12 e6 fa 4e  89 a9 7e a2  0a 9e ee e6  4b 55 d3 9a
    //   21 92 99 2a  27 4f c1 a8  36 ba 3c 23  a3 fe eb bd
    //   45 4d 44 23  64 3c e8 0e  2a 9a c9 4f  a5 4c a4 9f
    @Test fn TestNistFips180Abc()
    {
        this.sha.Reset()

        var msg: byte[128] = [
            0x61, 0x62, 0x63, 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, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x18]
        this.sha.ProcessBlock(msg)

        var digest: byte[64] = this.sha.GetDigest()
        assert digest[0]  == 0xdd; assert digest[1]  == 0xaf; assert digest[2]  == 0x35; assert digest[3]  == 0xa1
        assert digest[4]  == 0x93; assert digest[5]  == 0x61; assert digest[6]  == 0x7a; assert digest[7]  == 0xba
        assert digest[8]  == 0xcc; assert digest[9]  == 0x41; assert digest[10] == 0x73; assert digest[11] == 0x49
        assert digest[12] == 0xae; assert digest[13] == 0x20; assert digest[14] == 0x41; assert digest[15] == 0x31
        assert digest[16] == 0x12; assert digest[17] == 0xe6; assert digest[18] == 0xfa; assert digest[19] == 0x4e
        assert digest[20] == 0x89; assert digest[21] == 0xa9; assert digest[22] == 0x7e; assert digest[23] == 0xa2
        assert digest[24] == 0x0a; assert digest[25] == 0x9e; assert digest[26] == 0xee; assert digest[27] == 0xe6
        assert digest[28] == 0x4b; assert digest[29] == 0x55; assert digest[30] == 0xd3; assert digest[31] == 0x9a
        assert digest[32] == 0x21; assert digest[33] == 0x92; assert digest[34] == 0x99; assert digest[35] == 0x2a
        assert digest[36] == 0x27; assert digest[37] == 0x4f; assert digest[38] == 0xc1; assert digest[39] == 0xa8
        assert digest[40] == 0x36; assert digest[41] == 0xba; assert digest[42] == 0x3c; assert digest[43] == 0x23
        assert digest[44] == 0xa3; assert digest[45] == 0xfe; assert digest[46] == 0xeb; assert digest[47] == 0xbd
        assert digest[48] == 0x45; assert digest[49] == 0x4d; assert digest[50] == 0x44; assert digest[51] == 0x23
        assert digest[52] == 0x64; assert digest[53] == 0x3c; assert digest[54] == 0xe8; assert digest[55] == 0x0e
        assert digest[56] == 0x2a; assert digest[57] == 0x9a; assert digest[58] == 0xc9; assert digest[59] == 0x4f
        assert digest[60] == 0xa5; assert digest[61] == 0x4c; assert digest[62] == 0xa4; assert digest[63] == 0x9f
    }

    // SHA-512 of the empty string.
    // Padded single 128-byte block:
    //   80 [127 zeros]
    // Expected digest (64 bytes):
    //   cf 83 e1 35  7e ef b8 bd  f1 54 28 50  d6 6d 80 07
    //   d6 20 e4 05  0b 57 15 dc  83 f4 a9 21  d3 6c e9 ce
    //   47 d0 d1 3c  5d 85 f2 b0  ff 83 18 d2  87 7e ec 2f
    //   63 b9 31 bd  47 41 7a 81  a5 38 32 7a  f9 27 da 3e
    @Test fn TestEmptyString()
    {
        this.sha.Reset()

        var msg: byte[128] = [
            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, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00]
        this.sha.ProcessBlock(msg)

        var digest: byte[64] = this.sha.GetDigest()
        assert digest[0]  == 0xcf; assert digest[1]  == 0x83; assert digest[2]  == 0xe1; assert digest[3]  == 0x35
        assert digest[4]  == 0x7e; assert digest[5]  == 0xef; assert digest[6]  == 0xb8; assert digest[7]  == 0xbd
        assert digest[8]  == 0xf1; assert digest[9]  == 0x54; assert digest[10] == 0x28; assert digest[11] == 0x50
        assert digest[12] == 0xd6; assert digest[13] == 0x6d; assert digest[14] == 0x80; assert digest[15] == 0x07
        assert digest[16] == 0xd6; assert digest[17] == 0x20; assert digest[18] == 0xe4; assert digest[19] == 0x05
        assert digest[20] == 0x0b; assert digest[21] == 0x57; assert digest[22] == 0x15; assert digest[23] == 0xdc
        assert digest[24] == 0x83; assert digest[25] == 0xf4; assert digest[26] == 0xa9; assert digest[27] == 0x21
        assert digest[28] == 0xd3; assert digest[29] == 0x6c; assert digest[30] == 0xe9; assert digest[31] == 0xce
        assert digest[32] == 0x47; assert digest[33] == 0xd0; assert digest[34] == 0xd1; assert digest[35] == 0x3c
        assert digest[36] == 0x5d; assert digest[37] == 0x85; assert digest[38] == 0xf2; assert digest[39] == 0xb0
        assert digest[40] == 0xff; assert digest[41] == 0x83; assert digest[42] == 0x18; assert digest[43] == 0xd2
        assert digest[44] == 0x87; assert digest[45] == 0x7e; assert digest[46] == 0xec; assert digest[47] == 0x2f
        assert digest[48] == 0x63; assert digest[49] == 0xb9; assert digest[50] == 0x31; assert digest[51] == 0xbd
        assert digest[52] == 0x47; assert digest[53] == 0x41; assert digest[54] == 0x7a; assert digest[55] == 0x81
        assert digest[56] == 0xa5; assert digest[57] == 0x38; assert digest[58] == 0x32; assert digest[59] == 0x7a
        assert digest[60] == 0xf9; assert digest[61] == 0x27; assert digest[62] == 0xda; assert digest[63] == 0x3e
    }

    // Determinism: same block from same initial state produces same digest.
    @Test fn TestDeterminism()
    {
        this.sha.Reset()

        var msg: byte[128] = [
            0x61, 0x62, 0x63, 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, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x18]
        this.sha.ProcessBlock(msg)
        var digest1: byte[64] = this.sha.GetDigest()

        this.sha.Reset()
        this.sha.ProcessBlock(msg)
        var digest2: byte[64] = this.sha.GetDigest()

        assert digest1[0]  == digest2[0];  assert digest1[1]  == digest2[1]
        assert digest1[2]  == digest2[2];  assert digest1[3]  == digest2[3]
        assert digest1[4]  == digest2[4];  assert digest1[5]  == digest2[5]
        assert digest1[6]  == digest2[6];  assert digest1[7]  == digest2[7]
        assert digest1[8]  == digest2[8];  assert digest1[9]  == digest2[9]
        assert digest1[10] == digest2[10]; assert digest1[11] == digest2[11]
        assert digest1[12] == digest2[12]; assert digest1[13] == digest2[13]
        assert digest1[14] == digest2[14]; assert digest1[15] == digest2[15]
        assert digest1[16] == digest2[16]; assert digest1[17] == digest2[17]
        assert digest1[18] == digest2[18]; assert digest1[19] == digest2[19]
        assert digest1[20] == digest2[20]; assert digest1[21] == digest2[21]
        assert digest1[22] == digest2[22]; assert digest1[23] == digest2[23]
        assert digest1[24] == digest2[24]; assert digest1[25] == digest2[25]
        assert digest1[26] == digest2[26]; assert digest1[27] == digest2[27]
        assert digest1[28] == digest2[28]; assert digest1[29] == digest2[29]
        assert digest1[30] == digest2[30]; assert digest1[31] == digest2[31]
        assert digest1[32] == digest2[32]; assert digest1[33] == digest2[33]
        assert digest1[34] == digest2[34]; assert digest1[35] == digest2[35]
        assert digest1[36] == digest2[36]; assert digest1[37] == digest2[37]
        assert digest1[38] == digest2[38]; assert digest1[39] == digest2[39]
        assert digest1[40] == digest2[40]; assert digest1[41] == digest2[41]
        assert digest1[42] == digest2[42]; assert digest1[43] == digest2[43]
        assert digest1[44] == digest2[44]; assert digest1[45] == digest2[45]
        assert digest1[46] == digest2[46]; assert digest1[47] == digest2[47]
        assert digest1[48] == digest2[48]; assert digest1[49] == digest2[49]
        assert digest1[50] == digest2[50]; assert digest1[51] == digest2[51]
        assert digest1[52] == digest2[52]; assert digest1[53] == digest2[53]
        assert digest1[54] == digest2[54]; assert digest1[55] == digest2[55]
        assert digest1[56] == digest2[56]; assert digest1[57] == digest2[57]
        assert digest1[58] == digest2[58]; assert digest1[59] == digest2[59]
        assert digest1[60] == digest2[60]; assert digest1[61] == digest2[61]
        assert digest1[62] == digest2[62]; assert digest1[63] == digest2[63]
    }
}