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