11#include <winpr/wlog.h>
18 WinPrAsn1_tag tag = 0;
24 if (WinPrAsn1DecReadTagLenValue(decoder, &tag, &len, &inner) == 0)
27 switch (tag & ER_TAG_MASK)
31 WinPrAsn1_BOOL value = 0;
32 (void)WinPrAsn1DecReadBoolean(&inner, &value);
37 WinPrAsn1_INTEGER value = 0;
38 (void)WinPrAsn1DecReadInteger(&inner, &value);
41 case ER_TAG_OCTET_STRING:
44 if (WinPrAsn1DecReadOctetString(&inner, &value, TRUE))
45 WinPrAsn1FreeOctetString(&value);
48 case ER_TAG_OBJECT_IDENTIFIER:
51 if (WinPrAsn1DecReadOID(&inner, &value, TRUE))
52 WinPrAsn1FreeOID(&value);
55 case ER_TAG_ENUMERATED:
57 WinPrAsn1_ENUMERATED value = 0;
58 (void)WinPrAsn1DecReadEnumerated(&inner, &value);
64 (void)WinPrAsn1DecReadUtcTime(&inner, &value);
67 case ER_TAG_IA5STRING:
69 WinPrAsn1_IA5STRING value =
nullptr;
70 (void)WinPrAsn1DecReadIA5String(&inner, &value);
75 (void)WinPrAsn1DecReadNull(&inner);
81 if ((tag == ER_TAG_SEQUENCE) || (tag == ER_TAG_SET))
82 fuzz_walk_sequence(&inner, depth + 1);
83 else if ((tag & 0xC0) == 0x80)
84 fuzz_walk_sequence(&inner, depth + 1);
92 for (
size_t index = 0; index < 64; index++)
94 WinPrAsn1_tag tag = 0;
96 if (!WinPrAsn1DecPeekTag(outer, &tag))
99 fuzz_consume_one(outer, depth);
103int LLVMFuzzerTestOneInput(
const uint8_t* data,
size_t size)
105 static BOOL loggingInitialized = FALSE;
107 if (!loggingInitialized)
109 (void)WLog_SetLogLevel(WLog_GetRoot(), WLOG_TRACE);
110 loggingInitialized = TRUE;
113 if ((size == 0) || (size > (1u << 20)))
118 WinPrAsn1Decoder_InitMem(&decoder, WINPR_ASN1_DER, data, size);
119 fuzz_walk_sequence(&decoder, 0);
124 WinPrAsn1Decoder_InitMem(&decoder, WINPR_ASN1_BER, data, size);
125 fuzz_walk_sequence(&decoder, 0);
132 WinPrAsn1Decoder_InitMem(&decoder, WINPR_ASN1_DER, data, size);
133 if (WinPrAsn1DecReadSequence(&decoder, &sequence))
134 fuzz_walk_sequence(&sequence, 1);