]> git.saurik.com Git - apple/security.git/blob - libsecurity_keychain/libDER/libDER/DER_Encode.h
Security-55178.0.1.tar.gz
[apple/security.git] / libsecurity_keychain / libDER / libDER / DER_Encode.h
1 /* Copyright (c) 2005-2007 Apple Inc. All Rights Reserved. */
2
3 /*
4 * DER_Encode.h - DER encoding routines
5 *
6 * Created Dec. 2 2005 by dmitch
7 */
8
9 #ifndef _DER_ENCCODE_H_
10 #define _DER_ENCODE_H_
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 #include <libDER/libDER.h>
17
18 /*
19 * Max size of an encoded item given its length.
20 * This includes a possible leading zero prepended to a signed integer
21 * (see DER_ENC_SIGNED_INT below).
22 */
23 #define DER_MAX_ENCODED_SIZE(len) \
24 ( 1 + /* tag */ \
25 5 + /* max length */ \
26 1 + /* possible prepended zero */ \
27 len)
28
29 /* calculate size of encoded length */
30 DERSize DERLengthOfLength(
31 DERSize length);
32
33 /* encode length */
34 DERReturn DEREncodeLength(
35 DERSize length,
36 DERByte *buf, /* encoded length goes here */
37 DERSize *inOutLen); /* IN/OUT */
38
39 /* calculate size of encoded length */
40 DERSize DERLengthOfItem(
41 DERTag tag,
42 DERSize length);
43
44 /* encode item */
45 DERReturn DEREncodeItem(
46 DERTag tag,
47 DERSize length,
48 const DERByte *src,
49 DERByte *derOut, /* encoded item goes here */
50 DERSize *inOutLen); /* IN/OUT */
51
52 /*
53 * Per-item encode options.
54 */
55
56 /* explicit default, no options */
57 #define DER_ENC_NO_OPTS 0x0000
58
59 /* signed integer check: if incoming m.s. bit is 1, prepend a zero */
60 #define DER_ENC_SIGNED_INT 0x0100
61
62 /* DERItem contains fully encoded item - copy, don't encode */
63 #define DER_ENC_WRITE_DER 0x0200
64
65
66 /*
67 * High-level sequence or set encode support.
68 *
69 * The outgoing sequence is expressed as an array of DERItemSpecs, each
70 * of which corresponds to one item in the encoded sequence.
71 *
72 * Normally the tag of the encoded item comes from the associated
73 * DERItemSpec, and the content comes from the DERItem whose address is
74 * the src arg plus the offset value in the associated DERItemSpec.
75 *
76 * If the DER_ENC_WRITE_DER option is true for a given DERItemSpec then
77 * no per-item encoding is done; the DER - with tag, length, and content -
78 * is taken en masse from the associated DERItem.
79 */
80 DERReturn DEREncodeSequence(
81 DERTag topTag, /* ASN1_CONSTR_SEQUENCE, ASN1_CONSTR_SET */
82 const void *src, /* generally a ptr to a struct full of
83 * DERItems */
84 DERShort numItems, /* size of itemSpecs[] */
85 const DERItemSpec *itemSpecs,
86 DERByte *derOut, /* encoded data written here */
87 DERSize *inOutLen); /* IN/OUT */
88
89 /* precalculate the length of an encoded sequence. */
90 DERSize DERLengthOfEncodedSequence(
91 DERTag topTag, /* ASN1_CONSTR_SEQUENCE, ASN1_CONSTR_SET */
92 const void *src, /* generally a ptr to a struct full of
93 * DERItems */
94 DERShort numItems, /* size of itemSpecs[] */
95 const DERItemSpec *itemSpecs);
96
97
98 #ifdef __cplusplus
99 }
100 #endif
101
102 #endif /* _DER_DECODE_H_ */
103