xref: /xnu-8796.121.2/EXTERNAL_HEADERS/corecrypto/ccasn1.h (revision c54f35ca767986246321eb901baf8f5ff7923f6a)
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