]> git.saurik.com Git - apple/xnu.git/blame - EXTERNAL_HEADERS/corecrypto/ccder.h
xnu-2782.40.9.tar.gz
[apple/xnu.git] / EXTERNAL_HEADERS / corecrypto / ccder.h
CommitLineData
316670eb
A
1/*
2 * ccder.h
3 * corecrypto
4 *
5 * Created by Michael Brouwer on 2/28/12.
6 * Copyright 2012 Apple Inc. All rights reserved.
7 *
8 */
9
10#ifndef _CORECRYPTO_CCDER_H_
11#define _CORECRYPTO_CCDER_H_
12
13#include <corecrypto/ccasn1.h>
14#include <corecrypto/ccn.h>
15
16#define CCDER_MULTIBYTE_TAGS 1
17
18#ifdef CCDER_MULTIBYTE_TAGS
19typedef unsigned long ccder_tag;
20#else
21typedef uint8_t ccder_tag;
22#endif
23
24/* DER types to be used with ccder_decode and ccder_encode functions. */
25enum {
26 CCDER_EOL = CCASN1_EOL,
27 CCDER_BOOLEAN = CCASN1_BOOLEAN,
28 CCDER_INTEGER = CCASN1_INTEGER,
29 CCDER_BIT_STRING = CCASN1_BIT_STRING,
30 CCDER_OCTET_STRING = CCASN1_OCTET_STRING,
31 CCDER_NULL = CCASN1_NULL,
32 CCDER_OBJECT_IDENTIFIER = CCASN1_OBJECT_IDENTIFIER,
33 CCDER_OBJECT_DESCRIPTOR = CCASN1_OBJECT_DESCRIPTOR,
34 /* External or instance-of 0x08 */
35 CCDER_REAL = CCASN1_REAL,
36 CCDER_ENUMERATED = CCASN1_ENUMERATED,
37 CCDER_EMBEDDED_PDV = CCASN1_EMBEDDED_PDV,
38 CCDER_UTF8_STRING = CCASN1_UTF8_STRING,
39 /* 0x0d */
40 /* 0x0e */
41 /* 0x0f */
42 CCDER_SEQUENCE = CCASN1_SEQUENCE,
43 CCDER_SET = CCASN1_SET,
44 CCDER_NUMERIC_STRING = CCASN1_NUMERIC_STRING,
45 CCDER_PRINTABLE_STRING = CCASN1_PRINTABLE_STRING,
46 CCDER_T61_STRING = CCASN1_T61_STRING,
47 CCDER_VIDEOTEX_STRING = CCASN1_VIDEOTEX_STRING,
48 CCDER_IA5_STRING = CCASN1_IA5_STRING,
49 CCDER_UTC_TIME = CCASN1_UTC_TIME,
50 CCDER_GENERALIZED_TIME = CCASN1_GENERALIZED_TIME,
51 CCDER_GRAPHIC_STRING = CCASN1_GRAPHIC_STRING,
52 CCDER_VISIBLE_STRING = CCASN1_VISIBLE_STRING,
53 CCDER_GENERAL_STRING = CCASN1_GENERAL_STRING,
54 CCDER_UNIVERSAL_STRING = CCASN1_UNIVERSAL_STRING,
55 /* 0x1d */
56 CCDER_BMP_STRING = CCASN1_BMP_STRING,
57 CCDER_HIGH_TAG_NUMBER = CCASN1_HIGH_TAG_NUMBER,
58 CCDER_TELETEX_STRING = CCDER_T61_STRING,
59
60#ifdef CCDER_MULTIBYTE_TAGS
61 CCDER_TAG_MASK = ((ccder_tag)~0),
62 CCDER_TAGNUM_MASK = ((ccder_tag)~((ccder_tag)7 << (sizeof(ccder_tag) * 8 - 3))),
63
64 CCDER_METHOD_MASK = ((ccder_tag)1 << (sizeof(ccder_tag) * 8 - 3)),
65 CCDER_PRIMITIVE = ((ccder_tag)0 << (sizeof(ccder_tag) * 8 - 3)),
66 CCDER_CONSTRUCTED = ((ccder_tag)1 << (sizeof(ccder_tag) * 8 - 3)),
67
68 CCDER_CLASS_MASK = ((ccder_tag)3 << (sizeof(ccder_tag) * 8 - 2)),
69 CCDER_UNIVERSAL = ((ccder_tag)0 << (sizeof(ccder_tag) * 8 - 2)),
70 CCDER_APPLICATION = ((ccder_tag)1 << (sizeof(ccder_tag) * 8 - 2)),
71 CCDER_CONTEXT_SPECIFIC = ((ccder_tag)2 << (sizeof(ccder_tag) * 8 - 2)),
72 CCDER_PRIVATE = ((ccder_tag)3 << (sizeof(ccder_tag) * 8 - 2)),
73#else
74 CCDER_TAG_MASK = CCASN1_TAG_MASK,
75 CCDER_TAGNUM_MASK = CCASN1_TAGNUM_MASK,
76
77 CCDER_METHOD_MASK = CCASN1_METHOD_MASK,
78 CCDER_PRIMITIVE = CCASN1_PRIMITIVE,
79 CCDER_CONSTRUCTED = CCASN1_CONSTRUCTED,
80
81 CCDER_CLASS_MASK = CCASN1_CLASS_MASK,
82 CCDER_UNIVERSAL = CCASN1_UNIVERSAL,
83 CCDER_APPLICATION = CCASN1_APPLICATION,
84 CCDER_CONTEXT_SPECIFIC = CCASN1_CONTEXT_SPECIFIC,
85 CCDER_PRIVATE = CCASN1_PRIVATE,
86#endif
87 CCDER_CONSTRUCTED_SET = CCDER_SET | CCDER_CONSTRUCTED,
88 CCDER_CONSTRUCTED_SEQUENCE = CCDER_SEQUENCE | CCDER_CONSTRUCTED,
89};
90
91
fe8ab488
A
92#define CC_NO_INLINE
93// MARK: ccder_sizeof_ functions
316670eb 94
fe8ab488
A
95/* Returns the size of an asn1 encoded item of length l in bytes. */
96CC_NO_INLINE CC_CONST
97size_t ccder_sizeof(ccder_tag tag, size_t len);
98
99CC_NO_INLINE CC_PURE
100size_t ccder_sizeof_implicit_integer(ccder_tag implicit_tag,
101 cc_size n, const cc_unit *s);
102
103CC_NO_INLINE CC_PURE
104size_t ccder_sizeof_implicit_octet_string(ccder_tag implicit_tag,
105 cc_size n, const cc_unit *s);
316670eb 106
fe8ab488
A
107CC_NO_INLINE CC_CONST
108size_t ccder_sizeof_implicit_raw_octet_string(ccder_tag implicit_tag,
109 size_t s_size);
110CC_NO_INLINE CC_CONST
111size_t ccder_sizeof_implicit_uint64(ccder_tag implicit_tag, uint64_t value);
112
113CC_NO_INLINE CC_PURE
114size_t ccder_sizeof_integer(cc_size n, const cc_unit *s);
115
116CC_NO_INLINE CC_CONST
316670eb
A
117size_t ccder_sizeof_len(size_t len);
118
fe8ab488
A
119CC_NO_INLINE CC_PURE
120size_t ccder_sizeof_octet_string(cc_size n, const cc_unit *s);
316670eb 121
fe8ab488 122CC_NO_INLINE CC_PURE
316670eb
A
123size_t ccder_sizeof_oid(ccoid_t oid);
124
fe8ab488
A
125CC_NO_INLINE CC_CONST
126size_t ccder_sizeof_raw_octet_string(size_t s_size);
127
128CC_NO_INLINE CC_CONST
129size_t ccder_sizeof_tag(ccder_tag tag);
130
131CC_NO_INLINE CC_CONST
132size_t ccder_sizeof_uint64(uint64_t value);
133
134
135// MARK: ccder_encode_ functions.
316670eb
A
136
137/* Encode a tag backwards, der_end should point to one byte past the end of
138 destination for the tag, returns a pointer to the first byte of the tag.
139 Returns NULL if there is an encoding error. */
fe8ab488 140CC_NO_INLINE CC_NONNULL2
316670eb
A
141uint8_t *ccder_encode_tag(ccder_tag tag, const uint8_t *der, uint8_t *der_end);
142
143/* Returns a pointer to the start of the len field. returns NULL if there
144 is an encoding error. */
fe8ab488 145CC_NO_INLINE CC_NONNULL2
316670eb
A
146uint8_t *
147ccder_encode_len(size_t len, const uint8_t *der, uint8_t *der_end);
148
149/* der_end should point to the first byte of the content of this der item. */
fe8ab488 150CC_NO_INLINE CC_NONNULL3
316670eb
A
151uint8_t *
152ccder_encode_tl(ccder_tag tag, size_t len, const uint8_t *der, uint8_t *der_end);
153
fe8ab488 154CC_NO_INLINE CC_PURE CC_NONNULL2
316670eb
A
155uint8_t *
156ccder_encode_body_nocopy(size_t size, const uint8_t *der, uint8_t *der_end);
157
158/* Encode the tag and length of a constructed object. der is the lower
159 bound, der_end is one byte paste where we want to write the length and
160 body_end is one byte past the end of the body of the der object we are
161 encoding the tag and length of. */
fe8ab488 162CC_NO_INLINE CC_NONNULL((2, 3))
316670eb
A
163uint8_t *
164ccder_encode_constructed_tl(ccder_tag tag, const uint8_t *body_end,
165 const uint8_t *der, uint8_t *der_end);
166
167/* Encodes oid into der and returns
168 der + ccder_sizeof_oid(oid). */
fe8ab488 169CC_NO_INLINE CC_NONNULL_TU((1)) CC_NONNULL2
316670eb
A
170uint8_t *ccder_encode_oid(ccoid_t oid, const uint8_t *der, uint8_t *der_end);
171
fe8ab488 172CC_NO_INLINE CC_NONNULL((3, 4))
316670eb
A
173uint8_t *ccder_encode_implicit_integer(ccder_tag implicit_tag,
174 cc_size n, const cc_unit *s,
175 const uint8_t *der, uint8_t *der_end);
176
fe8ab488 177CC_NO_INLINE CC_NONNULL((2, 3))
316670eb
A
178uint8_t *ccder_encode_integer(cc_size n, const cc_unit *s,
179 const uint8_t *der, uint8_t *der_end);
180
fe8ab488 181CC_NO_INLINE CC_NONNULL3
316670eb
A
182uint8_t *ccder_encode_implicit_uint64(ccder_tag implicit_tag,
183 uint64_t value,
184 const uint8_t *der, uint8_t *der_end);
185
fe8ab488 186CC_NO_INLINE CC_NONNULL2
316670eb
A
187uint8_t *ccder_encode_uint64(uint64_t value,
188 const uint8_t *der, uint8_t *der_end);
189
fe8ab488 190CC_NO_INLINE CC_NONNULL((3, 4))
316670eb
A
191uint8_t *ccder_encode_implicit_octet_string(ccder_tag implicit_tag,
192 cc_size n, const cc_unit *s,
193 const uint8_t *der,
194 uint8_t *der_end);
195
fe8ab488 196CC_NO_INLINE CC_NONNULL((2, 3))
316670eb
A
197uint8_t *ccder_encode_octet_string(cc_size n, const cc_unit *s,
198 const uint8_t *der, uint8_t *der_end);
199
fe8ab488 200CC_NO_INLINE CC_NONNULL((3, 4))
316670eb
A
201uint8_t *ccder_encode_implicit_raw_octet_string(ccder_tag implicit_tag,
202 size_t s_size, const uint8_t *s,
203 const uint8_t *der,
204 uint8_t *der_end);
205
fe8ab488 206CC_NO_INLINE CC_NONNULL((2, 3))
316670eb
A
207uint8_t *ccder_encode_raw_octet_string(size_t s_size, const uint8_t *s,
208 const uint8_t *der, uint8_t *der_end);
209
210/* ccder_encode_body COPIES the body into the der.
211 It's inefficient – especially when you already have to convert to get to
212 the form for the body.
213 see encode integer for the right way to unify conversion and insertion */
fe8ab488 214CC_NO_INLINE CC_NONNULL3
316670eb
A
215uint8_t *
216ccder_encode_body(size_t size, const uint8_t* body,
217 const uint8_t *der, uint8_t *der_end);
218
fe8ab488 219// MARK: ccder_decode_ functions.
316670eb
A
220
221/* Returns a pointer to the start of the length field, and returns the decoded tag in tag.
222 returns NULL if there is a decoding error. */
fe8ab488 223CC_NO_INLINE CC_NONNULL((1, 3))
316670eb
A
224const uint8_t *ccder_decode_tag(ccder_tag *tagp, const uint8_t *der, const uint8_t *der_end);
225
fe8ab488 226CC_NO_INLINE CC_NONNULL((1, 3))
316670eb
A
227const uint8_t *ccder_decode_len(size_t *lenp, const uint8_t *der, const uint8_t *der_end);
228
229/* Returns a pointer to the start of the der object, and returns the length in len.
230 returns NULL if there is a decoding error. */
fe8ab488 231CC_NO_INLINE CC_NONNULL((2, 4))
316670eb
A
232const uint8_t *ccder_decode_tl(ccder_tag expected_tag, size_t *lenp,
233 const uint8_t *der, const uint8_t *der_end);
234
fe8ab488 235CC_NO_INLINE CC_NONNULL((2, 4))
316670eb
A
236const uint8_t *
237ccder_decode_constructed_tl(ccder_tag expected_tag, const uint8_t **body_end,
238 const uint8_t *der, const uint8_t *der_end);
239
fe8ab488 240CC_NO_INLINE CC_NONNULL((1, 3))
316670eb
A
241const uint8_t *
242ccder_decode_sequence_tl(const uint8_t **body_end,
243 const uint8_t *der, const uint8_t *der_end);
244
fe8ab488 245CC_NO_INLINE CC_NONNULL((2, 4))
316670eb
A
246const uint8_t *ccder_decode_uint(cc_size n, cc_unit *r,
247 const uint8_t *der, const uint8_t *der_end);
248
fe8ab488 249CC_NO_INLINE CC_NONNULL((1, 3))
316670eb
A
250const uint8_t *ccder_decode_uint64(uint64_t* r,
251 const uint8_t *der, const uint8_t *der_end);
252
253/* Decode SEQUENCE { r, s -- (unsigned)integer } in der into r and s.
254 Returns NULL on decode errors, returns pointer just past the end of the
255 sequence of integers otherwise. */
fe8ab488 256CC_NO_INLINE CC_NONNULL((2, 3, 5))
316670eb
A
257const uint8_t *ccder_decode_seqii(cc_size n, cc_unit *r, cc_unit *s,
258 const uint8_t *der, const uint8_t *der_end);
fe8ab488 259CC_NO_INLINE CC_NONNULL_TU((1)) CC_NONNULL((3))
316670eb
A
260const uint8_t *ccder_decode_oid(ccoid_t *oidp,
261 const uint8_t *der, const uint8_t *der_end);
262
fe8ab488
A
263CC_NO_INLINE CC_NONNULL_ALL
264const uint8_t *ccder_decode_bitstring(const uint8_t **bit_string,
265 size_t *bit_length,
266 const uint8_t *der, const uint8_t *der_end);
267
268CC_NO_INLINE CC_NONNULL_ALL
269const uint8_t *ccder_decode_eckey(uint64_t *version,
270 size_t *priv_size, const uint8_t **priv_key,
271 ccoid_t *oid,
272 size_t *pub_size, const uint8_t **pub_key,
273 const uint8_t *der, const uint8_t *der_end);
274
316670eb
A
275#ifndef CCDER_MULTIBYTE_TAGS
276#include <corecrypto/ccder_decode_constructed_tl.h>
277#include <corecrypto/ccder_decode_len.h>
278#include <corecrypto/ccder_decode_oid.h>
279#include <corecrypto/ccder_decode_seqii.h>
280#include <corecrypto/ccder_decode_sequence_tl.h>
281#include <corecrypto/ccder_decode_tag.h>
282#include <corecrypto/ccder_decode_tl.h>
283#include <corecrypto/ccder_decode_uint.h>
fe8ab488
A
284#include <corecrypto/ccder_decode_bitstring.h>
285#include <corecrypto/ccder_decode_eckey.h>
316670eb
A
286#include <corecrypto/ccder_encode_body_nocopy.h>
287#include <corecrypto/ccder_encode_constructed_tl.h>
288#include <corecrypto/ccder_encode_implicit_integer.h>
289#include <corecrypto/ccder_encode_implicit_octet_string.h>
290#include <corecrypto/ccder_encode_implicit_uint64.h>
291#include <corecrypto/ccder_encode_integer.h>
292#include <corecrypto/ccder_encode_len.h>
293#include <corecrypto/ccder_encode_octet_string.h>
294#include <corecrypto/ccder_encode_oid.h>
295#include <corecrypto/ccder_encode_tag.h>
296#include <corecrypto/ccder_encode_tl.h>
297#include <corecrypto/ccder_encode_uint64.h>
298#include <corecrypto/ccder_sizeof.h>
fe8ab488 299#include <corecrypto/ccder_sizeof_integer.h>
316670eb
A
300#include <corecrypto/ccder_sizeof_len.h>
301#include <corecrypto/ccder_sizeof_oid.h>
302#include <corecrypto/ccder_sizeof_tag.h>
303#endif
304
305#endif /* _CORECRYPTO_CCDER_H_ */