00001
00007 #include "asn1_node.h"
00008
00009
00010 const char* _ASN1_NODE_CLASS[] =
00011 {
00012 "UNIVERSAL",
00013 "APPLICATION",
00014 "CONTEXT-DEFINED",
00015 "PRIVATE"
00016 };
00017
00018
00019 const char* _ASN1_NODE_CONST[] =
00020 {
00021 "PRIMITIVE",
00022 "CONSTRUCTED"
00023 };
00024
00025
00026 const char* _ASN1_NODE_TAG[] =
00027 {
00028 "DATA_END",
00029 "BOOLEAN",
00030 "INTEGER",
00031 "BIT_STRING",
00032 "OCTET_STRING",
00033 "NULL",
00034 "OBJECT_IDENTIFIER",
00035 "OBJECT_DESCRITOR",
00036 "EXTERNAL",
00037 "REAL",
00038 "ENUMERATED",
00039 "EMBEDDED PDV",
00040 "UTF8_STRING",
00041 "RELATIVE-OID",
00042 "?",
00043 "?",
00044 "SEQUENCE",
00045 "SET",
00046 "NUMERIC_STRING",
00047 "PRINTABLE_STRING",
00048 "TELETEX_STRING",
00049 "VIDEOTEX_STRING",
00050 "IA5_STRING",
00051 "UTC_TIME",
00052 "GENERALIZED_TIME",
00053 "GRAPHIC_STRING",
00054 "VISIBLE_STRING",
00055 "GENERAL_STRING",
00056 "UNIVERSAL_STRING",
00057 "CHARACTER_STRING",
00058 "BMP_STRING",
00059 "?",
00060 };
00061
00062
00063
00064 void asn1_id_type(int id, int* type, int* cnst, int* tag)
00065 {
00066 if (cnst!=NULL) {
00067 if (id & JBXL_ASN1_CNSTRCTD) *cnst = 1;
00068 else *cnst = 0;
00069 }
00070 if (type!=NULL) *type = (id & 0xc0) >> 6;
00071 if (tag!=NULL) *tag = id & 0x1f;
00072
00073 return;
00074 }
00075
00076
00077 void asn1_print_id(FILE* fp, int id)
00078 {
00079 int cnst, type, tag;
00080
00081 asn1_id_type(id, &type, &cnst, &tag);
00082
00083 fprintf(fp, "[%02x] ", id);
00084 fprintf(fp, "%s ", _ASN1_NODE_CLASS[type]);
00085 fprintf(fp, "%s ", _ASN1_NODE_CONST[cnst]);
00086 if (type==0x00) fprintf(fp, "%s ", _ASN1_NODE_TAG[tag]);
00087 else fprintf(fp, "(%02x) ", tag);
00088
00089 return;
00090 }
00091
00092
00093
00094 void asn1_print_tag_value(FILE* fp, int id, Buffer buf)
00095 {
00096 if (buf.vldsz<=0) return;
00097
00098 fprintf(fp, ": ");
00099
00100 int tag = id & 0x1f;
00101 if (tag==JBXL_ASN1_INT) {
00102 long int n = bin2int_DER(buf);
00103 fprintf(fp, "INT = %ld ", n);
00104 }
00105 else if (tag==JBXL_ASN1_OCT) {
00106 if (buf.buf!=NULL) fprintf(fp, "\"%s\" ", buf.buf);
00107 else fprintf(fp, "\"\" ");
00108 }
00109 else if (buf.buf!=NULL) {
00110 fprintf(fp, "....... ");
00111 }
00112
00113 return;
00114 }
00115