Coverage Report

Created: 2026-05-11 06:56

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
33.2k
#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
WINPR_ATTR_NODISCARD
77
static inline WinPrAsn1Decoder WinPrAsn1Decoder_init(void)
78
95.8k
{
79
95.8k
  const wStream stream = Stream_Init();
80
95.8k
  const WinPrAsn1Decoder empty = { WINPR_ASN1_BER, stream };
81
95.8k
  return empty;
82
95.8k
}
TestFuzzCredSSP_Asn1.c:WinPrAsn1Decoder_init
Line
Count
Source
78
95.8k
{
79
95.8k
  const wStream stream = Stream_Init();
80
95.8k
  const WinPrAsn1Decoder empty = { WINPR_ASN1_BER, stream };
81
95.8k
  return empty;
82
95.8k
}
Unexecuted instantiation: asn1.c:WinPrAsn1Decoder_init
83
84
typedef BYTE WinPrAsn1_tag;
85
typedef BYTE WinPrAsn1_tagId;
86
typedef BOOL WinPrAsn1_BOOL;
87
typedef INT32 WinPrAsn1_INTEGER;
88
typedef INT32 WinPrAsn1_ENUMERATED;
89
typedef char* WinPrAsn1_STRING;
90
typedef char* WinPrAsn1_IA5STRING;
91
typedef struct
92
{
93
  size_t len;
94
  BYTE* data;
95
} WinPrAsn1_MemoryChunk;
96
97
typedef WinPrAsn1_MemoryChunk WinPrAsn1_OID;
98
typedef WinPrAsn1_MemoryChunk WinPrAsn1_OctetString;
99
100
typedef struct
101
{
102
  UINT16 year;
103
  UINT8 month;
104
  UINT8 day;
105
  UINT8 hour;
106
  UINT8 minute;
107
  UINT8 second;
108
  char tz;
109
} WinPrAsn1_UTCTIME;
110
111
#ifdef __cplusplus
112
extern "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
218
  /** @brief A free function for \ref WinPrAsn1Encoder instances. Does not set the pointer to
219
   * NULL.
220
   *
221
   *  @param penc A pointer to the instance to free
222
   *  @version since 3.24.0
223
   */
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_ */