diff options
author | Greg Hudson <ghudson@mit.edu> | 2012-02-12 17:13:24 +0000 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2012-02-12 17:13:24 +0000 |
commit | 278b6a29d425ddca787d6d87dea14be48e45c13a (patch) | |
tree | 6e59d51222adc68be0ea81110705874aac9b0b62 /src/lib/krb5/asn.1/asn1_k_encode.c | |
parent | 718e993720682d6e2b7cc54ab699d2fd3f58446d (diff) | |
download | krb5-278b6a29d425ddca787d6d87dea14be48e45c13a.zip krb5-278b6a29d425ddca787d6d87dea14be48e45c13a.tar.gz krb5-278b6a29d425ddca787d6d87dea14be48e45c13a.tar.bz2 |
Separate tag info and length in ASN.1 encoder
Remove the length field of taginfo, and change the internal ASN.1
encoder interfaces to return length separately from tag info.
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25698 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/krb5/asn.1/asn1_k_encode.c')
-rw-r--r-- | src/lib/krb5/asn.1/asn1_k_encode.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/lib/krb5/asn.1/asn1_k_encode.c b/src/lib/krb5/asn.1/asn1_k_encode.c index a48db98..5ed1752 100644 --- a/src/lib/krb5/asn.1/asn1_k_encode.c +++ b/src/lib/krb5/asn.1/asn1_k_encode.c @@ -94,13 +94,13 @@ DEFOPTIONALZEROTYPE(opt_principal, principal); * with old implementations. */ static asn1_error_code -encode_seqno(asn1buf *buf, const void *p, taginfo *rettag) +encode_seqno(asn1buf *buf, const void *p, taginfo *rettag, size_t *len_out) { krb5_ui_4 val = *(krb5_ui_4 *)p; rettag->asn1class = UNIVERSAL; rettag->construction = PRIMITIVE; rettag->tagnum = ASN1_INTEGER; - return k5_asn1_encode_uint(buf, val, &rettag->length); + return k5_asn1_encode_uint(buf, val, len_out); } static asn1_error_code decode_seqno(const taginfo *t, const unsigned char *asn1, size_t len, void *p) @@ -128,14 +128,15 @@ DEFOPTIONALZEROTYPE(opt_seqno, seqno); /* Define the kerberos_time type, which is an ASN.1 generaltime represented in * a krb5_timestamp. */ static asn1_error_code -encode_kerberos_time(asn1buf *buf, const void *p, taginfo *rettag) +encode_kerberos_time(asn1buf *buf, const void *p, taginfo *rettag, + size_t *len_out) { /* Range checking for time_t vs krb5_timestamp? */ time_t val = *(krb5_timestamp *)p; rettag->asn1class = UNIVERSAL; rettag->construction = PRIMITIVE; rettag->tagnum = ASN1_GENERALTIME; - return k5_asn1_encode_generaltime(buf, val, &rettag->length); + return k5_asn1_encode_generaltime(buf, val, len_out); } static asn1_error_code decode_kerberos_time(const taginfo *t, const unsigned char *asn1, size_t len, @@ -190,14 +191,15 @@ DEFOPTIONALTYPE(opt_encrypted_data, nonempty_enc_data, NULL, encrypted_data); /* Define the krb5_flags type, which is an ASN.1 bit string represented in a * 32-bit integer. */ static asn1_error_code -encode_krb5_flags(asn1buf *buf, const void *p, taginfo *rettag) +encode_krb5_flags(asn1buf *buf, const void *p, taginfo *rettag, + size_t *len_out) { unsigned char cbuf[4], *cptr = cbuf; store_32_be((krb5_ui_4)*(const krb5_flags *)p, cbuf); rettag->asn1class = UNIVERSAL; rettag->construction = PRIMITIVE; rettag->tagnum = ASN1_BITSTRING; - return k5_asn1_encode_bitstring(buf, &cptr, 4, &rettag->length); + return k5_asn1_encode_bitstring(buf, &cptr, 4, len_out); } static asn1_error_code decode_krb5_flags(const taginfo *t, const unsigned char *asn1, size_t len, @@ -277,13 +279,13 @@ DEFOPTIONALZEROTYPE(opt_checksum_ptr, checksum_ptr); /* Define the last_req_type type, which is a krb5_int32 with some massaging * on decode for backward compatibility. */ static asn1_error_code -encode_lr_type(asn1buf *buf, const void *p, taginfo *rettag) +encode_lr_type(asn1buf *buf, const void *p, taginfo *rettag, size_t *len_out) { krb5_int32 val = *(krb5_int32 *)p; rettag->asn1class = UNIVERSAL; rettag->construction = PRIMITIVE; rettag->tagnum = ASN1_INTEGER; - return k5_asn1_encode_int(buf, val, &rettag->length); + return k5_asn1_encode_int(buf, val, len_out); } static asn1_error_code decode_lr_type(const taginfo *t, const unsigned char *asn1, size_t len, @@ -434,7 +436,8 @@ static const struct atype_info *kdc_req_hack_fields[] = { }; DEFSEQTYPE(kdc_req_body_hack, kdc_req_hack, kdc_req_hack_fields); static asn1_error_code -encode_kdc_req_body(asn1buf *buf, const void *p, taginfo *tag_out) +encode_kdc_req_body(asn1buf *buf, const void *p, taginfo *tag_out, + size_t *len_out) { const krb5_kdc_req *val = p; kdc_req_hack h; @@ -448,7 +451,8 @@ encode_kdc_req_body(asn1buf *buf, const void *p, taginfo *tag_out) h.server_realm = val->server->realm; else return ASN1_MISSING_FIELD; - return k5_asn1_encode_atype(buf, &h, &k5_atype_kdc_req_body_hack, tag_out); + return k5_asn1_encode_atype(buf, &h, &k5_atype_kdc_req_body_hack, tag_out, + len_out); } static void free_kdc_req_body(void *val) |