bake_test.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*
  2. *******************************************************************************
  3. \file bake_demo.c
  4. \brief Tests for STB 34.101.66 (bake)
  5. \project bee2/test
  6. \created 2014.04.23
  7. \version 2023.09.22
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include <bee2/core/err.h>
  13. #include <bee2/core/mem.h>
  14. #include <bee2/core/hex.h>
  15. #include <bee2/core/prng.h>
  16. #include <bee2/core/str.h>
  17. #include <bee2/core/util.h>
  18. #include <bee2/crypto/bake.h>
  19. /*
  20. *******************************************************************************
  21. Проверочный канал связи как набор буферов памяти
  22. Сообщение протокола описывается структурой типа msg_t. Сообщения хранятся
  23. в массиве _msgs и обрабатываются с помощью функций _msgWrite(), _msgRead().
  24. *******************************************************************************
  25. */
  26. typedef struct
  27. {
  28. bool_t valid; /* сообщение задано? */
  29. octet buf[1024]; /* содержимое сообщения */
  30. size_t len; /* длина содержимого */
  31. } msg_t;
  32. static msg_t _msgs[4];
  33. typedef struct
  34. {
  35. size_t i; /* номер сообщения */
  36. size_t offset; /* смещение в содержимом сообщения (при чтении) */
  37. } file_msg_st;
  38. static err_t fileMsgWrite(size_t* written, const void* buf, size_t count,
  39. void* file)
  40. {
  41. file_msg_st* f;
  42. // pre
  43. ASSERT(memIsValid(file, sizeof(file_msg_st)));
  44. ASSERT(memIsValid(buf, count));
  45. ASSERT(memIsValid(written, sizeof(size_t)));
  46. // найти сообщение
  47. f = (file_msg_st*)file;
  48. if (f->i >= 4)
  49. return ERR_FILE_WRITE;
  50. // записать
  51. if (count > sizeof(_msgs[f->i].buf))
  52. return ERR_OUTOFMEMORY;
  53. _msgs[f->i].valid = TRUE;
  54. memCopy(_msgs[f->i].buf, buf, count);
  55. *written = _msgs[f->i].len = count;
  56. // к следующему сообщению
  57. ++f->i, f->offset = 0;
  58. // все нормально
  59. return ERR_OK;
  60. }
  61. static err_t fileMsgRead(size_t* read, void* buf, size_t count, void* file)
  62. {
  63. file_msg_st* f;
  64. // pre
  65. ASSERT(memIsValid(file, sizeof(file_msg_st)));
  66. ASSERT(memIsValid(buf, count));
  67. ASSERT(memIsValid(read, sizeof(size_t)));
  68. // найти сообщение
  69. f = (file_msg_st*)file;
  70. if (f->i >= 4)
  71. return ERR_FILE_READ;
  72. if (!_msgs[f->i].valid)
  73. return ERR_FILE_NOT_FOUND;
  74. // прочитать частично?
  75. ASSERT(f->offset <= _msgs[f->i].len);
  76. if (count + f->offset > _msgs[f->i].len)
  77. {
  78. memCopy(buf, _msgs[f->i].buf + f->offset,
  79. *read = _msgs[f->i].len - f->offset);
  80. ++f->i, f->offset = 0;
  81. return ERR_MAX;
  82. }
  83. // прочитать полностью
  84. memCopy(buf, _msgs[f->i].buf + f->offset, *read = count);
  85. f->offset += count;
  86. // конец сообщения?
  87. if (f->offset == _msgs[f->i].len)
  88. ++f->i, f->offset = 0;
  89. // все нормально
  90. return ERR_OK;
  91. }
  92. static void fileMsgFlash()
  93. {
  94. memSetZero(_msgs, sizeof(_msgs));
  95. }
  96. /*
  97. *******************************************************************************
  98. Самотестирование: таблица Б.1
  99. *******************************************************************************
  100. */
  101. static const char _da[] =
  102. "1F66B5B84B7339674533F0329C74F218"
  103. "34281FED0732429E0C79235FC273E269";
  104. static const char _db[] =
  105. "4C0E74B2CD5811AD21F23DE7E0FA742C"
  106. "3ED6EC483C461CE15C33A77AA308B7D2";
  107. static const char _certa[] =
  108. "416C696365"
  109. "BD1A5650179D79E03FCEE49D4C2BD5DD"
  110. "F54CE46D0CF11E4FF87BF7A890857FD0"
  111. "7AC6A60361E8C8173491686D461B2826"
  112. "190C2EDA5909054A9AB84D2AB9D99A90";
  113. static const char _certb[] =
  114. "426F62"
  115. "CCEEF1A313A406649D15DA0A851D486A"
  116. "695B641B20611776252FFDCE39C71060"
  117. "7C9EA1F33C23D20DFCB8485A88BE6523"
  118. "A28ECC3215B47FA289D6C9BE1CE837C0";
  119. /*
  120. *******************************************************************************
  121. Самотестирование: случайные числа сторон
  122. *******************************************************************************
  123. */
  124. static const char _bmqv_randa[] =
  125. "0A4E8298BE0839E46F19409F637F4415"
  126. "572251DD0D39284F0F0390D93BBCE9EC";
  127. static const char _bmqv_randb[] =
  128. "0F51D91347617C20BD4AB07AEF4F26A1"
  129. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5";
  130. static const char _bsts_randa[] =
  131. "0A4E8298BE0839E46F19409F637F4415"
  132. "572251DD0D39284F0F0390D93BBCE9EC";
  133. static const char _bsts_randb[] =
  134. "0F51D91347617C20BD4AB07AEF4F26A1"
  135. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5";
  136. static const char _bpace_randa[] =
  137. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5"
  138. "0A4E8298BE0839E46F19409F637F4415"
  139. "572251DD0D39284F0F0390D93BBCE9EC";
  140. static const char _bpace_randb[] =
  141. "0F51D91347617C20BD4AB07AEF4F26A1"
  142. "F81B29D571F6452FF8B2B97F57E18A58"
  143. "BC946FEE45EAB32B06FCAC23A33F422B";
  144. /*
  145. *******************************************************************************
  146. Проверка сертификата
  147. *******************************************************************************
  148. */
  149. static err_t bakeTestCertVal(octet* pubkey, const bign_params* params,
  150. const octet* data, size_t len)
  151. {
  152. if (!memIsValid(params, sizeof(bign_params)) ||
  153. (params->l != 128 && params->l != 192 && params->l != 256) ||
  154. !memIsNullOrValid(pubkey, params->l / 2))
  155. return ERR_BAD_INPUT;
  156. if (!memIsValid(data, len) ||
  157. len < params->l / 2)
  158. return ERR_BAD_CERT;
  159. if (pubkey)
  160. memCopy(pubkey, data + (len - params->l / 2), params->l / 2);
  161. return ERR_OK;
  162. }
  163. /*
  164. *******************************************************************************
  165. Самотестирование
  166. -# Выполняются тесты из приложения к СТБ 34.101.66.
  167. -# Номера тестов соответствуют номерам таблиц приложения.
  168. *******************************************************************************
  169. */
  170. bool_t bakeTest()
  171. {
  172. err_t codea;
  173. err_t codeb;
  174. bign_params params[1];
  175. octet randa[48];
  176. octet randb[48];
  177. octet echoa[64];
  178. octet echob[64];
  179. bake_settings settingsa[1];
  180. bake_settings settingsb[1];
  181. octet da[32];
  182. octet db[32];
  183. octet certdataa[5 /* Alice */ + 64 + 3 /* align */];
  184. octet certdatab[3 /* Bob */ + 64 + 5 /* align */];
  185. bake_cert certa[1];
  186. bake_cert certb[1];
  187. file_msg_st filea[1];
  188. file_msg_st fileb[1];
  189. const char pwd[] = "8086";
  190. octet keya[32];
  191. octet keyb[32];
  192. octet secret[32];
  193. octet iv[64];
  194. // подготовить память
  195. if (sizeof(echoa) < prngEcho_keep())
  196. return FALSE;
  197. // загрузить долговременные параметры
  198. if (bignParamsStd(params, "1.2.112.0.2.0.34.101.45.3.1") != ERR_OK)
  199. return FALSE;
  200. // задать настройки
  201. memSetZero(settingsa, sizeof(bake_settings));
  202. memSetZero(settingsb, sizeof(bake_settings));
  203. settingsa->kca = settingsa->kcb = TRUE;
  204. settingsb->kca = settingsb->kcb = TRUE;
  205. settingsa->rng = settingsb->rng = prngEchoStepR;
  206. settingsa->rng_state = echoa;
  207. settingsb->rng_state = echob;
  208. // загрузить личные ключи
  209. hexTo(da, _da);
  210. hexTo(db, _db);
  211. // загрузить сертификаты
  212. hexTo(certdataa, _certa);
  213. hexTo(certdatab, _certb);
  214. certa->data = certdataa;
  215. certa->len = strLen(_certa) / 2;
  216. certb->data = certdatab;
  217. certb->len = strLen(_certb) / 2;
  218. certa->val = certb->val = bakeTestCertVal;
  219. // тест Б.2
  220. hexTo(randa, _bmqv_randa);
  221. hexTo(randb, _bmqv_randb);
  222. fileMsgFlash();
  223. do
  224. {
  225. filea->i = filea->offset = 0;
  226. fileb->i = fileb->offset = 0;
  227. prngEchoStart(echoa, randa, strLen(_bmqv_randb) / 2);
  228. prngEchoStart(echob, randb, strLen(_bmqv_randb) / 2);
  229. codeb = bakeBMQVRunB(keyb, params, settingsb, db, certb, certa,
  230. fileMsgRead, fileMsgWrite, fileb);
  231. if (codeb != ERR_OK && codeb != ERR_FILE_NOT_FOUND)
  232. return FALSE;
  233. codea = bakeBMQVRunA(keya, params, settingsa, da, certa, certb,
  234. fileMsgRead, fileMsgWrite, filea);
  235. if (codea != ERR_OK && codea != ERR_FILE_NOT_FOUND)
  236. return FALSE;
  237. }
  238. while (codea == ERR_FILE_NOT_FOUND || codeb == ERR_FILE_NOT_FOUND);
  239. if (!memEq(keya, keyb, 32) ||
  240. !hexEq(keya,
  241. "C6F86D0E468D5EF1A9955B2EE0CF0581"
  242. "050C81D1B47727092408E863C7EEB48C"))
  243. return FALSE;
  244. // тест Б.3
  245. hexTo(randa, _bsts_randa);
  246. hexTo(randb, _bsts_randb);
  247. fileMsgFlash();
  248. do
  249. {
  250. filea->i = filea->offset = 0;
  251. fileb->i = fileb->offset = 0;
  252. prngEchoStart(echoa, randa, strLen(_bsts_randb) / 2);
  253. prngEchoStart(echob, randb, strLen(_bsts_randb) / 2);
  254. codeb = bakeBSTSRunB(keyb, params, settingsb, db, certb,
  255. bakeTestCertVal, fileMsgRead, fileMsgWrite, fileb);
  256. if (codeb != ERR_OK && codeb != ERR_FILE_NOT_FOUND)
  257. return FALSE;
  258. codea = bakeBSTSRunA(keya, params, settingsa, da, certa,
  259. bakeTestCertVal, fileMsgRead, fileMsgWrite, filea);
  260. if (codea != ERR_OK && codea != ERR_FILE_NOT_FOUND)
  261. return FALSE;
  262. }
  263. while (codea == ERR_FILE_NOT_FOUND || codeb == ERR_FILE_NOT_FOUND);
  264. if (!memEq(keya, keyb, 32) ||
  265. !hexEq(keya,
  266. "78EF2C56BD6DA2116BB5BEE80CEE5C05"
  267. "394E7609183CF7F76DF0C2DCFB25C4AD"))
  268. return FALSE;
  269. // тест Б.4
  270. hexTo(randa, _bpace_randa);
  271. hexTo(randb, _bpace_randb);
  272. fileMsgFlash();
  273. do
  274. {
  275. filea->i = filea->offset = 0;
  276. fileb->i = fileb->offset = 0;
  277. prngEchoStart(echoa, randa, strLen(_bpace_randb) / 2);
  278. prngEchoStart(echob, randb, strLen(_bpace_randb) / 2);
  279. codeb = bakeBPACERunB(keyb, params, settingsb, (const octet*)pwd,
  280. strLen(pwd), fileMsgRead, fileMsgWrite, fileb);
  281. if (codeb != ERR_OK && codeb != ERR_FILE_NOT_FOUND)
  282. return FALSE;
  283. codea = bakeBPACERunA(keya, params, settingsa, (const octet*)pwd,
  284. strLen(pwd), fileMsgRead, fileMsgWrite, filea);
  285. if (codea != ERR_OK && codea != ERR_FILE_NOT_FOUND)
  286. return FALSE;
  287. }
  288. while (codea == ERR_FILE_NOT_FOUND || codeb == ERR_FILE_NOT_FOUND);
  289. if (!memEq(keya, keyb, 32) ||
  290. !hexEq(keya,
  291. "DAC4D8F411F9C523D28BBAAB32A5270E"
  292. "4DFA1F0F757EF8E0F30AF08FBDE1E7F4"))
  293. return FALSE;
  294. // тест bakeKDF (по данным из теста Б.4)
  295. hexTo(secret,
  296. "723356E335ED70620FFB1842752092C3"
  297. "2603EB666040920587D800575BECFC42");
  298. hexTo(iv,
  299. "6B13ACBB086FB87618BCC2EF20A3FA89"
  300. "475654CB367E670A2441730B24B8AB31"
  301. "CD3D6487DC4EEB23456978186A069C71"
  302. "375D75C2DF198BAD1E61EEA0DBBFF737");
  303. if (bakeKDF(keya, secret, 32, iv, 64, 0) != ERR_OK ||
  304. bakeKDF(keyb, secret, 32, iv, 64, 1) != ERR_OK ||
  305. !hexEq(keya,
  306. "DAC4D8F411F9C523D28BBAAB32A5270E"
  307. "4DFA1F0F757EF8E0F30AF08FBDE1E7F4") ||
  308. !hexEq(keyb,
  309. "54AC058284D679CF4C47D3D72651F3E4"
  310. "EF0D61D1D0ED5BAF8FF30B8924E599D8"))
  311. return FALSE;
  312. // тест bakeSWU (по данным из теста Б.4)
  313. hexTo(secret,
  314. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5"
  315. "0F51D91347617C20BD4AB07AEF4F26A1");
  316. if (bakeSWU(iv, params, secret) != ERR_OK ||
  317. !hexEq(iv,
  318. "014417D3355557317D2E2AB6D0875487"
  319. "8D19E8D97B71FDC95DBB2A9B894D16D7"
  320. "7704A0B5CAA9CDA10791E4760671E105"
  321. "0DDEAB7083A7458447866ADB01473810"))
  322. return FALSE;
  323. // все нормально
  324. return TRUE;
  325. }