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. \author (C) Sergey Agievich [agievich@{bsu.by|gmail.com}]
  7. \created 2014.04.23
  8. \version 2017.01.17
  9. \license This program is released under the GNU General Public License
  10. version 3. See Copyright Notices in bee2/info.h.
  11. *******************************************************************************
  12. */
  13. #include <bee2/core/err.h>
  14. #include <bee2/core/mem.h>
  15. #include <bee2/core/hex.h>
  16. #include <bee2/core/prng.h>
  17. #include <bee2/core/str.h>
  18. #include <bee2/core/util.h>
  19. #include <bee2/crypto/bake.h>
  20. /*
  21. *******************************************************************************
  22. Проверочный канал связи как набор буферов памяти
  23. Сообщение протокола описывается структурой типа msg_t. Сообщения хранятся
  24. в массиве _msgs и обрабатываются с помощью функций _msgWrite(), _msgRead().
  25. *******************************************************************************
  26. */
  27. typedef struct
  28. {
  29. bool_t valid; /* сообщение задано? */
  30. octet buf[1024]; /* содержимое сообщения */
  31. size_t len; /* длина содержимого */
  32. } msg_t;
  33. static msg_t _msgs[4];
  34. typedef struct
  35. {
  36. size_t i; /* номер сообщения */
  37. size_t offset; /* смещение в содержимом сообщения (при чтении) */
  38. } file_msg_st;
  39. static err_t fileMsgWrite(size_t* written, const void* buf, size_t count,
  40. void* file)
  41. {
  42. file_msg_st* f;
  43. // pre
  44. ASSERT(memIsValid(file, sizeof(file_msg_st)));
  45. ASSERT(memIsValid(buf, count));
  46. ASSERT(memIsValid(written, sizeof(size_t)));
  47. // найти сообщение
  48. f = (file_msg_st*)file;
  49. if (f->i >= 4)
  50. return ERR_FILE_WRITE;
  51. // записать
  52. if (count > sizeof(_msgs[f->i].buf))
  53. return ERR_OUTOFMEMORY;
  54. _msgs[f->i].valid = TRUE;
  55. memCopy(_msgs[f->i].buf, buf, count);
  56. *written = _msgs[f->i].len = count;
  57. // к следующему сообщению
  58. ++f->i, f->offset = 0;
  59. // все нормально
  60. return ERR_OK;
  61. }
  62. static err_t fileMsgRead(size_t* read, void* buf, size_t count, void* file)
  63. {
  64. file_msg_st* f;
  65. // pre
  66. ASSERT(memIsValid(file, sizeof(file_msg_st)));
  67. ASSERT(memIsValid(buf, count));
  68. ASSERT(memIsValid(read, sizeof(size_t)));
  69. // найти сообщение
  70. f = (file_msg_st*)file;
  71. if (f->i >= 4)
  72. return ERR_FILE_READ;
  73. if (!_msgs[f->i].valid)
  74. return ERR_FILE_NOT_FOUND;
  75. // прочитать частично?
  76. ASSERT(f->offset <= _msgs[f->i].len);
  77. if (count + f->offset > _msgs[f->i].len)
  78. {
  79. memCopy(buf, _msgs[f->i].buf + f->offset,
  80. *read = _msgs[f->i].len - f->offset);
  81. ++f->i, f->offset = 0;
  82. return ERR_MAX;
  83. }
  84. // прочитать полностью
  85. memCopy(buf, _msgs[f->i].buf + f->offset, *read = count);
  86. f->offset += count;
  87. // конец сообщения?
  88. if (f->offset == _msgs[f->i].len)
  89. ++f->i, f->offset = 0;
  90. // все нормально
  91. return ERR_OK;
  92. }
  93. static void fileMsgFlash()
  94. {
  95. memSetZero(_msgs, sizeof(_msgs));
  96. }
  97. /*
  98. *******************************************************************************
  99. Самотестирование: таблица Б.1
  100. *******************************************************************************
  101. */
  102. static const char _da[] =
  103. "1F66B5B84B7339674533F0329C74F218"
  104. "34281FED0732429E0C79235FC273E269";
  105. static const char _db[] =
  106. "4C0E74B2CD5811AD21F23DE7E0FA742C"
  107. "3ED6EC483C461CE15C33A77AA308B7D2";
  108. static const char _certa[] =
  109. "416C696365"
  110. "BD1A5650179D79E03FCEE49D4C2BD5DD"
  111. "F54CE46D0CF11E4FF87BF7A890857FD0"
  112. "7AC6A60361E8C8173491686D461B2826"
  113. "190C2EDA5909054A9AB84D2AB9D99A90";
  114. static const char _certb[] =
  115. "426F62"
  116. "CCEEF1A313A406649D15DA0A851D486A"
  117. "695B641B20611776252FFDCE39C71060"
  118. "7C9EA1F33C23D20DFCB8485A88BE6523"
  119. "A28ECC3215B47FA289D6C9BE1CE837C0";
  120. /*
  121. *******************************************************************************
  122. Самотестирование: случайные числа сторон
  123. *******************************************************************************
  124. */
  125. static const char _bmqv_randa[] =
  126. "0A4E8298BE0839E46F19409F637F4415"
  127. "572251DD0D39284F0F0390D93BBCE9EC";
  128. static const char _bmqv_randb[] =
  129. "0F51D91347617C20BD4AB07AEF4F26A1"
  130. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5";
  131. static const char _bsts_randa[] =
  132. "0A4E8298BE0839E46F19409F637F4415"
  133. "572251DD0D39284F0F0390D93BBCE9EC";
  134. static const char _bsts_randb[] =
  135. "0F51D91347617C20BD4AB07AEF4F26A1"
  136. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5";
  137. static const char _bpace_randa[] =
  138. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5"
  139. "0A4E8298BE0839E46F19409F637F4415"
  140. "572251DD0D39284F0F0390D93BBCE9EC";
  141. static const char _bpace_randb[] =
  142. "0F51D91347617C20BD4AB07AEF4F26A1"
  143. "F81B29D571F6452FF8B2B97F57E18A58"
  144. "BC946FEE45EAB32B06FCAC23A33F422B";
  145. /*
  146. *******************************************************************************
  147. Проверка сертификата
  148. *******************************************************************************
  149. */
  150. static err_t bakeTestCertVal(octet* pubkey, const bign_params* params,
  151. const octet* data, size_t len)
  152. {
  153. if (!memIsValid(params, sizeof(bign_params)) ||
  154. (params->l != 128 && params->l != 192 && params->l != 256) ||
  155. !memIsNullOrValid(pubkey, params->l / 2))
  156. return ERR_BAD_INPUT;
  157. if (!memIsValid(data, len) ||
  158. len < params->l / 2)
  159. return ERR_BAD_CERT;
  160. if (pubkey)
  161. memCopy(pubkey, data + (len - params->l / 2), params->l / 2);
  162. return ERR_OK;
  163. }
  164. /*
  165. *******************************************************************************
  166. Самотестирование
  167. -# Выполняются тесты из приложения к СТБ 34.101.66.
  168. -# Номера тестов соответствуют номерам таблиц приложения.
  169. *******************************************************************************
  170. */
  171. bool_t bakeTest()
  172. {
  173. err_t codea;
  174. err_t codeb;
  175. bign_params params[1];
  176. octet randa[48];
  177. octet randb[48];
  178. octet echoa[64];
  179. octet echob[64];
  180. bake_settings settingsa[1];
  181. bake_settings settingsb[1];
  182. octet da[32];
  183. octet db[32];
  184. octet certdataa[5 /* Alice */ + 64 + 3 /* align */];
  185. octet certdatab[3 /* Bob */ + 64 + 5 /* align */];
  186. bake_cert certa[1];
  187. bake_cert certb[1];
  188. file_msg_st filea[1];
  189. file_msg_st fileb[1];
  190. const char pwd[] = "8086";
  191. octet keya[32];
  192. octet keyb[32];
  193. octet secret[32];
  194. octet iv[64];
  195. // загрузить долговременные параметры
  196. if (bignStdParams(params, "1.2.112.0.2.0.34.101.45.3.1") != ERR_OK)
  197. return FALSE;
  198. // настроить генераторы
  199. ASSERT(prngEcho_keep() <= sizeof(echoa));
  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. }