asn1test.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. /*
  2. * Copyright 2014-2023 The GmSSL Project. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the License); you may
  5. * not use this file except in compliance with the License.
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <limits.h>
  13. #include <assert.h>
  14. #include <gmssl/asn1.h>
  15. #include <gmssl/error.h>
  16. static void print_buf(const uint8_t *a, size_t len)
  17. {
  18. size_t i;
  19. for (i = 0; i < len; i++) {
  20. printf("%02x ", a[i]);
  21. }
  22. printf("\n");
  23. }
  24. static void print_integer(const uint8_t *a, size_t alen)
  25. {
  26. size_t i;
  27. printf("integer = ");
  28. for (i = 0; i < alen; i++) {
  29. printf("%02x", a[i]);
  30. }
  31. printf("\n");
  32. }
  33. static void print_bits(const uint8_t *bits, size_t nbits)
  34. {
  35. size_t i;
  36. printf("bits (%zu) = ", nbits);
  37. for (i = 0; i < (nbits + 7)/8; i++) {
  38. printf("%02x", bits[i]);
  39. }
  40. printf("\n");
  41. }
  42. static void print_octets(const uint8_t *o, size_t olen)
  43. {
  44. size_t i;
  45. printf("octets (%zu) = ", olen);
  46. for (i = 0; i < olen; i++) {
  47. printf("%02x", o[i]);
  48. }
  49. printf("\n");
  50. }
  51. static int test_asn1_tag(void)
  52. {
  53. int i;
  54. format_print(stderr, 0, 0, "Tags:\n");
  55. for (i = 1; i <= 13; i++) {
  56. format_print(stderr, 0, 4, "%s (0x%02x)\n", asn1_tag_name(i), i);
  57. }
  58. for (i = 18; i <= 30; i++) {
  59. format_print(stderr, 0, 4, "%s (0x%02x)\n", asn1_tag_name(i), i);
  60. }
  61. printf("%s() ok\n", __FUNCTION__);
  62. return 1;
  63. }
  64. static int test_asn1_length(void)
  65. {
  66. size_t tests[] = {
  67. 0,
  68. 5,
  69. 127,
  70. 128,
  71. 256,
  72. 344,
  73. 65537,
  74. 1<<23,
  75. INT_MAX, // INT_MAX = 2^31 - 1
  76. //(size_t)1<<31, // default int value of (1<<31) is -2^31, 2^31 is larger than the INT_MAX limit
  77. };
  78. size_t length;
  79. uint8_t buf[256];
  80. uint8_t *p = buf;
  81. const uint8_t *cp = buf;
  82. size_t len = 0;
  83. size_t i;
  84. format_print(stderr, 0, 0, "Length:\n");
  85. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  86. if (asn1_length_to_der(tests[i], &p, &len) != 1) {
  87. error_print();
  88. return -1;
  89. }
  90. format_bytes(stderr, 0, 4, "", buf, len);
  91. }
  92. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  93. int ret;
  94. ret = asn1_length_from_der(&length, &cp, &len);
  95. if (ret != 1 && ret != -2) {
  96. error_print();
  97. return -1;
  98. }
  99. if (length != tests[i]) {
  100. error_print();
  101. return -1;
  102. }
  103. format_print(stderr, 0, 4, "%zd\n", length);
  104. }
  105. if (len != 0) {
  106. error_print();
  107. return -1;
  108. }
  109. printf("%s() ok\n", __FUNCTION__);
  110. return 1;
  111. }
  112. static int test_asn1_boolean(void)
  113. {
  114. int tests[] = {0, 1};
  115. int val;
  116. uint8_t buf[128] = {0};
  117. uint8_t *p = buf;
  118. const uint8_t *cp = buf;
  119. size_t len = 0;
  120. size_t i;
  121. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_BOOLEAN));
  122. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  123. if (asn1_boolean_to_der(tests[i], &p, &len) != 1) {
  124. error_print();
  125. return -1;
  126. }
  127. format_bytes(stderr, 0, 4, "", buf, len);
  128. }
  129. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  130. if (asn1_boolean_from_der(&val, &cp, &len) != 1
  131. || asn1_check(val == tests[i]) != 1) {
  132. error_print();
  133. return -1;
  134. }
  135. format_print(stderr, 0, 4, "%s\n", val ? "true" : "false");
  136. }
  137. if (len != 0) {
  138. error_print();
  139. return -1;
  140. }
  141. printf("%s() ok\n", __FUNCTION__);
  142. return 1;
  143. }
  144. static int test_asn1_int(void)
  145. {
  146. int tests[] = {
  147. 0,
  148. 1,
  149. 127,
  150. 128,
  151. 65535,
  152. 65537,
  153. 1<<23,
  154. 1<<30,
  155. };
  156. int val;
  157. uint8_t buf[256] = {0};
  158. uint8_t *p = buf;
  159. const uint8_t *cp = buf;
  160. size_t len = 0;
  161. size_t i;
  162. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_INTEGER));
  163. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  164. if (asn1_int_to_der(tests[i], &p, &len) != 1) {
  165. error_print();
  166. return -1;
  167. }
  168. format_bytes(stderr, 0, 4, "", buf, len);
  169. }
  170. // 测试 -1 表示默认不编码
  171. if (asn1_int_to_der(-1, &p, &len) != 0) {
  172. error_print();
  173. return -1;
  174. }
  175. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  176. if (asn1_int_from_der(&val, &cp, &len) != 1
  177. || asn1_check(val == tests[i]) != 1) {
  178. error_print();
  179. return -1;
  180. }
  181. format_print(stderr, 0, 4, "%d\n", val);
  182. }
  183. if (len != 0) {
  184. error_print();
  185. return -1;
  186. }
  187. // 测试返回0时是否对val值做初始化
  188. if (asn1_int_from_der(&val, &cp, &len) != 0) {
  189. error_print();
  190. return -1;
  191. }
  192. if (val != -1) {
  193. error_print();
  194. return -1;
  195. }
  196. printf("%s() ok\n", __FUNCTION__);
  197. return 1;
  198. }
  199. static int test_asn1_bits(void)
  200. {
  201. int tests[] = {
  202. 0x01,
  203. 0x02,
  204. 0x03,
  205. 0x7f,
  206. 0xfe,
  207. 0xff,
  208. 0xffff,
  209. 0xfffff,
  210. };
  211. uint8_t der[] = {
  212. 0x03,0x02,0x07,0x80,
  213. 0x03,0x02,0x06,0x40,
  214. 0x03,0x02,0x06,0xC0,
  215. 0x03,0x02,0x01,0xFE,
  216. 0x03,0x02,0x00,0x7F,
  217. 0x03,0x02,0x00,0xFF,
  218. 0x03,0x03,0x00,0xFF,0xFF,
  219. 0x03,0x04,0x04,0xFF,0xFF,0xF0,
  220. };
  221. int bits;
  222. uint8_t buf[256];
  223. uint8_t *p = buf;
  224. const uint8_t *cp = buf;
  225. size_t len = 0;
  226. size_t i;
  227. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_BIT_STRING));
  228. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  229. if (asn1_bits_to_der(tests[i], &p, &len) != 1) {
  230. error_print();
  231. return -1;
  232. }
  233. format_bytes(stderr, 0, 4, "", buf, len);
  234. }
  235. if (sizeof(der) != len
  236. || memcmp(der, buf, len) != 0) {
  237. error_print();
  238. return -1;
  239. }
  240. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  241. if (asn1_bits_from_der(&bits, &cp, &len) != 1
  242. || asn1_check(bits == tests[i]) != 1) {
  243. error_print();
  244. return -1;
  245. }
  246. format_print(stderr, 0, 4, "%x\n", bits);
  247. }
  248. if (len != 0) {
  249. error_print();
  250. return -1;
  251. }
  252. printf("%s() ok\n", __FUNCTION__);
  253. return 1;
  254. }
  255. static int test_asn1_null(void)
  256. {
  257. uint8_t buf[256] = {0};
  258. uint8_t *p = buf;
  259. const uint8_t *cp = buf;
  260. size_t len = 0;
  261. size_t i;
  262. format_print(stderr, 0, 0, "NULL\n");
  263. for (i = 0; i < 3; i++) {
  264. if (asn1_null_to_der(&p, &len) != 1) {
  265. error_print();
  266. return -1;
  267. }
  268. format_bytes(stderr, 0, 4, "", buf, len);
  269. }
  270. for (i = 0; i < 3; i++) {
  271. if (asn1_null_from_der(&cp, &len) != 1) {
  272. error_print();
  273. return -1;
  274. }
  275. format_print(stderr, 0, 4, "%s\n", asn1_tag_name(ASN1_TAG_NULL));
  276. }
  277. if (asn1_length_is_zero(len) != 1) {
  278. error_print();
  279. return -1;
  280. }
  281. printf("%s() ok\n", __FUNCTION__);
  282. return 1;
  283. }
  284. static int test_asn1_object_identifier(void)
  285. {
  286. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_OBJECT_IDENTIFIER));
  287. // test 1
  288. {
  289. char *name = "sm2";
  290. uint32_t oid[] = { 1,2,156,10197,1,301 };
  291. uint8_t der[] = { 0x06, 0x08, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x82, 0x2D };
  292. uint32_t nodes[32];
  293. size_t nodes_cnt;
  294. uint8_t buf[128];
  295. uint8_t *p = buf;
  296. const uint8_t *cp = buf;
  297. size_t len = 0;
  298. format_print(stderr, 0 ,4, "%s ", name);
  299. if (asn1_object_identifier_to_der(oid, sizeof(oid)/sizeof(int), &p, &len) != 1
  300. || asn1_check(len == sizeof(der)) != 1
  301. || asn1_check(memcmp(buf, der, sizeof(der)) == 0) != 1
  302. || asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, &len) != 1
  303. || asn1_length_is_zero(len) != 1
  304. || asn1_object_identifier_equ(nodes, nodes_cnt, oid, sizeof(oid)/sizeof(int)) != 1) {
  305. fprintf(stderr, "failed\n");
  306. error_print();
  307. return -1;
  308. } else {
  309. printf("ok\n");
  310. }
  311. }
  312. // test 2
  313. {
  314. char *name = "x9.62-ecPublicKey";
  315. uint32_t oid[] = { 1,2,840,10045,2,1 };
  316. uint8_t der[] = { 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01 };
  317. uint8_t buf[128];
  318. uint32_t nodes[32];
  319. size_t nodes_cnt;
  320. uint8_t *p = buf;
  321. const uint8_t *cp = buf;
  322. size_t len = 0;
  323. format_print(stderr, 0 ,4, "%s ", name);
  324. if (asn1_object_identifier_to_der(oid, sizeof(oid)/sizeof(int), &p, &len) != 1
  325. || asn1_check(len == sizeof(der)) != 1
  326. || asn1_check(memcmp(buf, der, sizeof(der)) == 0) != 1
  327. || asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, &len) != 1
  328. || asn1_length_is_zero(len) != 1
  329. || asn1_object_identifier_equ(nodes, nodes_cnt, oid, sizeof(oid)/sizeof(int)) != 1) {
  330. fprintf(stderr, "failed\n");
  331. error_print();
  332. return -1;
  333. } else {
  334. printf("ok\n");
  335. }
  336. }
  337. printf("%s() ok\n", __FUNCTION__);
  338. return 1;
  339. }
  340. static int test_asn1_printable_string(void)
  341. {
  342. char *tests[] = {
  343. "hello",
  344. "world",
  345. "Just do it", // string "Just do it!" include invalid '!'
  346. };
  347. uint8_t buf[256];
  348. uint8_t *p = buf;
  349. const uint8_t *cp = buf;
  350. size_t len = 0;
  351. size_t i;
  352. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_PrintableString));
  353. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  354. if (asn1_printable_string_to_der(tests[i], strlen(tests[i]), &p, &len) != 1) {
  355. error_print();
  356. return -1;
  357. }
  358. format_bytes(stderr, 0, 4, "", buf, len);
  359. }
  360. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  361. const char *d;
  362. size_t dlen;
  363. if (asn1_printable_string_from_der(&d, &dlen, &cp, &len) != 1
  364. || strlen(tests[i]) != dlen
  365. || memcmp(tests[i], d, dlen) != 0) {
  366. error_print();
  367. return -1;
  368. }
  369. format_string(stderr, 0, 4, "", (uint8_t *)d, dlen);
  370. }
  371. if (len != 0) {
  372. error_print();
  373. return -1;
  374. }
  375. printf("%s() ok\n", __FUNCTION__);
  376. return 1;
  377. }
  378. static int test_asn1_printable_string_check(void)
  379. {
  380. char *printable_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 '()+,-./:=?";
  381. if (asn1_string_is_printable_string(printable_str, strlen(printable_str)) != 1) {
  382. error_print();
  383. return -1;
  384. }
  385. if (asn1_string_is_printable_string("a*b", 3) == 1) {
  386. error_print();
  387. return -1;
  388. }
  389. printf("%s() ok\n", __FUNCTION__);
  390. return 1;
  391. }
  392. static int test_asn1_printable_string_case_ignore_match(void)
  393. {
  394. if (asn1_printable_string_case_ignore_match("HELLO", 5, "WORLD", 5) == 1) {
  395. error_print();
  396. return -1;
  397. }
  398. if (asn1_printable_string_case_ignore_match("HELLO", 5, "HELLO", 5) != 1) {
  399. error_print();
  400. return -1;
  401. }
  402. if (asn1_printable_string_case_ignore_match("HELLO", 5, "hello", 5) != 1) {
  403. error_print();
  404. return -1;
  405. }
  406. if (asn1_printable_string_case_ignore_match(" HELLO", 7, "hello", 5) != 1) {
  407. error_print();
  408. return -1;
  409. }
  410. if (asn1_printable_string_case_ignore_match(" HELLO", 7, "hello ", 8) != 1) {
  411. error_print();
  412. return -1;
  413. }
  414. if (asn1_printable_string_case_ignore_match(" A2b ", 5, " a2B ", 7) != 1) {
  415. error_print();
  416. return -1;
  417. }
  418. if (asn1_printable_string_case_ignore_match(" ", 5, " ", 7) != 1) {
  419. error_print();
  420. return -1;
  421. }
  422. printf("%s() ok\n", __FUNCTION__);
  423. return 1;
  424. }
  425. static int test_asn1_utf8_string(void)
  426. {
  427. char *tests[] = {
  428. "hello",
  429. "world",
  430. "Just do it!",
  431. };
  432. uint8_t buf[256];
  433. uint8_t *p = buf;
  434. const uint8_t *cp = buf;
  435. size_t len = 0;
  436. size_t i;
  437. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_UTF8String));
  438. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  439. if (asn1_utf8_string_to_der(tests[i], strlen(tests[i]), &p, &len) != 1) {
  440. error_print();
  441. return -1;
  442. }
  443. format_bytes(stderr, 0, 4, "", buf, len);
  444. }
  445. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  446. const char *d;
  447. size_t dlen;
  448. if (asn1_utf8_string_from_der(&d, &dlen, &cp, &len) != 1
  449. || strlen(tests[i]) != dlen
  450. || memcmp(tests[i], d, dlen) != 0) {
  451. error_print();
  452. return -1;
  453. }
  454. format_string(stderr, 0, 4, "", (uint8_t *)d, dlen);
  455. }
  456. if (len != 0) {
  457. error_print();
  458. return -1;
  459. }
  460. printf("%s() ok\n", __FUNCTION__);
  461. return 1;
  462. }
  463. static int test_asn1_ia5_string(void)
  464. {
  465. char *tests[] = {
  466. "hello",
  467. "world",
  468. "Just do it!",
  469. };
  470. uint8_t buf[256];
  471. uint8_t *p = buf;
  472. const uint8_t *cp = buf;
  473. size_t len = 0;
  474. size_t i;
  475. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_IA5String));
  476. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  477. if (asn1_ia5_string_to_der(tests[i], strlen(tests[i]), &p, &len) != 1) {
  478. error_print();
  479. return -1;
  480. }
  481. format_bytes(stderr, 0, 4, "", buf, len);
  482. }
  483. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  484. const char *d;
  485. size_t dlen;
  486. if (asn1_ia5_string_from_der(&d, &dlen, &cp, &len) != 1
  487. || strlen(tests[i]) != dlen
  488. || memcmp(tests[i], d, dlen) != 0) {
  489. error_print();
  490. return -1;
  491. }
  492. format_string(stderr, 0, 4, "", (uint8_t *)d, dlen);
  493. }
  494. if (len != 0) {
  495. error_print();
  496. return -1;
  497. }
  498. printf("%s() ok\n", __FUNCTION__);
  499. return 1;
  500. }
  501. static int test_time(void)
  502. {
  503. time_t tval = 0;
  504. printf("%s", ctime(&tval));
  505. time(&tval);
  506. printf("%s", ctime(&tval));
  507. printf("%08x%08x\n", (uint32_t)(tval >> 32), (uint32_t)tval);
  508. return 1;
  509. }
  510. static int test_asn1_time(void)
  511. {
  512. time_t tests[] = {
  513. 0,
  514. 31*86400,
  515. (31+28)*86400,
  516. };
  517. char *utc_time[] = {
  518. "700101000000Z",
  519. "700201000000Z",
  520. "700301000000Z",
  521. };
  522. char *gen_time[] = {
  523. "19700101000000Z",
  524. "19700201000000Z",
  525. "19700301000000Z",
  526. };
  527. time_t cur = time(NULL);
  528. time_t ts;
  529. char str[16] = {0};
  530. int i;
  531. if (asn1_time_to_str(0, cur, str) != 1
  532. || asn1_time_from_str(0, &ts, str) != 1
  533. || ts != cur) {
  534. error_print();
  535. return -1;
  536. }
  537. if (asn1_time_to_str(1, cur, str) != 1
  538. || asn1_time_from_str(1, &ts, str) != 1
  539. || ts != cur) {
  540. error_print();
  541. return -1;
  542. }
  543. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  544. memset(str, 0, sizeof(str));
  545. if (asn1_time_to_str(1, tests[i], str) != 1
  546. || strcmp(str, utc_time[i]) != 0) {
  547. error_print();
  548. return -1;
  549. }
  550. memset(str, 0, sizeof(str));
  551. if (asn1_time_to_str(0, tests[i], str) != 1
  552. || strcmp(str, gen_time[i]) != 0) {
  553. error_print();
  554. return -1;
  555. }
  556. }
  557. printf("%s() ok\n", __FUNCTION__);
  558. return 1;
  559. }
  560. static int test_asn1_time_limits(void)
  561. {
  562. char *tests[] = {
  563. "20491231235959Z",
  564. "20500101000000Z",
  565. "99991231235959Z",
  566. };
  567. size_t i;
  568. time_t tv[sizeof(tests)/sizeof(tests[0])];
  569. char str[16] = {0};
  570. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  571. if (asn1_time_from_str(0, &tv[i], tests[i]) != 1) {
  572. error_print();
  573. return -1;
  574. }
  575. fprintf(stderr, " %s: %lld\n", tests[i], (long long)tv[i]);
  576. }
  577. if (tv[0] + 1 != tv[1]) {
  578. error_print();
  579. return -1;
  580. }
  581. printf("%s() ok\n", __FUNCTION__);
  582. return 1;
  583. }
  584. static int test_asn1_utc_time(void)
  585. {
  586. time_t tests[] = {
  587. 0,
  588. 0,
  589. 1<<30,
  590. };
  591. time_t tv;
  592. uint8_t buf[256];
  593. uint8_t *p = buf;
  594. const uint8_t *cp = buf;
  595. size_t len = 0;
  596. size_t i;
  597. time(&tests[1]);
  598. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_UTCTime));
  599. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  600. if (asn1_utc_time_to_der(tests[i], &p, &len) != 1) {
  601. error_print();
  602. return -1;
  603. }
  604. format_bytes(stderr, 0, 4, "", buf, len);
  605. }
  606. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  607. if (asn1_utc_time_from_der(&tv, &cp, &len) != 1
  608. || asn1_check(tv == tests[i]) != 1) {
  609. error_print();
  610. return -1;
  611. }
  612. format_print(stderr, 0, 4, "%s", ctime(&tv));
  613. }
  614. if (len != 0) {
  615. error_print();
  616. return -1;
  617. }
  618. printf("%s() ok\n", __FUNCTION__);
  619. return 1;
  620. }
  621. static int test_asn1_generalized_time(void)
  622. {
  623. time_t tests[] = {
  624. 0,
  625. 1<<30,
  626. };
  627. uint8_t buf[256];
  628. uint8_t *p = buf;
  629. const uint8_t *cp = buf;
  630. size_t len = 0;
  631. size_t i;
  632. time(&tests[0]);
  633. format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_GeneralizedTime));
  634. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  635. if (asn1_generalized_time_to_der(tests[i], &p, &len) != 1) {
  636. error_print();
  637. return -1;
  638. }
  639. format_bytes(stderr, 0, 4, "", buf, len);
  640. }
  641. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  642. time_t tv;
  643. if (asn1_generalized_time_from_der(&tv, &cp, &len) != 1
  644. || asn1_check(tv == tests[i]) != 1) {
  645. error_print();
  646. return -1;
  647. }
  648. format_print(stderr, 0, 4, "%s", ctime(&tv));
  649. }
  650. if (len != 0) {
  651. error_print();
  652. return -1;
  653. }
  654. printf("%s() ok\n", __FUNCTION__);
  655. return 1;
  656. }
  657. static int test_asn1_from_der_null_args(void)
  658. {
  659. uint8_t buf[100];
  660. const uint8_t *cp = NULL;
  661. size_t len = 100;
  662. int val;
  663. const char *str;
  664. size_t dlen;
  665. time_t t;
  666. uint32_t nodes[32];
  667. size_t nodes_cnt;
  668. fprintf(stderr, "%s: *inlen = 0\n", __FUNCTION__);
  669. cp = buf;
  670. len = 0;
  671. if (asn1_boolean_from_der(&val, &cp, &len) != 0) { error_print(); return -1; }
  672. if (asn1_int_from_der(&val, &cp, &len) != 0) { error_print(); return -1; }
  673. if (asn1_bits_from_der(&val, &cp, &len) != 0) { error_print(); return -1; }
  674. if (asn1_null_from_der(&cp, &len) != 0) { error_print(); return -1; }
  675. if (asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, &len) != 0) { error_print(); return -1; }
  676. if (asn1_utf8_string_from_der(&str, &dlen, &cp, &len) != 0) { error_print(); return -1; }
  677. if (asn1_printable_string_from_der(&str, &dlen, &cp, &len) != 0) { error_print(); return -1; }
  678. if (asn1_ia5_string_from_der(&str, &dlen, &cp, &len) != 0) { error_print(); return -1; }
  679. if (asn1_utc_time_from_der(&t, &cp, &len) != 0) { error_print(); return -1; }
  680. if (asn1_generalized_time_from_der(&t, &cp, &len) != 0) { error_print(); return -1; }
  681. fprintf(stderr, "%s: result = NULL\n", __FUNCTION__);
  682. cp = NULL;
  683. len = 100;
  684. if (asn1_boolean_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
  685. if (asn1_int_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
  686. if (asn1_bits_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
  687. //if (asn1_null_from_der(&cp, &len) != -1) { error_print(); return -1; }
  688. if (asn1_object_identifier_from_der(NULL, &nodes_cnt, &cp, &len) != -1) { error_print(); return -1; }
  689. if (asn1_utf8_string_from_der(NULL, &dlen, &cp, &len) != -1) { error_print(); return -1; }
  690. if (asn1_printable_string_from_der(NULL, &dlen, &cp, &len) != -1) { error_print(); return -1; }
  691. if (asn1_ia5_string_from_der(NULL, &dlen, &cp, &len) != -1) { error_print(); return -1; }
  692. if (asn1_utc_time_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
  693. if (asn1_generalized_time_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
  694. fprintf(stderr, "%s: *inlen = 0\n", __FUNCTION__);
  695. cp = buf;
  696. len = 0;
  697. if (asn1_boolean_from_der(&val, &cp, &len) != 0) { error_print(); return -1; }
  698. fprintf(stderr, "%s: in = NULL\n", __FUNCTION__);
  699. len = 100;
  700. if (asn1_boolean_from_der(&val, NULL, &len) != -1) { error_print(); return -1; }
  701. if (asn1_int_from_der(&val, NULL, &len) != -1) { error_print(); return -1; }
  702. if (asn1_bits_from_der(&val, NULL, &len) != -1) { error_print(); return -1; }
  703. if (asn1_null_from_der(NULL, &len) != -1) { error_print(); return -1; }
  704. if (asn1_object_identifier_from_der(nodes, &nodes_cnt, NULL, &len) != -1) { error_print(); return -1; }
  705. if (asn1_utf8_string_from_der(&str, &dlen, NULL, &len) != -1) { error_print(); return -1; }
  706. if (asn1_printable_string_from_der(&str, &dlen, NULL, &len) != -1) { error_print(); return -1; }
  707. if (asn1_ia5_string_from_der(&str, &dlen, NULL, &len) != -1) { error_print(); return -1; }
  708. if (asn1_utc_time_from_der(&t, NULL, &len) != -1) { error_print(); return -1; }
  709. if (asn1_generalized_time_from_der(&t, NULL, &len) != -1) { error_print(); return -1; }
  710. fprintf(stderr, "%s: inlen = NULL\n", __FUNCTION__);
  711. cp = buf;
  712. if (asn1_boolean_from_der(&val, &cp, NULL) != -1) { error_print(); return -1; }
  713. if (asn1_int_from_der(&val, &cp, NULL) != -1) { error_print(); return -1; }
  714. if (asn1_bits_from_der(&val, &cp, NULL) != -1) { error_print(); return -1; }
  715. if (asn1_null_from_der(&cp, NULL) != -1) { error_print(); return -1; }
  716. if (asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, NULL) != -1) { error_print(); return -1; }
  717. if (asn1_utf8_string_from_der(&str, &dlen, &cp, NULL) != -1) { error_print(); return -1; }
  718. if (asn1_printable_string_from_der(&str, &dlen, &cp, NULL) != -1) { error_print(); return -1; }
  719. if (asn1_ia5_string_from_der(&str, &dlen, &cp, NULL) != -1) { error_print(); return -1; }
  720. if (asn1_utc_time_from_der(&t, &cp, NULL) != -1) { error_print(); return -1; }
  721. if (asn1_generalized_time_from_der(&t, &cp, NULL) != -1) { error_print(); return -1; }
  722. fprintf(stderr, "%s: *in = NULL\n", __FUNCTION__);
  723. cp = NULL;
  724. len = 100;
  725. if (asn1_boolean_from_der(&val, &cp, &len) != -1) { error_print(); return -1; }
  726. if (asn1_int_from_der(&val, &cp, &len) != -1) { error_print(); return -1; }
  727. if (asn1_bits_from_der(&val, &cp, &len) != -1) { error_print(); return -1; }
  728. if (asn1_null_from_der(&cp, &len) != -1) { error_print(); return -1; }
  729. if (asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, &len) != -1) { error_print(); return -1; }
  730. if (asn1_utf8_string_from_der(&str, &dlen, &cp, &len) != -1) { error_print(); return -1; }
  731. if (asn1_printable_string_from_der(&str, &dlen, &cp, &len) != -1) { error_print(); return -1; }
  732. if (asn1_ia5_string_from_der(&str, &dlen, &cp, &len) != -1) { error_print(); return -1; }
  733. if (asn1_utc_time_from_der(&t, &cp, &len) != -1) { error_print(); return -1; }
  734. if (asn1_generalized_time_from_der(&t, &cp, &len) != -1) { error_print(); return -1; }
  735. printf("%s() ok\n", __FUNCTION__);
  736. return 1;
  737. }
  738. int main(void)
  739. {
  740. if (test_asn1_tag() != 1) goto err;
  741. if (test_asn1_length() != 1) goto err;
  742. if (test_asn1_boolean() != 1) goto err;
  743. if (test_asn1_int() != 1) goto err;
  744. if (test_asn1_bits() != 1) goto err;
  745. if (test_asn1_null() != 1) goto err;
  746. if (test_asn1_object_identifier() != 1) goto err;
  747. if (test_asn1_printable_string() != 1) goto err;
  748. if (test_asn1_printable_string_case_ignore_match() != 1) goto err;
  749. if (test_asn1_utf8_string() != 1) goto err;
  750. if (test_asn1_ia5_string() != 1) goto err;
  751. if (test_asn1_time() != 1) goto err;
  752. if (test_asn1_time_limits() != 1) goto err;
  753. if (test_asn1_utc_time() != 1) goto err;
  754. if (test_asn1_generalized_time() != 1) goto err;
  755. if (test_asn1_from_der_null_args() != 1) goto err;
  756. printf("%s all tests passed\n", __FILE__);
  757. return 0;
  758. err:
  759. error_print();
  760. return -1;
  761. }