aboutsummaryrefslogtreecommitdiff
path: root/src/lib/krb5/asn.1/asn1_get.c
diff options
context:
space:
mode:
authorTom Yu <tlyu@mit.edu>1999-11-01 21:08:55 +0000
committerTom Yu <tlyu@mit.edu>1999-11-01 21:08:55 +0000
commit18ba61167c89f65a6d861acf69460cff18b5a2cb (patch)
tree92f31455fba7979eafe0d424f97da1897da2e73f /src/lib/krb5/asn.1/asn1_get.c
parent4343e0d35106ae3179e4e7a5daca548648a4cd89 (diff)
downloadkrb5-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.c32
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;