33#ifndef DER_DECODE_ENABLE
34#error Please define DER_DECODE_ENABLE.
39#define DER_DECODE_DEBUG 0
42#define derDecDbg(a) printf(a)
43#define derDecDbg1(a, b) printf(a, b)
44#define derDecDbg2(a, b, c) printf(a, b, c)
45#define derDecDbg3(a, b, c, d) printf(a, b, c, d)
48#define derDecDbg1(a, b)
49#define derDecDbg2(a, b, c)
50#define derDecDbg3(a, b, c, d)
83 tagNumber = tag1 & 0x1F;
84 if(tagNumber == 0x1F) {
85#ifdef DER_MULTIBYTE_TAGS
92 if(derLen < 2 || (tagNumber & overflowMask) != 0) {
97 tagNumber = (tagNumber << 7) | (tagByte & 0x7F);
98 }
while((tagByte & 0x80) != 0);
101 if ((tagNumber & (overflowMask << 4)) != 0)
106 decoded->
tag = ((
DERTag)(tag1 & 0xE0) << ((
sizeof(
DERTag) - 1) * 8)) | tagNumber;
117 if((len1 >
sizeof(
DERSize)) || (len1 > derLen)) {
121 for(dex=0; dex<len1; dex++) {
123 longLen |= *derPtr++;
126 if(longLen > derLen) {
155 if(contents->
length < 2) {
158 bitStringBytes->
data = NULL;
159 bitStringBytes->
length = 0;
162 *numUnusedBits = contents->
data[0];
163 bitStringBytes->
data = contents->
data + 1;
176 if (contents->
length == 0) {
177 *
value = defaultValue;
180 if (contents->
length != 1 ||
181 (contents->
data[0] != 0 && contents->
data[0] != 0xFF))
195 for (ix = 0; ix < length; ++ix) {
225 switch(decoded.
tag) {
299 numItems, itemSpecs, dest, sizeToZero);
325 for(itemDex=0 ; itemDex<numItems; ) {
341 for(i=itemDex; i<numItems; i++) {
360 foundTag = currDecoded.
tag;
363 for(i=itemDex; i<numItems; i++) {
366 derDecDbg3(
"--- currItem %u expectTag 0x%x currOptions 0x%x\n",
367 i, currItemSpec->
tag, currOptions);
370 (foundTag == currItemSpec->
tag)) {
382 derDecDbg1(
"--- SAVE_DER at currItem %u\n", i);
392 if(itemDex == numItems) {
408 derDecDbg1(
"--- MISMATCH at currItem %u, !OPTIONAL, abort\n", i);
415 if(foundMatch == 0) {
458 numItems, itemSpecs, dest, sizeToZero);
483 return DERParseSetOrSequenceOfContent(&topDecode.
content,
484 numItems, itemSpecs, dest, numDestItems);
492 void *itemHandelerContext);
498 require_noerr_quiet(drtn, badCert);
516 require_noerr_quiet(drtn, badCert);
521 foundTag = currDecoded.
tag;
532 derDecDbg1(
"--- SAVE_DER at currItem %u\n", i);
541 if(itemDex == numItems) {
556 derDecDbg1(
"--- MISMATCH at currItem %u, !OPTIONAL, abort\n", i);
563 if(foundMatch == 0) {
DERReturn DERParseSequenceContent(const DERItem *content, DERShort numItems, const DERItemSpec *itemSpecs, void *dest, DERSize sizeToZero)
DERReturn DERDecodeSeqInit(const DERItem *der, DERTag *tag, DERSequence *derSeq)
DERReturn DERDecodeSeqNext(DERSequence *derSeq, DERDecodedInfo *decoded)
DERReturn DERDecodeSeqContentInit(const DERItem *content, DERSequence *derSeq)
DERReturn DERDecodeItem(const DERItem *der, DERDecodedInfo *decoded)
DERReturn DERParseBitString(const DERItem *contents, DERItem *bitStringBytes, DERByte *numUnusedBits)
DERReturn DERParseInteger(const DERItem *contents, uint32_t *result)
#define derDecDbg3(a, b, c, d)
DERReturn DERParseSequence(const DERItem *der, DERShort numItems, const DERItemSpec *itemSpecs, void *dest, DERSize sizeToZero)
DERReturn DERParseBoolean(const DERItem *contents, bool defaultValue, bool *value)
#define ASN1_CONSTR_SEQUENCE
#define DERMemset(ptr, c, len)