diff options
author | Fabio Fiorina <fiorinaf@gnutls.org> | 2003-03-25 19:04:41 +0000 |
---|---|---|
committer | Fabio Fiorina <fiorinaf@gnutls.org> | 2003-03-25 19:04:41 +0000 |
commit | 84f25fcf992e5d7285c6d5d9734c1f88539dc50e (patch) | |
tree | 0f144ce9f9929f65352609204af79a336a483388 | |
parent | 4a567aecd188b56f8536be5bc0aa2aa41d171de4 (diff) | |
download | libtasn1_0_2_4.tar.gz |
Add DEFAULT with OIDlibtasn1_0_2_4
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | doc/asn1.tex | 2 | ||||
-rw-r--r-- | lib/coding.c | 20 | ||||
-rw-r--r-- | lib/element.c | 16 | ||||
-rw-r--r-- | lib/int.h | 2 | ||||
-rw-r--r-- | lib/libtasn1.h | 2 | ||||
-rw-r--r-- | lib/parser_aux.c | 67 | ||||
-rw-r--r-- | tests/Test_parser.asn | 8 | ||||
-rw-r--r-- | tests/Test_parser.c | 10 | ||||
-rw-r--r-- | tests/Test_tree.asn | 17 | ||||
-rw-r--r-- | tests/Test_tree.c | 47 | ||||
-rw-r--r-- | tests/Test_tree_asn1_tab.c | 28 |
13 files changed, 207 insertions, 19 deletions
@@ -1,5 +1,10 @@ +Version 0.2.4 +- Bug fix in asn1_der_coding with NULL parameter +- Manage DEFAULT option with OBJECT IDENTIFIER + Version 0.2.3 - Chenge asn1_find_structure_from_oid prototype +- Chenge asn1_find_structure_from_oid prototype - Add ASN1_MEM_ALLOC_ERROR return value Version 0.2.2 diff --git a/configure.in b/configure.in index c002243..261c3e9 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=3 +ASN1_MICRO_VERSION=4 ASN1_VERSION=$ASN1_MAJOR_VERSION.$ASN1_MINOR_VERSION.$ASN1_MICRO_VERSION AC_DEFINE_UNQUOTED(ASN1_VERSION, "$ASN1_VERSION") diff --git a/doc/asn1.tex b/doc/asn1.tex index 76dce74..b5ac45e 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.3 of library 'libtasn1' developed + This document describes the version 0.2.4 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/coding.c b/lib/coding.c index a4e307f..ed38411 100644 --- a/lib/coding.c +++ b/lib/coding.c @@ -783,6 +783,8 @@ asn1_der_coding(ASN1_TYPE element,const char *name,unsigned char *der,int *len, if(p->value[0]=='F') der[counter++]=0; else der[counter++]=0xFF; } + else + counter+=2; } move=RIGHT; break; @@ -805,15 +807,21 @@ asn1_der_coding(ASN1_TYPE element,const char *name,unsigned char *der,int *len, move=RIGHT; break; case TYPE_OBJECT_ID: - if(p->value==NULL){ + if((p->type&CONST_DEFAULT) && (p->value==NULL)){ + counter=counter_old; + max_len=max_len_old; + } + else{ + if(p->value==NULL){ _asn1_error_description_value_not_found(p,ErrorDescription); return ASN1_VALUE_NOT_FOUND; + } + len2=max_len; + ris=_asn1_objectid_der(p->value,der+counter,&len2); + if(ris==ASN1_MEM_ALLOC_ERROR) return ris; + max_len-=len2; + counter+=len2; } - len2=max_len; - ris=_asn1_objectid_der(p->value,der+counter,&len2); - if(ris==ASN1_MEM_ALLOC_ERROR) return ris; - max_len-=len2; - counter+=len2; move=RIGHT; break; case TYPE_TIME: diff --git a/lib/element.c b/lib/element.c index ff1ac0f..207ff67 100644 --- a/lib/element.c +++ b/lib/element.c @@ -389,6 +389,14 @@ asn1_write_value(node_asn *node_root,const char *name, for(k=0;k<strlen(value);k++) if((!isdigit(value[k])) && (value[k]!='.') && (value[k]!='+')) return ASN1_VALUE_NOT_VALID; + if(node->type&CONST_DEFAULT){ + p=node->down; + while(type_field(p->type)!=TYPE_DEFAULT) p=p->right; + if(!strcmp(value,p->value)){ + _asn1_set_value(node,NULL,0); + break; + } + } _asn1_set_value(node,value,strlen(value)+1); break; case TYPE_TIME: @@ -665,7 +673,13 @@ asn1_read_value(node_asn *root,const char *name,unsigned char *value, int *len) p=p->right; } *len = strlen(value) + 1; - } else { + } + else if((node->type&CONST_DEFAULT) && (node->value==NULL)){ + p=node->down; + while(type_field(p->type)!=TYPE_DEFAULT) p=p->right; + PUT_STR_VALUE(value, value_size, p->value); + } + else { PUT_STR_VALUE(value, value_size, node->value); } break; @@ -32,7 +32,7 @@ #include <mem.h> -#define LIBTASN1_VERSION "0.2.3" +#define LIBTASN1_VERSION "0.2.4" #define MAX32 4294967295 #define MAX24 16777215 diff --git a/lib/libtasn1.h b/lib/libtasn1.h index bcbb84f..89f73e1 100644 --- a/lib/libtasn1.h +++ b/lib/libtasn1.h @@ -28,7 +28,7 @@ extern "C" { #endif -#define LIBTASN1_VERSION "0.2.3" +#define LIBTASN1_VERSION "0.2.4" #include <sys/types.h> #include <time.h> diff --git a/lib/parser_aux.c b/lib/parser_aux.c index 2444f3d..6f33563 100644 --- a/lib/parser_aux.c +++ b/lib/parser_aux.c @@ -518,7 +518,7 @@ asn1_retCode _asn1_expand_object_id(ASN1_TYPE node) { node_asn *p,*p2,*p3,*p4,*p5; - char name_root[129],name2[129]; + char name_root[MAX_NAME_SIZE],name2[2*MAX_NAME_SIZE+1]; int move; if(node==NULL) return ASN1_ELEMENT_NOT_FOUND; @@ -584,6 +584,55 @@ _asn1_expand_object_id(ASN1_TYPE node) if(move==UP) p=_asn1_find_up(p); } + + /*******************************/ + /* expand DEFAULT */ + /*******************************/ + p=node; + move=DOWN; + + while(!((p==node) && (move==UP))){ + if(move!=UP){ + if((type_field(p->type)==TYPE_OBJECT_ID) && + (p->type&CONST_DEFAULT)){ + p2=p->down; + if(p2 && (type_field(p2->type)==TYPE_DEFAULT)){ + _asn1_str_cpy(name2, sizeof(name2), name_root); + _asn1_str_cat(name2, sizeof(name2), "."); + _asn1_str_cat(name2, sizeof(name2), p2->value); + p3=_asn1_find_node(node,name2); + if(!p3 || (type_field(p3->type)!=TYPE_OBJECT_ID) || + !(p3->type&CONST_ASSIGN)) return ASN1_ELEMENT_NOT_FOUND; + p4=p3->down; + name2[0]=0; + while(p4){ + if(type_field(p4->type)==TYPE_CONSTANT){ + if(name2[0]) _asn1_str_cat(name2,sizeof(name2),"."); + _asn1_str_cat(name2,sizeof(name2),p4->value); + } + p4=p4->right; + } + _asn1_set_value(p2,name2,strlen(name2)+1); + } + } + move=DOWN; + } + else move=RIGHT; + + if(move==DOWN){ + if(p->down) p=p->down; + else move=RIGHT; + } + + if(p==node) {move=UP; continue;} + + if(move==RIGHT){ + if(p->right) p=p->right; + else move=UP; + } + if(move==UP) p=_asn1_find_up(p); + } + return ASN1_SUCCESS; } @@ -675,6 +724,22 @@ _asn1_check_identifier(ASN1_TYPE node) } } else if((type_field(p->type)==TYPE_OBJECT_ID) && + (p->type&CONST_DEFAULT)){ + p2=p->down; + if(p2 && (type_field(p2->type)==TYPE_DEFAULT)){ + _asn1_str_cpy(name2, sizeof(name2), node->name); + _asn1_str_cat(name2, sizeof(name2), "."); + _asn1_str_cat(name2, sizeof(name2), p2->value); + strcpy(_asn1_identifierMissing,p2->value); + p2=_asn1_find_node(node,name2); + if(!p2 || (type_field(p2->type)!=TYPE_OBJECT_ID) || + !(p2->type&CONST_ASSIGN)) + return ASN1_IDENTIFIER_NOT_FOUND; + else + _asn1_identifierMissing[0]=0; + } + } + else if((type_field(p->type)==TYPE_OBJECT_ID) && (p->type&CONST_ASSIGN)){ p2=p->down; if(p2 && (type_field(p2->type)==TYPE_CONSTANT)){ diff --git a/tests/Test_parser.asn b/tests/Test_parser.asn index 8290dc7..e9b0ce9 100644 --- a/tests/Test_parser.asn +++ b/tests/Test_parser.asn @@ -16,6 +16,11 @@ Sequence1 ::= SEQUENCE{ generic GeneralString } +OidTest ::= SEQUENCE{ + oid1 OBJECT IDENTIFIER DEFAULT Oid-type1 +} + +Oid-type1 OBJECT IDENTIFIER ::= {1 2 3 4} END @@ -27,3 +32,6 @@ END + + + diff --git a/tests/Test_parser.c b/tests/Test_parser.c index 87c1ee2..5d6b638 100644 --- a/tests/Test_parser.c +++ b/tests/Test_parser.c @@ -84,6 +84,16 @@ test_type test_array[]={ {16," generic generalstring", ASN1_IDENTIFIER_NOT_FOUND,_FILE_":: identifier 'generalstring' not found"}, + /* Test: OID */ + {20," oid1 OBJECT IDENTIFIER DEFAULT Oid-type", + ASN1_IDENTIFIER_NOT_FOUND,_FILE_":: identifier 'Oid-type' not found"}, + {20," oid1 OBJECT IDENTIFIER DEFAULT 1", + ASN1_IDENTIFIER_NOT_FOUND,_FILE_":: identifier '1' not found"}, + {20," oid1 OBJECT IDENTIFIER DEFAULT", + ASN1_SYNTAX_ERROR,_FILE_":21: parse error near '}'"}, + {20," oid1 OBJECT IDENTIFIER DEFAULT Oid-type1", + ASN1_SUCCESS,""}, + /* end */ {0} diff --git a/tests/Test_tree.asn b/tests/Test_tree.asn index e0d0063..a918456 100644 --- a/tests/Test_tree.asn +++ b/tests/Test_tree.asn @@ -9,11 +9,24 @@ DEFINITIONS IMPLICIT TAGS ::= BEGIN +OidTest ::= SEQUENCE{ + oid3 [3] OBJECT IDENTIFIER DEFAULT id-Test, + oid [1] OBJECT IDENTIFIER DEFAULT id-anyTest2, + oid2 [2] OBJECT IDENTIFIER DEFAULT id-anyTest +} + OidAndTimeTest ::= SEQUENCE{ + set SET OF INTEGER, oid OBJECT IDENTIFIER, - time1 UTCTime, time2 GeneralizedTime, - oct OCTET STRING + bol BOOLEAN, + oct OCTET STRING, + bit BIT STRING OPTIONAL, + bol2 BOOLEAN DEFAULT TRUE, + enum ENUMERATED {v1(1),v2(2)} DEFAULT v1, + any [1] ANY OPTIONAL, + gen GeneralString OPTIONAL, + time1 UTCTime } SequenceTestTag ::= SEQUENCE{ diff --git a/tests/Test_tree.c b/tests/Test_tree.c index 9d165b9..0252ffd 100644 --- a/tests/Test_tree.c +++ b/tests/Test_tree.c @@ -69,19 +69,56 @@ test_type test_array[]={ {ACT_DELETE,"","",0,ASN1_ELEMENT_NOT_FOUND}, - /* Test: OID and TIME */ + /* Test: OID */ + {ACT_CREATE,"TEST_TREE.OidTest",0,0,ASN1_SUCCESS}, + {ACT_READ_LENGTH,"oid",NULL,9,ASN1_MEM_ERROR}, + {ACT_READ,"oid","2.5.29.2",9,ASN1_SUCCESS}, + {ACT_WRITE,"oid","1.2.3.4",0,ASN1_SUCCESS}, + {ACT_WRITE,"oid2","2.5.29.1",0,ASN1_SUCCESS}, + {ACT_WRITE,"oid3","1.2.29.2",0,ASN1_SUCCESS}, + {ACT_ENCODING_LENGTH,"",0,7,ASN1_MEM_ERROR}, + {ACT_ENCODING,"",0,6,ASN1_MEM_ERROR}, + {ACT_ENCODING,"",0,7,ASN1_SUCCESS}, + {ACT_PRINT_DER,0,0,0,ASN1_SUCCESS}, + {ACT_DELETE,"","",0,ASN1_SUCCESS}, + {ACT_CREATE,"TEST_TREE.OidTest",0,0,ASN1_SUCCESS}, + {ACT_DECODING,0,0,0,ASN1_SUCCESS}, + {ACT_DECODING_START_END,"oid","START",2,ASN1_SUCCESS}, + {ACT_DECODING_START_END,"oid","END",6,ASN1_SUCCESS}, + {ACT_DECODING_START_END,"","START",0,ASN1_SUCCESS}, + {ACT_DECODING_START_END,"","END",6,ASN1_SUCCESS}, + {ACT_READ,"oid2","2.5.29.1",9,ASN1_SUCCESS}, + {ACT_READ,"oid3","1.2.29.2",9,ASN1_SUCCESS}, + {ACT_WRITE,"oid","1.2.3.4",0,ASN1_SUCCESS}, + {ACT_VISIT,"","",ASN1_PRINT_ALL,ASN1_SUCCESS}, + {ACT_DELETE,"","",0,ASN1_SUCCESS}, + + /* Test: ENCODING_LENGTH and READ_LEN */ {ACT_CREATE,"TEST_TREE.OidAndTimeTest",0,0,ASN1_SUCCESS}, {ACT_WRITE,"oid","1.2.3.4",0,ASN1_SUCCESS}, {ACT_WRITE,"time1","9801011200Z",1,ASN1_SUCCESS}, {ACT_WRITE,"time2","2001010112001.12-0700",1,ASN1_SUCCESS}, {ACT_WRITE,"oct","ABCD",4,ASN1_SUCCESS}, + {ACT_WRITE,"bol","TRUE",1,ASN1_SUCCESS}, + {ACT_WRITE,"enum","2",0,ASN1_SUCCESS}, + {ACT_WRITE,"bit","1\xC0",10,ASN1_SUCCESS}, + {ACT_WRITE,"any","\x30\x01\x01",3,ASN1_SUCCESS}, + {ACT_WRITE,"set","NEW",0,ASN1_SUCCESS}, + {ACT_WRITE,"set.?LAST","10",0,ASN1_SUCCESS}, + {ACT_WRITE,"set","NEW",0,ASN1_SUCCESS}, + {ACT_WRITE,"set.?LAST","1",0,ASN1_SUCCESS}, + {ACT_WRITE,"gen","Prova",5,ASN1_SUCCESS}, {ACT_READ_LENGTH,"oid",NULL,8,ASN1_MEM_ERROR}, {ACT_READ_LENGTH,"time1",NULL,12,ASN1_MEM_ERROR}, {ACT_READ_LENGTH,"time2",NULL,22,ASN1_MEM_ERROR}, {ACT_READ_LENGTH,"oct",NULL,4,ASN1_MEM_ERROR}, - {ACT_ENCODING_LENGTH,"",0,49,ASN1_MEM_ERROR}, - {ACT_ENCODING,"",0,48,ASN1_MEM_ERROR}, - {ACT_ENCODING,"",0,200,ASN1_SUCCESS}, + {ACT_READ_LENGTH,"bol",NULL,5,ASN1_MEM_ERROR}, + {ACT_READ_LENGTH,"enum",NULL,1,ASN1_MEM_ERROR}, + {ACT_READ_LENGTH,"any",NULL,3,ASN1_MEM_ERROR}, + {ACT_READ_LENGTH,"gen",NULL,5,ASN1_MEM_ERROR}, + {ACT_ENCODING_LENGTH,"",0,79,ASN1_MEM_ERROR}, + {ACT_ENCODING,"",0,78,ASN1_MEM_ERROR}, + {ACT_ENCODING,"",0,79,ASN1_SUCCESS}, {ACT_PRINT_DER,0,0,0,ASN1_SUCCESS}, {ACT_DELETE,"","",0,ASN1_SUCCESS}, {ACT_CREATE,"TEST_TREE.OidAndTimeTest",0,0,ASN1_SUCCESS}, @@ -280,7 +317,7 @@ main(int argc,char *argv[]) printf( "/****************************************/\n\n"); /* Check version */ - if(asn1_check_version("0.2.2")==NULL) + if(asn1_check_version("0.2.4")==NULL) printf("\nLibrary version check ERROR:\n actual version: %s\n\n",asn1_check_version(NULL)); if(1) diff --git a/tests/Test_tree_asn1_tab.c b/tests/Test_tree_asn1_tab.c index 9db663d..e5d9c0f 100644 --- a/tests/Test_tree_asn1_tab.c +++ b/tests/Test_tree_asn1_tab.c @@ -13,6 +13,34 @@ const ASN1_ARRAY_TYPE Test_tree_asn1_tab[]={ {"pkix",1073741825,"7"}, {"id-mod",1073741825,"0"}, {"id-pkix1-implicit-88",1,"2"}, + {"OidTest",1610612741,0}, + {"oid3",1610653708,0}, + {0,1073741833,"id-Test"}, + {0,4104,"3"}, + {"oid",1610653708,0}, + {0,1073741833,"id-anyTest2"}, + {0,4104,"1"}, + {"oid2",536911884,0}, + {0,1073741833,"id-anyTest"}, + {0,4104,"2"}, + {"OidAndTimeTest",1610612741,0}, + {"set",1610612751,0}, + {0,3,0}, + {"oid",1073741836,0}, + {"time2",1082130449,0}, + {"bol",1073741828,0}, + {"oct",1073741831,0}, + {"bit",1073758214,0}, + {"bol2",1610645508,0}, + {0,65545,0}, + {"enum",1610907669,0}, + {0,1073741833,"v1"}, + {"v1",1073741825,"1"}, + {"v2",1,"2"}, + {"any",1610637325,0}, + {0,4104,"1"}, + {"gen",1073758235,0}, + {"time1",16777233,0}, {"SequenceTestTag",1610612741,0}, {"int1",1610620931,0}, {0,2056,"2"}, |