Рейтинг:0

Как протестировать реализацию Salsa20/8 Core RFC 7914 с помощью тестовых векторов?

флаг in

Я хотел протестировать реализацию основной функции Salsa20/8, представленную в RFC 7914, с тест векторов предоставлено, и я не получаю ожидаемого результата от предоставленного ввода. Я предполагаю, что я не использую ввод должным образом, но я боюсь, что мне нужна помощь... Вот мой код:

#include <stdio.h>

интервал основной () {

  целое число без знака в [16];
  целое число без знака x[16];
  беззнаковый вход [16];

  /*
  <https://datatracker.ietf.org/doc/html/rfc7914#section-8>
  ВХОД:
  7e 87 9a 21 4f 3e c9 86 7c a9 40 e6 41 71 8f 26
  ba ee 55 5b 8c 61 c1 b5 0d f8 46 11 6d cd 3b 1d
  ee 24 f3 19 df 9b 3d 85 14 12 1e 4b 5a c5 aa 32
  76 02 1d 29 09 c7 48 29 ed eb c6 8d b8 b8 c2 5e
  */

  in[0] = 0x7e879a21;
  in[1] = 0x4f3ec986;
  in[2] = 0x7ca940e6;
  в [3] = 0x41718f26;
  in[4] = 0xbaee555b;
  в [5] = 0x8c61c1b5;
  in[6] = 0x0df84611;
  in[7] = 0x6dcd3b1d;
  in[8] = 0xee24f319;
  в [9] = 0xdf9b3d85;
  in[10] = 0x14121e4b;
  in[11] = 0x5ac5aa32;
  in[12] = 0x76021d29;
  in[13] = 0x09c74829;
  in[14] = 0xedebc68d;
  in[15] = 0xb8b8c25e;


  /* <https://datatracker.ietf.org/doc/html/rfc7914#section-3> */
  #define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
  инт я;
  для (i = 0;i < 16;++i) x[i] = in[i];
  для (i = 8;i > 0;i -= 2) {
   х[4] ^= R(х[0]+х[12], 7); х[8] ^= R(х[4]+х[0], 9);
   х[12] ^= R(х[8]+х[4],13); х[0] ^= R(х[12]+х[8],18);
   х[9] ^= R(х[5]+х[1], 7); х[13] ^= R(х[9]+х[5], 9);
   х[1] ^= R(х[13]+х[9],13); х[5] ^= R(х[1]+х[13],18);
   х[14] ^= R(х[10]+х[6], 7); х[ 2] ^= R(х[14]+х[10], 9);
   х[6] ^= R(х[2]+х[14],13); х[10] ^= R(х[6]+х[2],18);
   х[3] ^= R(х[15]+х[11], 7); х[7] ^= R(х[3]+х[15], 9);
   х[11] ^= R(х[7]+х[3],13); х[15] ^= R(х[11]+х[7],18);
   х[1] ^= R(х[0]+х[3], 7); х[2] ^= R(х[1]+х[0], 9);
   х[3] ^= R(х[2]+х[1],13); х[0] ^= R(х[3]+х[2],18);
   х[6] ^= R(х[5]+х[4], 7); х[7] ^= R(х[6]+х[5], 9);
   х[4] ^= R(х[7]+х[6],13); х[5] ^= R(х[4]+х[7],18);
   х[11] ^= R(х[10]+х[9], 7); х[8] ^= R(х[11]+х[10], 9);
   х[9] ^= R(х[8]+х[11],13); х[10] ^= R(х[9]+х[8],18);
   х[12] ^= R(х[15]+х[14], 7); х[13] ^= R(х[12]+х[15], 9);
   х[14] ^= R(х[13]+х[12],13); х[15] ^= R(х[14]+х[13],18);
  }
  для (i = 0;i < 16;++i) out[i] = x[i] + in[i];

  printf("in[0] = 0x%08x | out[0] = 0x%08x\n", in[0], out[0]);
  printf("in[1] = 0x%08x | out[1] = 0x%08x\n", in[1], out[1]);
  printf("in[2] = 0x%08x | out[2] = 0x%08x\n", in[2], out[2]);
  printf("in[3] = 0x%08x | out[3] = 0x%08x\n", in[3], out[3]);
  printf("in[4] = 0x%08x | out[4] = 0x%08x\n", in[4], out[4]);
  printf("in[5] = 0x%08x | out[5] = 0x%08x\n", in[5], out[5]);
  printf("in[6] = 0x%08x | out[6] = 0x%08x\n", in[6], out[6]);
  printf("in[7] = 0x%08x | out[7] = 0x%08x\n", in[7], out[7]);
  printf("in[8] = 0x%08x | out[8] = 0x%08x\n", in[8], out[8]);
  printf("in[9] = 0x%08x | out[9] = 0x%08x\n", in[9], out[9]);
  printf("in[10] = 0x%08x | out[10] = 0x%08x\n", in[10], out[10]);
  printf("in[11] = 0x%08x | out[11] = 0x%08x\n", in[11], out[11]);
  printf("in[12] = 0x%08x | out[12] = 0x%08x\n", in[12], out[12]);
  printf("in[13] = 0x%08x | out[13] = 0x%08x\n", in[13], out[13]);
  printf("in[14] = 0x%08x | out[14] = 0x%08x\n", in[14], out[14]);
  printf("in[15] = 0x%08x | out[15] = 0x%08x\n", in[15], out[15]);

  вернуть 0;
}

/*
РЕЗУЛЬТАТ:
в[0] = 0x7e879a21 | выход[0] = 0x4f027d2d
in[1] = 0x4f3ec986 | выход[1] = 0x4d5b0cd1
in[2] = 0x7ca940e6 | выход[2] = 0x3ee27bc6
в [3] = 0x41718f26 | выход[3] = 0xcfbc626d
in[4] = 0xbaee555b | выход[4] = 0xb577900a
в [5] = 0x8c61c1b5 | выход[5] = 0x034adb4a
in[6] = 0x0df84611 | выход[6] = 0x45cc3314
в [7] = 0x6dcd3b1d | выход[7] = 0x3bdc106b
в [8] = 0xee24f319 | выход[8] = 0x7fac24dd
в [9] = 0xdf9b3d85 | выход[9] = 0x9a53c287
in[10] = 0x14121e4b | выход[10] = 0x719eb5c5
in[11] = 0x5ac5aa32 | выход[11] = 0x291ded16
in[12] = 0x76021d29 | выход[12] = 0x2e3a5184
in[13] = 0x09c74829 | выход[13] = 0xa4d4d61a
in[14] = 0xedebc68d | выход[14] = 0x191ff4df
in[15] = 0xb8b8c25e | выход[15] = 0xef2671d8

<https://datatracker.ietf.org/doc/html/rfc7914#section-8>
ВХОД:
7e 87 9a 21 4f 3e c9 86 7c a9 40 e6 41 71 8f 26
ba ee 55 5b 8c 61 c1 b5 0d f8 46 11 6d cd 3b 1d
ee 24 f3 19 df 9b 3d 85 14 12 1e 4b 5a c5 aa 32
76 02 1d 29 09 c7 48 29 ed eb c6 8d b8 b8 c2 5e
ВЫВОД:
a4 1f 85 9c 66 08 cc 99 3b 81 ca cb 02 0c ef 05
04 4б 21 81 а2 фд 33 7д фд 7б 1в 63 96 68 2ф 29
b4 39 31 68 e3 c9 e6 bc fe 6b c5 b7 a0 6d 96 ba
e4 24 cc 10 2c 91 74 5c 24 ad 67 3d c7 61 8f 81
*/

Я просто запускаю свой код с помощью https://www.programiz.com/c-programming/online-compiler/ чтобы получить вывод. Надеюсь, вы поможете мне найти мою ошибку...

hardyrama avatar
флаг sd
Вы проверили реализацию с прямым/обратным порядком байтов? Я думаю, что вопросы реализации здесь неуместны.
Рейтинг:1
флаг in

Хорошо, как и ожидалось, это была «проблема с порядком байтов». Используя следующие SHIFT(х) макрос как для ввода, так и для вывода, я получаю тестовые векторы:

#define SHIFT(x) ((x) << 24 | ((x) & 0x0000ff00) << 8 | ((x) & 0x00ff0000) >> 8 | ((x) & 0xff000000) >> 24)

Вот полный код:

#include <stdio.h>

интервал основной () {

  целое число без знака в [16];
  целое число без знака x[16];
  беззнаковый вход [16];

  /*
  <https://datatracker.ietf.org/doc/html/rfc7914#section-8>
  ВХОД:
  7e 87 9a 21 4f 3e c9 86 7c a9 40 e6 41 71 8f 26
  ba ee 55 5b 8c 61 c1 b5 0d f8 46 11 6d cd 3b 1d
  ee 24 f3 19 df 9b 3d 85 14 12 1e 4b 5a c5 aa 32
  76 02 1d 29 09 c7 48 29 ed eb c6 8d b8 b8 c2 5e
  */

  #define SHIFT(x) ((x) << 24 | ((x) & 0x0000ff00) << 8 | ((x) & 0x00ff0000) >> 8 | ((x) & 0xff000000) >> 24)

  in[0] = SHIFT(0x7e879a21);
  in[1] = SHIFT(0x4f3ec986);
  in[2] = SHIFT(0x7ca940e6);
  in[3] = SHIFT(0x41718f26);
  in[4] = SHIFT(0xbaee555b);
  in[5] = SHIFT(0x8c61c1b5);
  in[6] = SHIFT(0x0df84611);
  in[7] = SHIFT(0x6dcd3b1d);
  in[8] = SHIFT(0xee24f319);
  in[9] = SHIFT(0xdf9b3d85);
  in[10] = SHIFT(0x14121e4b);
  in[11] = SHIFT(0x5ac5aa32);
  in[12] = SHIFT(0x76021d29);
  in[13] = SHIFT(0x09c74829);
  in[14] = SHIFT(0xedebc68d);
  in[15] = SHIFT(0xb8b8c25e);

  /* <https://datatracker.ietf.org/doc/html/rfc7914#section-3> */
  #define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
  инт я;
  для (i = 0;i < 16;++i) x[i] = in[i];
  для (i = 8;i > 0;i -= 2) {
   х[4] ^= R(х[0]+х[12], 7); х[8] ^= R(х[4]+х[0], 9);
   х[12] ^= R(х[8]+х[4],13); х[0] ^= R(х[12]+х[8],18);
   х[9] ^= R(х[5]+х[1], 7); х[13] ^= R(х[9]+х[5], 9);
   х[1] ^= R(х[13]+х[9],13); х[5] ^= R(х[1]+х[13],18);
   х[14] ^= R(х[10]+х[6], 7); х[ 2] ^= R(х[14]+х[10], 9);
   х[6] ^= R(х[2]+х[14],13); х[10] ^= R(х[6]+х[2],18);
   х[3] ^= R(х[15]+х[11], 7); х[7] ^= R(х[3]+х[15], 9);
   х[11] ^= R(х[7]+х[3],13); х[15] ^= R(х[11]+х[7],18);
   х[1] ^= R(х[0]+х[3], 7); х[2] ^= R(х[1]+х[0], 9);
   х[3] ^= R(х[2]+х[1],13); х[0] ^= R(х[3]+х[2],18);
   х[6] ^= R(х[5]+х[4], 7); х[7] ^= R(х[6]+х[5], 9);
   х[4] ^= R(х[7]+х[6],13); х[5] ^= R(х[4]+х[7],18);
   х[11] ^= R(х[10]+х[9], 7); х[8] ^= R(х[11]+х[10], 9);
   х[9] ^= R(х[8]+х[11],13); х[10] ^= R(х[9]+х[8],18);
   х[12] ^= R(х[15]+х[14], 7); х[13] ^= R(х[12]+х[15], 9);
   х[14] ^= R(х[13]+х[12],13); х[15] ^= R(х[14]+х[13],18);
  }
  для (i = 0;i < 16;++i) out[i] = x[i] + in[i];

  printf("in[0] = 0x%08x | out[0] = 0x%08x\n", in[0], SHIFT(out[0]));
  printf("in[1] = 0x%08x | out[1] = 0x%08x\n", in[1], SHIFT(out[1]));
  printf("in[2] = 0x%08x | out[2] = 0x%08x\n", in[2], SHIFT(out[2]));
  printf("in[3] = 0x%08x | out[3] = 0x%08x\n", in[3], SHIFT(out[3]));
  printf("in[4] = 0x%08x | out[4] = 0x%08x\n", in[4], SHIFT(out[4]));
  printf("in[5] = 0x%08x | out[5] = 0x%08x\n", in[5], SHIFT(out[5]));
  printf("in[6] = 0x%08x | out[6] = 0x%08x\n", in[6], SHIFT(out[6]));
  printf("in[7] = 0x%08x | out[7] = 0x%08x\n", in[7], SHIFT(out[7]));
  printf("in[8] = 0x%08x | out[8] = 0x%08x\n", in[8], SHIFT(out[8]));
  printf("in[9] = 0x%08x | out[9] = 0x%08x\n", in[9], SHIFT(out[9]));
  printf("in[10] = 0x%08x | out[10] = 0x%08x\n", in[10], SHIFT(out[10]));
  printf("in[11] = 0x%08x | out[11] = 0x%08x\n", in[11], SHIFT(out[11]));
  printf("in[12] = 0x%08x | out[12] = 0x%08x\n", in[12], SHIFT(out[12]));
  printf("in[13] = 0x%08x | out[13] = 0x%08x\n", in[13], SHIFT(out[13]));
  printf("in[14] = 0x%08x | out[14] = 0x%08x\n", in[14], SHIFT(out[14]));
  printf("in[15] = 0x%08x | out[15] = 0x%08x\n", in[15], SHIFT(out[15]));

  вернуть 0;
}

/*
ВЫВОД:
in[0] = 0x219a877e | выход[0] = 0xa41f859c
в [1] = 0x86c93e4f | выход[1] = 0x6608cc99
в [2] = 0xe640a97c | выход[2] = 0x3b81cacb
в [3] = 0x268f7141 | выход[3] = 0x020cef05
in[4] = 0x5b55eeba | выход[4] = 0x044b2181
в [5] = 0xb5c1618c | выход[5] = 0xa2fd337d
в [6] = 0x1146f80d | выход[6] = 0xfd7b1c63
в [7] = 0x1d3bcd6d | выход[7] = 0x96682f29
in[8] = 0x19f324ee | выход[8] = 0xb4393168
в [9] = 0x853d9bdf | выход[9] = 0xe3c9e6bc
in[10] = 0x4b1e1214 | выход[10] = 0xfe6bc5b7
in[11] = 0x32aac55a | выход[11] = 0xa06d96ba
in[12] = 0x291d0276 | выход[12] = 0xe424cc10
in[13] = 0x2948c709 | выход[13] = 0x2c91745c
in[14] = 0x8dc6ebed | выход[14] = 0x24ad673d
in[15] = 0x5ec2b8b8 | выход[15] = 0xc7618f81

<https://datatracker.ietf.org/doc/html/rfc7914#section-8>
ВХОД:
7e 87 9a 21 4f 3e c9 86 7c a9 40 e6 41 71 8f 26
ba ee 55 5b 8c 61 c1 b5 0d f8 46 11 6d cd 3b 1d
ee 24 f3 19 df 9b 3d 85 14 12 1e 4b 5a c5 aa 32
76 02 1d 29 09 c7 48 29 ed eb c6 8d b8 b8 c2 5e
ВЫВОД:
a4 1f 85 9c 66 08 cc 99 3b 81 ca cb 02 0c ef 05
04 4б 21 81 а2 фд 33 7д фд 7б 1в 63 96 68 2ф 29
b4 39 31 68 e3 c9 e6 bc fe 6b c5 b7 a0 6d 96 ba
e4 24 cc 10 2c 91 74 5c 24 ad 67 3d c7 61 8f 81
*/

на котором можно запустить https://www.programiz.com/c-programming/online-compiler/.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.