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