asn1_error_code krb5int_asn1_encode_a_thing(asn1buf *buf, const void *val, const struct atype_info *a, unsigned int *retlen) { switch (a->type) { case atype_fn: assert(a->enc != NULL); return a->enc(buf, val, retlen); case atype_sequence: assert(a->seq != NULL); return just_encode_sequence(buf, val, a->seq, retlen); case atype_ptr: assert(a->basetype != NULL); return krb5int_asn1_encode_a_thing(buf, LOADPTR(val, a), a->basetype, retlen); case atype_field: assert(a->field != NULL); return encode_a_field(buf, val, a->field, retlen); case atype_nullterm_sequence_of: case atype_nonempty_nullterm_sequence_of: assert(a->basetype != NULL); return encode_nullterm_sequence_of(buf, val, a->basetype, a->type == atype_nullterm_sequence_of, retlen); case atype_tagged_thing: { asn1_error_code retval; unsigned int length, sum = 0; retval = krb5int_asn1_encode_a_thing(buf, val, a->basetype, &length); if (retval) return retval; sum = length; retval = asn1_make_etag(buf, a->tagtype, a->tagval, sum, &length); if (retval) return retval; sum += length; *retlen = sum; return 0; } case atype_int: assert(a->loadint != NULL); return asn1_encode_integer(buf, a->loadint(val), retlen); case atype_uint: assert(a->loaduint != NULL); return asn1_encode_unsigned_integer(buf, a->loaduint(val), retlen); case atype_min: case atype_max: case atype_fn_len: default: assert(a->type > atype_min); assert(a->type < atype_max); assert(a->type != atype_fn_len); abort(); } }
asn1_error_code asn1_encode_ui_4(asn1buf *buf, const krb5_ui_4 val, unsigned int *retlen) { return asn1_encode_unsigned_integer(buf,val,retlen); }