der_test.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /*
  2. *******************************************************************************
  3. \file der_test.c
  4. \brief Tests for DER encoding rules
  5. \project bee2/test
  6. \created 2021.04.12
  7. \version 2022.10.26
  8. \license This program is released under the GNU General Public License
  9. version 3. See Copyright Notices in bee2/info.h.
  10. *******************************************************************************
  11. */
  12. #include <bee2/core/der.h>
  13. #include <bee2/core/hex.h>
  14. #include <bee2/core/mem.h>
  15. #include <bee2/core/str.h>
  16. #include <bee2/core/util.h>
  17. /*
  18. *******************************************************************************
  19. Тестирование
  20. -# used [Kaliski B. A Layman's Guide to a Subset of ASN.1, BER, and DER]
  21. http://luca.ntop.org/Teaching/Appunti/asn1.html
  22. *******************************************************************************
  23. */
  24. #define derStep(step, count)\
  25. {\
  26. size_t t = (step);\
  27. if (t == SIZE_MAX)\
  28. return FALSE;\
  29. (count) += t;\
  30. }\
  31. #define derStep2(step, ptr, count)\
  32. {\
  33. size_t t = (step);\
  34. if (t == SIZE_MAX)\
  35. return FALSE;\
  36. (ptr) += t, (count) -= t;\
  37. }\
  38. bool_t derTest()
  39. {
  40. octet buf[1024];
  41. size_t count, len;
  42. u32 tag;
  43. union {
  44. size_t size;
  45. octet oct[128];
  46. octet* ptr;
  47. char oid[16];
  48. char str[16];
  49. } val;
  50. // SIZE(0)
  51. count = derSIZEEnc(0, 0);
  52. if (count != 3)
  53. return FALSE;
  54. ASSERT(count <= sizeof(buf));
  55. if (derSIZEEnc(buf, 0) != 3 ||
  56. !hexEq(buf, "020100") ||
  57. derDecTL(&tag, &len, buf, 1024) != 3 || tag != 2 || len != 1 ||
  58. derSIZEDec(&val.size, buf, sizeof(buf)) != 3 ||
  59. val.size != 0)
  60. return FALSE;
  61. // SIZE[APPLICATION 41](0)
  62. count = derTSIZEEnc(0, tag = 0x5F29, 0);
  63. if (count != 4)
  64. return FALSE;
  65. ASSERT(count <= sizeof(buf));
  66. if (derTSIZEEnc(buf, tag, 0) != 4 ||
  67. !hexEq(buf, "5F290100") ||
  68. derTSIZEDec(&val.size, buf, sizeof(buf), tag) != 4 ||
  69. val.size != 0 ||
  70. derTSIZEDec(&val.size, buf, sizeof(buf), tag + 1) != SIZE_MAX)
  71. return FALSE;
  72. // SIZE(127)
  73. count = derSIZEEnc(0, 127);
  74. if (count != 3)
  75. return FALSE;
  76. ASSERT(count <= sizeof(buf));
  77. if (derSIZEEnc(buf, 127) != 3 ||
  78. !hexEq(buf, "02017F") ||
  79. derSIZEDec(&val.size, buf, sizeof(buf)) != 3 ||
  80. val.size != 127)
  81. return FALSE;
  82. // SIZE(128)
  83. count = derSIZEEnc(0, 128);
  84. if (count != 4)
  85. return FALSE;
  86. ASSERT(count <= sizeof(buf));
  87. if (derSIZEEnc(buf, 128) != 4 ||
  88. !hexEq(buf, "02020080") ||
  89. derSIZEDec(&val.size, buf, sizeof(buf)) != 4 ||
  90. val.size != 128)
  91. return FALSE;
  92. // SIZE(256)
  93. count = derSIZEEnc(0, 256);
  94. if (count != 4)
  95. return FALSE;
  96. ASSERT(count <= sizeof(buf));
  97. if (derSIZEEnc(buf, 256) != 4 ||
  98. !hexEq(buf, "02020100") ||
  99. derSIZEDec(&val.size, buf, sizeof(buf)) != 4 ||
  100. val.size != 256)
  101. return FALSE;
  102. // NULL
  103. count = derNULLEnc(0);
  104. if (count != 2)
  105. return FALSE;
  106. ASSERT(count <= sizeof(buf));
  107. if (derNULLEnc(buf) != 2 ||
  108. !hexEq(buf, "0500") ||
  109. derNULLDec(buf, sizeof(buf)) != 2)
  110. return FALSE;
  111. // BIT
  112. hexTo(val.oct, "0123456789ABCDEF");
  113. count = derBITEnc(0, val.oct, 61);
  114. if (count != 11)
  115. return FALSE;
  116. ASSERT(count <= sizeof(buf));
  117. if (derBITEnc(buf, val.oct, 61) != 11 ||
  118. !hexEq(buf, "0309030123456789ABCDE8") ||
  119. derBITDec2(val.oct, buf, sizeof(buf), 61) != 11 ||
  120. !hexEq(val.oct, "0123456789ABCDE8") ||
  121. derBITDec2(val.oct, buf, sizeof(buf), 62) != SIZE_MAX ||
  122. derBITDec2(val.oct, buf, 6, 61) != SIZE_MAX ||
  123. derBITDec(val.oct, &len, buf, sizeof(buf)) != 11 || len != 61 ||
  124. !hexEq(val.oct, "0123456789ABCDE8") ||
  125. derBITEnc(buf, val.oct, 64) != 11 ||
  126. !hexEq(buf, "0309000123456789ABCDE8") ||
  127. derBITDec2(val.oct, buf, sizeof(buf), 64) != 11 ||
  128. !hexEq(val.oct, "0123456789ABCDE8") ||
  129. derBITDec2(val.oct, buf, sizeof(buf), 63) != SIZE_MAX ||
  130. derBITDec2(val.oct, buf, 6, 64) != SIZE_MAX ||
  131. derBITDec(val.oct, &len, buf, sizeof(buf)) != 11 || len != 64)
  132. return FALSE;
  133. // OCT
  134. hexTo(val.oct, "0123456789ABCDEF");
  135. count = derOCTEnc(0, val.oct, 8);
  136. if (count != 10)
  137. return FALSE;
  138. ASSERT(count <= sizeof(buf));
  139. if (derOCTEnc(buf, val.oct, 8) != 10 ||
  140. !hexEq(buf, "04080123456789ABCDEF") ||
  141. derOCTDec3(buf, sizeof(buf), val.oct, 8) != 10 ||
  142. derOCTDec2(val.oct, buf, sizeof(buf), 8) != 10 ||
  143. !hexEq(val.oct, "0123456789ABCDEF") ||
  144. derOCTDec2(0, buf, sizeof(buf), 8) != 10 ||
  145. derOCTDec(val.oct, &len, buf, sizeof(buf)) != 10 || len != 8 ||
  146. !hexEq(val.oct, "0123456789ABCDEF") ||
  147. derOCTDec(0, &len, buf, sizeof(buf)) != 10 || len != 8 ||
  148. derOCTDec(val.oct, 0, buf, sizeof(buf)) != 10 ||
  149. !hexEq(val.oct, "0123456789ABCDEF") ||
  150. derOCTDec(0, 0, buf, sizeof(buf)) != 10)
  151. return FALSE;
  152. // OID
  153. count = derOIDEnc(0, "1.2.840.113549");
  154. if (count != 8)
  155. return FALSE;
  156. ASSERT(count <= sizeof(buf));
  157. if (derOIDEnc(buf, "1.2.840.113549") != 8 ||
  158. !hexEq(buf, "06062A864886F70D") ||
  159. derOIDDec(0, 0, buf, sizeof(buf)) != 8 ||
  160. derOIDDec(val.oid, 0, buf, sizeof(buf)) != 8 ||
  161. !strEq(val.oid, "1.2.840.113549") ||
  162. derOIDDec(val.oid, &len, buf, sizeof(buf)) != 8 || len != 14 ||
  163. !strEq(val.oid, "1.2.840.113549") ||
  164. derOIDDec(0, &len, buf, sizeof(buf)) != 8 || len != 14 ||
  165. !strEq(val.oid, "1.2.840.113549") ||
  166. derOIDDec2(buf, sizeof(buf), val.oid) != 8)
  167. return FALSE;
  168. // PSTR
  169. count = derTPSTREnc(0, 0x42, "BYCA0000");
  170. if (count != 10)
  171. return FALSE;
  172. ASSERT(count <= sizeof(buf));
  173. if (derTPSTREnc(buf, 0x42, "BYCA0000") != 10 ||
  174. !hexEq(buf, "42084259434130303030") ||
  175. derTPSTRDec(0, 0, buf, sizeof(buf), 0x42) != 10 ||
  176. derPSTRDec(0, 0, buf, sizeof(buf)) != SIZE_MAX ||
  177. derTPSTRDec(val.str, 0, buf, sizeof(buf), 0x42) != 10 ||
  178. !strEq(val.str, "BYCA0000") ||
  179. derTPSTRDec(val.str, &len, buf, sizeof(buf), 0x42) != 10 ||
  180. !strEq(val.oid, "BYCA0000") || len != 8 ||
  181. derTPSTRDec(0, &len, buf, sizeof(buf), 0x42) != 10 || len != 8)
  182. return FALSE;
  183. // Seq1 ::= SEQUENCE { nothing NULL }
  184. {
  185. der_anchor_t Seq1[1];
  186. octet* ptr;
  187. // определить длину кода
  188. count = 0;
  189. derStep(derSEQEncStart(Seq1, 0, count), count);
  190. derStep(derNULLEnc(0), count);
  191. derStep(derSEQEncStop(0, count, Seq1), count);
  192. if (count != 4)
  193. return FALSE;
  194. // кодировать
  195. ASSERT(count <= sizeof(buf));
  196. count = 0;
  197. derStep(derSEQEncStart(Seq1, buf, count), count);
  198. derStep(derNULLEnc(buf + count), count);
  199. derStep(derSEQEncStop(buf + count, count, Seq1), count);
  200. if (count != 4 || !hexEq(buf, "30020500"))
  201. return FALSE;
  202. // проверить
  203. if (!derIsValid(buf, count) || !derIsValid2(buf, count, 0x30))
  204. return FALSE;
  205. // декодировать
  206. derStep2(derSEQDecStart(Seq1, ptr = buf, count), ptr, count);
  207. derStep2(derNULLDec(ptr, count), ptr, count);
  208. derStep2(derSEQDecStop(ptr, Seq1), ptr, count);
  209. if (count != 0)
  210. return FALSE;
  211. }
  212. // Seq2 ::= SEQUENCE { octet OCTET STRING(130) }
  213. {
  214. der_anchor_t Seq2[1];
  215. octet* ptr;
  216. // подготовить строку октетов
  217. memSetZero(val.oct, 127);
  218. // кодировать
  219. count = 0;
  220. derStep(derSEQEncStart(Seq2, buf, count), count);
  221. derStep(derOCTEnc(buf + count, val.oct, 127), count);
  222. derStep(derSEQEncStop(buf + count, count, Seq2), count);
  223. if (count != 132 || !hexEq(buf, "308181047F0000"))
  224. return FALSE;
  225. // декодировать
  226. derStep2(derSEQDecStart(Seq2, ptr = buf, count), ptr, count);
  227. derStep2(derOCTDec3(ptr, count, val.oct, 127), ptr, count);
  228. derStep2(derSEQDecStop(ptr, Seq2), ptr, count);
  229. if (count != 0)
  230. return FALSE;
  231. }
  232. // все нормально
  233. return TRUE;
  234. }