diff options
author | Tom Yu <tlyu@mit.edu> | 1999-11-01 21:08:55 +0000 |
---|---|---|
committer | Tom Yu <tlyu@mit.edu> | 1999-11-01 21:08:55 +0000 |
commit | 18ba61167c89f65a6d861acf69460cff18b5a2cb (patch) | |
tree | 92f31455fba7979eafe0d424f97da1897da2e73f /src/lib/krb5/asn.1/asn1_get.c | |
parent | 4343e0d35106ae3179e4e7a5daca548648a4cd89 (diff) | |
download | krb5-18ba61167c89f65a6d861acf69460cff18b5a2cb.zip krb5-18ba61167c89f65a6d861acf69460cff18b5a2cb.tar.gz krb5-18ba61167c89f65a6d861acf69460cff18b5a2cb.tar.bz2 |
* 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.
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@11890 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/krb5/asn.1/asn1_get.c')
-rw-r--r-- | src/lib/krb5/asn.1/asn1_get.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/lib/krb5/asn.1/asn1_get.c b/src/lib/krb5/asn.1/asn1_get.c index 39750bc..20334a2 100644 --- a/src/lib/krb5/asn.1/asn1_get.c +++ b/src/lib/krb5/asn.1/asn1_get.c @@ -26,12 +26,14 @@ #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; |