* krb5_decode.c (begin_structure): Update to deal with indefinite
authorTom Yu <tlyu@mit.edu>
Mon, 1 Nov 1999 21:08:55 +0000 (21:08 +0000)
committerTom Yu <tlyu@mit.edu>
Mon, 1 Nov 1999 21:08:55 +0000 (21:08 +0000)
encodings better; also call asn1_get_sequence().

* asn1_k_decode.c (sequence_of): Update to deal with indefinite
encodings better.
(begin_structure): Update to deal with indefinite encodings
better; also call asn1_get_sequence().

* asn1_get.h: Update prototypes for asn1_get_tag_indef(),
asn1_get_tag(), asn1_get_sequence(), asn1_get_length().

* asn1_get.c (asn1_get_tag_indef): New function; get tag info,
lengths, etc. as well as flag indicating whether the length is
indefinite.
(asn1_get_tag): Modify to just call asn1_get_tag_indef().
(asn1_get_sequence): Call asn1_get_tag_indef() in order to
determine whether encoding is indefinite length.
(asn1_get_length): Add "indef" arg to indicate whether an encoding
has an indefinite length.

* asn1buf.h: Update asn1buf_imbed() prototype.

* asn1buf.c (asn1buf_imbed): Add "indef" arg so that we don't
treat a definite zero-length encoding as an indefinite encoding.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@11890 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/krb5/asn.1/ChangeLog
src/lib/krb5/asn.1/asn1_get.c
src/lib/krb5/asn.1/asn1_get.h
src/lib/krb5/asn.1/asn1_k_decode.c
src/lib/krb5/asn.1/asn1buf.c
src/lib/krb5/asn.1/asn1buf.h
src/lib/krb5/asn.1/krb5_decode.c

index 96ec800120667cc606129d3a8f31ddc053cf5f89..2d9b70eeabf7978dc9a2de00edb7972defc08860 100644 (file)
@@ -1,3 +1,30 @@
+1999-11-01  Tom Yu  <tlyu@mit.edu>
+
+       * krb5_decode.c (begin_structure): Update to deal with indefinite
+       encodings better; also call asn1_get_sequence().
+
+       * asn1_k_decode.c (sequence_of): Update to deal with indefinite
+       encodings better.
+       (begin_structure): Update to deal with indefinite encodings
+       better; also call asn1_get_sequence().
+
+       * asn1_get.h: Update prototypes for asn1_get_tag_indef(),
+       asn1_get_tag(), asn1_get_sequence(), asn1_get_length().
+
+       * asn1_get.c (asn1_get_tag_indef): New function; get tag info,
+       lengths, etc. as well as flag indicating whether the length is
+       indefinite.
+       (asn1_get_tag): Modify to just call asn1_get_tag_indef().
+       (asn1_get_sequence): Call asn1_get_tag_indef() in order to
+       determine whether encoding is indefinite length.
+       (asn1_get_length): Add "indef" arg to indicate whether an encoding
+       has an indefinite length.
+
+       * asn1buf.h: Update asn1buf_imbed() prototype.
+
+       * asn1buf.c (asn1buf_imbed): Add "indef" arg so that we don't
+       treat a definite zero-length encoding as an indefinite encoding.
+
 1999-10-26  Tom Yu  <tlyu@mit.edu>
 
        * Makefile.in: Clean up usage of CFLAGS, CPPFLAGS, DEFS, DEFINES,
index 39750bc7490f6763bed6a7030f8db6cc9151fa57..20334a2fc2197b46ad44b3953b17d5f366d811c0 100644 (file)
 
 #include "asn1_get.h"
 
-asn1_error_code asn1_get_tag(buf, class, construction, tagnum, retlen)
+asn1_error_code
+asn1_get_tag_indef(buf, class, construction, tagnum, retlen, indef)
      asn1buf * buf;
      asn1_class * class;
      asn1_construction * construction;
      asn1_tagnum * tagnum;
      int * retlen;
+     int * indef;
 {
   asn1_error_code retval;
   
@@ -48,21 +50,36 @@ asn1_error_code asn1_get_tag(buf, class, construction, tagnum, retlen)
   }
   retval = asn1_get_id(buf,class,construction,tagnum);
   if(retval) return retval;
-  retval = asn1_get_length(buf,retlen);
+  retval = asn1_get_length(buf,retlen,indef);
   if(retval) return retval;
   return 0;
 }
 
-asn1_error_code asn1_get_sequence(buf, retlen)
+asn1_error_code
+asn1_get_tag(buf, class, construction, tagnum, retlen)
+     asn1buf *buf;
+     asn1_class *class;
+     asn1_construction *construction;
+     asn1_tagnum *tagnum;
+     int *retlen;
+{
+  asn1_error_code retval;
+  int indef;
+
+  return asn1_get_tag_indef(buf, class, construction, tagnum, retlen, &indef);
+}
+
+asn1_error_code asn1_get_sequence(buf, retlen, indef)
      asn1buf * buf;
      int * retlen;
+     int * indef;
 {
   asn1_error_code retval;
   asn1_class class;
   asn1_construction construction;
   asn1_tagnum tagnum;
 
-  retval = asn1_get_tag(buf,&class,&construction,&tagnum,retlen);
+  retval = asn1_get_tag_indef(buf,&class,&construction,&tagnum,retlen,indef);
   if(retval) return retval;
   if(retval) return (krb5_error_code)retval;
   if(class != UNIVERSAL || construction != CONSTRUCTED ||
@@ -109,13 +126,16 @@ asn1_error_code asn1_get_id(buf, class, construction, tagnum)
   return 0;
 }
 
-asn1_error_code asn1_get_length(buf, retlen)
+asn1_error_code asn1_get_length(buf, retlen, indef)
      asn1buf * buf;
      int * retlen;
+     int * indef;
 {
   asn1_error_code retval;
   asn1_octet o;
 
+  if (indef != NULL)
+    *indef = 0;
   retval = asn1buf_remove_octet(buf,&o);
   if(retval) return retval;
   if((o&0x80) == 0){
@@ -129,6 +149,8 @@ asn1_error_code asn1_get_length(buf, retlen)
       if(retval) return retval;
       len = (len<<8) + (int)o;
     }
+    if (indef != NULL && !len)
+      *indef = 1;
     if(retlen != NULL) *retlen = len;
   }
   return 0;
index f21c117dba16e62f16675b19aec17a4dd906f69b..2f5edf112287917607e90f9e0427ef1a59216d12 100644 (file)
 #include "krbasn1.h"
 #include "asn1buf.h"
 
+asn1_error_code asn1_get_tag_indef
+       PROTOTYPE((asn1buf *buf,
+                  asn1_class *class,
+                  asn1_construction *construction,
+                  asn1_tagnum *tagnum,
+                  int *retlen, int *indef));
 asn1_error_code asn1_get_tag
        PROTOTYPE((asn1buf *buf,
                   asn1_class *class,
@@ -49,7 +55,7 @@ asn1_error_code asn1_get_tag
             Returns ASN1_OVERRUN if *buf is exhausted during the parse. */
 
 asn1_error_code asn1_get_sequence
-       PROTOTYPE((asn1buf *buf, int *retlen));
+       PROTOTYPE((asn1buf *buf, int *retlen, int *indef));
 /* requires  *buf is allocated
    effects   Decodes a tag from *buf and returns ASN1_BAD_ID if it
               doesn't have a sequence ID.  If retlen != NULL, the
@@ -71,7 +77,7 @@ asn1_error_code asn1_get_id
             Returns ASN1_OVERRUN if *buf is exhausted. */
 
 asn1_error_code asn1_get_length
-       PROTOTYPE((asn1buf *buf, int *retlen));
+       PROTOTYPE((asn1buf *buf, int *retlen, int *indef));
 /* requires  *buf is allocated
    effects   Decodes the group of length octets at *buf's
               current position.  If retlen != NULL, the
index a92621a7599b78f2a1a371fbc2d1919291c820b7..0c14e94f0883f155bd1f9539e8886a7656daa407 100644 (file)
@@ -92,11 +92,10 @@ else { len = 0; var = 0; }
 
 #define begin_structure()\
 asn1buf subbuf;\
-retval = asn1_get_tag(buf,&class,&construction,&tagnum,&length);\
+int indef;\
+retval = asn1_get_sequence(buf,&length,&indef);\
 if(retval) return retval;\
-if(class != UNIVERSAL || construction != CONSTRUCTED ||\
-   tagnum != ASN1_SEQUENCE) return ASN1_BAD_ID;\
-retval = asn1buf_imbed(&subbuf,buf,length);\
+retval = asn1buf_imbed(&subbuf,buf,length,indef);\
 if(retval) return retval;\
 next_tag()
 
@@ -108,9 +107,10 @@ if(retval) return retval
 int size=0;\
 asn1buf seqbuf;\
 int length;\
-retval = asn1_get_sequence(buf,&length);\
+int indef;\
+retval = asn1_get_sequence(buf,&length,&indef);\
 if(retval) return retval;\
-retval = asn1buf_imbed(&seqbuf,buf,length);\
+retval = asn1buf_imbed(&seqbuf,buf,length,indef);\
 if(retval) return retval
 
 #define end_sequence_of(buf)\
index 6d7a950b93a64718153cbbcff0b6a81e24e14d37..9c639279a8cca25d92368c329cf054240b92fabd 100644 (file)
@@ -75,13 +75,14 @@ asn1_error_code asn1buf_wrap_data(buf, code)
   return 0;
 }
 
-asn1_error_code asn1buf_imbed(subbuf, buf, length)
+asn1_error_code asn1buf_imbed(subbuf, buf, length, indef)
      asn1buf * subbuf;
      const asn1buf * buf;
      const int length;
+     const int indef;
 {
   subbuf->base = subbuf->next = buf->next;
-  if (length > 0 ) {
+  if (!indef) {
       subbuf->bound = subbuf->base + length - 1;
       if (subbuf->bound > buf->bound)
          return ASN1_OVERRUN;
index b1da42f7db375bebec9f4ea5f8bebbc8cc479f70..52fc0d625adb28af8702b7642e49730d0469b068 100644 (file)
@@ -111,7 +111,8 @@ asn1_error_code asn1buf_wrap_data
             Returns ASN1_MISSING_FIELD if code is empty. */
 
 asn1_error_code asn1buf_imbed
-       PROTOTYPE((asn1buf *subbuf, const asn1buf *buf, const int length));
+       PROTOTYPE((asn1buf *subbuf, const asn1buf *buf, const int length,
+                  const int indef));
 /* requires  *subbuf and *buf are allocated
    effects   *subbuf becomes a sub-buffer of *buf.  *subbuf begins
               at *buf's current position and is length octets long.
index d66f697c715ad02acb6928cc29eace4bdd498439..a56a1f45163209157c58079e0c0d1ef87162f4b6 100644 (file)
@@ -85,11 +85,10 @@ if(class != CONTEXT_SPECIFIC || construction != CONSTRUCTED)\
 /* decode sequence header and initialize tagnum with the first field */
 #define begin_structure()\
 asn1buf subbuf;\
-retval = asn1_get_tag(&buf,&class,&construction,&tagnum,&length);\
+int indef;\
+retval = asn1_get_sequence(&buf,&length,&indef);\
 if(retval) clean_return(retval);\
-if(class != UNIVERSAL || construction != CONSTRUCTED ||\
-   tagnum != ASN1_SEQUENCE) clean_return(ASN1_BAD_ID);\
-retval = asn1buf_imbed(&subbuf,&buf,length);\
+retval = asn1buf_imbed(&subbuf,&buf,length,indef);\
 if(retval) clean_return(retval);\
 next_tag()