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/Sha256Test.lvt

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



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

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

    // NIST FIPS 180-4 Example 1: SHA-256("abc").
    // Padded single block:
    //   61 62 63 80  00..00  00 00 00 00  00 00 00 18
    // Expected digest:
    //   ba 78 16 bf  8f 01 cf ea  41 41 40 de  5d ae 22 23
    //   b0 03 61 a3  96 17 7a 9c  b4 10 ff 61  f2 00 15 ad
    @Test fn TestNistFips180Abc()
    {
        this.sha.Reset()

        var blk: byte[64] = [
            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, 0x18]
        this.sha.ProcessBlock(blk)

        var digest: byte[32] = this.sha.GetDigest()
        assert digest[0]  == 0xba
        assert digest[1]  == 0x78
        assert digest[2]  == 0x16
        assert digest[3]  == 0xbf
        assert digest[4]  == 0x8f
        assert digest[5]  == 0x01
        assert digest[6]  == 0xcf
        assert digest[7]  == 0xea
        assert digest[8]  == 0x41
        assert digest[9]  == 0x41
        assert digest[10] == 0x40
        assert digest[11] == 0xde
        assert digest[12] == 0x5d
        assert digest[13] == 0xae
        assert digest[14] == 0x22
        assert digest[15] == 0x23
        assert digest[16] == 0xb0
        assert digest[17] == 0x03
        assert digest[18] == 0x61
        assert digest[19] == 0xa3
        assert digest[20] == 0x96
        assert digest[21] == 0x17
        assert digest[22] == 0x7a
        assert digest[23] == 0x9c
        assert digest[24] == 0xb4
        assert digest[25] == 0x10
        assert digest[26] == 0xff
        assert digest[27] == 0x61
        assert digest[28] == 0xf2
        assert digest[29] == 0x00
        assert digest[30] == 0x15
        assert digest[31] == 0xad
    }

    // SHA-256 of the empty string.
    // Padded single block:
    //   80 00..00  00 00 00 00  00 00 00 00
    // Expected digest:
    //   e3 b0 c4 42  98 fc 1c 14  9a fb f4 c8  99 6f b9 24
    //   27 ae 41 e4  64 9b 93 4c  a4 95 99 1b  78 52 b8 55
    @Test fn TestEmptyString()
    {
        this.sha.Reset()

        var blk: byte[64] = [
            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]
        this.sha.ProcessBlock(blk)

        var digest: byte[32] = this.sha.GetDigest()
        assert digest[0]  == 0xe3
        assert digest[1]  == 0xb0
        assert digest[2]  == 0xc4
        assert digest[3]  == 0x42
        assert digest[4]  == 0x98
        assert digest[5]  == 0xfc
        assert digest[6]  == 0x1c
        assert digest[7]  == 0x14
        assert digest[8]  == 0x9a
        assert digest[9]  == 0xfb
        assert digest[10] == 0xf4
        assert digest[11] == 0xc8
        assert digest[12] == 0x99
        assert digest[13] == 0x6f
        assert digest[14] == 0xb9
        assert digest[15] == 0x24
        assert digest[16] == 0x27
        assert digest[17] == 0xae
        assert digest[18] == 0x41
        assert digest[19] == 0xe4
        assert digest[20] == 0x64
        assert digest[21] == 0x9b
        assert digest[22] == 0x93
        assert digest[23] == 0x4c
        assert digest[24] == 0xa4
        assert digest[25] == 0x95
        assert digest[26] == 0x99
        assert digest[27] == 0x1b
        assert digest[28] == 0x78
        assert digest[29] == 0x52
        assert digest[30] == 0xb8
        assert digest[31] == 0x55
    }

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

        var blk: byte[64] = [
            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, 0x18]
        this.sha.ProcessBlock(blk)
        var digest1: byte[32] = this.sha.GetDigest()

        this.sha.Reset()
        this.sha.ProcessBlock(blk)
        var digest2: byte[32] = 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]
    }
}