bpki_test.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /*
  2. *******************************************************************************
  3. \file bpki_test.c
  4. \brief Tests for STB 34.101.78 (bpki) helpers
  5. \project bee2/test
  6. \created 2021.04.13
  7. \version 2024.05.08
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include <bee2/core/mem.h>
  13. #include <bee2/core/hex.h>
  14. #include <bee2/core/str.h>
  15. #include <bee2/core/util.h>
  16. #include <bee2/crypto/belt.h>
  17. #include <bee2/crypto/bpki.h>
  18. /*
  19. *******************************************************************************
  20. Контейнеры
  21. *******************************************************************************
  22. */
  23. static bool_t bpkiContTest()
  24. {
  25. octet epki[1024];
  26. octet key[64];
  27. octet pwd[] = { 'z', 'e', 'd' };
  28. size_t epki_len, epki_len1;
  29. size_t key_len;
  30. // создать контейнер с личным ключом (l = 96)
  31. if (bpkiPrivkeyWrap(0, &epki_len, beltH(), 24,
  32. pwd, sizeof(pwd), beltH() + 24, 10000) != ERR_OK ||
  33. epki_len > sizeof(epki) ||
  34. bpkiPrivkeyWrap(epki, &epki_len1, beltH(), 24,
  35. pwd, sizeof(pwd), beltH() + 24, 10000) != ERR_OK ||
  36. epki_len != epki_len1)
  37. return FALSE;
  38. // разобрать контейнер с личным ключом (l = 96)
  39. if (bpkiPrivkeyUnwrap(0, &key_len, epki, epki_len,
  40. pwd, sizeof(pwd)) != ERR_OK ||
  41. key_len != 24 || key_len > sizeof(key) ||
  42. bpkiPrivkeyUnwrap(key, &key_len, epki, epki_len,
  43. pwd, sizeof(pwd)) != ERR_OK ||
  44. key_len != 24 || !memEq(key, beltH(), 24))
  45. return FALSE;
  46. // создать контейнер с личным ключом (l = 128)
  47. if (bpkiPrivkeyWrap(0, &epki_len, beltH(), 32,
  48. pwd, sizeof(pwd), beltH() + 32, 10001) != ERR_OK ||
  49. epki_len > sizeof(epki) ||
  50. bpkiPrivkeyWrap(epki, &epki_len1, beltH(), 32,
  51. pwd, sizeof(pwd), beltH() + 32, 10001) != ERR_OK ||
  52. epki_len != epki_len1)
  53. return FALSE;
  54. // разобрать контейнер с личным ключом (l = 128)
  55. if (bpkiPrivkeyUnwrap(0, &key_len, epki, epki_len,
  56. pwd, sizeof(pwd)) != ERR_OK ||
  57. key_len != 32 || key_len > sizeof(key) ||
  58. bpkiPrivkeyUnwrap(key, &key_len, epki, epki_len,
  59. pwd, sizeof(pwd)) != ERR_OK ||
  60. key_len != 32 || !memEq(key, beltH(), 32))
  61. return FALSE;
  62. // создать контейнер с личным ключом (l = 192)
  63. if (bpkiPrivkeyWrap(0, &epki_len, beltH(), 48,
  64. pwd, sizeof(pwd), beltH() + 40, 10002) != ERR_OK ||
  65. epki_len > sizeof(epki) ||
  66. bpkiPrivkeyWrap(epki, &epki_len1, beltH(), 48,
  67. pwd, sizeof(pwd), beltH() + 40, 10002) != ERR_OK ||
  68. epki_len1 != epki_len)
  69. return FALSE;
  70. // разобрать контейнер с личным ключом (l = 192)
  71. if (bpkiPrivkeyUnwrap(0, &key_len, epki, epki_len,
  72. pwd, sizeof(pwd)) != ERR_OK ||
  73. key_len != 48 ||
  74. bpkiPrivkeyUnwrap(key, &key_len, epki, epki_len,
  75. pwd, sizeof(pwd)) != ERR_OK ||
  76. key_len != 48 || !memEq(key, beltH(), 48))
  77. return FALSE;
  78. // создать контейнер с личным ключом (l = 256)
  79. if (bpkiPrivkeyWrap(0, &epki_len, beltH(), 64,
  80. pwd, sizeof(pwd), beltH() + 48, 10003) != ERR_OK ||
  81. epki_len > sizeof(epki) ||
  82. bpkiPrivkeyWrap(epki, &epki_len1, beltH(), 64,
  83. pwd, sizeof(pwd), beltH() + 48, 10003) != ERR_OK ||
  84. epki_len1 != epki_len)
  85. return FALSE;
  86. // разобрать контейнер с личным ключом (l = 256)
  87. if (bpkiPrivkeyUnwrap(0, &key_len, epki, epki_len,
  88. pwd, sizeof(pwd)) != ERR_OK ||
  89. key_len != 64 ||
  90. bpkiPrivkeyUnwrap(key, &key_len, epki, epki_len,
  91. pwd, sizeof(pwd)) != ERR_OK ||
  92. key_len != 64 || !memEq(key, beltH(), 64))
  93. return FALSE;
  94. // создать контейнер с частичным секретом (l = 128)
  95. memCopy(key + 1, beltH(), 16), key[0] = 1;
  96. if (bpkiShareWrap(0, &epki_len, key, 17,
  97. pwd, sizeof(pwd), beltH() + 64, 10003) != ERR_OK ||
  98. epki_len > sizeof(epki) ||
  99. bpkiShareWrap(epki, &epki_len1, key, 17,
  100. pwd, sizeof(pwd), beltH() + 64, 10003) != ERR_OK ||
  101. epki_len != epki_len1)
  102. return FALSE;
  103. // разобрать контейнер с частичным секретом (l = 128)
  104. if (bpkiShareUnwrap(0, &key_len, epki, epki_len,
  105. pwd, sizeof(pwd)) != ERR_OK ||
  106. key_len != 17 ||
  107. bpkiShareUnwrap(key, &key_len, epki, epki_len,
  108. pwd, sizeof(pwd)) != ERR_OK ||
  109. key_len != 17 || !memEq(key + 1, beltH(), 16) || key[0] != 1)
  110. return FALSE;
  111. // создать контейнер с частичным секретом (l = 192)
  112. memCopy(key + 1, beltH(), 24), key[0] = 2;
  113. if (bpkiShareWrap(0, &epki_len, key, 25,
  114. pwd, sizeof(pwd), beltH() + 64, 10004) != ERR_OK ||
  115. epki_len > sizeof(epki) ||
  116. bpkiShareWrap(epki, &epki_len1, key, 25,
  117. pwd, sizeof(pwd), beltH() + 64, 10004) != ERR_OK ||
  118. epki_len1 != epki_len)
  119. return FALSE;
  120. // разобрать контейнер с частичным секретом (l = 192)
  121. if (bpkiShareUnwrap(0, &key_len, epki, epki_len,
  122. pwd, sizeof(pwd)) != ERR_OK ||
  123. key_len != 25 ||
  124. bpkiShareUnwrap(key, &key_len, epki, epki_len,
  125. pwd, sizeof(pwd)) != ERR_OK ||
  126. key_len != 25 || !memEq(key + 1, beltH(), 24) || key[0] != 2)
  127. return FALSE;
  128. // создать контейнер с частичным секретом (l = 256)
  129. memCopy(key + 1, beltH(), 32), key[0] = 16;
  130. if (bpkiShareWrap(0, &epki_len, key, 33,
  131. pwd, sizeof(pwd), beltH() + 64, 10005) != ERR_OK ||
  132. epki_len > sizeof(epki) ||
  133. bpkiShareWrap(epki, &epki_len1, key, 33,
  134. pwd, sizeof(pwd), beltH() + 64, 10005) != ERR_OK ||
  135. epki_len1 != epki_len)
  136. return FALSE;
  137. // разобрать контейнер с частичным секретом (l = 256)
  138. if (bpkiShareUnwrap(0, &key_len, epki, epki_len,
  139. pwd, sizeof(pwd)) != ERR_OK ||
  140. key_len != 33 ||
  141. bpkiShareUnwrap(key, &key_len, epki, epki_len,
  142. pwd, sizeof(pwd)) != ERR_OK ||
  143. key_len != 33 || !memEq(key + 1, beltH(), 32) || key[0] != 16)
  144. return FALSE;
  145. // все нормально
  146. return TRUE;
  147. }
  148. /*
  149. *******************************************************************************
  150. Запрос на выпуск сертификата
  151. \remark Запрос сгенерирован в OpenSSL[bee2evp] при следующих настройках:
  152. \code
  153. [req]
  154. prompt = no
  155. distinguished_name = dn
  156. attributes = attrs
  157. [attrs]
  158. challengePassword = /INFO:erip234123
  159. [dn]
  160. CN = ROBERT SMITH
  161. surname = SMITH
  162. givenName = ROBERT
  163. serialNumber = PASGB-533324428
  164. countryName = GB
  165. [reqexts]
  166. certificatePolicies = bpki-role-fnp
  167. subjectAltName = email:robert.smith@example.uk
  168. \endcode
  169. *******************************************************************************
  170. */
  171. static bool_t bpkiCSRTest()
  172. {
  173. octet csr[382];
  174. octet privkey[32];
  175. octet pubkey[64];
  176. size_t pubkey_len;
  177. // загрузить запрос
  178. hexTo(csr,
  179. "3082017A30820134020100305F311530"
  180. "1306035504030C0C524F424552542053"
  181. "4D495448310E300C06035504040C0553"
  182. "4D495448310F300D060355042A0C0652"
  183. "4F42455254311830160603550405130F"
  184. "50415347422D35333333323434323831"
  185. "0B3009060355040613024742305D3018"
  186. "060A2A7000020022652D0201060A2A70"
  187. "00020022652D0301034100F64CDDFFE4"
  188. "D546EF484471583FAEBA9A38061084E2"
  189. "80BF996F90BA6AF0DB6620F59ABAA7AD"
  190. "29D4E7D1CA0C21DD9E32D485F9E74084"
  191. "1F4317CA9481503D1F1B50A06F301F06"
  192. "092A864886F70D01090731120C102F49"
  193. "4E464F3A65726970323334313233304C"
  194. "06092A864886F70D01090E313F303D30"
  195. "170603551D200410300E300C060A2A70"
  196. "00020022654E023D30220603551D1104"
  197. "1B30198117726F626572742E736D6974"
  198. "68406578616D706C652E756B300D0609"
  199. "2A7000020022652D0C050003310082B4"
  200. "F9F934E3FD457F5DF06AE63A88E722E3"
  201. "5D35F565551535BA94CEF9243011999D"
  202. "F2159E4F4BAC22AD8C3135A3BD26");
  203. // разобрать запрос
  204. if (bpkiCSRUnwrap(0, 0, csr, sizeof(csr)) != ERR_OK ||
  205. bpkiCSRUnwrap(0, &pubkey_len, csr, sizeof(csr)) != ERR_OK ||
  206. bpkiCSRUnwrap(pubkey, 0, csr, sizeof(csr)) != ERR_OK ||
  207. bpkiCSRUnwrap(pubkey, &pubkey_len, csr, sizeof(csr)) != ERR_OK ||
  208. pubkey_len != 64)
  209. return FALSE;
  210. // загрузить личный ключ (тест bign:Г.1)
  211. hexTo(privkey,
  212. "1F66B5B84B7339674533F0329C74F218"
  213. "34281FED0732429E0C79235FC273E269");
  214. // перевыпустить запрос
  215. if (bpkiCSRRewrap(csr, sizeof(csr), privkey, 32) != ERR_OK)
  216. return FALSE;
  217. // повторно разобрать запрос
  218. if (bpkiCSRUnwrap(pubkey, 0, csr, sizeof(csr)) != ERR_OK ||
  219. !hexEq(pubkey,
  220. "BD1A5650179D79E03FCEE49D4C2BD5DD"
  221. "F54CE46D0CF11E4FF87BF7A890857FD0"
  222. "7AC6A60361E8C8173491686D461B2826"
  223. "190C2EDA5909054A9AB84D2AB9D99A90"))
  224. return FALSE;
  225. // все нормально
  226. return TRUE;
  227. }
  228. /*
  229. *******************************************************************************
  230. Общий тест
  231. *******************************************************************************
  232. */
  233. bool_t bpkiTest()
  234. {
  235. return bpkiContTest() && bpkiCSRTest();
  236. }