1 /** 2 * \file asn1.h 3 * 4 * \brief Generic ASN.1 parsing 5 */ 6 /* 7 * Copyright The Mbed TLS Contributors 8 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 9 */ 10 #ifndef MBEDTLS_ASN1_H 11 #define MBEDTLS_ASN1_H 12 #include "mbedtls/private_access.h" 13 14 #include "mbedtls/build_info.h" 15 #include "mbedtls/platform_util.h" 16 17 #include <stddef.h> 18 19 #if defined(MBEDTLS_BIGNUM_C) 20 #include "mbedtls/bignum.h" 21 #endif 22 23 /** 24 * \addtogroup asn1_module 25 * \{ 26 */ 27 28 /** 29 * \name ASN1 Error codes 30 * These error codes are combined with other error codes for 31 * higher error granularity. 32 * e.g. X.509 and PKCS #7 error codes 33 * ASN1 is a standard to specify data structures. 34 * \{ 35 */ 36 /** Out of data when parsing an ASN1 data structure. */ 37 #define MBEDTLS_ERR_ASN1_OUT_OF_DATA -0x0060 38 /** ASN1 tag was of an unexpected value. */ 39 #define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -0x0062 40 /** Error when trying to determine the length or invalid length. */ 41 #define MBEDTLS_ERR_ASN1_INVALID_LENGTH -0x0064 42 /** Actual length differs from expected length. */ 43 #define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -0x0066 44 /** Data is invalid. */ 45 #define MBEDTLS_ERR_ASN1_INVALID_DATA -0x0068 46 /** Memory allocation failed */ 47 #define MBEDTLS_ERR_ASN1_ALLOC_FAILED -0x006A 48 /** Buffer too small when writing ASN.1 data structure. */ 49 #define MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -0x006C 50 51 /** \} name ASN1 Error codes */ 52 53 /** 54 * \name DER constants 55 * These constants comply with the DER encoded ASN.1 type tags. 56 * DER encoding uses hexadecimal representation. 57 * An example DER sequence is:\n 58 * - 0x02 -- tag indicating INTEGER 59 * - 0x01 -- length in octets 60 * - 0x05 -- value 61 * Such sequences are typically read into \c ::mbedtls_x509_buf. 62 * \{ 63 */ 64 #define MBEDTLS_ASN1_BOOLEAN 0x01 65 #define MBEDTLS_ASN1_INTEGER 0x02 66 #define MBEDTLS_ASN1_BIT_STRING 0x03 67 #define MBEDTLS_ASN1_OCTET_STRING 0x04 68 #define MBEDTLS_ASN1_NULL 0x05 69 #define MBEDTLS_ASN1_OID 0x06 70 #define MBEDTLS_ASN1_ENUMERATED 0x0A 71 #define MBEDTLS_ASN1_UTF8_STRING 0x0C 72 #define MBEDTLS_ASN1_SEQUENCE 0x10 73 #define MBEDTLS_ASN1_SET 0x11 74 #define MBEDTLS_ASN1_PRINTABLE_STRING 0x13 75 #define MBEDTLS_ASN1_T61_STRING 0x14 76 #define MBEDTLS_ASN1_IA5_STRING 0x16 77 #define MBEDTLS_ASN1_UTC_TIME 0x17 78 #define MBEDTLS_ASN1_GENERALIZED_TIME 0x18 79 #define MBEDTLS_ASN1_UNIVERSAL_STRING 0x1C 80 #define MBEDTLS_ASN1_BMP_STRING 0x1E 81 #define MBEDTLS_ASN1_PRIMITIVE 0x00 82 #define MBEDTLS_ASN1_CONSTRUCTED 0x20 83 #define MBEDTLS_ASN1_CONTEXT_SPECIFIC 0x80 84 85 /* Slightly smaller way to check if tag is a string tag 86 * compared to canonical implementation. */ 87 #define MBEDTLS_ASN1_IS_STRING_TAG(tag) \ 88 ((unsigned int) (tag) < 32u && ( \ 89 ((1u << (tag)) & ((1u << MBEDTLS_ASN1_BMP_STRING) | \ 90 (1u << MBEDTLS_ASN1_UTF8_STRING) | \ 91 (1u << MBEDTLS_ASN1_T61_STRING) | \ 92 (1u << MBEDTLS_ASN1_IA5_STRING) | \ 93 (1u << MBEDTLS_ASN1_UNIVERSAL_STRING) | \ 94 (1u << MBEDTLS_ASN1_PRINTABLE_STRING))) != 0)) 95 96 /* 97 * Bit masks for each of the components of an ASN.1 tag as specified in 98 * ITU X.690 (08/2015), section 8.1 "General rules for encoding", 99 * paragraph 8.1.2.2: 100 * 101 * Bit 8 7 6 5 1 102 * +-------+-----+------------+ 103 * | Class | P/C | Tag number | 104 * +-------+-----+------------+ 105 */ 106 #define MBEDTLS_ASN1_TAG_CLASS_MASK 0xC0 107 #define MBEDTLS_ASN1_TAG_PC_MASK 0x20 108 #define MBEDTLS_ASN1_TAG_VALUE_MASK 0x1F 109 110 /** \} name DER constants */ 111 112 /** Returns the size of the binary string, without the trailing \\0 */ 113 #define MBEDTLS_OID_SIZE(x) (sizeof(x) - 1) 114 115 /** 116 * Compares an mbedtls_asn1_buf structure to a reference OID. 117 * 118 * Only works for 'defined' oid_str values (MBEDTLS_OID_HMAC_SHA1), you cannot use a 119 * 'unsigned char *oid' here! 120 */ 121 #define MBEDTLS_OID_CMP(oid_str, oid_buf) \ 122 ((MBEDTLS_OID_SIZE(oid_str) != (oid_buf)->len) || \ 123 memcmp((oid_str), (oid_buf)->p, (oid_buf)->len) != 0) 124 125 #define MBEDTLS_OID_CMP_RAW(oid_str, oid_buf, oid_buf_len) \ 126 ((MBEDTLS_OID_SIZE(oid_str) != (oid_buf_len)) || \ 127 memcmp((oid_str), (oid_buf), (oid_buf_len)) != 0) 128 129 #ifdef __cplusplus 130 extern "C" { 131 #endif 132 133 /** 134 * \name Functions to parse ASN.1 data structures 135 * \{ 136 */ 137 138 /** 139 * Type-length-value structure that allows for ASN1 using DER. 140 */ 141 typedef struct mbedtls_asn1_buf { 142 int tag; /**< ASN1 type, e.g. MBEDTLS_ASN1_UTF8_STRING. */ 143 size_t len; /**< ASN1 length, in octets. */ 144 unsigned char *p; /**< ASN1 data, e.g. in ASCII. */ 145 } 146 mbedtls_asn1_buf; 147 148 /** 149 * Container for ASN1 bit strings. 150 */ 151 typedef struct mbedtls_asn1_bitstring { 152 size_t len; /**< ASN1 length, in octets. */ 153 unsigned char unused_bits; /**< Number of unused bits at the end of the string */ 154 unsigned char *p; /**< Raw ASN1 data for the bit string */ 155 } 156 mbedtls_asn1_bitstring; 157 158 /** 159 * Container for a sequence of ASN.1 items 160 */ 161 typedef struct mbedtls_asn1_sequence { 162 mbedtls_asn1_buf buf; /**< Buffer containing the given ASN.1 item. */ 163 164 /** The next entry in the sequence. 165 * 166 * The details of memory management for sequences are not documented and 167 * may change in future versions. Set this field to \p NULL when 168 * initializing a structure, and do not modify it except via Mbed TLS 169 * library functions. 170 */ 171 struct mbedtls_asn1_sequence *next; 172 } 173 mbedtls_asn1_sequence; 174 175 /** 176 * Container for a sequence or list of 'named' ASN.1 data items 177 */ 178 typedef struct mbedtls_asn1_named_data { 179 mbedtls_asn1_buf oid; /**< The object identifier. */ 180 mbedtls_asn1_buf val; /**< The named value. */ 181 182 /** The next entry in the sequence. 183 * 184 * The details of memory management for named data sequences are not 185 * documented and may change in future versions. Set this field to \p NULL 186 * when initializing a structure, and do not modify it except via Mbed TLS 187 * library functions. 188 */ 189 struct mbedtls_asn1_named_data *next; 190 191 /** Merge next item into the current one? 192 * 193 * This field exists for the sake of Mbed TLS's X.509 certificate parsing 194 * code and may change in future versions of the library. 195 */ 196 unsigned char MBEDTLS_PRIVATE(next_merged); 197 } 198 mbedtls_asn1_named_data; 199 200 #if defined(MBEDTLS_ASN1_PARSE_C) || defined(MBEDTLS_X509_CREATE_C) 201 /** 202 * \brief Get the length of an ASN.1 element. 203 * Updates the pointer to immediately behind the length. 204 * 205 * \param p On entry, \c *p points to the first byte of the length, 206 * i.e. immediately after the tag. 207 * On successful completion, \c *p points to the first byte 208 * after the length, i.e. the first byte of the content. 209 * On error, the value of \c *p is undefined. 210 * \param end End of data. 211 * \param len On successful completion, \c *len contains the length 212 * read from the ASN.1 input. 213 * 214 * \return 0 if successful. 215 * \return #MBEDTLS_ERR_ASN1_OUT_OF_DATA if the ASN.1 element 216 * would end beyond \p end. 217 * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the length is unparsable. 218 */ 219 int mbedtls_asn1_get_len(unsigned char **p, 220 const unsigned char *end, 221 size_t *len); 222 223 /** 224 * \brief Get the tag and length of the element. 225 * Check for the requested tag. 226 * Updates the pointer to immediately behind the tag and length. 227 * 228 * \param p On entry, \c *p points to the start of the ASN.1 element. 229 * On successful completion, \c *p points to the first byte 230 * after the length, i.e. the first byte of the content. 231 * On error, the value of \c *p is undefined. 232 * \param end End of data. 233 * \param len On successful completion, \c *len contains the length 234 * read from the ASN.1 input. 235 * \param tag The expected tag. 236 * 237 * \return 0 if successful. 238 * \return #MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if the data does not start 239 * with the requested tag. 240 * \return #MBEDTLS_ERR_ASN1_OUT_OF_DATA if the ASN.1 element 241 * would end beyond \p end. 242 * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the length is unparsable. 243 */ 244 int mbedtls_asn1_get_tag(unsigned char **p, 245 const unsigned char *end, 246 size_t *len, int tag); 247 #endif /* MBEDTLS_ASN1_PARSE_C || MBEDTLS_X509_CREATE_C */ 248 249 #if defined(MBEDTLS_ASN1_PARSE_C) 250 /** 251 * \brief Retrieve a boolean ASN.1 tag and its value. 252 * Updates the pointer to immediately behind the full tag. 253 * 254 * \param p On entry, \c *p points to the start of the ASN.1 element. 255 * On successful completion, \c *p points to the first byte 256 * beyond the ASN.1 element. 257 * On error, the value of \c *p is undefined. 258 * \param end End of data. 259 * \param val On success, the parsed value (\c 0 or \c 1). 260 * 261 * \return 0 if successful. 262 * \return An ASN.1 error code if the input does not start with 263 * a valid ASN.1 BOOLEAN. 264 */ 265 int mbedtls_asn1_get_bool(unsigned char **p, 266 const unsigned char *end, 267 int *val); 268 269 /** 270 * \brief Retrieve an integer ASN.1 tag and its value. 271 * Updates the pointer to immediately behind the full tag. 272 * 273 * \param p On entry, \c *p points to the start of the ASN.1 element. 274 * On successful completion, \c *p points to the first byte 275 * beyond the ASN.1 element. 276 * On error, the value of \c *p is undefined. 277 * \param end End of data. 278 * \param val On success, the parsed value. 279 * 280 * \return 0 if successful. 281 * \return An ASN.1 error code if the input does not start with 282 * a valid ASN.1 INTEGER. 283 * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the parsed value does 284 * not fit in an \c int. 285 */ 286 int mbedtls_asn1_get_int(unsigned char **p, 287 const unsigned char *end, 288 int *val); 289 290 /** 291 * \brief Retrieve an enumerated ASN.1 tag and its value. 292 * Updates the pointer to immediately behind the full tag. 293 * 294 * \param p On entry, \c *p points to the start of the ASN.1 element. 295 * On successful completion, \c *p points to the first byte 296 * beyond the ASN.1 element. 297 * On error, the value of \c *p is undefined. 298 * \param end End of data. 299 * \param val On success, the parsed value. 300 * 301 * \return 0 if successful. 302 * \return An ASN.1 error code if the input does not start with 303 * a valid ASN.1 ENUMERATED. 304 * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the parsed value does 305 * not fit in an \c int. 306 */ 307 int mbedtls_asn1_get_enum(unsigned char **p, 308 const unsigned char *end, 309 int *val); 310 311 /** 312 * \brief Retrieve a bitstring ASN.1 tag and its value. 313 * Updates the pointer to immediately behind the full tag. 314 * 315 * \param p On entry, \c *p points to the start of the ASN.1 element. 316 * On successful completion, \c *p is equal to \p end. 317 * On error, the value of \c *p is undefined. 318 * \param end End of data. 319 * \param bs On success, ::mbedtls_asn1_bitstring information about 320 * the parsed value. 321 * 322 * \return 0 if successful. 323 * \return #MBEDTLS_ERR_ASN1_LENGTH_MISMATCH if the input contains 324 * extra data after a valid BIT STRING. 325 * \return An ASN.1 error code if the input does not start with 326 * a valid ASN.1 BIT STRING. 327 */ 328 int mbedtls_asn1_get_bitstring(unsigned char **p, const unsigned char *end, 329 mbedtls_asn1_bitstring *bs); 330 331 /** 332 * \brief Retrieve a bitstring ASN.1 tag without unused bits and its 333 * value. 334 * Updates the pointer to the beginning of the bit/octet string. 335 * 336 * \param p On entry, \c *p points to the start of the ASN.1 element. 337 * On successful completion, \c *p points to the first byte 338 * of the content of the BIT STRING. 339 * On error, the value of \c *p is undefined. 340 * \param end End of data. 341 * \param len On success, \c *len is the length of the content in bytes. 342 * 343 * \return 0 if successful. 344 * \return #MBEDTLS_ERR_ASN1_INVALID_DATA if the input starts with 345 * a valid BIT STRING with a nonzero number of unused bits. 346 * \return An ASN.1 error code if the input does not start with 347 * a valid ASN.1 BIT STRING. 348 */ 349 int mbedtls_asn1_get_bitstring_null(unsigned char **p, 350 const unsigned char *end, 351 size_t *len); 352 353 /** 354 * \brief Parses and splits an ASN.1 "SEQUENCE OF <tag>". 355 * Updates the pointer to immediately behind the full sequence tag. 356 * 357 * This function allocates memory for the sequence elements. You can free 358 * the allocated memory with mbedtls_asn1_sequence_free(). 359 * 360 * \note On error, this function may return a partial list in \p cur. 361 * You must set `cur->next = NULL` before calling this function! 362 * Otherwise it is impossible to distinguish a previously non-null 363 * pointer from a pointer to an object allocated by this function. 364 * 365 * \note If the sequence is empty, this function does not modify 366 * \c *cur. If the sequence is valid and non-empty, this 367 * function sets `cur->buf.tag` to \p tag. This allows 368 * callers to distinguish between an empty sequence and 369 * a one-element sequence. 370 * 371 * \param p On entry, \c *p points to the start of the ASN.1 element. 372 * On successful completion, \c *p is equal to \p end. 373 * On error, the value of \c *p is undefined. 374 * \param end End of data. 375 * \param cur A ::mbedtls_asn1_sequence which this function fills. 376 * When this function returns, \c *cur is the head of a linked 377 * list. Each node in this list is allocated with 378 * mbedtls_calloc() apart from \p cur itself, and should 379 * therefore be freed with mbedtls_free(). 380 * The list describes the content of the sequence. 381 * The head of the list (i.e. \c *cur itself) describes the 382 * first element, `*cur->next` describes the second element, etc. 383 * For each element, `buf.tag == tag`, `buf.len` is the length 384 * of the content of the content of the element, and `buf.p` 385 * points to the first byte of the content (i.e. immediately 386 * past the length of the element). 387 * Note that list elements may be allocated even on error. 388 * \param tag Each element of the sequence must have this tag. 389 * 390 * \return 0 if successful. 391 * \return #MBEDTLS_ERR_ASN1_LENGTH_MISMATCH if the input contains 392 * extra data after a valid SEQUENCE OF \p tag. 393 * \return #MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if the input starts with 394 * an ASN.1 SEQUENCE in which an element has a tag that 395 * is different from \p tag. 396 * \return #MBEDTLS_ERR_ASN1_ALLOC_FAILED if a memory allocation failed. 397 * \return An ASN.1 error code if the input does not start with 398 * a valid ASN.1 SEQUENCE. 399 */ 400 int mbedtls_asn1_get_sequence_of(unsigned char **p, 401 const unsigned char *end, 402 mbedtls_asn1_sequence *cur, 403 int tag); 404 /** 405 * \brief Free a heap-allocated linked list presentation of 406 * an ASN.1 sequence, including the first element. 407 * 408 * There are two common ways to manage the memory used for the representation 409 * of a parsed ASN.1 sequence: 410 * - Allocate a head node `mbedtls_asn1_sequence *head` with mbedtls_calloc(). 411 * Pass this node as the `cur` argument to mbedtls_asn1_get_sequence_of(). 412 * When you have finished processing the sequence, 413 * call mbedtls_asn1_sequence_free() on `head`. 414 * - Allocate a head node `mbedtls_asn1_sequence *head` in any manner, 415 * for example on the stack. Make sure that `head->next == NULL`. 416 * Pass `head` as the `cur` argument to mbedtls_asn1_get_sequence_of(). 417 * When you have finished processing the sequence, 418 * call mbedtls_asn1_sequence_free() on `head->cur`, 419 * then free `head` itself in the appropriate manner. 420 * 421 * \param seq The address of the first sequence component. This may 422 * be \c NULL, in which case this functions returns 423 * immediately. 424 */ 425 void mbedtls_asn1_sequence_free(mbedtls_asn1_sequence *seq); 426 427 /** 428 * \brief Traverse an ASN.1 SEQUENCE container and 429 * call a callback for each entry. 430 * 431 * This function checks that the input is a SEQUENCE of elements that 432 * each have a "must" tag, and calls a callback function on the elements 433 * that have a "may" tag. 434 * 435 * For example, to validate that the input is a SEQUENCE of `tag1` and call 436 * `cb` on each element, use 437 * ``` 438 * mbedtls_asn1_traverse_sequence_of(&p, end, 0xff, tag1, 0, 0, cb, ctx); 439 * ``` 440 * 441 * To validate that the input is a SEQUENCE of ANY and call `cb` on 442 * each element, use 443 * ``` 444 * mbedtls_asn1_traverse_sequence_of(&p, end, 0, 0, 0, 0, cb, ctx); 445 * ``` 446 * 447 * To validate that the input is a SEQUENCE of CHOICE {NULL, OCTET STRING} 448 * and call `cb` on each element that is an OCTET STRING, use 449 * ``` 450 * mbedtls_asn1_traverse_sequence_of(&p, end, 0xfe, 0x04, 0xff, 0x04, cb, ctx); 451 * ``` 452 * 453 * The callback is called on the elements with a "may" tag from left to 454 * right. If the input is not a valid SEQUENCE of elements with a "must" tag, 455 * the callback is called on the elements up to the leftmost point where 456 * the input is invalid. 457 * 458 * \warning This function is still experimental and may change 459 * at any time. 460 * 461 * \param p The address of the pointer to the beginning of 462 * the ASN.1 SEQUENCE header. This is updated to 463 * point to the end of the ASN.1 SEQUENCE container 464 * on a successful invocation. 465 * \param end The end of the ASN.1 SEQUENCE container. 466 * \param tag_must_mask A mask to be applied to the ASN.1 tags found within 467 * the SEQUENCE before comparing to \p tag_must_val. 468 * \param tag_must_val The required value of each ASN.1 tag found in the 469 * SEQUENCE, after masking with \p tag_must_mask. 470 * Mismatching tags lead to an error. 471 * For example, a value of \c 0 for both \p tag_must_mask 472 * and \p tag_must_val means that every tag is allowed, 473 * while a value of \c 0xFF for \p tag_must_mask means 474 * that \p tag_must_val is the only allowed tag. 475 * \param tag_may_mask A mask to be applied to the ASN.1 tags found within 476 * the SEQUENCE before comparing to \p tag_may_val. 477 * \param tag_may_val The desired value of each ASN.1 tag found in the 478 * SEQUENCE, after masking with \p tag_may_mask. 479 * Mismatching tags will be silently ignored. 480 * For example, a value of \c 0 for \p tag_may_mask and 481 * \p tag_may_val means that any tag will be considered, 482 * while a value of \c 0xFF for \p tag_may_mask means 483 * that all tags with value different from \p tag_may_val 484 * will be ignored. 485 * \param cb The callback to trigger for each component 486 * in the ASN.1 SEQUENCE that matches \p tag_may_val. 487 * The callback function is called with the following 488 * parameters: 489 * - \p ctx. 490 * - The tag of the current element. 491 * - A pointer to the start of the current element's 492 * content inside the input. 493 * - The length of the content of the current element. 494 * If the callback returns a non-zero value, 495 * the function stops immediately, 496 * forwarding the callback's return value. 497 * \param ctx The context to be passed to the callback \p cb. 498 * 499 * \return \c 0 if successful the entire ASN.1 SEQUENCE 500 * was traversed without parsing or callback errors. 501 * \return #MBEDTLS_ERR_ASN1_LENGTH_MISMATCH if the input 502 * contains extra data after a valid SEQUENCE 503 * of elements with an accepted tag. 504 * \return #MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if the input starts 505 * with an ASN.1 SEQUENCE in which an element has a tag 506 * that is not accepted. 507 * \return An ASN.1 error code if the input does not start with 508 * a valid ASN.1 SEQUENCE. 509 * \return A non-zero error code forwarded from the callback 510 * \p cb in case the latter returns a non-zero value. 511 */ 512 int mbedtls_asn1_traverse_sequence_of( 513 unsigned char **p, 514 const unsigned char *end, 515 unsigned char tag_must_mask, unsigned char tag_must_val, 516 unsigned char tag_may_mask, unsigned char tag_may_val, 517 int (*cb)(void *ctx, int tag, 518 unsigned char *start, size_t len), 519 void *ctx); 520 521 #if defined(MBEDTLS_BIGNUM_C) 522 /** 523 * \brief Retrieve an integer ASN.1 tag and its value. 524 * Updates the pointer to immediately behind the full tag. 525 * 526 * \param p On entry, \c *p points to the start of the ASN.1 element. 527 * On successful completion, \c *p points to the first byte 528 * beyond the ASN.1 element. 529 * On error, the value of \c *p is undefined. 530 * \param end End of data. 531 * \param X On success, the parsed value. 532 * 533 * \return 0 if successful. 534 * \return An ASN.1 error code if the input does not start with 535 * a valid ASN.1 INTEGER. 536 * \return #MBEDTLS_ERR_ASN1_INVALID_LENGTH if the parsed value does 537 * not fit in an \c int. 538 * \return An MPI error code if the parsed value is too large. 539 */ 540 int mbedtls_asn1_get_mpi(unsigned char **p, 541 const unsigned char *end, 542 mbedtls_mpi *X); 543 #endif /* MBEDTLS_BIGNUM_C */ 544 545 /** 546 * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence. 547 * Updates the pointer to immediately behind the full 548 * AlgorithmIdentifier. 549 * 550 * \param p On entry, \c *p points to the start of the ASN.1 element. 551 * On successful completion, \c *p points to the first byte 552 * beyond the AlgorithmIdentifier element. 553 * On error, the value of \c *p is undefined. 554 * \param end End of data. 555 * \param alg The buffer to receive the OID. 556 * \param params The buffer to receive the parameters. 557 * This is zeroized if there are no parameters. 558 * 559 * \return 0 if successful or a specific ASN.1 or MPI error code. 560 */ 561 int mbedtls_asn1_get_alg(unsigned char **p, 562 const unsigned char *end, 563 mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params); 564 565 /** 566 * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no 567 * params. 568 * Updates the pointer to immediately behind the full 569 * AlgorithmIdentifier. 570 * 571 * \param p On entry, \c *p points to the start of the ASN.1 element. 572 * On successful completion, \c *p points to the first byte 573 * beyond the AlgorithmIdentifier element. 574 * On error, the value of \c *p is undefined. 575 * \param end End of data. 576 * \param alg The buffer to receive the OID. 577 * 578 * \return 0 if successful or a specific ASN.1 or MPI error code. 579 */ 580 int mbedtls_asn1_get_alg_null(unsigned char **p, 581 const unsigned char *end, 582 mbedtls_asn1_buf *alg); 583 584 /** 585 * \brief Find a specific named_data entry in a sequence or list based on 586 * the OID. 587 * 588 * \param list The list to seek through 589 * \param oid The OID to look for 590 * \param len Size of the OID 591 * 592 * \return NULL if not found, or a pointer to the existing entry. 593 */ 594 const mbedtls_asn1_named_data *mbedtls_asn1_find_named_data(const mbedtls_asn1_named_data *list, 595 const char *oid, size_t len); 596 597 #if !defined(MBEDTLS_DEPRECATED_REMOVED) 598 /** 599 * \brief Free a mbedtls_asn1_named_data entry 600 * 601 * \deprecated This function is deprecated and will be removed in a 602 * future version of the library. 603 * Please use mbedtls_asn1_free_named_data_list() 604 * or mbedtls_asn1_free_named_data_list_shallow(). 605 * 606 * \param entry The named data entry to free. 607 * This function calls mbedtls_free() on 608 * `entry->oid.p` and `entry->val.p`. 609 */ 610 void MBEDTLS_DEPRECATED mbedtls_asn1_free_named_data(mbedtls_asn1_named_data *entry); 611 #endif /* MBEDTLS_DEPRECATED_REMOVED */ 612 613 /** 614 * \brief Free all entries in a mbedtls_asn1_named_data list. 615 * 616 * \param head Pointer to the head of the list of named data entries to free. 617 * This function calls mbedtls_free() on 618 * `entry->oid.p` and `entry->val.p` and then on `entry` 619 * for each list entry, and sets \c *head to \c NULL. 620 */ 621 void mbedtls_asn1_free_named_data_list(mbedtls_asn1_named_data **head); 622 623 /** 624 * \brief Free all shallow entries in a mbedtls_asn1_named_data list, 625 * but do not free internal pointer targets. 626 * 627 * \param name Head of the list of named data entries to free. 628 * This function calls mbedtls_free() on each list element. 629 */ 630 void mbedtls_asn1_free_named_data_list_shallow(mbedtls_asn1_named_data *name); 631 632 /** \} name Functions to parse ASN.1 data structures */ 633 /** \} addtogroup asn1_module */ 634 635 #endif /* MBEDTLS_ASN1_PARSE_C */ 636 637 #ifdef __cplusplus 638 } 639 #endif 640 641 #endif /* asn1.h */ 642