bels_test.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /*
  2. *******************************************************************************
  3. \file bels_test.c
  4. \brief Tests for STB 34.101.60 (bels)
  5. \project bee2/test
  6. \author Sergey Agievich [agievich@{bsu.by|gmail.com}]
  7. \created 2013.06.27
  8. \version 2021.04.15
  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/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/bels.h>
  19. #include <bee2/crypto/belt.h>
  20. #include <bee2/crypto/brng.h>
  21. /*
  22. *******************************************************************************
  23. Самотестирование
  24. -# Выполняются тесты из приложения к СТБ 34.101.60.
  25. -# Номера тестов соответствуют номерам таблиц приложения.
  26. *******************************************************************************
  27. */
  28. bool_t belsTest()
  29. {
  30. size_t len, num;
  31. octet m0[32];
  32. octet mi[32 * 5];
  33. octet s[32];
  34. octet si[33 * 5];
  35. char id[] = "Alice";
  36. octet echo_state[64];
  37. octet combo_state[512];
  38. // проверить состояния
  39. ASSERT(sizeof(echo_state) >= prngEcho_keep());
  40. ASSERT(sizeof(combo_state) >= prngCOMBO_keep());
  41. // проверить таблицы A.1 -- A.4
  42. for (len = 16; len <= 32; len += 8)
  43. for (num = 0; num <= 16; ++num)
  44. {
  45. if (belsStdM(mi, len, num) != ERR_OK)
  46. return FALSE;
  47. if (belsValM(mi, len) != ERR_OK)
  48. return FALSE;
  49. }
  50. // сгенерировать общие ключи
  51. prngCOMBOStart(combo_state, utilNonce32());
  52. if (belsGenM0(m0, 16, prngCOMBOStepR, combo_state) != ERR_OK ||
  53. belsValM(m0, 16) != ERR_OK)
  54. return FALSE;
  55. if (belsGenM0(m0, 24, prngCOMBOStepR, combo_state) != ERR_OK ||
  56. belsValM(m0, 24) != ERR_OK)
  57. return FALSE;
  58. if (belsGenM0(m0, 32, prngCOMBOStepR, combo_state) != ERR_OK ||
  59. belsValM(m0, 32) != ERR_OK)
  60. return FALSE;
  61. // тест Б.1
  62. belsStdM(m0, 16, 0);
  63. if (belsGenMid(mi, 16, m0, (const octet*)id, strLen(id)) != ERR_OK ||
  64. belsValM(mi, 16) != ERR_OK ||
  65. !hexEq(mi,
  66. "F9D6F31B5DB0BB61F00E17EEF2E6007F"))
  67. return FALSE;
  68. belsStdM(m0, 24, 0);
  69. if (belsGenMid(mi, 24, m0, (const octet*)id, strLen(id)) != ERR_OK ||
  70. belsValM(mi, 24) != ERR_OK ||
  71. !hexEq(mi,
  72. "09EA79297F94A3E43A3885FC0D1BB8FD"
  73. "D0DF86FD313CEF46"))
  74. return FALSE;
  75. belsStdM(m0, 32, 0);
  76. if (belsGenMid(mi, 32, m0, (const octet*)id, strLen(id)) != ERR_OK ||
  77. belsValM(mi, 32) != ERR_OK ||
  78. !hexEq(mi,
  79. "D53CC51BE1F976F1032A00D9CD0E190E"
  80. "62C37FFD233E8A9DF14C85F85C51A045"))
  81. return FALSE;
  82. // проверка belsGenMi
  83. for (len = 16; len <= 32; len += 8)
  84. {
  85. belsStdM(m0, len, 0);
  86. if (belsGenMi(mi, len, m0, prngCOMBOStepR, combo_state) != ERR_OK ||
  87. belsValM(mi, len) != ERR_OK)
  88. return FALSE;
  89. }
  90. // проверка belsShare
  91. for (len = 16; len <= 32; len += 8)
  92. {
  93. // загрузить открытые ключи
  94. belsStdM(m0, len, 0);
  95. belsStdM(mi + 0 * len, len, 1);
  96. belsStdM(mi + 1 * len, len, 2);
  97. belsStdM(mi + 2 * len, len, 3);
  98. belsStdM(mi + 3 * len, len, 4);
  99. belsStdM(mi + 4 * len, len, 5);
  100. // инициализировать эхо-генератор
  101. prngEchoStart(echo_state, beltH() + 128, 128);
  102. // разделить секрет (тесты Б.2 -- Б.4)
  103. if (belsShare(si, 5, 3, len, beltH(), m0, mi, prngEchoStepR,
  104. echo_state) != ERR_OK)
  105. return FALSE;
  106. if (len == 16 && !hexEq(si,
  107. "E27D0CFD31C557BC37C3897DCFF2C7FC"
  108. "50BB9EECBAEF52DDB811BCDE1495441D"
  109. "A92473F6796683534AD115812A3F9950"
  110. "9A8331FD945D58E6D8723E4744FB1DA9"
  111. "51913D18C8625C5AB0812133FB643D66"))
  112. return FALSE;
  113. if (len == 24 && !hexEq(si,
  114. "8D0EBB0C67A315C214B34A5D68E9712A"
  115. "12F7B43287E3138A"
  116. "2506EB8283D8555318479D278A752B04"
  117. "E9B5E6CC43543403"
  118. "E5B885E65E69ADD330D08268EC3D0A44"
  119. "B04B8E142CDDDD5C"
  120. "E85B368A66489AFE0E73D3D0EEB6A210"
  121. "CF0629C275AB1E94"
  122. "ED6CD8B56C37C03EE4FF04AE2A975AAA"
  123. "748AA0E97AA0DE20"))
  124. return FALSE;
  125. if (len == 32 && !hexEq(si,
  126. "27EC2268C7A06E7CC54F66FC3D357298"
  127. "4D4D4EF69916EB8D1EAFDFA420217ADC"
  128. "20E06235E355CC433E2AF2F4100C636F"
  129. "3BFAB861A4390614E42BC17577BCBE42"
  130. "1E14B1E795CED216AAC5BB526EFC786C"
  131. "5BCE1F1865D3886ED4DD7D9EFEF77F39"
  132. "62EFAD2544718293262E2CB74A396B50"
  133. "B6D8843DF5E2F0EEFFFE6CD18722765E"
  134. "71ADE959FC88CCBB1C521FA9A1168C18"
  135. "4619832AB66265E08A65DD48EE406418"))
  136. return FALSE;
  137. // восстановить секрет
  138. if (belsRecover(s, 1, len, si, m0, mi) != ERR_OK ||
  139. memEq(s, beltH(), len))
  140. return FALSE;
  141. if (belsRecover(s, 2, len, si, m0, mi) != ERR_OK ||
  142. memEq(s, beltH(), len))
  143. return FALSE;
  144. if (belsRecover(s, 3, len, si, m0, mi) != ERR_OK ||
  145. !memEq(s, beltH(), len))
  146. return FALSE;
  147. if (belsRecover(s, 4, len, si, m0, mi) != ERR_OK ||
  148. !memEq(s, beltH(), len))
  149. return FALSE;
  150. if (belsRecover(s, 5, len, si, m0, mi) != ERR_OK ||
  151. !memEq(s, beltH(), len))
  152. return FALSE;
  153. // восстановить секрет (тесты Б.5 -- Б.7, строка 1)
  154. if (belsRecover(s, 2, len, si, m0, mi) != ERR_OK ||
  155. len == 16 && !hexEq(s,
  156. "6380669CA508058FA9AADF986C77C175") ||
  157. len == 24 && !hexEq(s,
  158. "1E9811BD520C56E12B5B0E517756FA1A"
  159. "EE3CACC13B6313E9") ||
  160. len == 32 && !hexEq(s,
  161. "C39C8FA8590A7855914AED9B05940D9E"
  162. "8A119B130D939B8799889C938D1E078D"))
  163. return FALSE;
  164. // восстановить секрет (тесты Б.5 -- Б.7, строка 5)
  165. if (belsRecover(s, 2, len, si + len, m0, mi + len) != ERR_OK ||
  166. len == 16 && !hexEq(s,
  167. "E8BA837676967C5C939DBF5172C9AB4F") ||
  168. len == 24 && !hexEq(s,
  169. "AF8AB8304FEBD5CF89D643A850C77165"
  170. "7310CA0E8EDF9C60") ||
  171. len == 32 && !hexEq(s,
  172. "31C06C2BF7AF38C2A6870A7F1B7BA9CC"
  173. "1A741DD96374A4D17A1F701666C9A777"))
  174. return FALSE;
  175. // восстановить секрет (тесты Б.5 -- Б.7, строка 8)
  176. if (belsRecover(s, 2, len, si + 2 * len, m0, mi + 2 * len) != ERR_OK ||
  177. len == 16 && !hexEq(s,
  178. "81C498D55DC506E858DE632A079C2C31") ||
  179. len == 24 && !hexEq(s,
  180. "21B6A467511CD2CE6AE671E1D0992538"
  181. "BFB4EAE927F70991") ||
  182. len == 32 && !hexEq(s,
  183. "3ACC00A6DF80BC314A708A19D467F954"
  184. "40B214356D4666B4075E384B87BEB86C"))
  185. return FALSE;
  186. // восстановить секрет (тесты Б.5 -- Б.7, строка 10)
  187. if (belsRecover(s, 2, len, si + 3 * len, m0, mi + 3 * len) != ERR_OK ||
  188. len == 16 && !hexEq(s,
  189. "40F629F9A4487DBCBF53192EA4A49EAA") ||
  190. len == 24 && !hexEq(s,
  191. "1C0E2B99D81134E0EB9AD40279D09786"
  192. "CA3CDA79B2E5D385") ||
  193. len == 32 && !hexEq(s,
  194. "3F5F33C778D77A4FADC0BB51BE9F0153"
  195. "2627D1E83D023DA72255CC826B05213B"))
  196. return FALSE;
  197. // изменить порядок открытых ключей / частичных секретов: 13245
  198. memSwap(mi + len, mi + 2 * len, len);
  199. memSwap(si + len, si + 2 * len, len);
  200. // восстановить секрет (тесты Б.5 -- Б.7, строка 2)
  201. if (belsRecover(s, 2, len, si, m0, mi) != ERR_OK ||
  202. len == 16 && !hexEq(s,
  203. "ABD72A835739A358DD954BEF7A923AEC") ||
  204. len == 24 && !hexEq(s,
  205. "A2E3B51AFBD7AFD552048DD6444416E0"
  206. "7F2D9FA92D726920") ||
  207. len == 32 && !hexEq(s,
  208. "70EDE256F46BDC35EEE39361921EE8A3"
  209. "94E8E67F3F56ABFBA65329D146DA185B"))
  210. return FALSE;
  211. // восстановить секрет (тесты Б.5 -- Б.7, строка 6)
  212. if (belsRecover(s, 2, len, si + 2 * len, m0, mi + 2 * len) != ERR_OK ||
  213. len == 16 && !hexEq(s,
  214. "6CB93B8CF600A746F8520860901E36FA") ||
  215. len == 24 && !hexEq(s,
  216. "6D542544073C04C1C417ABDC292755A2"
  217. "861B4EB590B65841") ||
  218. len == 32 && !hexEq(s,
  219. "44FC1DE684980BE2660BB7BCE50728A1"
  220. "25A81D3B71B8D4ACD74E03190ADA473B"))
  221. return FALSE;
  222. // изменить порядок открытых ключей / частичных секретов: 53241
  223. memSwap(mi, mi + 4 * len, len);
  224. memSwap(si, si + 4 * len, len);
  225. // восстановить секрет (тесты Б.5 -- Б.7, строка 9)
  226. if (belsRecover(s, 2, len, si, m0, mi) != ERR_OK ||
  227. len == 16 && !hexEq(s,
  228. "E685CC725DDE29E60927563912CBBEA4") ||
  229. len == 24 && !hexEq(s,
  230. "F2E193958DB1D3391D54C410244C151D"
  231. "BC267D6F5182DEC4") ||
  232. len == 32 && !hexEq(s,
  233. "B3C2EDAD484A5A864575721D10B9D0C0"
  234. "9AE32C972C74857BA423D04502EE0066"))
  235. return FALSE;
  236. // восстановить секрет (тесты Б.5 -- Б.7, строка 3)
  237. if (belsRecover(s, 2, len, si + 3 * len, m0, mi + 3 * len) != ERR_OK ||
  238. len == 16 && !hexEq(s,
  239. "225E2DF0E4AE6532D5A741981410A83C") ||
  240. len == 24 && !hexEq(s,
  241. "2B65B8D1BEF2EA079F6C45DF5877EAA1"
  242. "8F1188539B0AEF32") ||
  243. len == 32 && !hexEq(s,
  244. "7C2D5033F0F10CC69065B13BB53BE7D1"
  245. "9D61CF864CF1578E8325F10564F995A3"))
  246. return FALSE;
  247. // изменить порядок открытых ключей / частичных секретов: 43251
  248. memSwap(mi, mi + 3 * len, len);
  249. memSwap(si, si + 3 * len, len);
  250. // восстановить секрет (тесты Б.5 -- Б.7, строка 7)
  251. if (belsRecover(s, 2, len, si + 2 * len, m0, mi + 2 * len) != ERR_OK ||
  252. len == 16 && !hexEq(s,
  253. "E4FCC7E24E448324367F400326954776") ||
  254. len == 24 && !hexEq(s,
  255. "EF5CE43C8AE6F4E441CE1C2D16ACC662"
  256. "D6CC1D8BAF937320") ||
  257. len == 32 && !hexEq(s,
  258. "264FD3BE9298495758B2446363616A38"
  259. "75D15EB96F95A122332597A87B2CCCBC"))
  260. return FALSE;
  261. // восстановить секрет (тесты Б.5 -- Б.7, строка 4)
  262. if (belsRecover(s, 2, len, si + 3 * len, m0, mi + 3 * len) != ERR_OK ||
  263. len == 16 && !hexEq(s,
  264. "E0C4268AC9C5FE35C15334E4D01417BE") ||
  265. len == 24 && !hexEq(s,
  266. "7E880E3E89CE5FD4E8452256BD66E42D"
  267. "18D88C0CF85FDC26") ||
  268. len == 32 && !hexEq(s,
  269. "00DD41CD32684FE7564F67FC51B0AD87"
  270. "003EEBDF90E803BA37CBA4FF8D9A724F"))
  271. return FALSE;
  272. }
  273. // разделение и сборка на стандартных открытых ключах
  274. for (len = 16; len <= 32; len += 8)
  275. {
  276. // разделить секрет
  277. if (belsShare3(si, 5, 3, len, beltH()) != ERR_OK)
  278. return FALSE;
  279. // восстановить секрет
  280. if (belsRecover2(s, 1, len, si) != ERR_OK ||
  281. memEq(s, beltH(), len))
  282. return FALSE;
  283. if (belsRecover2(s, 2, len, si) != ERR_OK ||
  284. memEq(s, beltH(), len))
  285. return FALSE;
  286. if (belsRecover2(s, 3, len, si) != ERR_OK ||
  287. !memEq(s, beltH(), len))
  288. return FALSE;
  289. if (belsRecover2(s, 4, len, si) != ERR_OK ||
  290. !memEq(s, beltH(), len))
  291. return FALSE;
  292. if (belsRecover2(s, 5, len, si) != ERR_OK ||
  293. !memEq(s, beltH(), len))
  294. return FALSE;
  295. }
  296. // все нормально
  297. return TRUE;
  298. }