23#include <winpr/winpr.h>
24#include <winpr/wtypes.h>
25#include <winpr/stream.h>
27#define ER_TAG_MASK 0x1F
31 ER_TAG_BOOLEAN = 0x01,
32 ER_TAG_INTEGER = 0x02,
33 ER_TAG_BIT_STRING = 0x03,
34 ER_TAG_OCTET_STRING = 0x04,
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,
46 ER_TAG_SEQUENCE = 0x30,
47 ER_TAG_SEQUENCE_OF = 0x30,
51 ER_TAG_CONTEXTUAL = 0xA0
59} WinPrAsn1EncodingRule;
61typedef struct WinPrAsn1Encoder WinPrAsn1Encoder;
65 WinPrAsn1EncodingRule encoding;
79 const wStream stream = Stream_Init();
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;
121 WINPR_API
void WinPrAsn1Decoder_Init(
WinPrAsn1Decoder* dec, WinPrAsn1EncodingRule encoding,
123 WINPR_API
void WinPrAsn1Decoder_InitMem(
WinPrAsn1Decoder* dec, WinPrAsn1EncodingRule encoding,
124 const BYTE* source,
size_t len);
127 WINPR_API BOOL WinPrAsn1DecPeekTag(
WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag);
130 WINPR_API
size_t WinPrAsn1DecReadTagAndLen(
WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag,
134 WINPR_API
size_t WinPrAsn1DecPeekTagAndLen(
WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag,
138 WINPR_API
size_t WinPrAsn1DecReadTagLenValue(
WinPrAsn1Decoder* dec, WinPrAsn1_tag* tag,
142 WINPR_API
size_t WinPrAsn1DecReadBoolean(
WinPrAsn1Decoder* dec, WinPrAsn1_BOOL* target);
145 WINPR_API
size_t WinPrAsn1DecReadInteger(
WinPrAsn1Decoder* dec, WinPrAsn1_INTEGER* target);
149 WinPrAsn1_ENUMERATED* target);
160 WINPR_API
size_t WinPrAsn1DecReadIA5String(
WinPrAsn1Decoder* dec, WinPrAsn1_IA5STRING* target);
163 WINPR_API
size_t WinPrAsn1DecReadGeneralString(
WinPrAsn1Decoder* dec, WinPrAsn1_STRING* target);
172 WINPR_API
size_t WinPrAsn1DecReadApp(
WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId,
182 WINPR_API
size_t WinPrAsn1DecReadContextualTag(
WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId,
186 WINPR_API
size_t WinPrAsn1DecPeekContextualTag(
WinPrAsn1Decoder* dec, WinPrAsn1_tagId* tagId,
190 WINPR_API
size_t WinPrAsn1DecReadContextualBool(
WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId,
191 BOOL* error, WinPrAsn1_BOOL* target);
193 WINPR_API
size_t WinPrAsn1DecReadContextualInteger(
WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId,
194 BOOL* error, WinPrAsn1_INTEGER* target);
197 WINPR_API
size_t WinPrAsn1DecReadContextualOID(
WinPrAsn1Decoder* dec, WinPrAsn1_tagId tagId,
201 WINPR_API
size_t WinPrAsn1DecReadContextualOctetString(
WinPrAsn1Decoder* dec,
202 WinPrAsn1_tagId tagId, BOOL* error,
208 WinPrAsn1_tagId tagId, BOOL* error,
216 WINPR_API
void WinPrAsn1Encoder_Free(WinPrAsn1Encoder** penc);
224 WINPR_API
void WinPrAsn1Encoder_FreeNoNull(WinPrAsn1Encoder* penc);
226 WINPR_ATTR_MALLOC(WinPrAsn1Encoder_FreeNoNull, 1)
227 WINPR_API WinPrAsn1Encoder* WinPrAsn1Encoder_New(WinPrAsn1EncodingRule encoding);
229 WINPR_API
void WinPrAsn1Encoder_Reset(WinPrAsn1Encoder* enc);
232 WINPR_API BOOL WinPrAsn1EncAppContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId);
234 WINPR_API BOOL WinPrAsn1EncSeqContainer(WinPrAsn1Encoder* enc);
237 WINPR_API BOOL WinPrAsn1EncContextualSeqContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId);
239 WINPR_API BOOL WinPrAsn1EncSetContainer(WinPrAsn1Encoder* enc);
242 WINPR_API BOOL WinPrAsn1EncContextualSetContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId);
244 WINPR_API BOOL WinPrAsn1EncContextualContainer(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId);
246 WINPR_API BOOL WinPrAsn1EncOctetStringContainer(WinPrAsn1Encoder* enc);
249 WINPR_API BOOL WinPrAsn1EncContextualOctetStringContainer(WinPrAsn1Encoder* enc,
250 WinPrAsn1_tagId tagId);
253 WINPR_API
size_t WinPrAsn1EncEndContainer(WinPrAsn1Encoder* enc);
258 WINPR_API
size_t WinPrAsn1EncContextualRawContent(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
262 WINPR_API
size_t WinPrAsn1EncInteger(WinPrAsn1Encoder* enc, WinPrAsn1_INTEGER integer);
264 WINPR_API
size_t WinPrAsn1EncContextualInteger(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
265 WinPrAsn1_INTEGER integer);
267 WINPR_API
size_t WinPrAsn1EncBoolean(WinPrAsn1Encoder* enc, WinPrAsn1_BOOL b);
269 WINPR_API
size_t WinPrAsn1EncContextualBoolean(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
272 WINPR_API
size_t WinPrAsn1EncEnumerated(WinPrAsn1Encoder* enc, WinPrAsn1_ENUMERATED e);
274 WINPR_API
size_t WinPrAsn1EncContextualEnumerated(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
275 WinPrAsn1_ENUMERATED e);
278 WINPR_API
size_t WinPrAsn1EncOID(WinPrAsn1Encoder* enc, const
WinPrAsn1_OID* oid);
280 WINPR_API
size_t WinPrAsn1EncContextualOID(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
283 WINPR_API
size_t WinPrAsn1EncOctetString(WinPrAsn1Encoder* enc,
287 WINPR_API
size_t WinPrAsn1EncContextualOctetString(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
291 WINPR_API
size_t WinPrAsn1EncIA5String(WinPrAsn1Encoder* enc, WinPrAsn1_IA5STRING ia5);
293 WINPR_API
size_t WinPrAsn1EncGeneralString(WinPrAsn1Encoder* enc, WinPrAsn1_STRING str);
295 WINPR_API
size_t WinPrAsn1EncContextualIA5String(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
296 WinPrAsn1_IA5STRING ia5);
298 WINPR_API
size_t WinPrAsn1EncUtcTime(WinPrAsn1Encoder* enc, const
WinPrAsn1_UTCTIME* utc);
300 WINPR_API
size_t WinPrAsn1EncContextualUtcTime(WinPrAsn1Encoder* enc, WinPrAsn1_tagId tagId,
304 WINPR_API BOOL WinPrAsn1EncStreamSize(WinPrAsn1Encoder* enc,
size_t* s);
307 WINPR_API BOOL WinPrAsn1EncToStream(WinPrAsn1Encoder* enc,
wStream* s);