bake_demo.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. /*
  2. *******************************************************************************
  3. \file bake_demo.c
  4. \brief Demo for STB 34.101.66 (bake)
  5. \project bee2/test
  6. \created 2014.05.03
  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/u16.h>
  18. #include <bee2/core/util.h>
  19. #include <bee2/crypto/bake.h>
  20. /*
  21. *******************************************************************************
  22. Проверочный канал связи
  23. Проверочный канал связи задается буфером памяти, разбитым на пакеты. Пакет
  24. описывает отдельное сообщение протокола. Пакет имеет формат len || frame,
  25. где len -- длина, заданная двумя октетами по правилам little-endian,
  26. frame -- содержимое пакета, состоящее из len октетов.
  27. Чтение из канала -- это чтение пакета или его части.
  28. Запись в канал --- это сравнение записываемого сообщения с текущим пакетом.
  29. *******************************************************************************
  30. */
  31. typedef struct
  32. {
  33. octet* data; /* буфер памяти */
  34. size_t data_len; /* длина буфера */
  35. octet* frame; /* текущий пакет */
  36. size_t frame_len; /* длина текущего пакета */
  37. size_t frame_offset; /* смещение в текущем пакете */
  38. } file_st;
  39. static err_t fileCreate(void* file, void* data, size_t data_len)
  40. {
  41. file_st* f = (file_st*)file;
  42. u16 len;
  43. // pre
  44. if (!memIsValid(f, sizeof(file_st)) ||
  45. !memIsValid(data, data_len))
  46. return ERR_BAD_INPUT;
  47. // запомнить буфер
  48. f->data = data;
  49. f->data_len = data_len;
  50. // нет пакетов?
  51. if (data_len < 2)
  52. {
  53. f->frame = 0;
  54. f->frame_len = f->frame_offset = 0;
  55. }
  56. // найти первый пакет
  57. else
  58. {
  59. u16From(&len, data, 2);
  60. f->frame_len = (size_t)len;
  61. f->frame = f->data + 2;
  62. f->frame_offset = 0;
  63. // выход за границы?
  64. if (f->frame + f->frame_len > f->data + f->data_len)
  65. return ERR_BAD_FORMAT;
  66. }
  67. // все нормально
  68. return ERR_OK;
  69. }
  70. static err_t fileWrite(size_t* written, const void* buf, size_t count,
  71. void* file)
  72. {
  73. file_st* f = (file_st*)file;
  74. u16 len;
  75. // pre
  76. ASSERT(memIsValid(f, sizeof(file_st)));
  77. ASSERT(memIsValid(buf, count));
  78. ASSERT(memIsValid(written, sizeof(size_t)));
  79. // конец файла?
  80. // запись не с начала пакета?
  81. // отличаются длины пакета и сообщения?
  82. // отличается содержимое?
  83. if (f->frame == 0 ||
  84. f->frame_offset != 0 ||
  85. f->frame_len != count ||
  86. !memEq(f->frame, buf, count))
  87. return ERR_FILE_WRITE;
  88. // к следующему пакету
  89. f->frame += f->frame_len;
  90. if (f->frame + 2 >= f->data + f->data_len)
  91. {
  92. f->frame = 0;
  93. f->frame_len = f->frame_offset = 0;
  94. }
  95. else
  96. {
  97. u16From(&len, f->frame, 2);
  98. f->frame_len = (size_t)len;
  99. f->frame += 2;
  100. f->frame_offset = 0;
  101. // выход за границы?
  102. if (f->frame + f->frame_len > f->data + f->data_len)
  103. return ERR_BAD_FORMAT;
  104. }
  105. // все нормально
  106. *written = count;
  107. return ERR_OK;
  108. }
  109. static err_t fileRead(size_t* read, void* buf, size_t count, void* file)
  110. {
  111. file_st* f = (file_st*)file;
  112. u16 len;
  113. err_t code;
  114. // pre
  115. ASSERT(memIsValid(f, sizeof(file_st)));
  116. ASSERT(memIsValid(buf, count));
  117. ASSERT(memIsValid(read, sizeof(size_t)));
  118. // достигнут конец файла?
  119. if (f->frame == 0)
  120. {
  121. *read = 0;
  122. return ERR_MAX;
  123. }
  124. // достигается конец файла?
  125. if (f->frame_offset + count > f->frame_len)
  126. {
  127. *read = f->frame_len - f->frame_offset;
  128. memCopy(buf, f->frame + f->frame_offset, *read);
  129. code = ERR_MAX;
  130. }
  131. // обычное чтение
  132. else
  133. {
  134. *read = count;
  135. memCopy(buf, f->frame + f->frame_offset, *read);
  136. code = ERR_OK;
  137. }
  138. // к следующему пакету
  139. f->frame += f->frame_len;
  140. if (f->frame + 2 >= f->data + f->data_len)
  141. {
  142. f->frame = 0;
  143. f->frame_len = f->frame_offset = 0;
  144. }
  145. else
  146. {
  147. u16From(&len, f->frame, 2);
  148. f->frame_len = (size_t)len;
  149. f->frame += 2;
  150. f->frame_offset = 0;
  151. // выход за границы?
  152. if (f->frame + f->frame_len > f->data + f->data_len)
  153. return ERR_BAD_FORMAT;
  154. }
  155. // все нормально
  156. return code;
  157. }
  158. /*
  159. *******************************************************************************
  160. Тестирование: таблица Б.1
  161. *******************************************************************************
  162. */
  163. static const char _da[] =
  164. "1F66B5B84B7339674533F0329C74F218"
  165. "34281FED0732429E0C79235FC273E269";
  166. static const char _db[] =
  167. "4C0E74B2CD5811AD21F23DE7E0FA742C"
  168. "3ED6EC483C461CE15C33A77AA308B7D2";
  169. static const char _certa[] =
  170. "416C696365"
  171. "BD1A5650179D79E03FCEE49D4C2BD5DD"
  172. "F54CE46D0CF11E4FF87BF7A890857FD0"
  173. "7AC6A60361E8C8173491686D461B2826"
  174. "190C2EDA5909054A9AB84D2AB9D99A90";
  175. static const char _certb[] =
  176. "426F62"
  177. "CCEEF1A313A406649D15DA0A851D486A"
  178. "695B641B20611776252FFDCE39C71060"
  179. "7C9EA1F33C23D20DFCB8485A88BE6523"
  180. "A28ECC3215B47FA289D6C9BE1CE837C0";
  181. /*
  182. *******************************************************************************
  183. Тестирование: случайные числа сторон
  184. *******************************************************************************
  185. */
  186. static const char _bmqv_randa[] =
  187. "0A4E8298BE0839E46F19409F637F4415"
  188. "572251DD0D39284F0F0390D93BBCE9EC";
  189. static const char _bmqv_randb[] =
  190. "0F51D91347617C20BD4AB07AEF4F26A1"
  191. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5";
  192. static const char _bsts_randa[] =
  193. "0A4E8298BE0839E46F19409F637F4415"
  194. "572251DD0D39284F0F0390D93BBCE9EC";
  195. static const char _bsts_randb[] =
  196. "0F51D91347617C20BD4AB07AEF4F26A1"
  197. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5";
  198. static const char _bpace_randa[] =
  199. "AD1362A8F9A3D42FBE1B8E6F1C88AAD5"
  200. "0A4E8298BE0839E46F19409F637F4415"
  201. "572251DD0D39284F0F0390D93BBCE9EC";
  202. static const char _bpace_randb[] =
  203. "0F51D91347617C20BD4AB07AEF4F26A1"
  204. "F81B29D571F6452FF8B2B97F57E18A58"
  205. "BC946FEE45EAB32B06FCAC23A33F422B";
  206. /*
  207. *******************************************************************************
  208. Тестирование: сообщения сторон
  209. *******************************************************************************
  210. */
  211. static const char _bmqv_data[] =
  212. "4000" // M1
  213. "9B4EA669DABDF100A7D4B6E6EB76EE52" // M1::Vb
  214. "51912531F426750AAC8A9DBB51C54D8D"
  215. "6AB7DBF15FCBD768EE68A173F7B236EF"
  216. "C15A01E2AA6CD1FE98B947DA7B38A2A0"
  217. "4800" // M2
  218. "1D5A382B962D4ED06193258CA6DE535D" // M2::Va
  219. "8FD7FACB853171E932EF93B5EE800120"
  220. "03DBB7B5BD07036380BAFA47FCA7E6CA"
  221. "3F179EDDD1AE5086647909183628EDDC"
  222. "413B7E181BAFB337" // M2::Ta
  223. "0800" // M3
  224. "B800A2033AC7591B"; // M3::Tb
  225. static const char _bsts_data[] =
  226. "4000" // M1
  227. "9B4EA669DABDF100A7D4B6E6EB76EE52" // M1::Vb
  228. "51912531F426750AAC8A9DBB51C54D8D"
  229. "6AB7DBF15FCBD768EE68A173F7B236EF"
  230. "C15A01E2AA6CD1FE98B947DA7B38A2A0"
  231. "AD00" // M2
  232. "1D5A382B962D4ED06193258CA6DE535D" // M2::Va
  233. "8FD7FACB853171E932EF93B5EE800120"
  234. "03DBB7B5BD07036380BAFA47FCA7E6CA"
  235. "3F179EDDD1AE5086647909183628EDDC"
  236. "A994115F297D2FAD342A0AF54FCDA66E" // M2::Ya
  237. "1E6A30FE966662C43C2A73AFA3CADF69"
  238. "47344287CB200795616458678B76BA61"
  239. "924AD05D80BB81F53F8D5C4E0EF55EBD"
  240. "AFA674D7ECD74CB0609DE12BC0463670"
  241. "64059F011607DD18624074901F1C5A40"
  242. "94C006559F"
  243. "1306D68200087987" // M2::Ta
  244. "6B00" // M3
  245. "6D45B2E76AF24422ADC6D5D7A3CFA37F" // M3::Yb
  246. "DCB52F7E440222F1AACECB98BDED357B"
  247. "BD459DF0A3EE7A3EAFE0199CA5C4C072"
  248. "7C33909E4C322216F6F53E383A3727D8"
  249. "34B5D4F5C977FC3B7EBA6DCA55C0F1A5"
  250. "69BE3CD3464B13C388D0DAC3E6A82F9D"
  251. "2EF3D6"
  252. "CA7A5BAC4EB2910E"; // Tb
  253. static const char _bpace_data[] =
  254. "1000" // M1
  255. "991E81690B4C687C86BFD11CEBDA2421" // M1::Yb
  256. "5000" // M2
  257. "CE41B54DC13A28BDF74CEBD190881802" // M2::Ya
  258. "6B13ACBB086FB87618BCC2EF20A3FA89" // M2::Va
  259. "475654CB367E670A2441730B24B8AB31"
  260. "8209C81C9640C47A77B28E90AB9211A1"
  261. "DF21DE878191C314061E347C5125244F"
  262. "4800" // M3
  263. "CD3D6487DC4EEB23456978186A069C71" // M3::Vb
  264. "375D75C2DF198BAD1E61EEA0DBBFF737"
  265. "3D1D9ED17A7AD460AA420FB11952D580"
  266. "78BC1CC9F408F2E258FDE97F22A44C6F"
  267. "28FD4859D78BA971" // M3::Tb
  268. "0800" // M4
  269. "5D93FD9A7CB863AA"; // M4::Ta
  270. /*
  271. *******************************************************************************
  272. Проверка сертификата
  273. *******************************************************************************
  274. */
  275. static err_t certVal(octet* pubkey, const bign_params* params,
  276. const octet* data, size_t len)
  277. {
  278. if (!memIsValid(params, sizeof(bign_params)) ||
  279. (params->l != 128 && params->l != 192 && params->l != 256) ||
  280. !memIsNullOrValid(pubkey, params->l / 2))
  281. return ERR_BAD_INPUT;
  282. if (!memIsValid(data, len) ||
  283. len < params->l / 2)
  284. return ERR_BAD_CERT;
  285. if (pubkey)
  286. memCopy(pubkey, data + (len - params->l / 2), params->l / 2);
  287. return ERR_OK;
  288. }
  289. /*
  290. *******************************************************************************
  291. Тестирование
  292. -# Выполняются тесты из приложения к СТБ 34.101.66.
  293. -# Номера тестов соответствуют номерам таблиц приложения.
  294. *******************************************************************************
  295. */
  296. bool_t bakeDemo()
  297. {
  298. bign_params params[1];
  299. octet randa[48];
  300. octet randb[48];
  301. octet echoa[64];
  302. octet echob[64];
  303. bake_settings settingsa[1];
  304. bake_settings settingsb[1];
  305. octet da[32];
  306. octet db[32];
  307. octet certdataa[5 + 64];
  308. octet certdatab[3 + 64];
  309. bake_cert certa[1];
  310. bake_cert certb[1];
  311. octet file_data[1024];
  312. file_st filea[1];
  313. file_st fileb[1];
  314. const char pwd[] = "8086";
  315. octet keya[32];
  316. octet keyb[32];
  317. // подготовить память
  318. if (sizeof(echoa) < prngEcho_keep() ||
  319. sizeof(file_data) < strLen(_bmqv_data) / 2 ||
  320. sizeof(file_data) < strLen(_bsts_data) / 2 ||
  321. sizeof(file_data) < strLen(_bpace_data) / 2)
  322. return FALSE;
  323. // загрузить долговременные параметры
  324. if (bignParamsStd(params, "1.2.112.0.2.0.34.101.45.3.1") != ERR_OK)
  325. return FALSE;
  326. // задать настройки
  327. memSetZero(settingsa, sizeof(bake_settings));
  328. memSetZero(settingsb, sizeof(bake_settings));
  329. settingsa->kca = settingsa->kcb = TRUE;
  330. settingsb->kca = settingsb->kcb = TRUE;
  331. settingsa->rng = settingsb->rng = prngEchoStepR;
  332. settingsa->rng_state = echoa;
  333. settingsb->rng_state = echob;
  334. // загрузить личные ключи
  335. hexTo(da, _da);
  336. hexTo(db, _db);
  337. // загрузить сертификаты
  338. hexTo(certdataa, _certa);
  339. hexTo(certdatab, _certb);
  340. certa->data = certdataa;
  341. certa->len = strLen(_certa) / 2;
  342. certb->data = certdatab;
  343. certb->len = strLen(_certb) / 2;
  344. certa->val = certb->val = certVal;
  345. // тест Б.2
  346. hexTo(randa, _bmqv_randa);
  347. hexTo(randb, _bmqv_randb);
  348. hexTo(file_data, _bmqv_data);
  349. if (fileCreate(filea, file_data, strlen(_bmqv_data) / 2) != ERR_OK ||
  350. fileCreate(fileb, file_data, strlen(_bmqv_data) / 2) != ERR_OK)
  351. return FALSE;
  352. prngEchoStart(echoa, randa, strLen(_bmqv_randb) / 2);
  353. prngEchoStart(echob, randb, strLen(_bmqv_randb) / 2);
  354. if (bakeBMQVRunB(keyb, params, settingsb, db, certb, certa,
  355. fileRead, fileWrite, fileb) != ERR_OK ||
  356. bakeBMQVRunA(keya, params, settingsa, da, certa, certb,
  357. fileRead, fileWrite, filea))
  358. return FALSE;
  359. if (!memEq(keya, keyb, 32) ||
  360. !hexEq(keya,
  361. "C6F86D0E468D5EF1A9955B2EE0CF0581"
  362. "050C81D1B47727092408E863C7EEB48C"))
  363. return FALSE;
  364. // тест Б.3
  365. hexTo(randa, _bsts_randa);
  366. hexTo(randb, _bsts_randb);
  367. hexTo(file_data, _bsts_data);
  368. if (fileCreate(filea, file_data, strlen(_bsts_data) / 2) != ERR_OK ||
  369. fileCreate(fileb, file_data, strlen(_bsts_data) / 2) != ERR_OK)
  370. return FALSE;
  371. prngEchoStart(echoa, randa, strLen(_bsts_randb) / 2);
  372. prngEchoStart(echob, randb, strLen(_bsts_randb) / 2);
  373. if (bakeBSTSRunB(keyb, params, settingsb, db, certb, certVal,
  374. fileRead, fileWrite, fileb) != ERR_OK ||
  375. bakeBSTSRunA(keya, params, settingsa, da, certa, certVal,
  376. fileRead, fileWrite, filea))
  377. return FALSE;
  378. if (!memEq(keya, keyb, 32) ||
  379. !hexEq(keya,
  380. "78EF2C56BD6DA2116BB5BEE80CEE5C05"
  381. "394E7609183CF7F76DF0C2DCFB25C4AD"))
  382. return FALSE;
  383. // тест Б.4
  384. hexTo(randa, _bpace_randa);
  385. hexTo(randb, _bpace_randb);
  386. hexTo(file_data, _bpace_data);
  387. if (fileCreate(filea, file_data, strlen(_bpace_data) / 2) != ERR_OK ||
  388. fileCreate(fileb, file_data, strlen(_bpace_data) / 2) != ERR_OK)
  389. return FALSE;
  390. prngEchoStart(echoa, randa, strLen(_bpace_randb) / 2);
  391. prngEchoStart(echob, randb, strLen(_bpace_randb) / 2);
  392. if (bakeBPACERunB(keyb, params, settingsb, (octet*)pwd, strLen(pwd),
  393. fileRead, fileWrite, fileb) != ERR_OK ||
  394. bakeBPACERunA(keya, params, settingsa, (octet*)pwd, strLen(pwd),
  395. fileRead, fileWrite, filea))
  396. return FALSE;
  397. if (!memEq(keya, keyb, 32) ||
  398. !hexEq(keya,
  399. "DAC4D8F411F9C523D28BBAAB32A5270E"
  400. "4DFA1F0F757EF8E0F30AF08FBDE1E7F4"))
  401. return FALSE;
  402. // все нормально
  403. return TRUE;
  404. }