diff options
author | Fabio Fiorina <fiorinaf@gnutls.org> | 2003-03-18 20:59:46 +0000 |
---|---|---|
committer | Fabio Fiorina <fiorinaf@gnutls.org> | 2003-03-18 20:59:46 +0000 |
commit | b773d6402c760470db4e540e149ed724e61abdc1 (patch) | |
tree | c687ce5e7007933dbe9416e7dd0a5ce45f77e7e0 | |
parent | 330301615527a87b383275885d9198cc081683ab (diff) | |
download | libtasn1-b773d6402c760470db4e540e149ed724e61abdc1.tar.gz libtasn1-b773d6402c760470db4e540e149ed724e61abdc1.tar.bz2 libtasn1-b773d6402c760470db4e540e149ed724e61abdc1.zip |
change asn1_find_structure_from_oid prototype
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | configure.in | 6 | ||||
-rw-r--r-- | doc/asn1.tex | 2 | ||||
-rw-r--r-- | lib/decoding.c | 7 | ||||
-rw-r--r-- | lib/element.c | 62 | ||||
-rw-r--r-- | lib/errors.c | 1 | ||||
-rw-r--r-- | lib/errors_int.h | 9 | ||||
-rw-r--r-- | lib/int.h | 2 | ||||
-rw-r--r-- | lib/libtasn1.h | 19 | ||||
-rw-r--r-- | lib/structure.c | 22 | ||||
-rw-r--r-- | tests/Test_tree.c | 14 |
11 files changed, 77 insertions, 72 deletions
@@ -1,5 +1,10 @@ +Version 0.2.3 +- Chenge asn1_find_structure_from_oid prototype +- Add ASN1_MEM_ALLOC_ERROR return value + Version 0.2.2 - Add vector length check in asn1_der_coding function +- Add vector length check in asn1_der_coding function - Add vector length check in asn1_read_value function - Add asn1_check_version function diff --git a/configure.in b/configure.in index 2c94553..c002243 100644 --- a/configure.in +++ b/configure.in @@ -12,7 +12,7 @@ AC_DEFINE_UNQUOTED(T_OS, "$target_os") dnl libtasn1 Version ASN1_MAJOR_VERSION=0 ASN1_MINOR_VERSION=2 -ASN1_MICRO_VERSION=2 +ASN1_MICRO_VERSION=3 ASN1_VERSION=$ASN1_MAJOR_VERSION.$ASN1_MINOR_VERSION.$ASN1_MICRO_VERSION AC_DEFINE_UNQUOTED(ASN1_VERSION, "$ASN1_VERSION") @@ -21,9 +21,9 @@ AM_INIT_AUTOMAKE(libtasn1, $ASN1_VERSION) AM_CONFIG_HEADER(config.h) dnl This is the library version -ASN1_MOST_RECENT_INTERFACE=1 +ASN1_MOST_RECENT_INTERFACE=2 ASN1_CURRENT_INTERFACE_IMPLEMENTATION_NUMBER=$ASN1_MICRO_VERSION -ASN1_OLDEST_INTERFACE=1 +ASN1_OLDEST_INTERFACE=2 AC_SUBST(ASN1_MAJOR_VERSION) diff --git a/doc/asn1.tex b/doc/asn1.tex index b6cf27c..76dce74 100644 --- a/doc/asn1.tex +++ b/doc/asn1.tex @@ -39,7 +39,7 @@ chapter entitled "GNU Free Documentation License". \chapter{ASN.1 structures handling} \section{Introduction} - This document describes the version 0.2.2 of library 'libtasn1' developed + This document describes the version 0.2.3 of library 'libtasn1' developed for ASN1 (Abstract Syntax Notation One) structures management. The main features of this library are: \begin{itemize} diff --git a/lib/decoding.c b/lib/decoding.c index 0001388..29dc9c9 100644 --- a/lib/decoding.c +++ b/lib/decoding.c @@ -602,7 +602,7 @@ asn1_der_decoding(ASN1_TYPE *element,const unsigned char *der,int len, temp2=(unsigned char *)_asn1_alloca(len2+len3+len4); if (temp2==NULL){ asn1_delete_structure(element); - return ASN1_MEM_ERROR; + return ASN1_MEM_ALLOC_ERROR; } _asn1_octet_der(der+counter,len2+len3,temp2,&len4); @@ -669,6 +669,7 @@ asn1_der_decoding(ASN1_TYPE *element,const unsigned char *der,int len, * ASN1_ELEMENT_NOT_FOUND\: ELEMENT is ASN1_TYPE_EMPTY or elementName == NULL. * * ASN1_TAG_ERROR,ASN1_DER_ERROR\: the der encoding doesn't match the structure STRUCTURE. *ELEMENT deleted. + * **/ asn1_retCode asn1_der_decoding_element(ASN1_TYPE *structure,const char *elementName, @@ -700,7 +701,7 @@ asn1_der_decoding_element(ASN1_TYPE *structure,const char *elementName, if(nameLen>0) strcpy(currentName,(*structure)->name); else{ asn1_delete_structure(structure); - return ASN1_MEM_ERROR; + return ASN1_MEM_ERROR; } if(!(strcmp(currentName,elementName))){ state=FOUND; @@ -1000,7 +1001,7 @@ asn1_der_decoding_element(ASN1_TYPE *structure,const char *elementName, temp2=(unsigned char *)_asn1_alloca(len2+len3+len4); if (temp2==NULL){ asn1_delete_structure(structure); - return ASN1_MEM_ERROR; + return ASN1_MEM_ALLOC_ERROR; } _asn1_octet_der(der+counter,len2+len3,temp2,&len4); diff --git a/lib/element.c b/lib/element.c index 8b71d05..ff1ac0f 100644 --- a/lib/element.c +++ b/lib/element.c @@ -294,7 +294,7 @@ asn1_write_value(node_asn *node_root,const char *name, if(len==0){ if((isdigit(value[0])) || (value[0]=='-')){ value_temp=(unsigned char *)_asn1_alloca(SIZEOF_UNSIGNED_LONG_INT); - if (value_temp==NULL) return ASN1_MEM_ERROR; + if (value_temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_convert_integer(value,value_temp,SIZEOF_UNSIGNED_LONG_INT, &len); } @@ -305,7 +305,7 @@ asn1_write_value(node_asn *node_root,const char *name, if(type_field(p->type)==TYPE_CONSTANT){ if((p->name) && (!strcmp(p->name,value))){ value_temp=(unsigned char *)_asn1_alloca(SIZEOF_UNSIGNED_LONG_INT); - if (value_temp==NULL) return ASN1_MEM_ERROR; + if (value_temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_convert_integer(p->value,value_temp,SIZEOF_UNSIGNED_LONG_INT, &len); break; @@ -318,7 +318,7 @@ asn1_write_value(node_asn *node_root,const char *name, } else{ /* len != 0 */ value_temp=(unsigned char *)_asn1_alloca(len); - if (value_temp==NULL) return ASN1_MEM_ERROR; + if (value_temp==NULL) return ASN1_MEM_ALLOC_ERROR; memcpy(value_temp,value,len); } @@ -338,7 +338,7 @@ asn1_write_value(node_asn *node_root,const char *name, _asn1_length_der(len-k,NULL,&len2); temp=(unsigned char *)_asn1_alloca(len-k+len2); - if (temp==NULL) return ASN1_MEM_ERROR; + if (temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_octet_der(value_temp+k,len-k,temp,&len2); _asn1_set_value(node,temp,len2); @@ -351,7 +351,7 @@ asn1_write_value(node_asn *node_root,const char *name, while(type_field(p->type)!=TYPE_DEFAULT) p=p->right; if((isdigit(p->value[0])) || (p->value[0]=='-')){ default_temp=(unsigned char *)_asn1_alloca(SIZEOF_UNSIGNED_LONG_INT); - if (default_temp==NULL) return ASN1_MEM_ERROR; + if (default_temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_convert_integer(p->value,default_temp,SIZEOF_UNSIGNED_LONG_INT,&len2); } @@ -362,7 +362,7 @@ asn1_write_value(node_asn *node_root,const char *name, if(type_field(p2->type)==TYPE_CONSTANT){ if((p2->name) && (!strcmp(p2->name,p->value))){ default_temp=(unsigned char *)_asn1_alloca(SIZEOF_UNSIGNED_LONG_INT); - if (default_temp==NULL) return ASN1_MEM_ERROR; + if (default_temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_convert_integer(p2->value,default_temp,SIZEOF_UNSIGNED_LONG_INT,&len2); break; @@ -430,7 +430,7 @@ asn1_write_value(node_asn *node_root,const char *name, len=strlen(value); _asn1_length_der(len,NULL,&len2); temp=(unsigned char *)_asn1_alloca(len+len2); - if (temp==NULL) return ASN1_MEM_ERROR; + if (temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_octet_der(value,len,temp,&len2); _asn1_set_value(node,temp,len2); @@ -441,7 +441,7 @@ asn1_write_value(node_asn *node_root,const char *name, len=strlen(value); _asn1_length_der(len,NULL,&len2); temp=(unsigned char *)_asn1_alloca(len+len2); - if (temp==NULL) return ASN1_MEM_ERROR; + if (temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_octet_der(value,len,temp,&len2); _asn1_set_value(node,temp,len2); @@ -452,7 +452,7 @@ asn1_write_value(node_asn *node_root,const char *name, len=strlen(value); _asn1_length_der((len>>3)+2,NULL,&len2); temp=(unsigned char *)_asn1_alloca((len>>3)+2+len2); - if (temp==NULL) return ASN1_MEM_ERROR; + if (temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_bit_der(value,len,temp,&len2); _asn1_set_value(node,temp,len2); @@ -476,7 +476,7 @@ asn1_write_value(node_asn *node_root,const char *name, case TYPE_ANY: _asn1_length_der(len,NULL,&len2); temp=(unsigned char *)_asn1_alloca(len+len2); - if (temp==NULL) return ASN1_MEM_ERROR; + if (temp==NULL) return ASN1_MEM_ALLOC_ERROR; _asn1_octet_der(value,len,temp,&len2); _asn1_set_value(node,temp,len2); @@ -704,8 +704,8 @@ asn1_read_value(node_asn *root,const char *name,unsigned char *value, int *len) * asn1_read_tag - Returns the TAG of one element inside a structure * @root: pointer to a structure * @name: the name of the element inside a structure. - * @tag: variable that will contain the TAG value. - * @class: variable that will specify the TAG type. + * @tagValue: variable that will contain the TAG value. + * @classValue: variable that will specify the TAG type. * * Description: * @@ -721,7 +721,7 @@ asn1_read_value(node_asn *root,const char *name,unsigned char *value, int *len) * **/ asn1_retCode -asn1_read_tag(node_asn *root,const char *name,int *tag, int *class) +asn1_read_tag(node_asn *root,const char *name,int *tagValue, int *classValue) { node_asn *node,*p,*pTag; @@ -745,43 +745,43 @@ asn1_read_tag(node_asn *root,const char *name,int *tag, int *class) } if(pTag){ - *tag=strtoul(pTag->value,NULL,10); + *tagValue=strtoul(pTag->value,NULL,10); - if(pTag->type&CONST_APPLICATION) *class=ASN1_CLASS_APPLICATION; - else if(pTag->type&CONST_UNIVERSAL) *class=ASN1_CLASS_UNIVERSAL; - else if(pTag->type&CONST_PRIVATE) *class=ASN1_CLASS_PRIVATE; - else *class=ASN1_CLASS_CONTEXT_SPECIFIC; + if(pTag->type&CONST_APPLICATION) *classValue=ASN1_CLASS_APPLICATION; + else if(pTag->type&CONST_UNIVERSAL) *classValue=ASN1_CLASS_UNIVERSAL; + else if(pTag->type&CONST_PRIVATE) *classValue=ASN1_CLASS_PRIVATE; + else *classValue=ASN1_CLASS_CONTEXT_SPECIFIC; } else{ - *class=ASN1_CLASS_UNIVERSAL; + *classValue=ASN1_CLASS_UNIVERSAL; switch(type_field(node->type)){ case TYPE_NULL: - *tag=ASN1_TAG_NULL;break; + *tagValue=ASN1_TAG_NULL;break; case TYPE_BOOLEAN: - *tag=ASN1_TAG_BOOLEAN;break; + *tagValue=ASN1_TAG_BOOLEAN;break; case TYPE_INTEGER: - *tag=ASN1_TAG_INTEGER;break; + *tagValue=ASN1_TAG_INTEGER;break; case TYPE_ENUMERATED: - *tag=ASN1_TAG_ENUMERATED;break; + *tagValue=ASN1_TAG_ENUMERATED;break; case TYPE_OBJECT_ID: - *tag=ASN1_TAG_OBJECT_ID;break; + *tagValue=ASN1_TAG_OBJECT_ID;break; case TYPE_TIME: if(node->type&CONST_UTC){ - *tag=ASN1_TAG_UTCTime; + *tagValue=ASN1_TAG_UTCTime; } - else *tag=ASN1_TAG_GENERALIZEDTime; + else *tagValue=ASN1_TAG_GENERALIZEDTime; break; case TYPE_OCTET_STRING: - *tag=ASN1_TAG_OCTET_STRING;break; + *tagValue=ASN1_TAG_OCTET_STRING;break; case TYPE_GENERALSTRING: - *tag=ASN1_TAG_GENERALSTRING;break; + *tagValue=ASN1_TAG_GENERALSTRING;break; case TYPE_BIT_STRING: - *tag=ASN1_TAG_BIT_STRING;break; + *tagValue=ASN1_TAG_BIT_STRING;break; case TYPE_SEQUENCE: case TYPE_SEQUENCE_OF: - *tag=ASN1_TAG_SEQUENCE;break; + *tagValue=ASN1_TAG_SEQUENCE;break; case TYPE_SET: case TYPE_SET_OF: - *tag=ASN1_TAG_SET;break; + *tagValue=ASN1_TAG_SET;break; case TYPE_TAG: case TYPE_CHOICE: case TYPE_ANY: diff --git a/lib/errors.c b/lib/errors.c index bc51e9f..70f38cb 100644 --- a/lib/errors.c +++ b/lib/errors.c @@ -47,6 +47,7 @@ static libtasn1_error_entry error_algorithms[] = { LIBTASN1_ERROR_ENTRY( ASN1_ERROR_TYPE_ANY ), LIBTASN1_ERROR_ENTRY( ASN1_SYNTAX_ERROR ), LIBTASN1_ERROR_ENTRY( ASN1_MEM_ERROR ), + LIBTASN1_ERROR_ENTRY( ASN1_MEM_ALLOC_ERROR ), LIBTASN1_ERROR_ENTRY( ASN1_DER_OVERFLOW ), LIBTASN1_ERROR_ENTRY( ASN1_NAME_TOO_LONG ), LIBTASN1_ERROR_ENTRY( ASN1_ARRAY_ERROR ), diff --git a/lib/errors_int.h b/lib/errors_int.h index 351dd26..6d2706f 100644 --- a/lib/errors_int.h +++ b/lib/errors_int.h @@ -15,9 +15,10 @@ #define ASN1_ERROR_TYPE_ANY 10 #define ASN1_SYNTAX_ERROR 11 #define ASN1_MEM_ERROR 12 -#define ASN1_DER_OVERFLOW 13 -#define ASN1_NAME_TOO_LONG 14 -#define ASN1_ARRAY_ERROR 15 -#define ASN1_ELEMENT_NOT_EMPTY 16 +#define ASN1_MEM_ALLOC_ERROR 13 +#define ASN1_DER_OVERFLOW 14 +#define ASN1_NAME_TOO_LONG 15 +#define ASN1_ARRAY_ERROR 16 +#define ASN1_ELEMENT_NOT_EMPTY 17 @@ -32,7 +32,7 @@ #include <mem.h> -#define LIBTASN1_VERSION "0.2.2" +#define LIBTASN1_VERSION "0.2.3" #define MAX32 4294967295 #define MAX24 16777215 diff --git a/lib/libtasn1.h b/lib/libtasn1.h index b687ece..bcbb84f 100644 --- a/lib/libtasn1.h +++ b/lib/libtasn1.h @@ -28,7 +28,7 @@ extern "C" { #endif -#define LIBTASN1_VERSION "0.2.2" +#define LIBTASN1_VERSION "0.2.3" #include <sys/types.h> #include <time.h> @@ -58,10 +58,11 @@ typedef int asn1_retCode; /* type returned by libasn1 functions */ #define ASN1_ERROR_TYPE_ANY 10 #define ASN1_SYNTAX_ERROR 11 #define ASN1_MEM_ERROR 12 -#define ASN1_DER_OVERFLOW 13 -#define ASN1_NAME_TOO_LONG 14 -#define ASN1_ARRAY_ERROR 15 -#define ASN1_ELEMENT_NOT_EMPTY 16 +#define ASN1_MEM_ALLOC_ERROR 13 +#define ASN1_DER_OVERFLOW 14 +#define ASN1_NAME_TOO_LONG 15 +#define ASN1_ARRAY_ERROR 16 +#define ASN1_ELEMENT_NOT_EMPTY 17 /*************************************/ /* Constants used in asn1_visit_tree */ @@ -170,11 +171,11 @@ asn1_retCode asn1_expand_any_defined_by(ASN1_TYPE definitions, asn1_retCode asn1_expand_octet_string(ASN1_TYPE definitions,ASN1_TYPE *element, const char *octetName,const char *objectName); -asn1_retCode asn1_read_tag(node_asn *root,const char *name,int *tag, - int *class); +asn1_retCode asn1_read_tag(node_asn *root,const char *name,int *tagValue, + int *classValue); -asn1_retCode asn1_find_structure_from_oid(ASN1_TYPE definitions, - const char *oidValue,char *structureName); +const char* asn1_find_structure_from_oid(ASN1_TYPE definitions, + const char *oidValue); const char *asn1_check_version( const char *req_version ); diff --git a/lib/structure.c b/lib/structure.c index 7eb6fde..1291a00 100644 --- a/lib/structure.c +++ b/lib/structure.c @@ -860,24 +860,21 @@ asn1_number_of_elements(ASN1_TYPE element,const char *name,int *num) * after an OID definition. * @definitions: ASN1 definitions * @oidValue: value of the OID to search (e.g. "1.2.3.4"). - * @structureName: name returned by the function, that is the structure - * defined just after the OID of value equal to OIDVALUE. - * It must be an array of MAX_NAME_SIZE char elements. - * * Description: * * Search the structure that is defined just after an OID definition. * * Returns: * - * ASN1_SUCCESS\: structure found. + * NULL when OIDVALUE not found, * - * ASN1_ELEMENT_NOT_FOUND\: OID equal to OIDVALUE not found. + * otherwise the pointer to a constant string that contains the element + * name defined just after the OID. * **/ -asn1_retCode +const char* asn1_find_structure_from_oid(ASN1_TYPE definitions, - const char *oidValue,char *structureName) + const char *oidValue) { char definitionsName[MAX_NAME_SIZE],name[2*MAX_NAME_SIZE+1]; char value[MAX_NAME_SIZE]; @@ -886,7 +883,7 @@ asn1_find_structure_from_oid(ASN1_TYPE definitions, asn1_retCode result; if((definitions==ASN1_TYPE_EMPTY) || (oidValue==NULL)) - return ASN1_ELEMENT_NOT_FOUND; + return NULL; /* ASN1_ELEMENT_NOT_FOUND; */ strcpy(definitionsName,definitions->name); @@ -906,16 +903,15 @@ asn1_find_structure_from_oid(ASN1_TYPE definitions, if((result == ASN1_SUCCESS) && (!strcmp(oidValue,value))){ p=p->right; if(p==NULL) /* reach the end of ASN1 definitions */ - return ASN1_ELEMENT_NOT_FOUND; + return NULL; /* ASN1_ELEMENT_NOT_FOUND; */ - strcpy(structureName,p->name); - return ASN1_SUCCESS; + return p->name; } } p=p->right; } - return ASN1_ELEMENT_NOT_FOUND; + return NULL; /* ASN1_ELEMENT_NOT_FOUND; */ } diff --git a/tests/Test_tree.c b/tests/Test_tree.c index 4270caf..6b75139 100644 --- a/tests/Test_tree.c +++ b/tests/Test_tree.c @@ -253,6 +253,7 @@ main(int argc,char *argv[]) int valueLen,tag=0,class=0; int k; int start,end; + const char *str_p=NULL; printf("\n\n/****************************************/\n"); printf( "/* Test sequence : Test_tree */\n"); @@ -351,7 +352,7 @@ main(int argc,char *argv[]) test->par2); break; case ACT_OID_2_STRUCTURE: - result=asn1_find_structure_from_oid(definitions,test->par1,value); + str_p=asn1_find_structure_from_oid(definitions,test->par1); break; case ACT_VISIT: asn1_print_structure(out,asn1_element,test->par1,test->par3); @@ -430,15 +431,14 @@ main(int argc,char *argv[]) } break; case ACT_OID_2_STRUCTURE: - if((result != test->errorNumber) || - ((result == ASN1_SUCCESS) && (strcmp(value,test->par2)))){ + if(((test->errorNumber!=ASN1_SUCCESS) && (str_p!=NULL)) || + ((test->errorNumber==ASN1_SUCCESS) && (str_p==NULL)) || + ((test->errorNumber==ASN1_SUCCESS) && (strcmp(str_p,test->par2)))){ errorCounter++; printf("ERROR N. %d:\n",errorCounter); printf(" Action %d - %s\n",test->action,test->par1); - printf(" Error expected: %s - %s\n",libtasn1_strerror(test->errorNumber), - test->par2); - printf("\n Error detected: %s - %s\n\n",libtasn1_strerror(result), - value); + printf(" Error expected: %s - %s\n",libtasn1_strerror(test->errorNumber),test->par2); + printf(" Value detected: %s\n\n",str_p); } break; case ACT_DECODING_START_END: |