Coverage Report

Created: 2026-02-26 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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_ */