Я внедряю AES, как описано FIPS_197 , и я буду sh для реализации тестовых случаев, описанных в Приложении C (C1 - C3). Я скопировал контрольные примеры в текстовый файл FIPS_197_tests.txt
, который выглядит следующим образом:
# Контрольные примеры из приложения FIPS_192 C
# Открытый текст
# Ключ
# Выходные данные
#
# C .1 AES-128 (Nk = 4, Nr = 10)
00112233445566778899aabbccddeeff
000102030405060708090a0b0c0d0e0f
101c4e0d80a0b2c0. (Nk = 6, № = 12)
00112233445566778899aabbccddeeff
000102030405060708090a0b0c0d0e0f1011121314151617
dda97ca4864cdfe06eaf70a0ec0d7191
# C 0,3 AES-256 (Nk = 8, № = 14)
00112233445566778899aabbccddeeff * * 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f одна тысяча двадцать-одна
8ea2b7ca516745bfeafc49904b496089
Я хотел бы создать файл заголовка FIPS_197_tests.h
, который определяет некоторые тестовые векторы, которые можно легко использовать в C. Например, первый тестовый вектор:
// C.1 AES-128 (Nk=4, Nr=10)
unsigned char Key_1[4][4] = {
{0x00, 0x11, 0x22, 0x33},
{0x44, 0x55, 0x66, 0x77},
{0x88, 0x99, 0xaa, 0xbb},
{0xcc, 0xdd, 0xee, 0xff} };
unsigned char PlainText_1[4][4] = {
{0x00, 0x01, 0x02, 0x03},
{0x04, 0x05, 0x06, 0x07},
{0x08, 0x09, 0x0a, 0x0b},
{0x0c, 0x0d, 0x0e, 0x0f} };
unsigned char CipherText_1[4][4] = {
{0x69, 0xc4, 0xe0, 0xd8},
{0x6a, 0x7b, 0x04, 0x30},
{0xd8, 0xcd, 0xb7, 0x80},
{0x70, 0xb4, 0xc5, 0x5a} };
Есть только 3 набора тестовых векторов, и я мог бы просто сделать это вручную, но я часто делал шестнадцатеричные тестовые векторы в C и хотел бы чтобы иметь более умное решение, чем шестнадцатеричные массивы, вводимые вручную.
Ключевые вопросы, требующие решения:
- Именование : Векторы входят в наборы по три
- Первый - Key_n массив
- Второй - PlainText_n массив
- Третий - CipherText_n массив
- Размеры : все значения в векторах представлены в шестнадцатеричном виде, но не всегда заполняют массивы размером [4] [4] Размеры массивов должны быть правильными
Пока у меня есть этот скрипт, который немного упрощает работу, но ничего, что делает всю работу:
cat FIPS_192_tests.txt | sed '/^#/ d; s/../0x&, /g' | xargs -n4 | rev | sed 's/,//' | rev | sed 's|^|{|; s|$|},|'
В итоге
Я надеюсь, что можно легко создать шестнадцатеричные тестовые векторы в C из текстового файла, содержащего длинные текстовые строки. Тестовые векторы входят в наборы по 3 на каждый тестовый пример и должны иметь соответствующие имена (A_1, B_1, C_1, A_2, B_2 ... et c.). Тестовые векторы имеют переменный размер, поэтому некоторые массивы должны быть объявлены как type [4][4]
, в то время как другие должны быть объявлены type [4][5]
Идеальное решение допускает переменность следующих элементов текстового файла:
- Количество последовательных строк, которые определили тестовый пример.
- Базовые имена для каждой строки (Key_n, Ciphertext_n, Apple_n, Banana_n).
- Тип данных для каждого Базовое имя .
- Размер каждого массива.
- Формат считываемых данных (шестнадцатеричный, десятичный, двоичный, ...)
Он может называться следующим образом:
./solution -i FIPS_197_tests.txt -n 3 -b "Key, PlainText, CipherText" -d "unsigned char, unsigned char, unsigned char" -f HEX -o FIPS_197_tests.h