aboutsummaryrefslogtreecommitdiff
path: root/src/lib/krb5/asn.1/asn1_get.c
diff options
context:
space:
mode:
authorTom Yu <tlyu@mit.edu>1994-06-29 05:35:50 +0000
committerTom Yu <tlyu@mit.edu>1994-06-29 05:35:50 +0000
commitba0c614172f11219c430b17cd14602d9f7e629e3 (patch)
tree61c2ac5235dbd41debd8aaf0d6eb63be20e1a506 /src/lib/krb5/asn.1/asn1_get.c
parent0ab5822efa69c6b2236b5f052775b2ce86c7c30e (diff)
downloadkrb5-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.c111
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;
+}