asn1parse.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. /*
  2. * Generic ASN.1 parsing
  3. *
  4. * Copyright The Mbed TLS Contributors
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  8. * not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. */
  19. #include "common.h"
  20. #if defined(MBEDTLS_ASN1_PARSE_C)
  21. #include "mbedtls/asn1.h"
  22. #include "mbedtls/platform_util.h"
  23. #include "mbedtls/error.h"
  24. #include <string.h>
  25. #if defined(MBEDTLS_BIGNUM_C)
  26. #include "mbedtls/bignum.h"
  27. #endif
  28. #include "mbedtls/platform.h"
  29. /*
  30. * ASN.1 DER decoding routines
  31. */
  32. int mbedtls_asn1_get_len(unsigned char **p,
  33. const unsigned char *end,
  34. size_t *len)
  35. {
  36. if ((end - *p) < 1) {
  37. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  38. }
  39. if ((**p & 0x80) == 0) {
  40. *len = *(*p)++;
  41. } else {
  42. switch (**p & 0x7F) {
  43. case 1:
  44. if ((end - *p) < 2) {
  45. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  46. }
  47. *len = (*p)[1];
  48. (*p) += 2;
  49. break;
  50. case 2:
  51. if ((end - *p) < 3) {
  52. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  53. }
  54. *len = ((size_t) (*p)[1] << 8) | (*p)[2];
  55. (*p) += 3;
  56. break;
  57. case 3:
  58. if ((end - *p) < 4) {
  59. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  60. }
  61. *len = ((size_t) (*p)[1] << 16) |
  62. ((size_t) (*p)[2] << 8) | (*p)[3];
  63. (*p) += 4;
  64. break;
  65. case 4:
  66. if ((end - *p) < 5) {
  67. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  68. }
  69. *len = ((size_t) (*p)[1] << 24) | ((size_t) (*p)[2] << 16) |
  70. ((size_t) (*p)[3] << 8) | (*p)[4];
  71. (*p) += 5;
  72. break;
  73. default:
  74. return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
  75. }
  76. }
  77. if (*len > (size_t) (end - *p)) {
  78. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  79. }
  80. return 0;
  81. }
  82. int mbedtls_asn1_get_tag(unsigned char **p,
  83. const unsigned char *end,
  84. size_t *len, int tag)
  85. {
  86. if ((end - *p) < 1) {
  87. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  88. }
  89. if (**p != tag) {
  90. return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG;
  91. }
  92. (*p)++;
  93. return mbedtls_asn1_get_len(p, end, len);
  94. }
  95. int mbedtls_asn1_get_bool(unsigned char **p,
  96. const unsigned char *end,
  97. int *val)
  98. {
  99. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  100. size_t len;
  101. if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_BOOLEAN)) != 0) {
  102. return ret;
  103. }
  104. if (len != 1) {
  105. return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
  106. }
  107. *val = (**p != 0) ? 1 : 0;
  108. (*p)++;
  109. return 0;
  110. }
  111. static int asn1_get_tagged_int(unsigned char **p,
  112. const unsigned char *end,
  113. int tag, int *val)
  114. {
  115. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  116. size_t len;
  117. if ((ret = mbedtls_asn1_get_tag(p, end, &len, tag)) != 0) {
  118. return ret;
  119. }
  120. /*
  121. * len==0 is malformed (0 must be represented as 020100 for INTEGER,
  122. * or 0A0100 for ENUMERATED tags
  123. */
  124. if (len == 0) {
  125. return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
  126. }
  127. /* This is a cryptography library. Reject negative integers. */
  128. if ((**p & 0x80) != 0) {
  129. return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
  130. }
  131. /* Skip leading zeros. */
  132. while (len > 0 && **p == 0) {
  133. ++(*p);
  134. --len;
  135. }
  136. /* Reject integers that don't fit in an int. This code assumes that
  137. * the int type has no padding bit. */
  138. if (len > sizeof(int)) {
  139. return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
  140. }
  141. if (len == sizeof(int) && (**p & 0x80) != 0) {
  142. return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
  143. }
  144. *val = 0;
  145. while (len-- > 0) {
  146. *val = (*val << 8) | **p;
  147. (*p)++;
  148. }
  149. return 0;
  150. }
  151. int mbedtls_asn1_get_int(unsigned char **p,
  152. const unsigned char *end,
  153. int *val)
  154. {
  155. return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_INTEGER, val);
  156. }
  157. int mbedtls_asn1_get_enum(unsigned char **p,
  158. const unsigned char *end,
  159. int *val)
  160. {
  161. return asn1_get_tagged_int(p, end, MBEDTLS_ASN1_ENUMERATED, val);
  162. }
  163. #if defined(MBEDTLS_BIGNUM_C)
  164. int mbedtls_asn1_get_mpi(unsigned char **p,
  165. const unsigned char *end,
  166. mbedtls_mpi *X)
  167. {
  168. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  169. size_t len;
  170. if ((ret = mbedtls_asn1_get_tag(p, end, &len, MBEDTLS_ASN1_INTEGER)) != 0) {
  171. return ret;
  172. }
  173. ret = mbedtls_mpi_read_binary(X, *p, len);
  174. *p += len;
  175. return ret;
  176. }
  177. #endif /* MBEDTLS_BIGNUM_C */
  178. int mbedtls_asn1_get_bitstring(unsigned char **p, const unsigned char *end,
  179. mbedtls_asn1_bitstring *bs)
  180. {
  181. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  182. /* Certificate type is a single byte bitstring */
  183. if ((ret = mbedtls_asn1_get_tag(p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
  184. return ret;
  185. }
  186. /* Check length, subtract one for actual bit string length */
  187. if (bs->len < 1) {
  188. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  189. }
  190. bs->len -= 1;
  191. /* Get number of unused bits, ensure unused bits <= 7 */
  192. bs->unused_bits = **p;
  193. if (bs->unused_bits > 7) {
  194. return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
  195. }
  196. (*p)++;
  197. /* Get actual bitstring */
  198. bs->p = *p;
  199. *p += bs->len;
  200. if (*p != end) {
  201. return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
  202. }
  203. return 0;
  204. }
  205. /*
  206. * Traverse an ASN.1 "SEQUENCE OF <tag>"
  207. * and call a callback for each entry found.
  208. */
  209. int mbedtls_asn1_traverse_sequence_of(
  210. unsigned char **p,
  211. const unsigned char *end,
  212. unsigned char tag_must_mask, unsigned char tag_must_val,
  213. unsigned char tag_may_mask, unsigned char tag_may_val,
  214. int (*cb)(void *ctx, int tag,
  215. unsigned char *start, size_t len),
  216. void *ctx)
  217. {
  218. int ret;
  219. size_t len;
  220. /* Get main sequence tag */
  221. if ((ret = mbedtls_asn1_get_tag(p, end, &len,
  222. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
  223. return ret;
  224. }
  225. if (*p + len != end) {
  226. return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
  227. }
  228. while (*p < end) {
  229. unsigned char const tag = *(*p)++;
  230. if ((tag & tag_must_mask) != tag_must_val) {
  231. return MBEDTLS_ERR_ASN1_UNEXPECTED_TAG;
  232. }
  233. if ((ret = mbedtls_asn1_get_len(p, end, &len)) != 0) {
  234. return ret;
  235. }
  236. if ((tag & tag_may_mask) == tag_may_val) {
  237. if (cb != NULL) {
  238. ret = cb(ctx, tag, *p, len);
  239. if (ret != 0) {
  240. return ret;
  241. }
  242. }
  243. }
  244. *p += len;
  245. }
  246. return 0;
  247. }
  248. /*
  249. * Get a bit string without unused bits
  250. */
  251. int mbedtls_asn1_get_bitstring_null(unsigned char **p, const unsigned char *end,
  252. size_t *len)
  253. {
  254. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  255. if ((ret = mbedtls_asn1_get_tag(p, end, len, MBEDTLS_ASN1_BIT_STRING)) != 0) {
  256. return ret;
  257. }
  258. if (*len == 0) {
  259. return MBEDTLS_ERR_ASN1_INVALID_DATA;
  260. }
  261. --(*len);
  262. if (**p != 0) {
  263. return MBEDTLS_ERR_ASN1_INVALID_DATA;
  264. }
  265. ++(*p);
  266. return 0;
  267. }
  268. void mbedtls_asn1_sequence_free(mbedtls_asn1_sequence *seq)
  269. {
  270. while (seq != NULL) {
  271. mbedtls_asn1_sequence *next = seq->next;
  272. mbedtls_platform_zeroize(seq, sizeof(*seq));
  273. mbedtls_free(seq);
  274. seq = next;
  275. }
  276. }
  277. typedef struct {
  278. int tag;
  279. mbedtls_asn1_sequence *cur;
  280. } asn1_get_sequence_of_cb_ctx_t;
  281. static int asn1_get_sequence_of_cb(void *ctx,
  282. int tag,
  283. unsigned char *start,
  284. size_t len)
  285. {
  286. asn1_get_sequence_of_cb_ctx_t *cb_ctx =
  287. (asn1_get_sequence_of_cb_ctx_t *) ctx;
  288. mbedtls_asn1_sequence *cur =
  289. cb_ctx->cur;
  290. if (cur->buf.p != NULL) {
  291. cur->next =
  292. mbedtls_calloc(1, sizeof(mbedtls_asn1_sequence));
  293. if (cur->next == NULL) {
  294. return MBEDTLS_ERR_ASN1_ALLOC_FAILED;
  295. }
  296. cur = cur->next;
  297. }
  298. cur->buf.p = start;
  299. cur->buf.len = len;
  300. cur->buf.tag = tag;
  301. cb_ctx->cur = cur;
  302. return 0;
  303. }
  304. /*
  305. * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
  306. */
  307. int mbedtls_asn1_get_sequence_of(unsigned char **p,
  308. const unsigned char *end,
  309. mbedtls_asn1_sequence *cur,
  310. int tag)
  311. {
  312. asn1_get_sequence_of_cb_ctx_t cb_ctx = { tag, cur };
  313. memset(cur, 0, sizeof(mbedtls_asn1_sequence));
  314. return mbedtls_asn1_traverse_sequence_of(
  315. p, end, 0xFF, tag, 0, 0,
  316. asn1_get_sequence_of_cb, &cb_ctx);
  317. }
  318. int mbedtls_asn1_get_alg(unsigned char **p,
  319. const unsigned char *end,
  320. mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params)
  321. {
  322. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  323. size_t len;
  324. if ((ret = mbedtls_asn1_get_tag(p, end, &len,
  325. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
  326. return ret;
  327. }
  328. if ((end - *p) < 1) {
  329. return MBEDTLS_ERR_ASN1_OUT_OF_DATA;
  330. }
  331. alg->tag = **p;
  332. end = *p + len;
  333. if ((ret = mbedtls_asn1_get_tag(p, end, &alg->len, MBEDTLS_ASN1_OID)) != 0) {
  334. return ret;
  335. }
  336. alg->p = *p;
  337. *p += alg->len;
  338. if (*p == end) {
  339. mbedtls_platform_zeroize(params, sizeof(mbedtls_asn1_buf));
  340. return 0;
  341. }
  342. params->tag = **p;
  343. (*p)++;
  344. if ((ret = mbedtls_asn1_get_len(p, end, &params->len)) != 0) {
  345. return ret;
  346. }
  347. params->p = *p;
  348. *p += params->len;
  349. if (*p != end) {
  350. return MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
  351. }
  352. return 0;
  353. }
  354. int mbedtls_asn1_get_alg_null(unsigned char **p,
  355. const unsigned char *end,
  356. mbedtls_asn1_buf *alg)
  357. {
  358. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  359. mbedtls_asn1_buf params;
  360. memset(&params, 0, sizeof(mbedtls_asn1_buf));
  361. if ((ret = mbedtls_asn1_get_alg(p, end, alg, &params)) != 0) {
  362. return ret;
  363. }
  364. if ((params.tag != MBEDTLS_ASN1_NULL && params.tag != 0) || params.len != 0) {
  365. return MBEDTLS_ERR_ASN1_INVALID_DATA;
  366. }
  367. return 0;
  368. }
  369. void mbedtls_asn1_free_named_data(mbedtls_asn1_named_data *cur)
  370. {
  371. if (cur == NULL) {
  372. return;
  373. }
  374. mbedtls_free(cur->oid.p);
  375. mbedtls_free(cur->val.p);
  376. mbedtls_platform_zeroize(cur, sizeof(mbedtls_asn1_named_data));
  377. }
  378. void mbedtls_asn1_free_named_data_list(mbedtls_asn1_named_data **head)
  379. {
  380. mbedtls_asn1_named_data *cur;
  381. while ((cur = *head) != NULL) {
  382. *head = cur->next;
  383. mbedtls_asn1_free_named_data(cur);
  384. mbedtls_free(cur);
  385. }
  386. }
  387. mbedtls_asn1_named_data *mbedtls_asn1_find_named_data(mbedtls_asn1_named_data *list,
  388. const char *oid, size_t len)
  389. {
  390. while (list != NULL) {
  391. if (list->oid.len == len &&
  392. memcmp(list->oid.p, oid, len) == 0) {
  393. break;
  394. }
  395. list = list->next;
  396. }
  397. return list;
  398. }
  399. #endif /* MBEDTLS_ASN1_PARSE_C */