summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS5
-rw-r--r--configure.in2
-rw-r--r--doc/asn1.tex2
-rw-r--r--lib/coding.c20
-rw-r--r--lib/element.c16
-rw-r--r--lib/int.h2
-rw-r--r--lib/libtasn1.h2
-rw-r--r--lib/parser_aux.c67
-rw-r--r--tests/Test_parser.asn8
-rw-r--r--tests/Test_parser.c10
-rw-r--r--tests/Test_tree.asn17
-rw-r--r--tests/Test_tree.c47
-rw-r--r--tests/Test_tree_asn1_tab.c28
13 files changed, 207 insertions, 19 deletions
diff --git a/NEWS b/NEWS
index 159232f..be38cd2 100644
--- a/NEWS
+++ b/NEWS
@@ -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;
diff --git a/lib/int.h b/lib/int.h
index cd22204..0daed1d 100644
--- a/lib/int.h
+++ b/lib/int.h
@@ -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"},