| 1 | /* Generated from gssapi.asn1 */ |
| 2 | /* Do not edit */ |
| 3 | |
| 4 | #define ASN1_LIB |
| 5 | |
| 6 | #include <stdio.h> |
| 7 | #include <stdlib.h> |
| 8 | #include <time.h> |
| 9 | #include <string.h> |
| 10 | #include <errno.h> |
| 11 | #include <limits.h> |
| 12 | #include <krb5/krb5-types.h> |
| 13 | #include "gssapi_asn1.h" |
| 14 | #include "gssapi_asn1-priv.h" |
| 15 | #include <krb5/asn1_err.h> |
| 16 | #include <krb5/der.h> |
| 17 | #include <asn1-template.h> |
| 18 | |
| 19 | #include <krb5/parse_units.h> |
| 20 | |
| 21 | int ASN1CALL |
| 22 | encode_GSSAPIContextToken(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const GSSAPIContextToken *data, size_t *size) |
| 23 | { |
| 24 | size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0; |
| 25 | size_t l HEIMDAL_UNUSED_ATTRIBUTE; |
| 26 | int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE; |
| 27 | |
| 28 | /* innerContextToken */ |
| 29 | { |
| 30 | size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret; |
| 31 | ret = 0; |
| 32 | e = encode_heim_any_set(p, len, &(data)->innerContextToken, &l); |
| 33 | if (e) return e; |
| 34 | p -= l; len -= l; ret += l; |
| 35 | |
| 36 | ret += Top_tag_oldret; |
| 37 | } |
| 38 | /* thisMech */ |
| 39 | { |
| 40 | size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret; |
| 41 | ret = 0; |
| 42 | e = der_put_oid(p, len, &(data)->thisMech, &l); |
| 43 | if (e) return e; |
| 44 | p -= l; len -= l; ret += l; |
| 45 | |
| 46 | e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OID, &l); |
| 47 | if (e) return e; |
| 48 | p -= l; len -= l; ret += l; |
| 49 | |
| 50 | ret += Top_tag_oldret; |
| 51 | } |
| 52 | e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 0, &l); |
| 53 | if (e) return e; |
| 54 | p -= l; len -= l; ret += l; |
| 55 | |
| 56 | *size = ret; |
| 57 | return 0; |
| 58 | } |
| 59 | |
| 60 | int ASN1CALL |
| 61 | decode_GSSAPIContextToken(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, GSSAPIContextToken *data, size_t *size) |
| 62 | { |
| 63 | size_t ret = 0; |
| 64 | size_t l HEIMDAL_UNUSED_ATTRIBUTE; |
| 65 | int e HEIMDAL_UNUSED_ATTRIBUTE; |
| 66 | |
| 67 | memset(data, 0, sizeof(*data)); |
| 68 | { |
| 69 | size_t Top_datalen, Top_oldlen; |
| 70 | Der_type Top_type; |
| 71 | e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 0, &Top_datalen, &l); |
| 72 | if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; } |
| 73 | if(e) goto fail; |
| 74 | p += l; len -= l; ret += l; |
| 75 | Top_oldlen = len; |
| 76 | if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; } |
| 77 | len = Top_datalen; |
| 78 | { |
| 79 | size_t thisMech_datalen, thisMech_oldlen; |
| 80 | Der_type thisMech_type; |
| 81 | e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &thisMech_type, UT_OID, &thisMech_datalen, &l); |
| 82 | if (e == 0 && thisMech_type != PRIM) { e = ASN1_BAD_ID; } |
| 83 | if(e) goto fail; |
| 84 | p += l; len -= l; ret += l; |
| 85 | thisMech_oldlen = len; |
| 86 | if (thisMech_datalen > len) { e = ASN1_OVERRUN; goto fail; } |
| 87 | len = thisMech_datalen; |
| 88 | e = der_get_oid(p, len, &(data)->thisMech, &l); |
| 89 | if(e) goto fail; |
| 90 | p += l; len -= l; ret += l; |
| 91 | len = thisMech_oldlen - thisMech_datalen; |
| 92 | } |
| 93 | e = decode_heim_any_set(p, len, &(data)->innerContextToken, &l); |
| 94 | if(e) goto fail; |
| 95 | p += l; len -= l; ret += l; |
| 96 | len = Top_oldlen - Top_datalen; |
| 97 | } |
| 98 | if(size) *size = ret; |
| 99 | return 0; |
| 100 | fail: |
| 101 | free_GSSAPIContextToken(data); |
| 102 | return e; |
| 103 | } |
| 104 | |
| 105 | void ASN1CALL |
| 106 | free_GSSAPIContextToken(GSSAPIContextToken *data) |
| 107 | { |
| 108 | der_free_oid(&(data)->thisMech); |
| 109 | free_heim_any_set(&(data)->innerContextToken); |
| 110 | } |
| 111 | |
| 112 | size_t ASN1CALL |
| 113 | length_GSSAPIContextToken(const GSSAPIContextToken *data) |
| 114 | { |
| 115 | size_t ret = 0; |
| 116 | { |
| 117 | size_t Top_tag_oldret = ret; |
| 118 | ret = 0; |
| 119 | ret += der_length_oid(&(data)->thisMech); |
| 120 | ret += 1 + der_length_len (ret); |
| 121 | ret += Top_tag_oldret; |
| 122 | } |
| 123 | { |
| 124 | size_t Top_tag_oldret = ret; |
| 125 | ret = 0; |
| 126 | ret += length_heim_any_set(&(data)->innerContextToken); |
| 127 | ret += Top_tag_oldret; |
| 128 | } |
| 129 | ret += 1 + der_length_len (ret); |
| 130 | return ret; |
| 131 | } |
| 132 | |
| 133 | int ASN1CALL |
| 134 | copy_GSSAPIContextToken(const GSSAPIContextToken *from, GSSAPIContextToken *to) |
| 135 | { |
| 136 | memset(to, 0, sizeof(*to)); |
| 137 | if(der_copy_oid(&(from)->thisMech, &(to)->thisMech)) goto fail; |
| 138 | if(copy_heim_any_set(&(from)->innerContextToken, &(to)->innerContextToken)) goto fail; |
| 139 | return 0; |
| 140 | fail: |
| 141 | free_GSSAPIContextToken(to); |
| 142 | return ENOMEM; |
| 143 | } |
| 144 | |
| 145 | |