https://gitlab.limos.fr/iia_lulibral/tagada/
Raw File
Tip revision: 605be07f0334ef84b39a7241417de232b6d2ec6e authored by François Delobel on 06 April 2021, 17:15:46 UTC
data
Tip revision: 605be07
blocks.rb
#!ruby
## test base block features
require "minitest/autorun"

require_relative "../dag.rb"
require_relative "../blocks/input.rb"
require_relative "../blocks/xor.rb"
require_relative "../blocks/shiftrows.rb"
require_relative "../blocks/mixcolumns.rb"
require_relative "../blocks/permutation.rb"
require_relative "../blocks/rijndael_keyschedule.rb"
require_relative "../blocks/and.rb"


class TestInputBlock < Minitest::Unit::TestCase
    def test_22_input()
        outputs, states, operators = input_block("A", BYTE_RANGE, [2,2])
        dag = Dag.new(states, operators, outputs.flatten, outputs.flatten)
        assert_equal(dag.run([1,2,3,4]), [1,2,3,4])
    end

    def test_22_constants()
        outputs, states, operators = input_block("A", BYTE_RANGE, [2,2], [[1,2],[3,4]])
        dag = Dag.new(states, operators, [], outputs.flatten)
        assert_equal(dag.run([]), [1,2,3,4])
    end
end


class TestXorBlock < Minitest::Unit::TestCase
    def test_22_xor()
        dag = Dag.new([],[],[],[])
        a,_,_ = dag.register_block(*input_block("A", BYTE_RANGE, [2,2]))
        b,_,_ = dag.register_block(*input_block("B", BYTE_RANGE, [2,2]))
        c,_,_ = dag.register_block(*xor_block("C", [a,b]))
        dag.set_inputs(a.flatten+b.flatten)
        dag.set_outputs(c.flatten)
        assert_equal(dag.run([
            0,0,1,1, # A
            0,1,0,1  # B
        ]),[0,1,1,0]) # C
    end
end


class TestShiftRowsBlock < Minitest::Unit::TestCase
    def test_shift_rows()
        dag = Dag.new([],[],[],[])
        a,_,_ = dag.register_block(*input_block("A", BYTE_RANGE, [3,3]))
        b,_,_ = dag.register_block(*shiftrows_block("B", a, false))
        dag.set_inputs(a.flatten)
        dag.set_outputs(b.flatten)
        assert_equal(dag.run([
            1,2,3,
            4,5,6,
            7,8,9
        ]), [
            1,2,3,
            5,6,4,
            9,7,8
        ])
    end
end


class TestMixColumnsBlock < Minitest::Unit::TestCase
    def test_mixcolumns_aes()
        dag = Dag.new([],[],[],[])
        a,_,_ = dag.register_block(*input_block("A", BYTE_RANGE, [4,4]))
        b,_,_ = dag.register_block(*mixcolumns_block("B", a, [
            [2,3,1,1],
            [1,2,3,1],
            [1,1,2,3],
            [3,1,1,2],
        ]))
        dag.set_inputs(a.flatten)
        dag.set_outputs(b.flatten)
        assert_equal(dag.run([
            [0,  1,  219 ,242],
            [0,  1,  19  ,10 ],
            [0,  1,  83  ,34 ],
            [0,  1,  69  ,92 ]
        ].flatten), [
            [0,  1,  142 ,159],
            [0,  1,  77  ,220],
            [0,  1,  161 ,88 ],
            [0,  1,  188 ,157]
        ].flatten)
    end
end




class TestPermutationBlock < Minitest::Unit::TestCase
    def test_permutation_midori128()
        permutation = [0, 10, 5, 15, 14, 4, 11, 1, 9, 3, 12, 6, 7, 13, 2, 8]
        dag = Dag.new([],[],[],[])
        a,_,_ = dag.register_block(*input_block("A", BYTE_RANGE, [4,4]))
        b,_,_ = dag.register_block(*permutation_block("B", a, permutation))
        dag.set_inputs(a.flatten)
        dag.set_outputs(b.flatten)
        assert_equal(dag.run([
            0x2b, 0xe2, 0x36, 0xd5, 
            0xe0, 0xb3, 0x8f, 0xcb, 
            0xf7, 0xe9, 0xde, 0x9f, 
            0x88, 0xb3, 0x52, 0xe8, 
        ]), [
            0x2b, 0x9f, 0x8f, 0xb3, 
            0xde, 0xe2, 0x88, 0xcb, 
            0xb3, 0x52, 0xd5, 0xf7, 
            0xe8, 0xe0, 0xe9, 0x36,
        ])
    end
end


def transpose(t, y,x)
    z = x.times.map{|_| y.times.map{|_| 0}}
    i = 0
    y.times.each do |a|
        x.times do |b|
            z[b][a] = t[i]
            i += 1
        end
    end
    return z.flatten
end


class TestRijndaelKeySchedule < Minitest::Unit::TestCase

    def setup()
        @sbox = [
            0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
            0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
            0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
            0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
            0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
            0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
            0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
            0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
            0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
            0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
            0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
            0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
            0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
            0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
            0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
            0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
        ]
    end

    def test_rijndael_keyschedule1()
        dag = Dag.new([],[],[],[])
        k,_,_ = dag.register_block(*input_block("K", BYTE_RANGE, [4,4]))
        k2,_,_ = dag.register_block(*rijndael_keyschedule_block("K1", k, @sbox, 1))
        dag.set_inputs(k.flatten)
        dag.set_outputs(k2.flatten)
        assert_equal(dag.run([0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]),
            transpose([0x62, 0x63, 0x63, 0x63, 0x62, 0x63, 0x63, 0x63, 0x62, 0x63, 0x63, 0x63, 0x62, 0x63, 0x63, 0x63], 4,4)
        )
    end

    def test_rijndael_keyschedule2()
        dag = Dag.new([],[],[],[])
        k,_,_ = dag.register_block(*input_block("K", BYTE_RANGE, [4,4]))
        k2,_,_ = dag.register_block(*rijndael_keyschedule_block("K1", k, @sbox, 2))
        dag.set_inputs(k.flatten)
        dag.set_outputs(k2.flatten)
        assert_equal(dag.run(
            transpose([0x62, 0x63, 0x63, 0x63, 0x62, 0x63, 0x63, 0x63, 0x62, 0x63, 0x63, 0x63, 0x62, 0x63, 0x63, 0x63], 4,4)),
            transpose([0x9b, 0x98, 0x98, 0xc9, 0xf9, 0xfb, 0xfb, 0xaa, 0x9b, 0x98, 0x98, 0xc9, 0xf9, 0xfb, 0xfb, 0xaa], 4,4)
        )
    end

    def test_rijndael_keyschedule3()
        dag = Dag.new([],[],[],[])
        k,_,_ = dag.register_block(*input_block("K", BYTE_RANGE, [4,4]))
        k1,_,_ = dag.register_block(*rijndael_keyschedule_block("K1", k, @sbox, 1))
        k2,_,_ = dag.register_block(*rijndael_keyschedule_block("K2", k1, @sbox, 2))
        dag.set_inputs(k.flatten)
        dag.set_outputs(k2.flatten)
        assert_equal(dag.run(
            transpose([0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0], 4,4)),
            transpose([0x9b, 0x98, 0x98, 0xc9, 0xf9, 0xfb, 0xfb, 0xaa, 0x9b, 0x98, 0x98, 0xc9, 0xf9, 0xfb, 0xfb, 0xaa], 4,4)
        )
    end

    def test_rijndael_keyschedule_192()
        dag = Dag.new([],[],[],[])
        k,_,_ = dag.register_block(*input_block("K", BYTE_RANGE, [4,6]))
        k1,_,_ = dag.register_block(*rijndael_keyschedule_block("K1", k, @sbox, 1))
        k2,_,_ = dag.register_block(*rijndael_keyschedule_block("K2", k1, @sbox, 2))
        dag.set_inputs(k.flatten)
        dag.set_outputs(k2.flatten)
        assert_equal(dag.run(
            transpose([255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255], 6,4)),
            transpose([173,	174,	174,	25,	186,	184,	184,	15,	82,	81,	81,	230,	69,	71,	71,	240,	173,	174,	174,	25,	186,	184,	184,	15], 6,4)
        )
    end
    
    def test_rijndael_keyschedule_256()
        dag = Dag.new([],[],[],[])
        k,_,_ = dag.register_block(*input_block("K", BYTE_RANGE, [4,8]))
        k1,_,_ = dag.register_block(*rijndael_keyschedule_block("K1", k, @sbox, 1))
        dag.set_inputs(k.flatten)
        dag.set_outputs(k1.flatten)
        assert_equal(dag.run(
            transpose([255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255], 8,4)),
            transpose([0xe8, 0xe9, 0xe9, 0xe9, 0x17, 0x16, 0x16, 0x16, 0xe8, 0xe9, 0xe9, 0xe9, 0x17, 0x16, 0x16, 0x16, 
                0x0f, 0xb8, 0xb8, 0xb8, 0xf0, 0x47, 0x47, 0x47, 0x0f, 0xb8, 0xb8, 0xb8, 0xf0, 0x47, 0x47, 0x47], 8,4)
        )
    end
    
end


class TestAndBlock < Minitest::Unit::TestCase
    def test_22_and()
        dag = Dag.new([],[],[],[])
        a,_,_ = dag.register_block(*input_block("A", BYTE_RANGE, [2,2]))
        b,_,_ = dag.register_block(*input_block("B", BYTE_RANGE, [2,2]))
        c,_,_ = dag.register_block(*and_block("C", [a,b]))
        dag.set_inputs(a.flatten+b.flatten)
        dag.set_outputs(c.flatten)
        assert_equal(dag.run([
            0,0,1,1, # A
            0,1,0,1  # B
        ]),[0,0,0,1]) # C
    end
end
back to top