x509_csr.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. /*
  2. * X.509 Certificate Signing Request (CSR) parsing
  3. *
  4. * Copyright The Mbed TLS Contributors
  5. * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
  6. */
  7. /*
  8. * The ITU-T X.509 standard defines a certificate format for PKI.
  9. *
  10. * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)
  11. * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)
  12. * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)
  13. *
  14. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
  15. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
  16. */
  17. #include "common.h"
  18. #if defined(MBEDTLS_X509_CSR_PARSE_C)
  19. #include "mbedtls/x509_csr.h"
  20. #include "mbedtls/error.h"
  21. #include "mbedtls/oid.h"
  22. #include "mbedtls/platform_util.h"
  23. #include <string.h>
  24. #if defined(MBEDTLS_PEM_PARSE_C)
  25. #include "mbedtls/pem.h"
  26. #endif
  27. #include "mbedtls/platform.h"
  28. #if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32)
  29. #include <stdio.h>
  30. #endif
  31. /*
  32. * Version ::= INTEGER { v1(0) }
  33. */
  34. static int x509_csr_get_version(unsigned char **p,
  35. const unsigned char *end,
  36. int *ver)
  37. {
  38. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  39. if ((ret = mbedtls_asn1_get_int(p, end, ver)) != 0) {
  40. if (ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) {
  41. *ver = 0;
  42. return 0;
  43. }
  44. return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_VERSION, ret);
  45. }
  46. return 0;
  47. }
  48. /*
  49. * Parse a CSR in DER format
  50. */
  51. int mbedtls_x509_csr_parse_der(mbedtls_x509_csr *csr,
  52. const unsigned char *buf, size_t buflen)
  53. {
  54. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  55. size_t len;
  56. unsigned char *p, *end;
  57. mbedtls_x509_buf sig_params;
  58. memset(&sig_params, 0, sizeof(mbedtls_x509_buf));
  59. /*
  60. * Check for valid input
  61. */
  62. if (csr == NULL || buf == NULL || buflen == 0) {
  63. return MBEDTLS_ERR_X509_BAD_INPUT_DATA;
  64. }
  65. mbedtls_x509_csr_init(csr);
  66. /*
  67. * first copy the raw DER data
  68. */
  69. p = mbedtls_calloc(1, len = buflen);
  70. if (p == NULL) {
  71. return MBEDTLS_ERR_X509_ALLOC_FAILED;
  72. }
  73. memcpy(p, buf, buflen);
  74. csr->raw.p = p;
  75. csr->raw.len = len;
  76. end = p + len;
  77. /*
  78. * CertificationRequest ::= SEQUENCE {
  79. * certificationRequestInfo CertificationRequestInfo,
  80. * signatureAlgorithm AlgorithmIdentifier,
  81. * signature BIT STRING
  82. * }
  83. */
  84. if ((ret = mbedtls_asn1_get_tag(&p, end, &len,
  85. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
  86. mbedtls_x509_csr_free(csr);
  87. return MBEDTLS_ERR_X509_INVALID_FORMAT;
  88. }
  89. if (len != (size_t) (end - p)) {
  90. mbedtls_x509_csr_free(csr);
  91. return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT,
  92. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH);
  93. }
  94. /*
  95. * CertificationRequestInfo ::= SEQUENCE {
  96. */
  97. csr->cri.p = p;
  98. if ((ret = mbedtls_asn1_get_tag(&p, end, &len,
  99. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
  100. mbedtls_x509_csr_free(csr);
  101. return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);
  102. }
  103. end = p + len;
  104. csr->cri.len = end - csr->cri.p;
  105. /*
  106. * Version ::= INTEGER { v1(0) }
  107. */
  108. if ((ret = x509_csr_get_version(&p, end, &csr->version)) != 0) {
  109. mbedtls_x509_csr_free(csr);
  110. return ret;
  111. }
  112. if (csr->version != 0) {
  113. mbedtls_x509_csr_free(csr);
  114. return MBEDTLS_ERR_X509_UNKNOWN_VERSION;
  115. }
  116. csr->version++;
  117. /*
  118. * subject Name
  119. */
  120. csr->subject_raw.p = p;
  121. if ((ret = mbedtls_asn1_get_tag(&p, end, &len,
  122. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
  123. mbedtls_x509_csr_free(csr);
  124. return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);
  125. }
  126. if ((ret = mbedtls_x509_get_name(&p, p + len, &csr->subject)) != 0) {
  127. mbedtls_x509_csr_free(csr);
  128. return ret;
  129. }
  130. csr->subject_raw.len = p - csr->subject_raw.p;
  131. /*
  132. * subjectPKInfo SubjectPublicKeyInfo
  133. */
  134. if ((ret = mbedtls_pk_parse_subpubkey(&p, end, &csr->pk)) != 0) {
  135. mbedtls_x509_csr_free(csr);
  136. return ret;
  137. }
  138. /*
  139. * attributes [0] Attributes
  140. *
  141. * The list of possible attributes is open-ended, though RFC 2985
  142. * (PKCS#9) defines a few in section 5.4. We currently don't support any,
  143. * so we just ignore them. This is a safe thing to do as the worst thing
  144. * that could happen is that we issue a certificate that does not match
  145. * the requester's expectations - this cannot cause a violation of our
  146. * signature policies.
  147. */
  148. if ((ret = mbedtls_asn1_get_tag(&p, end, &len,
  149. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC)) !=
  150. 0) {
  151. mbedtls_x509_csr_free(csr);
  152. return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);
  153. }
  154. p += len;
  155. end = csr->raw.p + csr->raw.len;
  156. /*
  157. * signatureAlgorithm AlgorithmIdentifier,
  158. * signature BIT STRING
  159. */
  160. if ((ret = mbedtls_x509_get_alg(&p, end, &csr->sig_oid, &sig_params)) != 0) {
  161. mbedtls_x509_csr_free(csr);
  162. return ret;
  163. }
  164. if ((ret = mbedtls_x509_get_sig_alg(&csr->sig_oid, &sig_params,
  165. &csr->sig_md, &csr->sig_pk,
  166. &csr->sig_opts)) != 0) {
  167. mbedtls_x509_csr_free(csr);
  168. return MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG;
  169. }
  170. if ((ret = mbedtls_x509_get_sig(&p, end, &csr->sig)) != 0) {
  171. mbedtls_x509_csr_free(csr);
  172. return ret;
  173. }
  174. if (p != end) {
  175. mbedtls_x509_csr_free(csr);
  176. return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT,
  177. MBEDTLS_ERR_ASN1_LENGTH_MISMATCH);
  178. }
  179. return 0;
  180. }
  181. /*
  182. * Parse a CSR, allowing for PEM or raw DER encoding
  183. */
  184. int mbedtls_x509_csr_parse(mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen)
  185. {
  186. #if defined(MBEDTLS_PEM_PARSE_C)
  187. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  188. size_t use_len;
  189. mbedtls_pem_context pem;
  190. #endif
  191. /*
  192. * Check for valid input
  193. */
  194. if (csr == NULL || buf == NULL || buflen == 0) {
  195. return MBEDTLS_ERR_X509_BAD_INPUT_DATA;
  196. }
  197. #if defined(MBEDTLS_PEM_PARSE_C)
  198. /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */
  199. if (buf[buflen - 1] == '\0') {
  200. mbedtls_pem_init(&pem);
  201. ret = mbedtls_pem_read_buffer(&pem,
  202. "-----BEGIN CERTIFICATE REQUEST-----",
  203. "-----END CERTIFICATE REQUEST-----",
  204. buf, NULL, 0, &use_len);
  205. if (ret == MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) {
  206. ret = mbedtls_pem_read_buffer(&pem,
  207. "-----BEGIN NEW CERTIFICATE REQUEST-----",
  208. "-----END NEW CERTIFICATE REQUEST-----",
  209. buf, NULL, 0, &use_len);
  210. }
  211. if (ret == 0) {
  212. /*
  213. * Was PEM encoded, parse the result
  214. */
  215. ret = mbedtls_x509_csr_parse_der(csr, pem.buf, pem.buflen);
  216. }
  217. mbedtls_pem_free(&pem);
  218. if (ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) {
  219. return ret;
  220. }
  221. }
  222. #endif /* MBEDTLS_PEM_PARSE_C */
  223. return mbedtls_x509_csr_parse_der(csr, buf, buflen);
  224. }
  225. #if defined(MBEDTLS_FS_IO)
  226. /*
  227. * Load a CSR into the structure
  228. */
  229. int mbedtls_x509_csr_parse_file(mbedtls_x509_csr *csr, const char *path)
  230. {
  231. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  232. size_t n;
  233. unsigned char *buf;
  234. if ((ret = mbedtls_pk_load_file(path, &buf, &n)) != 0) {
  235. return ret;
  236. }
  237. ret = mbedtls_x509_csr_parse(csr, buf, n);
  238. mbedtls_platform_zeroize(buf, n);
  239. mbedtls_free(buf);
  240. return ret;
  241. }
  242. #endif /* MBEDTLS_FS_IO */
  243. #define BEFORE_COLON 14
  244. #define BC "14"
  245. /*
  246. * Return an informational string about the CSR.
  247. */
  248. int mbedtls_x509_csr_info(char *buf, size_t size, const char *prefix,
  249. const mbedtls_x509_csr *csr)
  250. {
  251. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  252. size_t n;
  253. char *p;
  254. char key_size_str[BEFORE_COLON];
  255. p = buf;
  256. n = size;
  257. ret = mbedtls_snprintf(p, n, "%sCSR version : %d",
  258. prefix, csr->version);
  259. MBEDTLS_X509_SAFE_SNPRINTF;
  260. ret = mbedtls_snprintf(p, n, "\n%ssubject name : ", prefix);
  261. MBEDTLS_X509_SAFE_SNPRINTF;
  262. ret = mbedtls_x509_dn_gets(p, n, &csr->subject);
  263. MBEDTLS_X509_SAFE_SNPRINTF;
  264. ret = mbedtls_snprintf(p, n, "\n%ssigned using : ", prefix);
  265. MBEDTLS_X509_SAFE_SNPRINTF;
  266. ret = mbedtls_x509_sig_alg_gets(p, n, &csr->sig_oid, csr->sig_pk, csr->sig_md,
  267. csr->sig_opts);
  268. MBEDTLS_X509_SAFE_SNPRINTF;
  269. if ((ret = mbedtls_x509_key_size_helper(key_size_str, BEFORE_COLON,
  270. mbedtls_pk_get_name(&csr->pk))) != 0) {
  271. return ret;
  272. }
  273. ret = mbedtls_snprintf(p, n, "\n%s%-" BC "s: %d bits\n", prefix, key_size_str,
  274. (int) mbedtls_pk_get_bitlen(&csr->pk));
  275. MBEDTLS_X509_SAFE_SNPRINTF;
  276. return (int) (size - n);
  277. }
  278. /*
  279. * Initialize a CSR
  280. */
  281. void mbedtls_x509_csr_init(mbedtls_x509_csr *csr)
  282. {
  283. memset(csr, 0, sizeof(mbedtls_x509_csr));
  284. }
  285. /*
  286. * Unallocate all CSR data
  287. */
  288. void mbedtls_x509_csr_free(mbedtls_x509_csr *csr)
  289. {
  290. mbedtls_x509_name *name_cur;
  291. mbedtls_x509_name *name_prv;
  292. if (csr == NULL) {
  293. return;
  294. }
  295. mbedtls_pk_free(&csr->pk);
  296. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  297. mbedtls_free(csr->sig_opts);
  298. #endif
  299. name_cur = csr->subject.next;
  300. while (name_cur != NULL) {
  301. name_prv = name_cur;
  302. name_cur = name_cur->next;
  303. mbedtls_platform_zeroize(name_prv, sizeof(mbedtls_x509_name));
  304. mbedtls_free(name_prv);
  305. }
  306. if (csr->raw.p != NULL) {
  307. mbedtls_platform_zeroize(csr->raw.p, csr->raw.len);
  308. mbedtls_free(csr->raw.p);
  309. }
  310. mbedtls_platform_zeroize(csr, sizeof(mbedtls_x509_csr));
  311. }
  312. #endif /* MBEDTLS_X509_CSR_PARSE_C */