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/aes/AesCmac192Test.lvt

namespace Livt.Crypto.Tests.Aes
using Livt.Crypto.Aes



// Tests for Cmac192 — NIST SP 800-38B vectors.
// Key: 8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b
@Test
component AesCmac192Test
{
    cmac: Cmac192

    new()
    {
        this.cmac = new Cmac192()
    }

    // -----------------------------------------------------------------------
    // NIST SP 800-38B, AES-192, zero-length message.
    // Input:  (empty)
    // Padded: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    // Tag:    d17ddf46adaacde531cac483de7a9367
    // -----------------------------------------------------------------------
    @Test
    fn TestNistEmptyMessage()
    {
        var key: byte[24] = [
            0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
            0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
            0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b]

        var padded: byte[16] = [
            0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

        this.cmac.SetKey(key)
        this.cmac.Reset()
        this.cmac.FinalizePaddedBlock(padded)

        var tag: byte[16] = this.cmac.GetTag()
        assert tag[0]  == 0xd1
        assert tag[1]  == 0x7d
        assert tag[2]  == 0xdf
        assert tag[3]  == 0x46
        assert tag[4]  == 0xad
        assert tag[5]  == 0xaa
        assert tag[6]  == 0xcd
        assert tag[7]  == 0xe5
        assert tag[8]  == 0x31
        assert tag[9]  == 0xca
        assert tag[10] == 0xc4
        assert tag[11] == 0x83
        assert tag[12] == 0xde
        assert tag[13] == 0x7a
        assert tag[14] == 0x93
        assert tag[15] == 0x67
    }

    // -----------------------------------------------------------------------
    // NIST SP 800-38B, AES-192, one-block message.
    // Message: 6bc1bee22e409f96e93d7e117393172a
    // Tag:     9e99a7bf31e710900662f65e617c5184
    // -----------------------------------------------------------------------
    @Test
    fn TestNistOneBlock()
    {
        var key: byte[24] = [
            0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
            0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
            0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b]

        var msg: byte[16] = [
            0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
            0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a]

        this.cmac.SetKey(key)
        this.cmac.Reset()
        this.cmac.FinalizeBlock(msg)

        var tag: byte[16] = this.cmac.GetTag()
        assert tag[0]  == 0x9e
        assert tag[1]  == 0x99
        assert tag[2]  == 0xa7
        assert tag[3]  == 0xbf
        assert tag[4]  == 0x31
        assert tag[5]  == 0xe7
        assert tag[6]  == 0x10
        assert tag[7]  == 0x90
        assert tag[8]  == 0x06
        assert tag[9]  == 0x62
        assert tag[10] == 0xf6
        assert tag[11] == 0x5e
        assert tag[12] == 0x61
        assert tag[13] == 0x7c
        assert tag[14] == 0x51
        assert tag[15] == 0x84
    }

    // -----------------------------------------------------------------------
    // Determinism: same key + message → identical tags on two consecutive runs.
    // -----------------------------------------------------------------------
    @Test
    fn TestDeterminism()
    {
        var key: byte[24] = [
            0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
            0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
            0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b]

        var msg: byte[16] = [
            0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
            0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a]

        this.cmac.SetKey(key)

        // First run.
        this.cmac.Reset()
        this.cmac.FinalizeBlock(msg)
        var tag1: byte[16] = this.cmac.GetTag()
        var t0:  byte = tag1[0]
        var t1:  byte = tag1[1]
        var t2:  byte = tag1[2]
        var t3:  byte = tag1[3]
        var t4:  byte = tag1[4]
        var t5:  byte = tag1[5]
        var t6:  byte = tag1[6]
        var t7:  byte = tag1[7]
        var t8:  byte = tag1[8]
        var t9:  byte = tag1[9]
        var t10: byte = tag1[10]
        var t11: byte = tag1[11]
        var t12: byte = tag1[12]
        var t13: byte = tag1[13]
        var t14: byte = tag1[14]
        var t15: byte = tag1[15]

        // Second run.
        this.cmac.Reset()
        this.cmac.FinalizeBlock(msg)
        var tag2: byte[16] = this.cmac.GetTag()

        assert tag2[0]  == t0
        assert tag2[1]  == t1
        assert tag2[2]  == t2
        assert tag2[3]  == t3
        assert tag2[4]  == t4
        assert tag2[5]  == t5
        assert tag2[6]  == t6
        assert tag2[7]  == t7
        assert tag2[8]  == t8
        assert tag2[9]  == t9
        assert tag2[10] == t10
        assert tag2[11] == t11
        assert tag2[12] == t12
        assert tag2[13] == t13
        assert tag2[14] == t14
        assert tag2[15] == t15
    }
}