FreeRDP
Loading...
Searching...
No Matches
asn1.h
1
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#define ER_TAG_MASK 0x1F
28
29enum
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
55typedef enum
56{
57 WINPR_ASN1_BER,
58 WINPR_ASN1_DER
59} WinPrAsn1EncodingRule;
60
61typedef struct WinPrAsn1Encoder WinPrAsn1Encoder;
62
64{
65 WinPrAsn1EncodingRule encoding;
66 wStream source;
67};
68
70
76WINPR_ATTR_NODISCARD
77static inline WinPrAsn1Decoder WinPrAsn1Decoder_init(void)
78{
79 const wStream stream = Stream_Init();
80 const WinPrAsn1Decoder empty = { WINPR_ASN1_BER, stream };
81 return empty;
82}
83
84typedef BYTE WinPrAsn1_tag;
85typedef BYTE WinPrAsn1_tagId;
86typedef BOOL WinPrAsn1_BOOL;
87typedef INT32 WinPrAsn1_INTEGER;
88typedef INT32 WinPrAsn1_ENUMERATED;
89typedef char* WinPrAsn1_STRING;
90typedef char* WinPrAsn1_IA5STRING;
91typedef struct
92{
93 size_t len;
94 BYTE* data;
96
99
100typedef struct
101{
102 UINT16 year;
103 UINT8 month;
104 UINT8 day;
105 UINT8 hour;
106 UINT8 minute;
107 UINT8 second;
108 char tz;
110
111#ifdef __cplusplus
112extern "C"
113{
114#endif /* __cplusplus */
115
116 WINPR_API void WinPrAsn1FreeOID(WinPrAsn1_OID* poid);
117 WINPR_API void WinPrAsn1FreeOctetString(WinPrAsn1_OctetString* octets);
118
119 /* decoder functions */
120
121 WINPR_API void WinPrAsn1Decoder_Init(WinPrAsn1Decoder* dec, WinPrAsn1EncodingRule encoding,
122 wStream* source);
123 WINPR_API void WinPrAsn1Decoder_InitMem(WinPrAsn1Decoder* dec, WinPrAsn1EncodingRule encoding,
124 const BYTE* source, size_t len);
125
126 WINPR_ATTR_NODISCARD
127 WINPR_API BOOL WinPrAsn1DecPeekTag(WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag);
128
129 WINPR_ATTR_NODISCARD
130 WINPR_API size_t WinPrAsn1DecReadTagAndLen(WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag,
131 size_t* len);
132
133 WINPR_ATTR_NODISCARD
134 WINPR_API size_t WinPrAsn1DecPeekTagAndLen(WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag,
135 size_t* len);
136
137 WINPR_ATTR_NODISCARD
138 WINPR_API size_t WinPrAsn1DecReadTagLenValue(WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag,
139 size_t* len, WinPrAsn1Decoder* value);
140
141 WINPR_ATTR_NODISCARD
142 WINPR_API size_t WinPrAsn1DecReadBoolean(WinPrAsn1Decoder* dec, WinPrAsn1_BOOL* target);
143
144 WINPR_ATTR_NODISCARD
145 WINPR_API size_t WinPrAsn1DecReadInteger(WinPrAsn1Decoder* dec, WinPrAsn1_INTEGER* target);
146
147 WINPR_ATTR_NODISCARD
148 WINPR_API size_t WinPrAsn1DecReadEnumerated(WinPrAsn1Decoder* dec,
149 WinPrAsn1_ENUMERATED* target);
150
151 WINPR_ATTR_NODISCARD
152 WINPR_API size_t WinPrAsn1DecReadOID(WinPrAsn1Decoder* dec, WinPrAsn1_OID* target,
153 BOOL allocate);
154
155 WINPR_ATTR_NODISCARD
156 WINPR_API size_t WinPrAsn1DecReadOctetString(WinPrAsn1Decoder* dec,
157 WinPrAsn1_OctetString* target, BOOL allocate);
158
159 WINPR_ATTR_NODISCARD
160 WINPR_API size_t WinPrAsn1DecReadIA5String(WinPrAsn1Decoder* dec, WinPrAsn1_IA5STRING* target);
161
162 WINPR_ATTR_NODISCARD
163 WINPR_API size_t WinPrAsn1DecReadGeneralString(WinPrAsn1Decoder* dec, WinPrAsn1_STRING* target);
164
165 WINPR_ATTR_NODISCARD
166 WINPR_API size_t WinPrAsn1DecReadUtcTime(WinPrAsn1Decoder* dec, WinPrAsn1_UTCTIME* target);
167
168 WINPR_ATTR_NODISCARD
169 WINPR_API size_t WinPrAsn1DecReadNull(WinPrAsn1Decoder* dec);
170
171 WINPR_ATTR_NODISCARD
172 WINPR_API size_t WinPrAsn1DecReadApp(WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId,
173 WinPrAsn1Decoder* setDec);
174
175 WINPR_ATTR_NODISCARD
176 WINPR_API size_t WinPrAsn1DecReadSequence(WinPrAsn1Decoder* dec, WinPrAsn1Decoder* seqDec);
177
178 WINPR_ATTR_NODISCARD
179 WINPR_API size_t WinPrAsn1DecReadSet(WinPrAsn1Decoder* dec, WinPrAsn1Decoder* setDec);
180
181 WINPR_ATTR_NODISCARD
182 WINPR_API size_t WinPrAsn1DecReadContextualTag(WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId,
183 WinPrAsn1Decoder* ctxtDec);
184
185 WINPR_ATTR_NODISCARD
186 WINPR_API size_t WinPrAsn1DecPeekContextualTag(WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId,
187 WinPrAsn1Decoder* ctxtDec);
188
189 WINPR_ATTR_NODISCARD
190 WINPR_API size_t WinPrAsn1DecReadContextualBool(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId,
191 BOOL* error, WinPrAsn1_BOOL* target);
192 WINPR_ATTR_NODISCARD
193 WINPR_API size_t WinPrAsn1DecReadContextualInteger(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId,
194 BOOL* error, WinPrAsn1_INTEGER* target);
195
196 WINPR_ATTR_NODISCARD
197 WINPR_API size_t WinPrAsn1DecReadContextualOID(WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId,
198 BOOL* error, WinPrAsn1_OID* target,
199 BOOL allocate);
200 WINPR_ATTR_NODISCARD
201 WINPR_API size_t WinPrAsn1DecReadContextualOctetString(WinPrAsn1Decoder* dec,
202 WinPrAsn1_tagId tagId, BOOL* error,
203 WinPrAsn1_OctetString* target,
204 BOOL allocate);
205
206 WINPR_ATTR_NODISCARD
207 WINPR_API size_t WinPrAsn1DecReadContextualSequence(WinPrAsn1Decoder* dec,
208 WinPrAsn1_tagId tagId, BOOL* error,
209 WinPrAsn1Decoder* target);
210
211 WINPR_ATTR_NODISCARD
212 WINPR_API wStream WinPrAsn1DecGetStream(WinPrAsn1Decoder* dec);
213
214 /* encoder functions */
215
216 WINPR_API void WinPrAsn1Encoder_Free(WinPrAsn1Encoder** penc);
217
224 WINPR_API void WinPrAsn1Encoder_FreeNoNull(WinPrAsn1Encoder* penc);
225
226 WINPR_ATTR_MALLOC(WinPrAsn1Encoder_FreeNoNull, 1)
227 WINPR_API WinPrAsn1Encoder* WinPrAsn1Encoder_New(WinPrAsn1EncodingRule encoding);
228
229 WINPR_API void WinPrAsn1Encoder_Reset(WinPrAsn1Encoder* enc);
230
231 WINPR_ATTR_NODISCARD
232 WINPR_API BOOL WinPrAsn1EncAppContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId);
233 WINPR_ATTR_NODISCARD
234 WINPR_API BOOL WinPrAsn1EncSeqContainer(WinPrAsn1Encoder* enc);
235
236 WINPR_ATTR_NODISCARD
237 WINPR_API BOOL WinPrAsn1EncContextualSeqContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId);
238 WINPR_ATTR_NODISCARD
239 WINPR_API BOOL WinPrAsn1EncSetContainer(WinPrAsn1Encoder* enc);
240
241 WINPR_ATTR_NODISCARD
242 WINPR_API BOOL WinPrAsn1EncContextualSetContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId);
243 WINPR_ATTR_NODISCARD
244 WINPR_API BOOL WinPrAsn1EncContextualContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId);
245 WINPR_ATTR_NODISCARD
246 WINPR_API BOOL WinPrAsn1EncOctetStringContainer(WinPrAsn1Encoder* enc);
247
248 WINPR_ATTR_NODISCARD
249 WINPR_API BOOL WinPrAsn1EncContextualOctetStringContainer(WinPrAsn1Encoder* enc,
250 WinPrAsn1_tagId tagId);
251
252 WINPR_ATTR_NODISCARD
253 WINPR_API size_t WinPrAsn1EncEndContainer(WinPrAsn1Encoder* enc);
254
255 WINPR_ATTR_NODISCARD
256 WINPR_API size_t WinPrAsn1EncRawContent(WinPrAsn1Encoder* enc, const WinPrAsn1_MemoryChunk* c);
257 WINPR_ATTR_NODISCARD
258 WINPR_API size_t WinPrAsn1EncContextualRawContent(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
259 const WinPrAsn1_MemoryChunk* c);
260
261 WINPR_ATTR_NODISCARD
262 WINPR_API size_t WinPrAsn1EncInteger(WinPrAsn1Encoder* enc, WinPrAsn1_INTEGER integer);
263 WINPR_ATTR_NODISCARD
264 WINPR_API size_t WinPrAsn1EncContextualInteger(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
265 WinPrAsn1_INTEGER integer);
266 WINPR_ATTR_NODISCARD
267 WINPR_API size_t WinPrAsn1EncBoolean(WinPrAsn1Encoder* enc, WinPrAsn1_BOOL b);
268 WINPR_ATTR_NODISCARD
269 WINPR_API size_t WinPrAsn1EncContextualBoolean(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
270 WinPrAsn1_BOOL b);
271 WINPR_ATTR_NODISCARD
272 WINPR_API size_t WinPrAsn1EncEnumerated(WinPrAsn1Encoder* enc, WinPrAsn1_ENUMERATED e);
273 WINPR_ATTR_NODISCARD
274 WINPR_API size_t WinPrAsn1EncContextualEnumerated(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
275 WinPrAsn1_ENUMERATED e);
276
277 WINPR_ATTR_NODISCARD
278 WINPR_API size_t WinPrAsn1EncOID(WinPrAsn1Encoder* enc, const WinPrAsn1_OID* oid);
279 WINPR_ATTR_NODISCARD
280 WINPR_API size_t WinPrAsn1EncContextualOID(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
281 const WinPrAsn1_OID* oid);
282 WINPR_ATTR_NODISCARD
283 WINPR_API size_t WinPrAsn1EncOctetString(WinPrAsn1Encoder* enc,
284 const WinPrAsn1_OctetString* octetstring);
285
286 WINPR_ATTR_NODISCARD
287 WINPR_API size_t WinPrAsn1EncContextualOctetString(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
288 const WinPrAsn1_OctetString* octetstring);
289
290 WINPR_ATTR_NODISCARD
291 WINPR_API size_t WinPrAsn1EncIA5String(WinPrAsn1Encoder* enc, WinPrAsn1_IA5STRING ia5);
292 WINPR_ATTR_NODISCARD
293 WINPR_API size_t WinPrAsn1EncGeneralString(WinPrAsn1Encoder* enc, WinPrAsn1_STRING str);
294 WINPR_ATTR_NODISCARD
295 WINPR_API size_t WinPrAsn1EncContextualIA5String(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
296 WinPrAsn1_IA5STRING ia5);
297 WINPR_ATTR_NODISCARD
298 WINPR_API size_t WinPrAsn1EncUtcTime(WinPrAsn1Encoder* enc, const WinPrAsn1_UTCTIME* utc);
299 WINPR_ATTR_NODISCARD
300 WINPR_API size_t WinPrAsn1EncContextualUtcTime(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
301 const WinPrAsn1_UTCTIME* utc);
302
303 WINPR_ATTR_NODISCARD
304 WINPR_API BOOL WinPrAsn1EncStreamSize(WinPrAsn1Encoder* enc, size_t* s);
305
306 WINPR_ATTR_NODISCARD
307 WINPR_API BOOL WinPrAsn1EncToStream(WinPrAsn1Encoder* enc, wStream* s);
308
309#ifdef __cplusplus
310}
311#endif /* __cplusplus */
312
313#endif /* WINPR_ASN1_H_ */