1 /* Copyright (c) (2010-2012,2015-2019,2021) Apple Inc. All rights reserved.
2 *
3 * corecrypto is licensed under Apple Inc.’s Internal Use License Agreement (which
4 * is contained in the License.txt file distributed with corecrypto) and only to
5 * people who accept that license. IMPORTANT: Any license rights granted to you by
6 * Apple Inc. (if any) are limited to internal use within your organization only on
7 * devices and computers you own or control, for the sole purpose of verifying the
8 * security characteristics and correct functioning of the Apple Software. You may
9 * not, directly or indirectly, redistribute the Apple Software or any portions thereof.
10 */
11
12 #ifndef _CORECRYPTO_CCASN1_H_
13 #define _CORECRYPTO_CCASN1_H_
14
15 #include <corecrypto/cc.h>
16 #include <stdbool.h>
17 #include <string.h>
18
19 CC_PTRCHECK_CAPABLE_HEADER()
20
21 /* ASN.1 types for on the fly ASN.1 BER/DER encoding/decoding. Don't use
22 these with the ccder interface, use the CCDER_ types instead. */
23 enum {
24 CCASN1_EOL = 0x00,
25 CCASN1_BOOLEAN = 0x01,
26 CCASN1_INTEGER = 0x02,
27 CCASN1_BIT_STRING = 0x03,
28 CCASN1_OCTET_STRING = 0x04,
29 CCASN1_NULL = 0x05,
30 CCASN1_OBJECT_IDENTIFIER = 0x06,
31 CCASN1_OBJECT_DESCRIPTOR = 0x07,
32 /* External or instance-of 0x08 */
33 CCASN1_REAL = 0x09,
34 CCASN1_ENUMERATED = 0x0a,
35 CCASN1_EMBEDDED_PDV = 0x0b,
36 CCASN1_UTF8_STRING = 0x0c,
37 /* 0x0d */
38 /* 0x0e */
39 /* 0x0f */
40 CCASN1_SEQUENCE = 0x10,
41 CCASN1_SET = 0x11,
42 CCASN1_NUMERIC_STRING = 0x12,
43 CCASN1_PRINTABLE_STRING = 0x13,
44 CCASN1_T61_STRING = 0x14,
45 CCASN1_VIDEOTEX_STRING = 0x15,
46 CCASN1_IA5_STRING = 0x16,
47 CCASN1_UTC_TIME = 0x17,
48 CCASN1_GENERALIZED_TIME = 0x18,
49 CCASN1_GRAPHIC_STRING = 0x19,
50 CCASN1_VISIBLE_STRING = 0x1a,
51 CCASN1_GENERAL_STRING = 0x1b,
52 CCASN1_UNIVERSAL_STRING = 0x1c,
53 /* 0x1d */
54 CCASN1_BMP_STRING = 0x1e,
55 CCASN1_HIGH_TAG_NUMBER = 0x1f,
56 CCASN1_TELETEX_STRING = CCASN1_T61_STRING,
57
58 CCASN1_TAG_MASK = 0xff,
59 CCASN1_TAGNUM_MASK = 0x1f,
60
61 CCASN1_METHOD_MASK = 0x20,
62 CCASN1_PRIMITIVE = 0x00,
63 CCASN1_CONSTRUCTED = 0x20,
64
65 CCASN1_CLASS_MASK = 0xc0,
66 CCASN1_UNIVERSAL = 0x00,
67 CCASN1_APPLICATION = 0x40,
68 CCASN1_CONTEXT_SPECIFIC = 0x80,
69 CCASN1_PRIVATE = 0xc0,
70
71 CCASN1_CONSTRUCTED_SET = CCASN1_SET | CCASN1_CONSTRUCTED,
72 CCASN1_CONSTRUCTED_SEQUENCE = CCASN1_SEQUENCE | CCASN1_CONSTRUCTED,
73 };
74
75 typedef const unsigned char * cc_unsafe_indexable ccoid_t;
76 #define CCOID(oid) (oid)
77
78 /* Returns the size of an oid including its tag and length. */
79 CC_INLINE CC_PURE CC_NONNULL((1))
ccoid_size(ccoid_t oid)80 size_t ccoid_size(ccoid_t oid) {
81 return 2 + CCOID(oid)[1];
82 }
83
84 CC_INLINE CC_PURE CC_NONNULL((1))
ccoid_payload(ccoid_t oid)85 const unsigned char *cc_indexable ccoid_payload(ccoid_t oid) {
86 return cc_unsafe_forge_bidi_indexable(CCOID(oid), ccoid_size(oid));
87 }
88
89 CC_PURE
90 bool ccoid_equal(ccoid_t oid1, ccoid_t oid2);
91
92 #endif /* _CORECRYPTO_CCASN1_H_ */
93