https://gitlab.limos.fr/iia_lulibral/tagada/
Tip revision: 605be07f0334ef84b39a7241417de232b6d2ec6e authored by François Delobel on 06 April 2021, 17:15:46 UTC
data
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