x509_crltest.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  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_crl.h>
  15. #include <gmssl/x509_ext.h>
  16. #include <gmssl/x509.h>
  17. #include <gmssl/rand.h>
  18. #include <gmssl/error.h>
  19. static int test_x509_crl_reason(void)
  20. {
  21. uint8_t buf[256];
  22. uint8_t *p = buf;
  23. const uint8_t *cp = buf;
  24. size_t len = 0;
  25. int reason;
  26. int i;
  27. for (i = 0; i < 11; i++) {
  28. if (x509_crl_reason_to_der(i, &p, &len) != 1) {
  29. error_print();
  30. return -1;
  31. }
  32. format_bytes(stderr, 0, 4, "", buf, len);
  33. }
  34. for (i = 0; i < 11; i++) {
  35. if (x509_crl_reason_from_der(&reason, &cp, &len) != 1
  36. || asn1_check(reason == i) != 1) {
  37. error_print();
  38. return -1;
  39. }
  40. format_print(stderr, 0, 4, "%s (%d)\n", x509_crl_reason_name(reason), reason);
  41. }
  42. (void)asn1_length_is_zero(len);
  43. printf("%s() ok\n", __FUNCTION__);
  44. return 1;
  45. }
  46. static int test_x509_crl_entry_ext(void)
  47. {
  48. int exts[] = {
  49. OID_ce_crl_reasons,
  50. OID_ce_invalidity_date,
  51. OID_ce_certificate_issuer,
  52. };
  53. uint8_t buf[256];
  54. uint8_t *p = buf;
  55. const uint8_t *cp = buf;
  56. size_t len = 0;
  57. int oid;
  58. int i;
  59. for (i = 0; i < sizeof(exts)/sizeof(exts[0]); i++) {
  60. if (x509_crl_entry_ext_id_to_der(exts[i], &p, &len) != 1) {
  61. error_print();
  62. return -1;
  63. }
  64. format_bytes(stderr, 0, 4, "", buf, len);
  65. }
  66. for (i = 0; i < sizeof(exts)/sizeof(exts[0]); i++) {
  67. if (x509_crl_entry_ext_id_from_der(&oid, &cp, &len) != 1
  68. || asn1_check(oid == exts[i]) != 1) {
  69. error_print();
  70. return -1;
  71. }
  72. format_print(stderr, 0, 4, "%s\n", x509_crl_entry_ext_id_name(oid));
  73. }
  74. (void)asn1_length_is_zero(len);
  75. printf("%s() ok\n", __FUNCTION__);
  76. return 1;
  77. }
  78. static int test_vector_gen_uri_as_general_names(void)
  79. {
  80. const char *uri = "http://www.example.com/path";
  81. uint8_t buf[256];
  82. uint8_t *p;
  83. const uint8_t *cp;
  84. size_t len;
  85. const uint8_t *d;
  86. size_t dlen;
  87. size_t i;
  88. cp = p = buf; len = 0;
  89. if (x509_uri_as_general_names_to_der(uri, strlen(uri), &p, &len) != 1
  90. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  91. || asn1_length_is_zero(len) != 1) {
  92. error_print();
  93. return -1;
  94. }
  95. printf("// generated by %s()\n", __FUNCTION__);
  96. printf("const uint8_t cert_issuer[] = {\n\t");
  97. for (i = 0; i < dlen; i++) {
  98. printf("0x%02x,", d[i]);
  99. if ((i + 1) % 8 == 0) printf("\n\t");
  100. }
  101. printf("\n};\n");
  102. return 1;
  103. }
  104. static int test_x509_crl_entry_exts(void)
  105. {
  106. // generated by test_vector_gen_uri_as_general_names()
  107. const uint8_t cert_issuer[] = {
  108. 0x86,0x1b,0x68,0x74,0x74,0x70,0x3a,0x2f,
  109. 0x2f,0x77,0x77,0x77,0x2e,0x65,0x78,0x61,
  110. 0x6d,0x70,0x6c,0x65,0x2e,0x63,0x6f,0x6d,
  111. 0x2f,0x70,0x61,0x74,0x68,
  112. };
  113. struct {
  114. int reason;
  115. time_t invalid_date;
  116. const uint8_t *cert_issuer;
  117. size_t cert_issuer_len;
  118. } tests[] = {
  119. { X509_cr_key_compromise, -1, NULL, 0 },
  120. { -1, time(NULL), NULL, 0 },
  121. { -1, -1, cert_issuer, sizeof(cert_issuer) },
  122. { X509_cr_key_compromise, time(NULL), NULL, 0 },
  123. { X509_cr_key_compromise, time(NULL), cert_issuer, sizeof(cert_issuer) },
  124. };
  125. uint8_t buf[1024];
  126. uint8_t *p;
  127. const uint8_t *cp;
  128. size_t len;
  129. size_t i;
  130. int reason;
  131. time_t invalid_date;
  132. const uint8_t *issuer;
  133. size_t issuer_len;
  134. cp = p = buf; len = 0;
  135. if (x509_crl_entry_exts_to_der(-1, -1, NULL, 0, &p, &len) != 0) {
  136. error_print();
  137. return -1;
  138. }
  139. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  140. if (x509_crl_entry_exts_to_der(
  141. tests[i].reason,
  142. tests[i].invalid_date,
  143. tests[i].cert_issuer,
  144. tests[i].cert_issuer_len, &p, &len) != 1) {
  145. error_print();
  146. return -1;
  147. }
  148. //printf("%s %d: test %zu passed\n", __FILE__, __LINE__, i);
  149. if (len > sizeof(buf)) {
  150. error_print();
  151. return -1;
  152. }
  153. }
  154. {
  155. size_t left = len;
  156. const uint8_t *d;
  157. size_t dlen;
  158. cp = buf;
  159. while (left) {
  160. if (asn1_sequence_from_der(&d, &dlen, &cp, &left) != 1) {
  161. error_print();
  162. return -1;
  163. }
  164. x509_crl_entry_exts_print(stderr, 0, 0, "CRLEntryExtensions", d, dlen);
  165. if (x509_crl_entry_exts_check(d, dlen) != 1) {
  166. error_print();
  167. return -1;
  168. }
  169. }
  170. }
  171. cp = p = buf;
  172. for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
  173. if (x509_crl_entry_exts_from_der(&reason, &invalid_date, &issuer, &issuer_len, &cp, &len) != 1) {
  174. error_print();
  175. return -1;
  176. }
  177. if (reason != tests[i].reason) {
  178. error_print();
  179. return -1;
  180. }
  181. if (invalid_date != tests[i].invalid_date) {
  182. error_print();
  183. return -1;
  184. }
  185. if (issuer_len != tests[i].cert_issuer_len || memcmp(issuer, tests[i].cert_issuer, issuer_len) != 0) {
  186. error_print();
  187. return -1;
  188. }
  189. //printf("%s %d: test %zu passed\n", __FILE__, __LINE__, i);
  190. }
  191. if (len != 0) {
  192. error_print();
  193. return -1;
  194. }
  195. printf("%s() ok\n", __FUNCTION__);
  196. return 1;
  197. }
  198. static int test_x509_revoked_cert(void)
  199. {
  200. uint8_t serial_buf[16] = { 0x01,0x02,0x00 };
  201. time_t revoke_date = time(NULL);
  202. int reason = X509_cr_key_compromise;
  203. time_t invalid_date = revoke_date;
  204. // generated by test_vector_gen_uri_as_general_names()
  205. const uint8_t cert_issuer_buf[] = {
  206. 0x86,0x1b,0x68,0x74,0x74,0x70,0x3a,0x2f,
  207. 0x2f,0x77,0x77,0x77,0x2e,0x65,0x78,0x61,
  208. 0x6d,0x70,0x6c,0x65,0x2e,0x63,0x6f,0x6d,
  209. 0x2f,0x70,0x61,0x74,0x68,
  210. };
  211. const uint8_t *serial;
  212. size_t serial_len;
  213. const uint8_t *cert_issuer;
  214. size_t cert_issuer_len;
  215. uint8_t buf[512];
  216. uint8_t *p;
  217. const uint8_t *cp;
  218. size_t len = 0;
  219. const uint8_t *d;
  220. size_t dlen;
  221. cp = p = buf; len = 0;
  222. if (x509_revoked_cert_to_der_ex(serial_buf, sizeof(serial_buf), revoke_date,
  223. reason, invalid_date, cert_issuer_buf, sizeof(cert_issuer_buf), &p, &len) != 1
  224. || asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  225. || asn1_length_is_zero(len) != 1) {
  226. error_print();
  227. return -1;
  228. }
  229. x509_revoked_cert_print(stderr, 0, 0, "RevokedCertificate", d, dlen);
  230. cp = p = buf; len = 0;
  231. if (x509_revoked_cert_to_der_ex(serial_buf, sizeof(serial_buf), revoke_date,
  232. reason, invalid_date, cert_issuer_buf, sizeof(cert_issuer_buf), &p, &len) != 1
  233. || x509_revoked_cert_from_der_ex(&serial, &serial_len, &revoke_date,
  234. &reason, &invalid_date, &cert_issuer, &cert_issuer_len, &cp, &len) != 1
  235. || asn1_length_is_zero(len) != 1) {
  236. error_print();
  237. return -1;
  238. }
  239. printf("%s() ok\n", __FUNCTION__);
  240. return 1;
  241. }
  242. static int test_x509_crl_ext_id(void)
  243. {
  244. int crl_ext_oids[] = {
  245. OID_ce_authority_key_identifier,
  246. OID_ce_issuer_alt_name,
  247. OID_ce_crl_number,
  248. OID_ce_delta_crl_indicator,
  249. OID_ce_issuing_distribution_point,
  250. OID_ce_freshest_crl,
  251. OID_pe_authority_info_access,
  252. };
  253. int oid;
  254. uint8_t buf[512];
  255. uint8_t *p;
  256. const uint8_t *cp;
  257. size_t len;
  258. size_t i;
  259. cp = p = buf; len = 0;
  260. for (i = 0; i < sizeof(crl_ext_oids)/sizeof(crl_ext_oids[0]); i++) {
  261. if (x509_crl_ext_id_to_der(crl_ext_oids[i], &p, &len) != 1) {
  262. error_print();
  263. return -1;
  264. }
  265. format_bytes(stderr, 0, 0, "", buf, len);
  266. }
  267. for (i = 0; i < sizeof(crl_ext_oids)/sizeof(crl_ext_oids[0]); i++) {
  268. if (x509_crl_ext_id_from_der(&oid, &cp, &len) != 1) {
  269. error_print();
  270. return -1;
  271. }
  272. printf(" %s\n", x509_crl_ext_id_name(oid));
  273. }
  274. if (len) {
  275. error_print();
  276. return -1;
  277. }
  278. printf("%s() ok\n", __FUNCTION__);
  279. return 1;
  280. }
  281. static int test_x509_issuing_distribution_point(void)
  282. {
  283. char *dist_point_uri = "http://www.example.com/crl.crl";
  284. int reason_flags = X509_RF_KEY_COMPROMISE|X509_RF_CA_COMPROMISE;
  285. uint8_t buf[512];
  286. uint8_t *p = buf;
  287. const uint8_t *cp = buf;
  288. size_t len = 0;
  289. const uint8_t *d;
  290. size_t dlen;
  291. if (x509_issuing_distribution_point_to_der(
  292. dist_point_uri, strlen(dist_point_uri),
  293. ASN1_TRUE,
  294. ASN1_TRUE,
  295. reason_flags,
  296. ASN1_TRUE,
  297. ASN1_TRUE, &p, &len) != 1) {
  298. error_print();
  299. return -1;
  300. }
  301. if (asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
  302. || asn1_length_is_zero(len) != 1) {
  303. error_print();
  304. return -1;
  305. }
  306. x509_issuing_distribution_point_print(stderr, 0, 0, "IssuingDistributionPoint", d, dlen);
  307. printf("%s() ok\n", __FUNCTION__);
  308. return 1;
  309. }
  310. static int test_x509_issuing_distribution_point_from_der(void)
  311. {
  312. char *uri = "http://www.example.com/crl.crl";
  313. int flags = X509_RF_KEY_COMPROMISE|X509_RF_CA_COMPROMISE;
  314. uint8_t buf[512];
  315. uint8_t *p = buf;
  316. const uint8_t *cp = buf;
  317. size_t len = 0;
  318. int dist_point_choice;
  319. const uint8_t *dist_point;
  320. size_t dist_point_len;
  321. int only_contains_user_certs;
  322. int only_contains_ca_certs;
  323. int only_some_reasons;
  324. int indirect_crl;
  325. int only_contains_attr_certs;
  326. if (x509_issuing_distribution_point_to_der(
  327. uri, strlen(uri),
  328. ASN1_TRUE,
  329. ASN1_FALSE,
  330. flags,
  331. -1,
  332. ASN1_FALSE, &p, &len) != 1) {
  333. error_print();
  334. return -1;
  335. }
  336. if (x509_issuing_distribution_point_from_der(
  337. &dist_point_choice, &dist_point, &dist_point_len,
  338. &only_contains_user_certs,
  339. &only_contains_ca_certs,
  340. &only_some_reasons,
  341. &indirect_crl,
  342. &only_contains_attr_certs, &cp, &len) != 1
  343. || asn1_length_is_zero(len) != 1) {
  344. error_print();
  345. return -1;
  346. }
  347. printf("%s() ok\n", __FUNCTION__);
  348. return 1;
  349. }
  350. static int test_x509_crl_exts(void)
  351. {
  352. uint8_t exts[1024];
  353. size_t extslen = 0;
  354. uint8_t key_id[32];
  355. uint8_t issuer[128];
  356. size_t issuer_len = 0;
  357. uint8_t serial[20];
  358. char *http_uri = "http://www.example.com/crl.crl";
  359. char *ldap_uri = "ldap://www.example.com/ldap";
  360. char *ca_issuers_uri = "http://www.example.com/ca.crt";
  361. char *ocsp_uri = "http://www.example.com/ocsp";
  362. char *dist_point_uri = "http://www.example.com/crl.crl";
  363. int reason_flags = X509_RF_KEY_COMPROMISE|X509_RF_CA_COMPROMISE;
  364. if (rand_bytes(key_id, sizeof(key_id)) != 1
  365. || x509_general_names_add_uniform_resource_identifier(issuer, &issuer_len, sizeof(issuer), "http://www.example.com") != 1
  366. || rand_bytes(serial, sizeof(serial)) != 1) {
  367. error_print();
  368. return -1;
  369. }
  370. if (x509_crl_exts_add_authority_key_identifier(exts, &extslen, sizeof(exts),
  371. -1, key_id, sizeof(key_id), issuer, issuer_len, serial, sizeof(serial)) != 1
  372. || x509_crl_exts_add_issuer_alt_name(exts, &extslen, sizeof(exts),
  373. X509_non_critical, issuer, issuer_len) != 1
  374. || x509_crl_exts_add_crl_number(exts, &extslen, sizeof(exts),
  375. X509_non_critical, 112) != 1
  376. || x509_crl_exts_add_delta_crl_indicator(exts, &extslen, sizeof(exts),
  377. X509_critical, 113) != 1
  378. || x509_crl_exts_add_issuing_distribution_point(exts, &extslen, sizeof(exts),
  379. X509_critical, dist_point_uri, strlen(dist_point_uri),
  380. ASN1_FALSE, ASN1_FALSE, reason_flags, ASN1_FALSE, ASN1_FALSE) != 1
  381. || x509_crl_exts_add_freshest_crl(exts, &extslen, sizeof(exts),
  382. X509_non_critical, http_uri, strlen(http_uri), ldap_uri, strlen(ldap_uri)) != 1
  383. || x509_crl_exts_add_authority_info_acess(exts, &extslen, sizeof(exts),
  384. X509_non_critical, ca_issuers_uri, strlen(ca_issuers_uri), ocsp_uri, strlen(ocsp_uri)) != 1
  385. ) {
  386. error_print();
  387. return -1;
  388. }
  389. x509_crl_exts_print(stderr, 0, 0, "CRLExtensions", exts, extslen);
  390. return 1;
  391. }
  392. static int test_x509_cert_revoke(void)
  393. {
  394. printf("%s() ok\n", __FUNCTION__);
  395. return 1;
  396. }
  397. /*
  398. http://mscrl.microsoft.com/pki/mscorp/crl/Microsoft%20RSA%20TLS%20CA%2002.crl
  399. http://crl.microsoft.com/pki/mscorp/crl/Microsoft%20RSA%20TLS%20CA%2002.crl
  400. http://crl3.digicert.com/Omniroot2025.crl
  401. */
  402. int main(void)
  403. {
  404. if (test_x509_crl_reason() != 1) goto err;
  405. if (test_x509_crl_entry_ext() != 1) goto err;
  406. if (test_x509_crl_entry_exts() != 1) goto err;
  407. if (test_x509_revoked_cert() != 1) goto err;
  408. if (test_vector_gen_uri_as_general_names() != 1) goto err;
  409. if (test_x509_crl_ext_id() != 1) goto err;
  410. if (test_x509_issuing_distribution_point() != 1) goto err;
  411. if (test_x509_issuing_distribution_point_from_der() != 1) goto err;
  412. if (test_x509_crl_exts() != 1) goto err;
  413. printf("%s all tests passed\n", __FILE__);
  414. return 0;
  415. err:
  416. error_print();
  417. return 1;
  418. }