00001 
00007 
00008 #include "asn1_node.h"
00009 
00010 
00011 const char* _ASN1_NODE_CONST[] = 
00012 {
00013     "PRIMITIVE",            
00014     "CONSTRUCTED"           
00015 };
00016 
00017 
00018 const char* _ASN1_NODE_TYPE[] = 
00019 {
00020     "UNIVERSAL",            
00021     "APPLICATION",          
00022     "CONTEXT-DEFINED",      
00023     "PRIVATE"               
00024 };
00025 
00026 
00027 const char* _ASN1_NODE_NAME[] = 
00028 {
00029     "DATA END",             
00030     "BOOLEAN",              
00031     "INTEGER",              
00032     "BIT STRING",           
00033     "OCTET STRING",         
00034     "NULL",                 
00035     "OBJECT IDENTIFIER",    
00036     "OBJECT DESCRITOR",     
00037     "EXTERNAL",             
00038     "REAL",                 
00039     "ENUMERATED",           
00040     "EMBEDDED PDV",         
00041     "UTF8 STRING",          
00042     "RELATIVE-OID",         
00043     "?",                    
00044     "?",                    
00045     "SEQUENCE",             
00046     "SET",                  
00047     "NUMERIC STRING",       
00048     "PRINTABLE STRING",     
00049     "TELETEX STRING",       
00050     "VIDEOTEX STRING",      
00051     "IA5 STRING",           
00052     "UTC TIME",             
00053     "GENERALIZED TIME",     
00054     "GRAPHIC STRING",       
00055     "VISIBLE STRING",       
00056     "GENERAL STRING",       
00057     "UNIVERSAL STRING",     
00058     "CHARACTER STRING",     
00059     "BMP STRING",           
00060     "?",                    
00061 };
00062 
00063 
00064 
00065 void  asn1_node_type(int node, int* cnst, int* type, int* name)
00066 {
00067     if (cnst!=NULL) {
00068         if (node & JBXL_ASN1_CNSTRCTD) *cnst = 1;
00069         else *cnst = 0;
00070     }
00071     if (type!=NULL) *type = (node & 0xc0) >> 6;
00072     if (name!=NULL) *name = node & 0x1f;
00073 
00074     return;
00075 }
00076 
00077 
00078 void  asn1_print_node(FILE* fp, int node)
00079 {
00080     int cnst, type, name;
00081 
00082     asn1_node_type(node, &cnst, &type, &name);
00083 
00084     if (cnst==1) fprintf(fp, "%s ", _ASN1_NODE_CONST[cnst]);
00085     fprintf(fp, "%s ", _ASN1_NODE_TYPE[type]);
00086     if (type==0x00) fprintf(fp, "%s ", _ASN1_NODE_NAME[name]);
00087     else fprintf(fp, "%d ", name);
00088     fprintf(fp, "(%02x) ", node);
00089 
00090     return;
00091 }
00092     
00093 
00094 
00095 void  asn1_print_node_value(FILE* fp, int node, Buffer buf)
00096 {
00097     fprintf(fp, ": ");
00098 
00099     if (node==JBXL_ASN1_INT) {
00100         long int n = bin2int_DER(buf);
00101         fprintf(fp, "INT = %ld ", n);
00102     }
00103     else if (node==JBXL_ASN1_OCT) {
00104         if (buf.buf!=NULL) fprintf(fp, "\"%s\" ", buf.buf);
00105         else               fprintf(fp, "\"\" ");
00106     }
00107     else if (buf.buf!=NULL) {               
00108         fprintf(fp, "....... ");
00109     }
00110 
00111     return;
00112 }
00113