2001-02-21 19:22:35 +00:00
|
|
|
/* $Id$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "asn1.h"
|
|
|
|
|
|
|
|
int ParseTag(u_char *p, u_char *end, int *tag)
|
|
|
|
{
|
|
|
|
*tag = *p;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ParseLen(u_char *p, u_char *end, int *len)
|
|
|
|
{
|
|
|
|
int l, i;
|
|
|
|
|
|
|
|
if (*p == 0x80) { // indefinite
|
|
|
|
*len = -1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (!(*p & 0x80)) { // one byte
|
|
|
|
*len = *p;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
*len = 0;
|
|
|
|
l = *p & ~0x80;
|
|
|
|
p++;
|
|
|
|
for (i = 0; i < l; i++) {
|
|
|
|
*len = (*len << 8) + *p;
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
return l+1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
ParseASN1(u_char *p, u_char *end, int level)
|
|
|
|
{
|
|
|
|
int tag, len;
|
|
|
|
int ret;
|
|
|
|
int j;
|
|
|
|
u_char *tag_end, *beg;
|
|
|
|
|
|
|
|
beg = p;
|
|
|
|
|
|
|
|
CallASN1(ret, p, end, ParseTag(p, end, &tag));
|
|
|
|
CallASN1(ret, p, end, ParseLen(p, end, &len));
|
|
|
|
#ifdef ASN1_DEBUG
|
2003-11-09 09:12:28 +00:00
|
|
|
for (j = 0; j < level*5; j++) print_asn1msg(PRT_DEBUG_DECODE, " ");
|
|
|
|
print_asn1msg(PRT_DEBUG_DECODE, "TAG 0x%02x LEN %3d\n", tag, len);
|
2001-02-21 19:22:35 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
if (tag & ASN1_TAG_CONSTRUCTED) {
|
|
|
|
if (len == -1) { // indefinite
|
|
|
|
while (*p) {
|
|
|
|
CallASN1(ret, p, end, ParseASN1(p, end, level + 1));
|
|
|
|
}
|
|
|
|
p++;
|
|
|
|
if (*p)
|
|
|
|
return -1;
|
|
|
|
p++;
|
|
|
|
} else {
|
|
|
|
tag_end = p + len;
|
|
|
|
while (p < tag_end) {
|
|
|
|
CallASN1(ret, p, end, ParseASN1(p, end, level +1));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2003-11-09 09:12:28 +00:00
|
|
|
for (j = 0; j < level*5; j++) print_asn1msg(PRT_DEBUG_DECODE, " ");
|
2001-02-21 19:22:35 +00:00
|
|
|
while (len--) {
|
2003-11-09 09:12:28 +00:00
|
|
|
print_asn1msg(PRT_DEBUG_DECODE, "%02x ", *p);
|
2001-02-21 19:22:35 +00:00
|
|
|
p++;
|
|
|
|
}
|
2003-11-09 09:12:28 +00:00
|
|
|
print_asn1msg(PRT_DEBUG_DECODE, "\n");
|
2001-02-21 19:22:35 +00:00
|
|
|
}
|
2003-11-09 09:12:28 +00:00
|
|
|
for (j = 0; j < level*5; j++) print_asn1msg(PRT_DEBUG_DECODE, " ");
|
|
|
|
print_asn1msg(PRT_DEBUG_DECODE, "END (%d)\n", p - beg - 2);
|
2001-02-21 19:22:35 +00:00
|
|
|
return p - beg;
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
u_char data[] = {"\xA2\x03\x02\x01\xA3"};
|
|
|
|
#endif
|
|
|
|
#if 0 // ActNotDiv
|
|
|
|
u_char data[] = {"\xA1\x2C\x02\x01\x7E\x02\x01\x09\x30\x24\x0A"
|
|
|
|
"\x01\x02\x0A\x01\x03\x30\x0C\x80\x0A\x30\x31"
|
|
|
|
"\x33\x30\x31\x34\x34\x37\x37\x30\xA1\x0E\x0A"
|
|
|
|
"\x01\x02\x12\x09\x32\x31\x31\x33\x34\x31\x38\x33\x30"};
|
|
|
|
#endif
|
|
|
|
#if 0 // ActDiv
|
|
|
|
u_char data[] = {"\xA1\x24\x02\x01\xA1\x02\x01\x07\x30\x1C\x0A"
|
|
|
|
"\x01\x02\x0A\x01\x01\x30\x0C\x80\x0A\x30"
|
|
|
|
"\x31\x33\x30\x31\x34\x34\x37\x37\x30\x80"
|
|
|
|
"\x06\x33\x34\x31\x38\x33\x30"};
|
|
|
|
#endif
|
|
|
|
#if 0 // DeactNotDiv
|
|
|
|
u_char data[] = {"\xA1\x1E\x02\x01\x08\x02\x01\x0A\x30\x16\x0A"
|
|
|
|
"\x01\x02\x0A\x01\x03\xA1\x0E\x0A\x01\x02\x12"
|
|
|
|
"\x09\x32\x31\x31\x33\x34\x31\x38\x33\x30"};
|
|
|
|
#endif
|
|
|
|
#if 1 // DeactDiv
|
|
|
|
u_char data[] = {"\xA1\x16\x02\x01\xB1\x02\x01\x08\x30\x0E\x0A"
|
|
|
|
"\x01\x02\x0A\x01\x01\x80\x06\x33\x34\x31\x38\x33\x30"};
|
|
|
|
#endif
|
|
|
|
#if 0 // AOCE, 0 Einheiten
|
|
|
|
u_char data[] = {"\xA1\x15\x02\x02\x00\xDC\x02\x01\x24\x30\x0C"
|
|
|
|
"\x30\x0A\xA1\x05\x30\x03\x02\x01\x00\x82\x01\x00"};
|
|
|
|
#endif
|
|
|
|
#if 0 // AOCE, 1 Einheit
|
|
|
|
u_char data[] = {"\xA1\x15\x02\x02\x00\xBC\x02\x01\x24\x30\x0C\x30"
|
|
|
|
"\x0A\xA1\x05\x30\x03\x02\x01\x01\x82\x01\x00"};
|
|
|
|
#endif
|
|
|
|
#if 0 // AOCD currency
|
|
|
|
u_char data[] = {"\xA1\x1A\x02\x02\x1C\x65\x02\x01\x21\x30\x11\xA1\x0C\x81\x02\x44\x4D\xA2\x06\x81\x01\x18\x82\x01\x01\x82\x01\x00"};
|
|
|
|
#endif
|
|
|
|
u_char *end = data + 47;
|
|
|
|
|
|
|
|
#include "asn1_component.h"
|
|
|
|
|
|
|
|
void
|
|
|
|
main()
|
|
|
|
{
|
|
|
|
struct Aoc chan;
|
|
|
|
|
|
|
|
#ifdef ASN1_DEBUG
|
|
|
|
ParseASN1(data, end, 0);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
ParseComponent(&chan, data, end);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|