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
+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,
#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;
}
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 ||
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){
if(retval) return retval;
len = (len<<8) + (int)o;
}
+ if (indef != NULL && !len)
+ *indef = 1;
if(retlen != NULL) *retlen = len;
}
return 0;
#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,
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
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
#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()
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)\
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;
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.
/* 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()