/src/FreeRDP/winpr/include/winpr/asn1.h
Line | Count | Source |
1 | | /** |
2 | | * WinPR: Windows Portable Runtime |
3 | | * ASN1 encoder / decoder |
4 | | * |
5 | | * Copyright 2022 David Fort <contact@hardening-consulting.com> |
6 | | * |
7 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
8 | | * you may not use this file except in compliance with the License. |
9 | | * You may obtain a copy of the License at |
10 | | * |
11 | | * http://www.apache.org/licenses/LICENSE-2.0 |
12 | | * |
13 | | * Unless required by applicable law or agreed to in writing, software |
14 | | * distributed under the License is distributed on an "AS IS" BASIS, |
15 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
16 | | * See the License for the specific language governing permissions and |
17 | | * limitations under the License. |
18 | | */ |
19 | | |
20 | | #ifndef WINPR_ASN1_H_ |
21 | | #define WINPR_ASN1_H_ |
22 | | |
23 | | #include <winpr/winpr.h> |
24 | | #include <winpr/wtypes.h> |
25 | | #include <winpr/stream.h> |
26 | | |
27 | 0 | #define ER_TAG_MASK 0x1F |
28 | | |
29 | | enum |
30 | | { |
31 | | ER_TAG_BOOLEAN = 0x01, |
32 | | ER_TAG_INTEGER = 0x02, |
33 | | ER_TAG_BIT_STRING = 0x03, |
34 | | ER_TAG_OCTET_STRING = 0x04, |
35 | | ER_TAG_NULL = 0x05, |
36 | | ER_TAG_OBJECT_IDENTIFIER = 0x06, |
37 | | ER_TAG_ENUMERATED = 0x0A, |
38 | | ER_TAG_UTF8STRING = 0x0C, |
39 | | ER_TAG_PRINTABLE_STRING = 0x13, |
40 | | ER_TAG_IA5STRING = 0x16, |
41 | | ER_TAG_UTCTIME = 0x17, |
42 | | ER_TAG_GENERAL_STRING = 0x1B, |
43 | | ER_TAG_GENERALIZED_TIME = 0x18, |
44 | | |
45 | | ER_TAG_APP = 0x60, |
46 | | ER_TAG_SEQUENCE = 0x30, |
47 | | ER_TAG_SEQUENCE_OF = 0x30, |
48 | | ER_TAG_SET = 0x31, |
49 | | ER_TAG_SET_OF = 0x31, |
50 | | |
51 | | ER_TAG_CONTEXTUAL = 0xA0 |
52 | | }; |
53 | | |
54 | | /** @brief rules for encoding */ |
55 | | typedef enum |
56 | | { |
57 | | WINPR_ASN1_BER, |
58 | | WINPR_ASN1_DER |
59 | | } WinPrAsn1EncodingRule; |
60 | | |
61 | | typedef struct WinPrAsn1Encoder WinPrAsn1Encoder; |
62 | | |
63 | | struct WinPrAsn1Decoder |
64 | | { |
65 | | WinPrAsn1EncodingRule encoding; |
66 | | wStream source; |
67 | | }; |
68 | | |
69 | | typedef struct WinPrAsn1Decoder WinPrAsn1Decoder; |
70 | | |
71 | | /** @brief helper initializing a \b WinPrAsn1Decoder context |
72 | | * |
73 | | * @return The initialized context |
74 | | * @since version 3.24.0 |
75 | | */ |
76 | | static inline WinPrAsn1Decoder WinPrAsn1Decoder_init(void) |
77 | 0 | { |
78 | 0 | const wStream stream = Stream_Init(); |
79 | 0 | const WinPrAsn1Decoder empty = { WINPR_ASN1_BER, stream }; |
80 | 0 | return empty; |
81 | 0 | } Unexecuted instantiation: nla.c:WinPrAsn1Decoder_init Unexecuted instantiation: asn1.c:WinPrAsn1Decoder_init Unexecuted instantiation: sspi_winpr.c:WinPrAsn1Decoder_init Unexecuted instantiation: sspi.c:WinPrAsn1Decoder_init Unexecuted instantiation: ncrypt_pkcs11.c:WinPrAsn1Decoder_init Unexecuted instantiation: credssp.c:WinPrAsn1Decoder_init Unexecuted instantiation: ntlm.c:WinPrAsn1Decoder_init Unexecuted instantiation: kerberos.c:WinPrAsn1Decoder_init Unexecuted instantiation: negotiate.c:WinPrAsn1Decoder_init Unexecuted instantiation: schannel.c:WinPrAsn1Decoder_init Unexecuted instantiation: sspi_gss.c:WinPrAsn1Decoder_init Unexecuted instantiation: ntlm_message.c:WinPrAsn1Decoder_init Unexecuted instantiation: schannel_openssl.c:WinPrAsn1Decoder_init Unexecuted instantiation: ntlm_av_pairs.c:WinPrAsn1Decoder_init Unexecuted instantiation: ntlm_compute.c:WinPrAsn1Decoder_init |
82 | | |
83 | | typedef BYTE WinPrAsn1_tag; |
84 | | typedef BYTE WinPrAsn1_tagId; |
85 | | typedef BOOL WinPrAsn1_BOOL; |
86 | | typedef INT32 WinPrAsn1_INTEGER; |
87 | | typedef INT32 WinPrAsn1_ENUMERATED; |
88 | | typedef char* WinPrAsn1_STRING; |
89 | | typedef char* WinPrAsn1_IA5STRING; |
90 | | typedef struct |
91 | | { |
92 | | size_t len; |
93 | | BYTE* data; |
94 | | } WinPrAsn1_MemoryChunk; |
95 | | |
96 | | typedef WinPrAsn1_MemoryChunk WinPrAsn1_OID; |
97 | | typedef WinPrAsn1_MemoryChunk WinPrAsn1_OctetString; |
98 | | |
99 | | typedef struct |
100 | | { |
101 | | UINT16 year; |
102 | | UINT8 month; |
103 | | UINT8 day; |
104 | | UINT8 hour; |
105 | | UINT8 minute; |
106 | | UINT8 second; |
107 | | char tz; |
108 | | } WinPrAsn1_UTCTIME; |
109 | | |
110 | | #ifdef __cplusplus |
111 | | extern "C" |
112 | | { |
113 | | #endif /* __cplusplus */ |
114 | | |
115 | | WINPR_API void WinPrAsn1FreeOID(WinPrAsn1_OID* poid); |
116 | | WINPR_API void WinPrAsn1FreeOctetString(WinPrAsn1_OctetString* octets); |
117 | | |
118 | | /* decoder functions */ |
119 | | |
120 | | WINPR_API void WinPrAsn1Decoder_Init(WinPrAsn1Decoder* dec, WinPrAsn1EncodingRule encoding, |
121 | | wStream* source); |
122 | | WINPR_API void WinPrAsn1Decoder_InitMem(WinPrAsn1Decoder* dec, WinPrAsn1EncodingRule encoding, |
123 | | const BYTE* source, size_t len); |
124 | | |
125 | | WINPR_API BOOL WinPrAsn1DecPeekTag(WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag); |
126 | | WINPR_API size_t WinPrAsn1DecReadTagAndLen(WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag, |
127 | | size_t* len); |
128 | | WINPR_API size_t WinPrAsn1DecPeekTagAndLen(WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag, |
129 | | size_t* len); |
130 | | WINPR_API size_t WinPrAsn1DecReadTagLenValue(WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag, |
131 | | size_t* len, WinPrAsn1Decoder* value); |
132 | | WINPR_API size_t WinPrAsn1DecReadBoolean(WinPrAsn1Decoder* dec, WinPrAsn1_BOOL* target); |
133 | | WINPR_API size_t WinPrAsn1DecReadInteger(WinPrAsn1Decoder* dec, WinPrAsn1_INTEGER* target); |
134 | | WINPR_API size_t WinPrAsn1DecReadEnumerated(WinPrAsn1Decoder* dec, |
135 | | WinPrAsn1_ENUMERATED* target); |
136 | | WINPR_API size_t WinPrAsn1DecReadOID(WinPrAsn1Decoder* dec, WinPrAsn1_OID* target, |
137 | | BOOL allocate); |
138 | | WINPR_API size_t WinPrAsn1DecReadOctetString(WinPrAsn1Decoder* dec, |
139 | | WinPrAsn1_OctetString* target, BOOL allocate); |
140 | | WINPR_API size_t WinPrAsn1DecReadIA5String(WinPrAsn1Decoder* dec, WinPrAsn1_IA5STRING* target); |
141 | | WINPR_API size_t WinPrAsn1DecReadGeneralString(WinPrAsn1Decoder* dec, WinPrAsn1_STRING* target); |
142 | | WINPR_API size_t WinPrAsn1DecReadUtcTime(WinPrAsn1Decoder* dec, WinPrAsn1_UTCTIME* target); |
143 | | WINPR_API size_t WinPrAsn1DecReadNull(WinPrAsn1Decoder* dec); |
144 | | |
145 | | WINPR_API size_t WinPrAsn1DecReadApp(WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId, |
146 | | WinPrAsn1Decoder* setDec); |
147 | | WINPR_API size_t WinPrAsn1DecReadSequence(WinPrAsn1Decoder* dec, WinPrAsn1Decoder* seqDec); |
148 | | WINPR_API size_t WinPrAsn1DecReadSet(WinPrAsn1Decoder* dec, WinPrAsn1Decoder* setDec); |
149 | | |
150 | | WINPR_API size_t WinPrAsn1DecReadContextualTag(WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId, |
151 | | WinPrAsn1Decoder* ctxtDec); |
152 | | WINPR_API size_t WinPrAsn1DecPeekContextualTag(WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId, |
153 | | WinPrAsn1Decoder* ctxtDec); |
154 | | |
155 | | WINPR_API size_t WinPrAsn1DecReadContextualBool(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId, |
156 | | BOOL* error, WinPrAsn1_BOOL* target); |
157 | | WINPR_API size_t WinPrAsn1DecReadContextualInteger(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId, |
158 | | BOOL* error, WinPrAsn1_INTEGER* target); |
159 | | WINPR_API size_t WinPrAsn1DecReadContextualOID(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId, |
160 | | BOOL* error, WinPrAsn1_OID* target, |
161 | | BOOL allocate); |
162 | | WINPR_API size_t WinPrAsn1DecReadContextualOctetString(WinPrAsn1Decoder* dec, |
163 | | WinPrAsn1_tagId tagId, BOOL* error, |
164 | | WinPrAsn1_OctetString* target, |
165 | | BOOL allocate); |
166 | | WINPR_API size_t WinPrAsn1DecReadContextualSequence(WinPrAsn1Decoder* dec, |
167 | | WinPrAsn1_tagId tagId, BOOL* error, |
168 | | WinPrAsn1Decoder* target); |
169 | | WINPR_API wStream WinPrAsn1DecGetStream(WinPrAsn1Decoder* dec); |
170 | | |
171 | | /* encoder functions */ |
172 | | |
173 | | WINPR_API void WinPrAsn1Encoder_Free(WinPrAsn1Encoder** penc); |
174 | | WINPR_API WinPrAsn1Encoder* WinPrAsn1Encoder_New(WinPrAsn1EncodingRule encoding); |
175 | | |
176 | | WINPR_API void WinPrAsn1Encoder_Reset(WinPrAsn1Encoder* enc); |
177 | | |
178 | | WINPR_API BOOL WinPrAsn1EncAppContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId); |
179 | | WINPR_API BOOL WinPrAsn1EncSeqContainer(WinPrAsn1Encoder* enc); |
180 | | WINPR_API BOOL WinPrAsn1EncContextualSeqContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId); |
181 | | WINPR_API BOOL WinPrAsn1EncSetContainer(WinPrAsn1Encoder* enc); |
182 | | WINPR_API BOOL WinPrAsn1EncContextualSetContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId); |
183 | | WINPR_API BOOL WinPrAsn1EncContextualContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId); |
184 | | WINPR_API BOOL WinPrAsn1EncOctetStringContainer(WinPrAsn1Encoder* enc); |
185 | | WINPR_API BOOL WinPrAsn1EncContextualOctetStringContainer(WinPrAsn1Encoder* enc, |
186 | | WinPrAsn1_tagId tagId); |
187 | | WINPR_API size_t WinPrAsn1EncEndContainer(WinPrAsn1Encoder* enc); |
188 | | |
189 | | WINPR_API size_t WinPrAsn1EncRawContent(WinPrAsn1Encoder* enc, const WinPrAsn1_MemoryChunk* c); |
190 | | WINPR_API size_t WinPrAsn1EncContextualRawContent(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId, |
191 | | const WinPrAsn1_MemoryChunk* c); |
192 | | WINPR_API size_t WinPrAsn1EncInteger(WinPrAsn1Encoder* enc, WinPrAsn1_INTEGER integer); |
193 | | WINPR_API size_t WinPrAsn1EncContextualInteger(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId, |
194 | | WinPrAsn1_INTEGER integer); |
195 | | WINPR_API size_t WinPrAsn1EncBoolean(WinPrAsn1Encoder* enc, WinPrAsn1_BOOL b); |
196 | | WINPR_API size_t WinPrAsn1EncContextualBoolean(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId, |
197 | | WinPrAsn1_BOOL b); |
198 | | WINPR_API size_t WinPrAsn1EncEnumerated(WinPrAsn1Encoder* enc, WinPrAsn1_ENUMERATED e); |
199 | | WINPR_API size_t WinPrAsn1EncContextualEnumerated(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId, |
200 | | WinPrAsn1_ENUMERATED e); |
201 | | |
202 | | WINPR_API size_t WinPrAsn1EncOID(WinPrAsn1Encoder* enc, const WinPrAsn1_OID* oid); |
203 | | WINPR_API size_t WinPrAsn1EncContextualOID(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId, |
204 | | const WinPrAsn1_OID* oid); |
205 | | WINPR_API size_t WinPrAsn1EncOctetString(WinPrAsn1Encoder* enc, |
206 | | const WinPrAsn1_OctetString* octetstring); |
207 | | WINPR_API size_t WinPrAsn1EncContextualOctetString(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId, |
208 | | const WinPrAsn1_OctetString* octetstring); |
209 | | WINPR_API size_t WinPrAsn1EncIA5String(WinPrAsn1Encoder* enc, WinPrAsn1_IA5STRING ia5); |
210 | | WINPR_API size_t WinPrAsn1EncGeneralString(WinPrAsn1Encoder* enc, WinPrAsn1_STRING str); |
211 | | WINPR_API size_t WinPrAsn1EncContextualIA5String(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId, |
212 | | WinPrAsn1_IA5STRING ia5); |
213 | | WINPR_API size_t WinPrAsn1EncUtcTime(WinPrAsn1Encoder* enc, const WinPrAsn1_UTCTIME* utc); |
214 | | WINPR_API size_t WinPrAsn1EncContextualUtcTime(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId, |
215 | | const WinPrAsn1_UTCTIME* utc); |
216 | | |
217 | | WINPR_API BOOL WinPrAsn1EncStreamSize(WinPrAsn1Encoder* enc, size_t* s); |
218 | | WINPR_API BOOL WinPrAsn1EncToStream(WinPrAsn1Encoder* enc, wStream* s); |
219 | | |
220 | | #ifdef __cplusplus |
221 | | } |
222 | | #endif /* __cplusplus */ |
223 | | |
224 | | #endif /* WINPR_ASN1_H_ */ |