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

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



@Test
component AesCtr192Test
{
    ctr: Ctr192

    new()
    {
        this.ctr = new Ctr192()
    }

    // -----------------------------------------------------------------------
    // NIST SP 800-38A Appendix F.5.3, AES-192 CTR
    // Key:        8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b
    // Counter[1]: f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
    // PT[1]:      6bc1bee22e409f96e93d7e117393172a  CT[1]: 1abc932417521ca24f2b0459fe7e6e0b
    // Counter[2]: f0f1f2f3f4f5f6f7f8f9fafbfcfdff00
    // PT[2]:      ae2d8a571e03ac9c9eb76fac45af8e51  CT[2]: 090339ec0aa6faefd5ccc2c6f4ce8e94
    // -----------------------------------------------------------------------

    // NIST SP 800-38A F.5.3 CTR-AES192 — Block 1 encryption.
    @Test
    fn TestNistSp80038ABlock1()
    {
        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 counter: byte[16] = [
            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff]

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

        this.ctr.SetKey(key)
        this.ctr.SetCounter(counter)
        this.ctr.LoadBlock(pt)
        this.ctr.CryptBlock()

        var ct: byte[16] = this.ctr.GetBlock()
        assert ct[0]  == 0x1a
        assert ct[1]  == 0xbc
        assert ct[2]  == 0x93
        assert ct[3]  == 0x24
        assert ct[4]  == 0x17
        assert ct[5]  == 0x52
        assert ct[6]  == 0x1c
        assert ct[7]  == 0xa2
        assert ct[8]  == 0x4f
        assert ct[9]  == 0x2b
        assert ct[10] == 0x04
        assert ct[11] == 0x59
        assert ct[12] == 0xfe
        assert ct[13] == 0x7e
        assert ct[14] == 0x6e
        assert ct[15] == 0x0b
    }

    // CTR decrypt is the same operation as encrypt.
    @Test
    fn TestDecryptRoundtrip()
    {
        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 counter: byte[16] = [
            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff]

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

        this.ctr.SetKey(key)
        this.ctr.SetCounter(counter)
        this.ctr.LoadBlock(pt)
        this.ctr.CryptBlock()
        var ct: byte[16] = this.ctr.GetBlock()

        this.ctr.SetCounter(counter)
        this.ctr.LoadBlock(ct)
        this.ctr.CryptBlock()

        var recovered: byte[16] = this.ctr.GetBlock()
        assert recovered[0]  == 0x6b
        assert recovered[1]  == 0xc1
        assert recovered[2]  == 0xbe
        assert recovered[3]  == 0xe2
        assert recovered[4]  == 0x2e
        assert recovered[5]  == 0x40
        assert recovered[6]  == 0x9f
        assert recovered[7]  == 0x96
        assert recovered[8]  == 0xe9
        assert recovered[9]  == 0x3d
        assert recovered[10] == 0x7e
        assert recovered[11] == 0x11
        assert recovered[12] == 0x73
        assert recovered[13] == 0x93
        assert recovered[14] == 0x17
        assert recovered[15] == 0x2a
    }
}