x509_exttest.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  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 <string.h>
  11. #include <stdlib.h>
  12. #include <gmssl/oid.h>
  13. #include <gmssl/x509_alg.h>
  14. #include <gmssl/x509_ext.h>
  15. #include <gmssl/x509.h>
  16. #include <gmssl/rand.h>
  17. #include <gmssl/error.h>
  18. #define cnt(nodes) (sizeof(nodes)/sizeof(int))
  19. static int test_x509_other_name(void)
  20. {
  21. const uint32_t oid[] = { 1,3,5 };
  22. const uint8_t value[] = { 0x30,0x01,0x00 };
  23. uint8_t buf[256];
  24. uint8_t *p = buf;
  25. const uint8_t *cp = buf;
  26. size_t len = 0;
  27. const uint8_t *d;
  28. size_t dlen;
  29. uint32_t nodes[32];
  30. size_t nodes_cnt;
  31. const uint8_t *val;
  32. size_t vlen;
  33. if (x509_other_name_to_der(oid, sizeof(oid)/sizeof(int), value, sizeof(value), &p, &len) != 1
  34. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  35. || asn1_length_is_zero(len) != 1) {
  36. error_print();
  37. return -1;
  38. }
  39. x509_other_name_print(stderr, 0, 0, "OtherName", d, dlen);
  40. p = buf;
  41. cp = buf;
  42. len = 0;
  43. if (x509_other_name_to_der(oid, sizeof(oid)/sizeof(int), value, sizeof(value), &p, &len) != 1
  44. || x509_other_name_from_der(nodes, &nodes_cnt, &val, &vlen, &cp, &len) != 1
  45. || asn1_length_is_zero(len) != 1) {
  46. error_print();
  47. return -1;
  48. }
  49. asn1_object_identifier_print(stderr, 0, 4, "type-id", NULL, nodes, nodes_cnt);
  50. format_bytes(stderr, 0, 4, "value", val, vlen);
  51. printf("%s() ok\n", __FUNCTION__);
  52. return 1;
  53. }
  54. static int test_x509_edi_party_name(void)
  55. {
  56. uint8_t buf[256];
  57. uint8_t *p = buf;
  58. const uint8_t *cp = buf;
  59. size_t len = 0;
  60. const uint8_t *d;
  61. size_t dlen;
  62. int assigner_tag;
  63. const uint8_t *assigner;
  64. size_t assigner_len;
  65. int party_name_tag;
  66. const uint8_t *party_name;
  67. size_t party_name_len;
  68. if (x509_edi_party_name_to_der(
  69. ASN1_TAG_PrintableString, (uint8_t *)"Hello", 5,
  70. ASN1_TAG_PrintableString, (uint8_t *)"World", 5,
  71. &p, &len) != 1
  72. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  73. || asn1_length_is_zero(len) != 1) {
  74. error_print();
  75. return -1;
  76. }
  77. x509_edi_party_name_print(stderr, 0, 0, "EDIPartyName", d, dlen);
  78. p = buf;
  79. cp = buf;
  80. len = 0;
  81. if (x509_edi_party_name_to_der(
  82. ASN1_TAG_PrintableString, (uint8_t *)"Hello", 5,
  83. ASN1_TAG_PrintableString, (uint8_t *)"World", 5,
  84. &p, &len) != 1
  85. || x509_edi_party_name_from_der(
  86. &assigner_tag, &assigner, &assigner_len,
  87. &party_name_tag, &party_name, &party_name_len,
  88. &cp, &len) != 1
  89. || asn1_length_is_zero(len) != 1) {
  90. error_print();
  91. return -1;
  92. }
  93. x509_directory_name_print(stderr, 0, 4, "nameAssigner", assigner_tag, assigner, assigner_len);
  94. x509_directory_name_print(stderr, 0, 4, "partyName", party_name_tag, party_name, party_name_len);
  95. printf("%s() ok\n", __FUNCTION__);
  96. return 1;
  97. }
  98. static int test_x509_general_name(void)
  99. {
  100. uint8_t buf[256];
  101. uint8_t *p = buf;
  102. const uint8_t *cp = buf;
  103. size_t len = 0;
  104. const uint8_t *d;
  105. size_t dlen;
  106. uint8_t gns[512];
  107. size_t gnslen;
  108. uint32_t other_id[] = { 1,3,5,7 };
  109. uint8_t value[] = { ASN1_TAG_OCTET_STRING, 0x02, 0x05, 0x05 };
  110. uint8_t x400[] = { ASN1_TAG_SEQUENCE, 0x00 };
  111. uint8_t name[512];
  112. size_t namelen;
  113. uint32_t reg_id[] = { 2,4,6,8 };
  114. if (x509_name_set(name, &namelen, sizeof(name),
  115. "CN", "Beijing", "Haidian", "PKU", "CS", "CA") != 1) {
  116. error_print();
  117. return -1;
  118. }
  119. gnslen = 0;
  120. if (0
  121. || x509_general_names_add_other_name(gns, &gnslen, sizeof(gns), other_id, cnt(other_id), value, sizeof(value)) != 1
  122. || x509_general_names_add_rfc822_name(gns, &gnslen, sizeof(gns), "guan@pku.edu.cn") != 1
  123. || x509_general_names_add_dns_name(gns, &gnslen, sizeof(gns), "www.pku.edu.cn") != 1
  124. || x509_general_names_add_x400_address(gns, &gnslen, sizeof(gns), x400, sizeof(x400)) != 1
  125. || x509_general_names_add_directory_name(gns, &gnslen, sizeof(gns), name, namelen) != 1
  126. || x509_general_names_add_edi_party_name(gns, &gnslen, sizeof(gns),
  127. ASN1_TAG_PrintableString, (uint8_t *)"Assigner", strlen("Assigner"),
  128. ASN1_TAG_PrintableString, (uint8_t *)"PartyName", strlen("PartyName")) != 1
  129. || x509_general_names_add_uniform_resource_identifier(gns, &gnslen, sizeof(gns), "http://localhost") != 1
  130. || x509_general_names_add_ip_address(gns, &gnslen, sizeof(gns), "127.0.0.1") != 1
  131. || x509_general_names_add_registered_id(gns, &gnslen, sizeof(gns), reg_id, cnt(reg_id)) != 1
  132. || x509_general_names_to_der(gns, gnslen, &p, &len) != 1
  133. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  134. || asn1_length_is_zero(len) != 1) {
  135. error_print();
  136. return -1;
  137. }
  138. x509_general_names_print(stderr, 0, 0, "GeneralNames", d, dlen);
  139. {
  140. size_t i;
  141. printf("uint8_t general_names[%zu] = {", dlen);
  142. for (i = 0; i < dlen; i++) {
  143. if (i % 16 == 0) {
  144. printf("\n\t");
  145. }
  146. printf("0x%02x,", d[i]);
  147. }
  148. printf("\n};\n");
  149. }
  150. printf("%s() ok\n", __FUNCTION__);
  151. return 1;
  152. }
  153. uint8_t general_names[202] = {
  154. 0x80,0x0b,0x06,0x03,0x2b,0x05,0x07,0xa0,0x04,0x04,0x02,0x05,0x05,0x81,0x0f,0x67,
  155. 0x75,0x61,0x6e,0x40,0x70,0x6b,0x75,0x2e,0x65,0x64,0x75,0x2e,0x63,0x6e,0x82,0x0e,
  156. 0x77,0x77,0x77,0x2e,0x70,0x6b,0x75,0x2e,0x65,0x64,0x75,0x2e,0x63,0x6e,0x83,0x02,
  157. 0x30,0x00,0x84,0x59,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,
  158. 0x4e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x08,0x13,0x07,0x42,0x65,0x69,0x6a,
  159. 0x69,0x6e,0x67,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x48,0x61,
  160. 0x69,0x64,0x69,0x61,0x6e,0x31,0x0c,0x30,0x0a,0x06,0x03,0x55,0x04,0x0a,0x13,0x03,
  161. 0x50,0x4b,0x55,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x0b,0x13,0x02,0x43,0x53,
  162. 0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x03,0x13,0x02,0x43,0x41,0x85,0x19,0xa0,
  163. 0x0a,0x13,0x08,0x41,0x73,0x73,0x69,0x67,0x6e,0x65,0x72,0xa1,0x0b,0x13,0x09,0x50,
  164. 0x61,0x72,0x74,0x79,0x4e,0x61,0x6d,0x65,0x86,0x10,0x68,0x74,0x74,0x70,0x3a,0x2f,
  165. 0x2f,0x6c,0x6f,0x63,0x61,0x6c,0x68,0x6f,0x73,0x74,0x87,0x09,0x31,0x32,0x37,0x2e,
  166. 0x30,0x2e,0x30,0x2e,0x31,0x88,0x03,0x54,0x06,0x08,
  167. };
  168. static int test_x509_authority_key_identifier(void)
  169. {
  170. uint8_t buf[512];
  171. uint8_t *p = buf;
  172. const uint8_t *cp = buf;
  173. size_t len = 0;
  174. const uint8_t *d;
  175. size_t dlen;
  176. uint8_t keyid[32];
  177. uint8_t serial[20];
  178. const uint8_t *keyidp;
  179. size_t keyidlen;
  180. const uint8_t *issuerp;
  181. size_t issuerlen;
  182. const uint8_t *serialp;
  183. size_t seriallen;
  184. sm3_digest((uint8_t *)"abc", 3, keyid);
  185. rand_bytes(serial, sizeof(serial));
  186. if (x509_authority_key_identifier_to_der(
  187. keyid, sizeof(keyid),
  188. general_names, sizeof(general_names),
  189. serial, sizeof(serial),
  190. &p, &len) != 1
  191. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  192. || asn1_length_is_zero(len) != 1) {
  193. error_print();
  194. return -1;
  195. }
  196. x509_authority_key_identifier_print(stderr, 0, 0, "AuthorityKeyIdentifier", d, dlen);
  197. p = buf;
  198. cp = buf;
  199. len = 0;
  200. if (x509_authority_key_identifier_to_der(
  201. keyid, sizeof(keyid),
  202. general_names, sizeof(general_names),
  203. serial, sizeof(serial),
  204. &p, &len) != 1
  205. || x509_authority_key_identifier_from_der(
  206. &keyidp, &keyidlen,
  207. &issuerp, &issuerlen,
  208. &serialp, &seriallen,
  209. &cp, &len) != 1
  210. || asn1_length_is_zero(len) != 1) {
  211. error_print();
  212. return -1;
  213. }
  214. printf("%s() ok\n", __FUNCTION__);
  215. return 1;
  216. }
  217. static int test_x509_key_usage(void)
  218. {
  219. int tests[] = {
  220. 0,
  221. 1,
  222. 2,
  223. X509_KU_NON_REPUDIATION|X509_KU_CRL_SIGN,
  224. 7,
  225. 8,
  226. X509_KU_DIGITAL_SIGNATURE|X509_KU_NON_REPUDIATION|X509_KU_DECIPHER_ONLY,
  227. 0x1ff,
  228. // 0x3ff, // this should return error
  229. };
  230. uint8_t buf[256];
  231. uint8_t *p = buf;
  232. const uint8_t *cp = buf;
  233. size_t len = 0;
  234. int usage;
  235. int i;
  236. for (i = 0; i <= 8; i++) {
  237. format_print(stderr, 0, 4, "%d %s\n", i, x509_key_usage_name(1 << i));
  238. }
  239. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  240. if (x509_key_usage_to_der(tests[i], &p, &len) != 1) {
  241. error_print();
  242. return -1;
  243. }
  244. format_bytes(stderr, 0, 4, "", buf, len);
  245. }
  246. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  247. if (x509_key_usage_from_der(&usage, &cp, &len) != 1
  248. || asn1_check(usage == tests[i]) != 1) {
  249. error_print();
  250. return -1;
  251. }
  252. x509_key_usage_print(stderr, 0, 4, "KeyUsage", usage);
  253. }
  254. (void)asn1_length_is_zero(len);
  255. printf("%s() ok\n", __FUNCTION__);
  256. return 1;
  257. }
  258. static int test_x509_notice_reference(void)
  259. {
  260. uint8_t buf[256];
  261. uint8_t *p = buf;
  262. const uint8_t *cp = buf;
  263. size_t len = 0;
  264. const uint8_t *d;
  265. size_t dlen;
  266. int notice_nums[] = { 1,2,3,4,5 };
  267. int org_tag;
  268. const uint8_t *org;
  269. size_t orglen;
  270. int nums[32];
  271. size_t nums_cnt;
  272. if (x509_notice_reference_to_der(
  273. ASN1_TAG_IA5String, (uint8_t *)"Hello", 5,
  274. notice_nums, sizeof(notice_nums)/sizeof(notice_nums[0]),
  275. &p, &len) != 1
  276. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  277. || asn1_length_is_zero(len) != 1) {
  278. error_print();
  279. return -1;
  280. }
  281. x509_notice_reference_print(stderr, 0, 0, "NoticeReference", d, dlen);
  282. p = buf;
  283. cp = buf;
  284. len = 0;
  285. if (x509_notice_reference_to_der(
  286. ASN1_TAG_IA5String, (uint8_t *)"Hello", 5,
  287. notice_nums, sizeof(notice_nums)/sizeof(notice_nums[0]),
  288. &p, &len) != 1
  289. || x509_notice_reference_from_der(
  290. &org_tag, &org, &orglen,
  291. nums, &nums_cnt, sizeof(nums)/sizeof(nums[0]),
  292. &cp, &len) != 1
  293. || asn1_length_is_zero(len) != 1) {
  294. error_print();
  295. return -1;
  296. }
  297. printf("%s() ok\n", __FUNCTION__);
  298. return 1;
  299. }
  300. static int test_x509_user_notice(void)
  301. {
  302. uint8_t buf[256];
  303. uint8_t *p = buf;
  304. const uint8_t *cp = buf;
  305. size_t len = 0;
  306. const uint8_t *d;
  307. size_t dlen;
  308. int notice_nums[] = { 1,2,3,4,5 };
  309. int org_tag;
  310. const uint8_t *org;
  311. size_t orglen;
  312. int nums[32];
  313. size_t nums_cnt;
  314. int text_tag;
  315. const uint8_t *text;
  316. size_t textlen;
  317. if (x509_user_notice_to_der(
  318. ASN1_TAG_IA5String, (uint8_t *)"Hello", 5,
  319. notice_nums, sizeof(notice_nums)/sizeof(notice_nums[0]),
  320. ASN1_TAG_IA5String, (uint8_t *)"World", 5,
  321. &p, &len) != 1
  322. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  323. || asn1_length_is_zero(len) != 1) {
  324. error_print();
  325. return -1;
  326. }
  327. x509_user_notice_print(stderr, 0, 0, "UserNotice", d, dlen);
  328. p = buf;
  329. cp = buf;
  330. len = 0;
  331. if (x509_user_notice_to_der(
  332. ASN1_TAG_IA5String, (uint8_t *)"Hello", 5,
  333. notice_nums, sizeof(notice_nums)/sizeof(notice_nums[0]),
  334. ASN1_TAG_IA5String, (uint8_t *)"World", 5,
  335. &p, &len) != 1
  336. || x509_user_notice_from_der(
  337. &org_tag, &org, &orglen,
  338. nums, &nums_cnt, sizeof(nums)/sizeof(nums[0]),
  339. &text_tag, &text, &textlen,
  340. &cp, &len) != 1
  341. || asn1_length_is_zero(len) != 1) {
  342. error_print();
  343. return -1;
  344. }
  345. printf("%s() ok\n", __FUNCTION__);
  346. return 1;
  347. }
  348. static int test_x509_policy_qualifier_info(void)
  349. {
  350. uint8_t buf[256];
  351. uint8_t *p = buf;
  352. const uint8_t *cp = buf;
  353. size_t len = 0;
  354. const uint8_t *d;
  355. size_t dlen;
  356. if (x509_policy_qualifier_info_to_der(
  357. OID_qt_cps,
  358. (uint8_t *)"Qualifier", strlen("Qualifier"),
  359. &p, &len) != 1
  360. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  361. || asn1_length_is_zero(len) != 1) {
  362. error_print();
  363. return -1;
  364. }
  365. x509_policy_qualifier_info_print(stderr, 0, 0, "PolicyQualifierInfo", d, dlen);
  366. printf("%s() ok\n", __FUNCTION__);
  367. return 1;
  368. }
  369. static int test_x509_policy_mapping(void)
  370. {
  371. uint8_t buf[256];
  372. uint8_t *p = buf;
  373. const uint8_t *cp = buf;
  374. size_t len = 0;
  375. const uint8_t *d;
  376. size_t dlen;
  377. int issuer_policy_oid;
  378. uint32_t issuer_policy_nodes[32];
  379. size_t issuer_policy_nodes_cnt;
  380. int subject_policy_oid;
  381. uint32_t subject_policy_nodes[32];
  382. size_t subject_policy_nodes_cnt;
  383. if (x509_policy_mapping_to_der(
  384. OID_any_policy, NULL, 0,
  385. OID_any_policy, NULL, 0,
  386. &p, &len) != 1
  387. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  388. || asn1_length_is_zero(len) != 1) {
  389. error_print();
  390. return -1;
  391. }
  392. x509_policy_mapping_print(stderr, 0, 0, "PolicyMapping", d, dlen);
  393. p = buf;
  394. cp = buf;
  395. len = 0;
  396. if (x509_policy_mapping_to_der(
  397. OID_any_policy, NULL, 0,
  398. OID_any_policy, NULL, 0,
  399. &p, &len) != 1
  400. || x509_policy_mapping_from_der(
  401. &issuer_policy_oid, issuer_policy_nodes, &issuer_policy_nodes_cnt,
  402. &subject_policy_oid, subject_policy_nodes, &subject_policy_nodes_cnt,
  403. &cp, &len) != 1
  404. || asn1_length_is_zero(len) != 1) {
  405. error_print();
  406. return -1;
  407. }
  408. printf("%s() ok\n", __FUNCTION__);
  409. return 1;
  410. }
  411. // 这里的一些OID应该在RFC中有,但是我们不实现
  412. static int test_x509_attribute(void)
  413. {
  414. // TODO
  415. return 1;
  416. }
  417. static int test_x509_basic_constraints(void)
  418. {
  419. uint8_t buf[256];
  420. uint8_t *p = buf;
  421. const uint8_t *cp = buf;
  422. size_t len = 0;
  423. const uint8_t *d;
  424. size_t dlen;
  425. int ca;
  426. int path;
  427. if (x509_basic_constraints_to_der(1, 4, &p, &len) != 1
  428. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  429. || asn1_length_is_zero(len) != 1) {
  430. error_print();
  431. return -1;
  432. }
  433. x509_basic_constraints_print(stderr, 0, 0, "BasicConstraints", d, dlen);
  434. cp = p = buf; len = 0;
  435. if (x509_basic_constraints_to_der(-1, 4, &p, &len) != 1
  436. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  437. || asn1_length_is_zero(len) != 1) {
  438. error_print();
  439. return -1;
  440. }
  441. x509_basic_constraints_print(stderr, 0, 0, "BasicConstraints", d, dlen);
  442. cp = p = buf; len = 0;
  443. if (x509_basic_constraints_to_der(-1, -1, &p, &len) != -1
  444. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 0 // empty sequence is not allowed
  445. || asn1_length_is_zero(len) != 1) {
  446. error_print();
  447. return -1;
  448. }
  449. x509_basic_constraints_print(stderr, 0, 0, "BasicConstraints", d, dlen);
  450. cp = p = buf; len = 0;
  451. if (x509_basic_constraints_to_der(1, 4, &p, &len) != 1
  452. || x509_basic_constraints_from_der(&ca, &path, &cp, &len) != 1
  453. || asn1_check(ca == 1) != 1
  454. || asn1_check(path == 4) != 1
  455. || asn1_length_is_zero(len) != 1) {
  456. error_print();
  457. return -1;
  458. }
  459. cp = p = buf; len = 0;
  460. if (x509_basic_constraints_to_der(-1, 4, &p, &len) != 1
  461. || x509_basic_constraints_from_der(&ca, &path, &cp, &len) != 1
  462. || asn1_check(ca == -1) != 1
  463. || asn1_check(path == 4) != 1
  464. || asn1_length_is_zero(len) != 1) {
  465. error_print();
  466. return -1;
  467. }
  468. cp = p = buf; len = 0;
  469. if (x509_basic_constraints_to_der(-1, -1, &p, &len) != -1 // should return error
  470. || x509_basic_constraints_from_der(&ca, &path, &cp, &len) != 0) {
  471. error_print();
  472. return -1;
  473. }
  474. printf("%s() ok\n", __FUNCTION__);
  475. return 1;
  476. }
  477. static int test_x509_general_subtree(void)
  478. {
  479. uint8_t buf[256];
  480. uint8_t *p = buf;
  481. const uint8_t *cp = buf;
  482. size_t len = 0;
  483. const uint8_t *d;
  484. size_t dlen;
  485. uint8_t *dns = (uint8_t *)"www.pku.edu.cn";
  486. size_t dnslen = strlen((char *)dns);
  487. int choice;
  488. const uint8_t *dns_name;
  489. size_t dns_name_len;
  490. int min_dis;
  491. int max_dis;
  492. if (x509_general_subtree_to_der(X509_gn_dns_name, dns, dnslen, 1, 5, &p, &len) != 1
  493. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  494. || asn1_length_is_zero(len) != 1) {
  495. error_print();
  496. return -1;
  497. }
  498. x509_general_subtree_print(stderr, 0, 0, "GeneralSubtree", d, dlen);
  499. cp = p = buf; len = 0;
  500. min_dis = max_dis = 99;
  501. if (x509_general_subtree_to_der(X509_gn_dns_name, dns, dnslen, -1, 5, &p, &len) != 1
  502. || x509_general_subtree_from_der(&choice, &dns_name, &dns_name_len, &min_dis, &max_dis, &cp, &len) != 1
  503. || asn1_check(choice == X509_gn_dns_name) != 1
  504. || asn1_check(dns_name_len == dnslen && memcmp(dns_name, dns, dnslen) == 0) != 1
  505. || asn1_check(min_dis == 0) != 1
  506. || asn1_check(max_dis == 5) != 1
  507. || asn1_length_is_zero(len) != 1) {
  508. error_print();
  509. return -1;
  510. }
  511. cp = p = buf; len = 0;
  512. min_dis = max_dis = 99;
  513. if (x509_general_subtree_to_der(X509_gn_dns_name, dns, dnslen, 1, -1, &p, &len) != 1
  514. || x509_general_subtree_from_der(&choice, &dns_name, &dns_name_len, &min_dis, &max_dis, &cp, &len) != 1
  515. || asn1_check(choice == X509_gn_dns_name) != 1
  516. || asn1_check(dns_name_len == dnslen && memcmp(dns_name, dns, dnslen) == 0) != 1
  517. || asn1_check(min_dis == 1) != 1
  518. || asn1_check(max_dis == -1) != 1
  519. || asn1_length_is_zero(len) != 1) {
  520. error_print();
  521. return -1;
  522. }
  523. printf("%s() ok\n", __FUNCTION__);
  524. return 1;
  525. }
  526. static int test_x509_policy_constraints(void)
  527. {
  528. uint8_t buf[256];
  529. uint8_t *p = buf;
  530. const uint8_t *cp = buf;
  531. size_t len = 0;
  532. const uint8_t *d;
  533. size_t dlen;
  534. int val1;
  535. int val2;
  536. if (x509_policy_constraints_to_der(2, 5, &p, &len) != 1
  537. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  538. || asn1_length_is_zero(len) != 1) {
  539. error_print();
  540. return -1;
  541. }
  542. x509_policy_constraints_print(stderr, 0, 0, "PolicyConstraints", d, dlen);
  543. cp = p = buf; len = 0;
  544. if (x509_policy_constraints_to_der(2, -1, &p, &len) != 1
  545. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  546. || asn1_length_is_zero(len) != 1) {
  547. error_print();
  548. return -1;
  549. }
  550. x509_policy_constraints_print(stderr, 0, 0, "PolicyConstraints", d, dlen);
  551. cp = p = buf; len = 0;
  552. if (x509_policy_constraints_to_der(-1, 5, &p, &len) != 1
  553. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  554. || asn1_length_is_zero(len) != 1) {
  555. error_print();
  556. return -1;
  557. }
  558. x509_policy_constraints_print(stderr, 0, 0, "PolicyConstraints", d, dlen);
  559. cp = p = buf; len = 0;
  560. val1 = val2 = 99;
  561. if (x509_policy_constraints_to_der(2, 5, &p, &len) != 1
  562. || x509_policy_constraints_from_der(&val1, &val2, &cp, &len) != 1
  563. || asn1_check(val1 == 2) != 1
  564. || asn1_check(val2 == 5) != 1
  565. || asn1_length_is_zero(len) != 1) {
  566. error_print();
  567. return -1;
  568. }
  569. cp = p = buf; len = 0;
  570. val1 = val2 = 99;
  571. if (x509_policy_constraints_to_der(-1, -1, &p, &len) != -1
  572. || x509_policy_constraints_from_der(&val1, &val2, &cp, &len) != 0 // empty sequence is not allowed
  573. || asn1_check(val1 == -1) != 1
  574. || asn1_check(val2 == -1) != 1
  575. || asn1_length_is_zero(len) != 1) {
  576. error_print();
  577. return -1;
  578. }
  579. printf("%s() ok\n", __FUNCTION__);
  580. return 1;
  581. }
  582. static int test_x509_ext_key_usage(void)
  583. {
  584. uint8_t buf[256];
  585. uint8_t *p = buf;
  586. const uint8_t *cp = buf;
  587. size_t len = 0;
  588. const uint8_t *d;
  589. size_t dlen;
  590. int kp[] = {
  591. OID_kp_server_auth,
  592. OID_kp_client_auth,
  593. OID_kp_code_signing,
  594. OID_kp_email_protection,
  595. OID_kp_time_stamping,
  596. OID_kp_ocsp_signing,
  597. };
  598. int oids[16] = {0};
  599. size_t oids_cnt;
  600. if (x509_ext_key_usage_to_der(kp, sizeof(kp)/sizeof(int), &p, &len) != 1
  601. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  602. || asn1_length_is_zero(len) != 1) {
  603. error_print();
  604. return -1;
  605. }
  606. x509_ext_key_usage_print(stderr, 0, 0, "ExtKeyUsageSyntax", d, dlen);
  607. if (x509_ext_key_usage_to_der(kp, sizeof(kp)/sizeof(int), &p, &len) != 1
  608. || x509_ext_key_usage_from_der(oids, &oids_cnt, sizeof(oids)/sizeof(oids[0]), &cp, &len) != 1
  609. || asn1_check(oids_cnt == sizeof(kp)/sizeof(int)) != 1
  610. || asn1_check(memcmp(oids, kp, sizeof(kp)) == 0) != 1
  611. || asn1_length_is_zero(len) != 1) {
  612. error_print();
  613. return -1;
  614. }
  615. printf("%s() ok\n", __FUNCTION__);
  616. return 1;
  617. }
  618. static int test_x509_revoke_reasons(void)
  619. {
  620. int tests[] = {
  621. 0,
  622. 1,
  623. 2,
  624. X509_RF_SUPERSEDED|X509_RF_PRIVILEGE_WITHDRAWN|X509_RF_AA_COMPROMISE,
  625. 0x1ff,
  626. };
  627. uint8_t buf[256];
  628. uint8_t *p = buf;
  629. const uint8_t *cp = buf;
  630. size_t len = 0;
  631. int bits;
  632. int i;
  633. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  634. if (x509_revoke_reason_flags_to_der(tests[i], &p, &len) != 1) {
  635. error_print();
  636. return -1;
  637. }
  638. format_bytes(stderr, 0, 4, "", buf, len);
  639. }
  640. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  641. if (x509_revoke_reason_flags_from_der(&bits, &cp, &len) != 1
  642. || asn1_check(bits == tests[i]) != 1) {
  643. error_print();
  644. return -1;
  645. }
  646. x509_revoke_reason_flags_print(stderr, 0, 4, "ReasonFlags", bits);
  647. }
  648. (void)asn1_length_is_zero(len);
  649. printf("%s() ok\n", __FUNCTION__);
  650. return 1;
  651. }
  652. static int test_x509_exts(void)
  653. {
  654. uint8_t buf[1024];
  655. uint8_t *p = buf;
  656. const uint8_t *cp = buf;
  657. size_t len = 0;
  658. const uint8_t *d;
  659. size_t dlen;
  660. uint8_t exts[512];
  661. size_t extslen = 0;
  662. uint8_t keyid[32] = {1};
  663. uint8_t serial[20] = {2};
  664. if (0
  665. || x509_exts_add_authority_key_identifier(exts, &extslen, sizeof(exts), 1,
  666. keyid, sizeof(keyid),
  667. general_names, sizeof(general_names),
  668. serial, sizeof(serial)) != 1
  669. || x509_exts_add_subject_key_identifier(exts, &extslen, sizeof(exts), 0,
  670. keyid, sizeof(keyid)) != 1
  671. || x509_exts_add_key_usage(exts, &extslen, sizeof(exts), 0,
  672. X509_KU_NON_REPUDIATION|X509_KU_CRL_SIGN) != 1
  673. || x509_exts_to_der(exts, extslen, &p, &len) != 1
  674. || x509_exts_from_der(&d, &dlen, &cp, &len) != 1
  675. || asn1_length_is_zero(len) != 1) {
  676. error_print();
  677. return -1;
  678. }
  679. x509_exts_print(stderr, 0, 0, "Extensions", d, dlen);
  680. printf("%s() ok\n", __FUNCTION__);
  681. return 1;
  682. }
  683. static int test_x509_cert_with_exts(void)
  684. {
  685. uint8_t cert[1024];
  686. size_t certlen = 0;
  687. uint8_t *p = cert;
  688. uint8_t serial[20];
  689. uint8_t name[256];
  690. size_t namelen;
  691. time_t not_before, not_after;
  692. SM2_KEY sm2_key;
  693. uint8_t uniq_id[32];
  694. uint8_t exts[512];
  695. size_t extslen = 0;
  696. uint8_t keyid[32] = {1};
  697. rand_bytes(serial, sizeof(serial));
  698. x509_name_set(name, &namelen, sizeof(name), "CN", "Beijing", "Haidian", "PKU", "CS", "CA");
  699. time(&not_before);
  700. x509_validity_add_days(&not_after, not_before, 365);
  701. sm2_key_generate(&sm2_key);
  702. sm3_digest((uint8_t *)&(sm2_key.public_key), sizeof(SM2_POINT), uniq_id);
  703. if (x509_exts_add_authority_key_identifier(exts, &extslen, sizeof(exts), 1,
  704. keyid, sizeof(keyid),
  705. general_names, sizeof(general_names),
  706. serial, sizeof(serial)) != 1
  707. || x509_exts_add_subject_key_identifier(exts, &extslen, sizeof(exts), 0,
  708. keyid, sizeof(keyid)) != 1
  709. || x509_exts_add_key_usage(exts, &extslen, sizeof(exts), 0,
  710. X509_KU_NON_REPUDIATION|X509_KU_CRL_SIGN) != 1) {
  711. error_print();
  712. return -1;
  713. }
  714. if (x509_cert_sign_to_der(
  715. X509_version_v3,
  716. serial, sizeof(serial),
  717. OID_sm2sign_with_sm3,
  718. name, namelen,
  719. not_before, not_after,
  720. name, namelen,
  721. &sm2_key,
  722. uniq_id, sizeof(uniq_id),
  723. uniq_id, sizeof(uniq_id),
  724. exts, extslen,
  725. &sm2_key,
  726. SM2_DEFAULT_ID, strlen(SM2_DEFAULT_ID),
  727. &p, &certlen) != 1) {
  728. error_print();
  729. return -1;
  730. }
  731. if (certlen > sizeof(cert)) {
  732. error_print();
  733. return -1;
  734. }
  735. x509_cert_print(stderr, 0, 0, "Certificate", cert, certlen);
  736. return 1;
  737. }
  738. static int test_x509_distribution_point_name(void)
  739. {
  740. uint8_t buf[512];
  741. uint8_t *p = buf;
  742. const uint8_t *cp = buf;
  743. size_t len = 0;
  744. x509_general_name_to_der(X509_gn_uniform_resource_identifier, (uint8_t *)"http://", 7, &p, &len);
  745. // x509_uri_as_general_names_to_der_ex(0x80, "http://", 7, &p, &len);
  746. format_bytes(stderr, 0, 0, "GeneralNames", buf, len);
  747. return 1;
  748. }
  749. int main(int argc, char **argv)
  750. {
  751. if (test_x509_other_name() != 1) goto err;
  752. if (test_x509_edi_party_name() != 1) goto err;
  753. if (test_x509_general_name() != 1) goto err;
  754. if (test_x509_authority_key_identifier() != 1) goto err;
  755. if (test_x509_key_usage() != 1) goto err;
  756. if (test_x509_notice_reference() != 1) goto err;
  757. if (test_x509_user_notice() != 1) goto err;
  758. if (test_x509_policy_qualifier_info() != 1) goto err;
  759. if (test_x509_policy_mapping() != 1) goto err;
  760. if (test_x509_basic_constraints() != 1) goto err;
  761. if (test_x509_general_subtree() != 1) goto err;
  762. if (test_x509_policy_constraints() != 1) goto err;
  763. if (test_x509_ext_key_usage() != 1) goto err;
  764. if (test_x509_revoke_reasons() != 1) goto err;
  765. if (test_x509_exts() != 1) goto err;
  766. if (test_x509_cert_with_exts() != 1) goto err;
  767. if (test_x509_distribution_point_name() != 1) goto err;
  768. printf("%s all tests passed!\n", __FILE__);
  769. return 0;
  770. err:
  771. error_print();
  772. return 1;
  773. }