diff options
author | Tom Yu <tlyu@mit.edu> | 1994-06-29 05:35:50 +0000 |
---|---|---|
committer | Tom Yu <tlyu@mit.edu> | 1994-06-29 05:35:50 +0000 |
commit | ba0c614172f11219c430b17cd14602d9f7e629e3 (patch) | |
tree | 61c2ac5235dbd41debd8aaf0d6eb63be20e1a506 /src/lib/krb5/asn.1/asn1_get.c | |
parent | 0ab5822efa69c6b2236b5f052775b2ce86c7c30e (diff) | |
download | krb5-ba0c614172f11219c430b17cd14602d9f7e629e3.zip krb5-ba0c614172f11219c430b17cd14602d9f7e629e3.tar.gz krb5-ba0c614172f11219c430b17cd14602d9f7e629e3.tar.bz2 |
folding in Harry's changes
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@3924 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 | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/lib/krb5/asn.1/asn1_get.c b/src/lib/krb5/asn.1/asn1_get.c new file mode 100644 index 0000000..67e74ce --- /dev/null +++ b/src/lib/krb5/asn.1/asn1_get.c @@ -0,0 +1,111 @@ +#include "asn1_get.h" + +asn1_error_code asn1_get_tag(DECLARG(asn1buf *, buf), + DECLARG(asn1_class *, class), + DECLARG(asn1_construction *, construction), + DECLARG(asn1_tagnum *, tagnum), + DECLARG(int *, retlen)) + OLDDECLARG(asn1buf *, buf) + OLDDECLARG(asn1_class *, class) + OLDDECLARG(asn1_construction *, construction) + OLDDECLARG(asn1_tagnum *, tagnum) + OLDDECLARG(int *, retlen) +{ + asn1_error_code retval; + + if(asn1buf_remains(buf) <= 0){ + *tagnum = ASN1_TAGNUM_CEILING; + return 0; + } + retval = asn1_get_id(buf,class,construction,tagnum); + if(retval) return retval; + retval = asn1_get_length(buf,retlen); + if(retval) return retval; + return 0; +} + +asn1_error_code asn1_get_sequence(DECLARG(asn1buf *, buf), + DECLARG(int *, retlen)) + OLDDECLARG(asn1buf *, buf) + OLDDECLARG(int *, retlen) +{ + asn1_error_code retval; + asn1_class class; + asn1_construction construction; + asn1_tagnum tagnum; + + retval = asn1_get_tag(buf,&class,&construction,&tagnum,retlen); + if(retval) return retval; + if(retval) return (krb5_error_code)retval; + if(class != UNIVERSAL || construction != CONSTRUCTED || + tagnum != ASN1_SEQUENCE) return ASN1_BAD_ID; + return 0; +} + +/****************************************************************/ +/* Private Procedures */ + +asn1_error_code asn1_get_id(DECLARG(asn1buf *, buf), + DECLARG(asn1_class *, class), + DECLARG(asn1_construction *, construction), + DECLARG(asn1_tagnum *, tagnum)) + OLDDECLARG(asn1buf *, buf) + OLDDECLARG(asn1_class *, class) + OLDDECLARG(asn1_construction *, construction) + OLDDECLARG(asn1_tagnum *, tagnum) +{ + asn1_error_code retval; + asn1_tagnum tn=0; + asn1_octet o; + +#define ASN1_CLASS_MASK 0xC0 +#define ASN1_CONSTRUCTION_MASK 0x20 +#define ASN1_TAG_NUMBER_MASK 0x1F + + retval = asn1buf_remove_octet(buf,&o); + if(retval) return retval; + + if(class != NULL) + *class = (asn1_class)(o&ASN1_CLASS_MASK); + if(construction != NULL) + *construction = (asn1_construction)(o&ASN1_CONSTRUCTION_MASK); + if((o&ASN1_TAG_NUMBER_MASK) != ASN1_TAG_NUMBER_MASK){ + /* low-tag-number form */ + if(tagnum != NULL) *tagnum = (asn1_tagnum)(o&ASN1_TAG_NUMBER_MASK); + }else{ + /* high-tag-number form */ + do{ + retval = asn1buf_remove_octet(buf,&o); + if(retval) return retval; + tn = (tn<<7) + (asn1_tagnum)(o&0x7F); + }while(tn&0x80); + if(tagnum != NULL) *tagnum = tn; + } + return 0; +} + +asn1_error_code asn1_get_length(DECLARG(asn1buf *, buf), + DECLARG(int *, retlen)) + OLDDECLARG(asn1buf *, buf) + OLDDECLARG(int *, retlen) +{ + asn1_error_code retval; + asn1_octet o; + + retval = asn1buf_remove_octet(buf,&o); + if(retval) return retval; + if((o&0x80) == 0){ + if(retlen != NULL) *retlen = (int)(o&0x7F); + }else{ + int num; + int len=0; + + for(num = (int)(o&0x7F); num>0; num--){ + retval = asn1buf_remove_octet(buf,&o); + if(retval) return retval; + len = (len<<8) + (int)o; + } + if(retlen != NULL) *retlen = len; + } + return 0; +} |