LCOV - code coverage report
Current view: top level - bin/default/source4/heimdal/lib/asn1 - asn1_hdb_asn1.c (source / functions) Hit Total Coverage
Test: coverage report for abartlet/fix-coverage dd10fb34 Lines: 59 3360 1.8 %
Date: 2021-09-23 10:06:22 Functions: 6 102 5.9 %

          Line data    Source code
       1             : #include "config.h"
       2             : /* Generated from /builds/samba-team/devel/samba/source4/heimdal/lib/hdb/hdb.asn1 */
       3             : /* Do not edit */
       4             : 
       5             : #define  ASN1_LIB
       6             : 
       7             : #include <stdio.h>
       8             : #include <stdlib.h>
       9             : #include <time.h>
      10             : #include <string.h>
      11             : #include <errno.h>
      12             : #include <limits.h>
      13             : #include <krb5-types.h>
      14             : #include <hdb_asn1.h>
      15             : #include <hdb_asn1-priv.h>
      16             : #include <asn1_err.h>
      17             : #include <der.h>
      18             : #include <der-private.h>
      19             : #include <asn1-template.h>
      20             : #include <parse_units.h>
      21             : 
      22             : int ASN1CALL
      23           0 : encode_Salt(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Salt *data, size_t *size)
      24             : {
      25           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
      26             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
      27             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
      28             : 
      29             : /* opaque */
      30           0 : if((data)->opaque) {
      31           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
      32           0 : ret = 0;
      33           0 : e = der_put_octet_string(p, len, (data)->opaque, &l);
      34           0 : if (e) return e;
      35           0 : p -= l; len -= l; ret += l;
      36             : 
      37           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
      38           0 : if (e) return e;
      39           0 : p -= l; len -= l; ret += l;
      40             : 
      41           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
      42           0 : if (e) return e;
      43           0 : p -= l; len -= l; ret += l;
      44             : 
      45           0 : ret += Top_tag_oldret;
      46             : }
      47             : /* salt */
      48             : {
      49           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
      50           0 : ret = 0;
      51           0 : e = der_put_octet_string(p, len, &(data)->salt, &l);
      52           0 : if (e) return e;
      53           0 : p -= l; len -= l; ret += l;
      54             : 
      55           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
      56           0 : if (e) return e;
      57           0 : p -= l; len -= l; ret += l;
      58             : 
      59           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
      60           0 : if (e) return e;
      61           0 : p -= l; len -= l; ret += l;
      62             : 
      63           0 : ret += Top_tag_oldret;
      64             : }
      65             : /* type */
      66             : {
      67           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
      68           0 : ret = 0;
      69           0 : e = der_put_unsigned(p, len, &(data)->type, &l);
      70           0 : if (e) return e;
      71           0 : p -= l; len -= l; ret += l;
      72             : 
      73           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
      74           0 : if (e) return e;
      75           0 : p -= l; len -= l; ret += l;
      76             : 
      77           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
      78           0 : if (e) return e;
      79           0 : p -= l; len -= l; ret += l;
      80             : 
      81           0 : ret += Top_tag_oldret;
      82             : }
      83           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
      84           0 : if (e) return e;
      85           0 : p -= l; len -= l; ret += l;
      86             : 
      87           0 : *size = ret;
      88           0 : return 0;
      89             : }
      90             : 
      91             : int ASN1CALL
      92           0 : decode_Salt(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Salt *data, size_t *size)
      93             : {
      94           0 : size_t ret = 0;
      95             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
      96             : int e HEIMDAL_UNUSED_ATTRIBUTE;
      97             : 
      98           0 : memset(data, 0, sizeof(*data));
      99             : {
     100             : size_t Top_datalen, Top_oldlen;
     101             : Der_type Top_type;
     102           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
     103           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
     104           0 : if(e) goto fail;
     105           0 : p += l; len -= l; ret += l;
     106           0 : Top_oldlen = len;
     107           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     108           0 : len = Top_datalen;
     109             : {
     110             : size_t type_datalen, type_oldlen;
     111             : Der_type type_type;
     112           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &type_type, 0, &type_datalen, &l);
     113           0 : if (e == 0 && type_type != CONS) { e = ASN1_BAD_ID; }
     114           0 : if(e) goto fail;
     115           0 : p += l; len -= l; ret += l;
     116           0 : type_oldlen = len;
     117           0 : if (type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     118           0 : len = type_datalen;
     119             : {
     120             : size_t type_Tag_datalen, type_Tag_oldlen;
     121             : Der_type type_Tag_type;
     122           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &type_Tag_type, UT_Integer, &type_Tag_datalen, &l);
     123           0 : if (e == 0 && type_Tag_type != PRIM) { e = ASN1_BAD_ID; }
     124           0 : if(e) goto fail;
     125           0 : p += l; len -= l; ret += l;
     126           0 : type_Tag_oldlen = len;
     127           0 : if (type_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     128           0 : len = type_Tag_datalen;
     129           0 : e = der_get_unsigned(p, len, &(data)->type, &l);
     130           0 : if(e) goto fail;
     131           0 : p += l; len -= l; ret += l;
     132           0 : len = type_Tag_oldlen - type_Tag_datalen;
     133             : }
     134           0 : len = type_oldlen - type_datalen;
     135             : }
     136             : {
     137             : size_t salt_datalen, salt_oldlen;
     138             : Der_type salt_type;
     139           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &salt_type, 1, &salt_datalen, &l);
     140           0 : if (e == 0 && salt_type != CONS) { e = ASN1_BAD_ID; }
     141           0 : if(e) goto fail;
     142           0 : p += l; len -= l; ret += l;
     143           0 : salt_oldlen = len;
     144           0 : if (salt_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     145           0 : len = salt_datalen;
     146             : {
     147             : size_t salt_Tag_datalen, salt_Tag_oldlen;
     148             : Der_type salt_Tag_type;
     149           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &salt_Tag_type, UT_OctetString, &salt_Tag_datalen, &l);
     150           0 : if (e == 0 && salt_Tag_type != PRIM) { e = ASN1_BAD_ID; }
     151           0 : if(e) goto fail;
     152           0 : p += l; len -= l; ret += l;
     153           0 : salt_Tag_oldlen = len;
     154           0 : if (salt_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     155           0 : len = salt_Tag_datalen;
     156           0 : e = der_get_octet_string(p, len, &(data)->salt, &l);
     157           0 : if(e) goto fail;
     158           0 : p += l; len -= l; ret += l;
     159           0 : len = salt_Tag_oldlen - salt_Tag_datalen;
     160             : }
     161           0 : len = salt_oldlen - salt_datalen;
     162             : }
     163             : {
     164             : size_t opaque_datalen, opaque_oldlen;
     165             : Der_type opaque_type;
     166           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &opaque_type, 2, &opaque_datalen, &l);
     167           0 : if (e == 0 && opaque_type != CONS) { e = ASN1_BAD_ID; }
     168           0 : if(e) {
     169           0 : (data)->opaque = NULL;
     170             : } else {
     171           0 : (data)->opaque = calloc(1, sizeof(*(data)->opaque));
     172           0 : if ((data)->opaque == NULL) { e = ENOMEM; goto fail; }
     173           0 : p += l; len -= l; ret += l;
     174           0 : opaque_oldlen = len;
     175           0 : if (opaque_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     176           0 : len = opaque_datalen;
     177             : {
     178             : size_t opaque_Tag_datalen, opaque_Tag_oldlen;
     179             : Der_type opaque_Tag_type;
     180           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &opaque_Tag_type, UT_OctetString, &opaque_Tag_datalen, &l);
     181           0 : if (e == 0 && opaque_Tag_type != PRIM) { e = ASN1_BAD_ID; }
     182           0 : if(e) goto fail;
     183           0 : p += l; len -= l; ret += l;
     184           0 : opaque_Tag_oldlen = len;
     185           0 : if (opaque_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     186           0 : len = opaque_Tag_datalen;
     187           0 : e = der_get_octet_string(p, len, (data)->opaque, &l);
     188           0 : if(e) goto fail;
     189           0 : p += l; len -= l; ret += l;
     190           0 : len = opaque_Tag_oldlen - opaque_Tag_datalen;
     191             : }
     192           0 : len = opaque_oldlen - opaque_datalen;
     193             : }
     194             : }
     195           0 : len = Top_oldlen - Top_datalen;
     196             : }
     197           0 : if(size) *size = ret;
     198           0 : return 0;
     199           0 : fail:
     200           0 : free_Salt(data);
     201           0 : return e;
     202             : }
     203             : 
     204             : void ASN1CALL
     205      439376 : free_Salt(Salt *data)
     206             : {
     207      439376 : der_free_octet_string(&(data)->salt);
     208      439376 : if((data)->opaque) {
     209           0 : der_free_octet_string((data)->opaque);
     210           0 : free((data)->opaque);
     211           0 : (data)->opaque = NULL;
     212             : }
     213      439376 : }
     214             : 
     215             : size_t ASN1CALL
     216           0 : length_Salt(const Salt *data)
     217             : {
     218           0 : size_t ret = 0;
     219             : {
     220           0 : size_t Top_tag_oldret = ret;
     221           0 : ret = 0;
     222           0 : ret += der_length_unsigned(&(data)->type);
     223           0 : ret += 1 + der_length_len (ret);
     224           0 : ret += 1 + der_length_len (ret);
     225           0 : ret += Top_tag_oldret;
     226             : }
     227             : {
     228           0 : size_t Top_tag_oldret = ret;
     229           0 : ret = 0;
     230           0 : ret += der_length_octet_string(&(data)->salt);
     231           0 : ret += 1 + der_length_len (ret);
     232           0 : ret += 1 + der_length_len (ret);
     233           0 : ret += Top_tag_oldret;
     234             : }
     235           0 : if((data)->opaque){
     236           0 : size_t Top_tag_oldret = ret;
     237           0 : ret = 0;
     238           0 : ret += der_length_octet_string((data)->opaque);
     239           0 : ret += 1 + der_length_len (ret);
     240           0 : ret += 1 + der_length_len (ret);
     241           0 : ret += Top_tag_oldret;
     242             : }
     243           0 : ret += 1 + der_length_len (ret);
     244           0 : return ret;
     245             : }
     246             : 
     247             : int ASN1CALL
     248           0 : copy_Salt(const Salt *from, Salt *to)
     249             : {
     250           0 : memset(to, 0, sizeof(*to));
     251           0 : *(&(to)->type) = *(&(from)->type);
     252           0 : if(der_copy_octet_string(&(from)->salt, &(to)->salt)) goto fail;
     253           0 : if((from)->opaque) {
     254           0 : (to)->opaque = malloc(sizeof(*(to)->opaque));
     255           0 : if((to)->opaque == NULL) goto fail;
     256           0 : if(der_copy_octet_string((from)->opaque, (to)->opaque)) goto fail;
     257             : }else
     258           0 : (to)->opaque = NULL;
     259           0 : return 0;
     260           0 : fail:
     261           0 : free_Salt(to);
     262           0 : return ENOMEM;
     263             : }
     264             : 
     265             : int ASN1CALL
     266           0 : encode_Key(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Key *data, size_t *size)
     267             : {
     268           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
     269             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
     270             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
     271             : 
     272             : /* salt */
     273           0 : if((data)->salt) {
     274           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
     275           0 : ret = 0;
     276           0 : e = encode_Salt(p, len, (data)->salt, &l);
     277           0 : if (e) return e;
     278           0 : p -= l; len -= l; ret += l;
     279             : 
     280           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
     281           0 : if (e) return e;
     282           0 : p -= l; len -= l; ret += l;
     283             : 
     284           0 : ret += Top_tag_oldret;
     285             : }
     286             : /* key */
     287             : {
     288           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
     289           0 : ret = 0;
     290           0 : e = encode_EncryptionKey(p, len, &(data)->key, &l);
     291           0 : if (e) return e;
     292           0 : p -= l; len -= l; ret += l;
     293             : 
     294           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
     295           0 : if (e) return e;
     296           0 : p -= l; len -= l; ret += l;
     297             : 
     298           0 : ret += Top_tag_oldret;
     299             : }
     300             : /* mkvno */
     301           0 : if((data)->mkvno) {
     302           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
     303           0 : ret = 0;
     304           0 : e = der_put_unsigned(p, len, (data)->mkvno, &l);
     305           0 : if (e) return e;
     306           0 : p -= l; len -= l; ret += l;
     307             : 
     308           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
     309           0 : if (e) return e;
     310           0 : p -= l; len -= l; ret += l;
     311             : 
     312           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
     313           0 : if (e) return e;
     314           0 : p -= l; len -= l; ret += l;
     315             : 
     316           0 : ret += Top_tag_oldret;
     317             : }
     318           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
     319           0 : if (e) return e;
     320           0 : p -= l; len -= l; ret += l;
     321             : 
     322           0 : *size = ret;
     323           0 : return 0;
     324             : }
     325             : 
     326             : int ASN1CALL
     327           0 : decode_Key(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Key *data, size_t *size)
     328             : {
     329           0 : size_t ret = 0;
     330             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
     331             : int e HEIMDAL_UNUSED_ATTRIBUTE;
     332             : 
     333           0 : memset(data, 0, sizeof(*data));
     334             : {
     335             : size_t Top_datalen, Top_oldlen;
     336             : Der_type Top_type;
     337           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
     338           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
     339           0 : if(e) goto fail;
     340           0 : p += l; len -= l; ret += l;
     341           0 : Top_oldlen = len;
     342           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     343           0 : len = Top_datalen;
     344             : {
     345             : size_t mkvno_datalen, mkvno_oldlen;
     346             : Der_type mkvno_type;
     347           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &mkvno_type, 0, &mkvno_datalen, &l);
     348           0 : if (e == 0 && mkvno_type != CONS) { e = ASN1_BAD_ID; }
     349           0 : if(e) {
     350           0 : (data)->mkvno = NULL;
     351             : } else {
     352           0 : (data)->mkvno = calloc(1, sizeof(*(data)->mkvno));
     353           0 : if ((data)->mkvno == NULL) { e = ENOMEM; goto fail; }
     354           0 : p += l; len -= l; ret += l;
     355           0 : mkvno_oldlen = len;
     356           0 : if (mkvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     357           0 : len = mkvno_datalen;
     358             : {
     359             : size_t mkvno_Tag_datalen, mkvno_Tag_oldlen;
     360             : Der_type mkvno_Tag_type;
     361           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &mkvno_Tag_type, UT_Integer, &mkvno_Tag_datalen, &l);
     362           0 : if (e == 0 && mkvno_Tag_type != PRIM) { e = ASN1_BAD_ID; }
     363           0 : if(e) goto fail;
     364           0 : p += l; len -= l; ret += l;
     365           0 : mkvno_Tag_oldlen = len;
     366           0 : if (mkvno_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     367           0 : len = mkvno_Tag_datalen;
     368           0 : e = der_get_unsigned(p, len, (data)->mkvno, &l);
     369           0 : if(e) goto fail;
     370           0 : p += l; len -= l; ret += l;
     371           0 : len = mkvno_Tag_oldlen - mkvno_Tag_datalen;
     372             : }
     373           0 : len = mkvno_oldlen - mkvno_datalen;
     374             : }
     375             : }
     376             : {
     377             : size_t key_datalen, key_oldlen;
     378             : Der_type key_type;
     379           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &key_type, 1, &key_datalen, &l);
     380           0 : if (e == 0 && key_type != CONS) { e = ASN1_BAD_ID; }
     381           0 : if(e) goto fail;
     382           0 : p += l; len -= l; ret += l;
     383           0 : key_oldlen = len;
     384           0 : if (key_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     385           0 : len = key_datalen;
     386           0 : e = decode_EncryptionKey(p, len, &(data)->key, &l);
     387           0 : if(e) goto fail;
     388           0 : p += l; len -= l; ret += l;
     389           0 : len = key_oldlen - key_datalen;
     390             : }
     391             : {
     392             : size_t salt_datalen, salt_oldlen;
     393             : Der_type salt_type;
     394           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &salt_type, 2, &salt_datalen, &l);
     395           0 : if (e == 0 && salt_type != CONS) { e = ASN1_BAD_ID; }
     396           0 : if(e) {
     397           0 : (data)->salt = NULL;
     398             : } else {
     399           0 : (data)->salt = calloc(1, sizeof(*(data)->salt));
     400           0 : if ((data)->salt == NULL) { e = ENOMEM; goto fail; }
     401           0 : p += l; len -= l; ret += l;
     402           0 : salt_oldlen = len;
     403           0 : if (salt_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     404           0 : len = salt_datalen;
     405           0 : e = decode_Salt(p, len, (data)->salt, &l);
     406           0 : if(e) goto fail;
     407           0 : p += l; len -= l; ret += l;
     408           0 : len = salt_oldlen - salt_datalen;
     409             : }
     410             : }
     411           0 : len = Top_oldlen - Top_datalen;
     412             : }
     413           0 : if(size) *size = ret;
     414           0 : return 0;
     415           0 : fail:
     416           0 : free_Key(data);
     417           0 : return e;
     418             : }
     419             : 
     420             : void ASN1CALL
     421      683370 : free_Key(Key *data)
     422             : {
     423      683370 : if((data)->mkvno) {
     424           0 : free((data)->mkvno);
     425           0 : (data)->mkvno = NULL;
     426             : }
     427      683370 : free_EncryptionKey(&(data)->key);
     428      683370 : if((data)->salt) {
     429      439376 : free_Salt((data)->salt);
     430      439376 : free((data)->salt);
     431      439376 : (data)->salt = NULL;
     432             : }
     433      683370 : }
     434             : 
     435             : size_t ASN1CALL
     436           0 : length_Key(const Key *data)
     437             : {
     438           0 : size_t ret = 0;
     439           0 : if((data)->mkvno){
     440           0 : size_t Top_tag_oldret = ret;
     441           0 : ret = 0;
     442           0 : ret += der_length_unsigned((data)->mkvno);
     443           0 : ret += 1 + der_length_len (ret);
     444           0 : ret += 1 + der_length_len (ret);
     445           0 : ret += Top_tag_oldret;
     446             : }
     447             : {
     448           0 : size_t Top_tag_oldret = ret;
     449           0 : ret = 0;
     450           0 : ret += length_EncryptionKey(&(data)->key);
     451           0 : ret += 1 + der_length_len (ret);
     452           0 : ret += Top_tag_oldret;
     453             : }
     454           0 : if((data)->salt){
     455           0 : size_t Top_tag_oldret = ret;
     456           0 : ret = 0;
     457           0 : ret += length_Salt((data)->salt);
     458           0 : ret += 1 + der_length_len (ret);
     459           0 : ret += Top_tag_oldret;
     460             : }
     461           0 : ret += 1 + der_length_len (ret);
     462           0 : return ret;
     463             : }
     464             : 
     465             : int ASN1CALL
     466           0 : copy_Key(const Key *from, Key *to)
     467             : {
     468           0 : memset(to, 0, sizeof(*to));
     469           0 : if((from)->mkvno) {
     470           0 : (to)->mkvno = malloc(sizeof(*(to)->mkvno));
     471           0 : if((to)->mkvno == NULL) goto fail;
     472           0 : *((to)->mkvno) = *((from)->mkvno);
     473             : }else
     474           0 : (to)->mkvno = NULL;
     475           0 : if(copy_EncryptionKey(&(from)->key, &(to)->key)) goto fail;
     476           0 : if((from)->salt) {
     477           0 : (to)->salt = malloc(sizeof(*(to)->salt));
     478           0 : if((to)->salt == NULL) goto fail;
     479           0 : if(copy_Salt((from)->salt, (to)->salt)) goto fail;
     480             : }else
     481           0 : (to)->salt = NULL;
     482           0 : return 0;
     483           0 : fail:
     484           0 : free_Key(to);
     485           0 : return ENOMEM;
     486             : }
     487             : 
     488             : int ASN1CALL
     489           0 : encode_Event(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Event *data, size_t *size)
     490             : {
     491           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
     492             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
     493             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
     494             : 
     495             : /* principal */
     496           0 : if((data)->principal) {
     497           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
     498           0 : ret = 0;
     499           0 : e = encode_Principal(p, len, (data)->principal, &l);
     500           0 : if (e) return e;
     501           0 : p -= l; len -= l; ret += l;
     502             : 
     503           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
     504           0 : if (e) return e;
     505           0 : p -= l; len -= l; ret += l;
     506             : 
     507           0 : ret += Top_tag_oldret;
     508             : }
     509             : /* time */
     510             : {
     511           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
     512           0 : ret = 0;
     513           0 : e = encode_KerberosTime(p, len, &(data)->time, &l);
     514           0 : if (e) return e;
     515           0 : p -= l; len -= l; ret += l;
     516             : 
     517           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
     518           0 : if (e) return e;
     519           0 : p -= l; len -= l; ret += l;
     520             : 
     521           0 : ret += Top_tag_oldret;
     522             : }
     523           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
     524           0 : if (e) return e;
     525           0 : p -= l; len -= l; ret += l;
     526             : 
     527           0 : *size = ret;
     528           0 : return 0;
     529             : }
     530             : 
     531             : int ASN1CALL
     532           0 : decode_Event(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Event *data, size_t *size)
     533             : {
     534           0 : size_t ret = 0;
     535             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
     536             : int e HEIMDAL_UNUSED_ATTRIBUTE;
     537             : 
     538           0 : memset(data, 0, sizeof(*data));
     539             : {
     540             : size_t Top_datalen, Top_oldlen;
     541             : Der_type Top_type;
     542           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
     543           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
     544           0 : if(e) goto fail;
     545           0 : p += l; len -= l; ret += l;
     546           0 : Top_oldlen = len;
     547           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     548           0 : len = Top_datalen;
     549             : {
     550             : size_t time_datalen, time_oldlen;
     551             : Der_type time_type;
     552           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &time_type, 0, &time_datalen, &l);
     553           0 : if (e == 0 && time_type != CONS) { e = ASN1_BAD_ID; }
     554           0 : if(e) goto fail;
     555           0 : p += l; len -= l; ret += l;
     556           0 : time_oldlen = len;
     557           0 : if (time_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     558           0 : len = time_datalen;
     559           0 : e = decode_KerberosTime(p, len, &(data)->time, &l);
     560           0 : if(e) goto fail;
     561           0 : p += l; len -= l; ret += l;
     562           0 : len = time_oldlen - time_datalen;
     563             : }
     564             : {
     565             : size_t principal_datalen, principal_oldlen;
     566             : Der_type principal_type;
     567           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &principal_type, 1, &principal_datalen, &l);
     568           0 : if (e == 0 && principal_type != CONS) { e = ASN1_BAD_ID; }
     569           0 : if(e) {
     570           0 : (data)->principal = NULL;
     571             : } else {
     572           0 : (data)->principal = calloc(1, sizeof(*(data)->principal));
     573           0 : if ((data)->principal == NULL) { e = ENOMEM; goto fail; }
     574           0 : p += l; len -= l; ret += l;
     575           0 : principal_oldlen = len;
     576           0 : if (principal_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     577           0 : len = principal_datalen;
     578           0 : e = decode_Principal(p, len, (data)->principal, &l);
     579           0 : if(e) goto fail;
     580           0 : p += l; len -= l; ret += l;
     581           0 : len = principal_oldlen - principal_datalen;
     582             : }
     583             : }
     584           0 : len = Top_oldlen - Top_datalen;
     585             : }
     586           0 : if(size) *size = ret;
     587           0 : return 0;
     588           0 : fail:
     589           0 : free_Event(data);
     590           0 : return e;
     591             : }
     592             : 
     593             : void ASN1CALL
     594      244004 : free_Event(Event *data)
     595             : {
     596      244004 : free_KerberosTime(&(data)->time);
     597      244004 : if((data)->principal) {
     598         907 : free_Principal((data)->principal);
     599         907 : free((data)->principal);
     600         907 : (data)->principal = NULL;
     601             : }
     602      244004 : }
     603             : 
     604             : size_t ASN1CALL
     605           0 : length_Event(const Event *data)
     606             : {
     607           0 : size_t ret = 0;
     608             : {
     609           0 : size_t Top_tag_oldret = ret;
     610           0 : ret = 0;
     611           0 : ret += length_KerberosTime(&(data)->time);
     612           0 : ret += 1 + der_length_len (ret);
     613           0 : ret += Top_tag_oldret;
     614             : }
     615           0 : if((data)->principal){
     616           0 : size_t Top_tag_oldret = ret;
     617           0 : ret = 0;
     618           0 : ret += length_Principal((data)->principal);
     619           0 : ret += 1 + der_length_len (ret);
     620           0 : ret += Top_tag_oldret;
     621             : }
     622           0 : ret += 1 + der_length_len (ret);
     623           0 : return ret;
     624             : }
     625             : 
     626             : int ASN1CALL
     627           0 : copy_Event(const Event *from, Event *to)
     628             : {
     629           0 : memset(to, 0, sizeof(*to));
     630           0 : if(copy_KerberosTime(&(from)->time, &(to)->time)) goto fail;
     631           0 : if((from)->principal) {
     632           0 : (to)->principal = malloc(sizeof(*(to)->principal));
     633           0 : if((to)->principal == NULL) goto fail;
     634           0 : if(copy_Principal((from)->principal, (to)->principal)) goto fail;
     635             : }else
     636           0 : (to)->principal = NULL;
     637           0 : return 0;
     638           0 : fail:
     639           0 : free_Event(to);
     640           0 : return ENOMEM;
     641             : }
     642             : 
     643             : int ASN1CALL
     644           0 : encode_HDBFlags(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDBFlags *data, size_t *size)
     645             : {
     646           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
     647             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
     648             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
     649             : 
     650             : {
     651           0 : unsigned char c = 0;
     652           0 : int rest = 0;
     653           0 : int bit_set = 0;
     654           0 : if((data)->do_not_store) {
     655           0 : c |= 1<<0;
     656             : }
     657           0 : if (c != 0 || bit_set) {
     658           0 : if (len < 1) return ASN1_OVERFLOW;
     659           0 : *p-- = c; len--; ret++;
     660           0 : if (!bit_set) {
     661           0 : rest = 0;
     662           0 : while(c) { 
     663           0 : if (c & 1) break;
     664           0 : c = c >> 1;
     665           0 : rest++;
     666             : }
     667           0 : bit_set = 1;
     668             : }
     669             : }
     670           0 : c = 0;
     671           0 : if((data)->locked_out) {
     672           0 : c |= 1<<6;
     673             : }
     674           0 : if((data)->allow_digest) {
     675           0 : c |= 1<<7;
     676             : }
     677           0 : if (c != 0 || bit_set) {
     678           0 : if (len < 1) return ASN1_OVERFLOW;
     679           0 : *p-- = c; len--; ret++;
     680           0 : if (!bit_set) {
     681           0 : rest = 0;
     682           0 : while(c) { 
     683           0 : if (c & 1) break;
     684           0 : c = c >> 1;
     685           0 : rest++;
     686             : }
     687           0 : bit_set = 1;
     688             : }
     689             : }
     690           0 : c = 0;
     691           0 : if((data)->allow_kerberos4) {
     692           0 : c |= 1<<0;
     693             : }
     694           0 : if((data)->trusted_for_delegation) {
     695           0 : c |= 1<<1;
     696             : }
     697           0 : if((data)->immutable) {
     698           0 : c |= 1<<2;
     699             : }
     700           0 : if((data)->user_to_user) {
     701           0 : c |= 1<<3;
     702             : }
     703           0 : if((data)->ok_as_delegate) {
     704           0 : c |= 1<<4;
     705             : }
     706           0 : if((data)->require_hwauth) {
     707           0 : c |= 1<<5;
     708             : }
     709           0 : if((data)->change_pw) {
     710           0 : c |= 1<<6;
     711             : }
     712           0 : if((data)->require_preauth) {
     713           0 : c |= 1<<7;
     714             : }
     715           0 : if (c != 0 || bit_set) {
     716           0 : if (len < 1) return ASN1_OVERFLOW;
     717           0 : *p-- = c; len--; ret++;
     718           0 : if (!bit_set) {
     719           0 : rest = 0;
     720           0 : while(c) { 
     721           0 : if (c & 1) break;
     722           0 : c = c >> 1;
     723           0 : rest++;
     724             : }
     725           0 : bit_set = 1;
     726             : }
     727             : }
     728           0 : c = 0;
     729           0 : if((data)->invalid) {
     730           0 : c |= 1<<0;
     731             : }
     732           0 : if((data)->client) {
     733           0 : c |= 1<<1;
     734             : }
     735           0 : if((data)->server) {
     736           0 : c |= 1<<2;
     737             : }
     738           0 : if((data)->postdate) {
     739           0 : c |= 1<<3;
     740             : }
     741           0 : if((data)->renewable) {
     742           0 : c |= 1<<4;
     743             : }
     744           0 : if((data)->proxiable) {
     745           0 : c |= 1<<5;
     746             : }
     747           0 : if((data)->forwardable) {
     748           0 : c |= 1<<6;
     749             : }
     750           0 : if((data)->initial) {
     751           0 : c |= 1<<7;
     752             : }
     753           0 : if (c != 0 || bit_set) {
     754           0 : if (len < 1) return ASN1_OVERFLOW;
     755           0 : *p-- = c; len--; ret++;
     756           0 : if (!bit_set) {
     757           0 : rest = 0;
     758           0 : if(c) { 
     759           0 : while(c) { 
     760           0 : if (c & 1) break;
     761           0 : c = c >> 1;
     762           0 : rest++;
     763             : }
     764             : }
     765             : }
     766             : }
     767           0 : if (len < 1) return ASN1_OVERFLOW;
     768           0 : *p-- = rest;
     769           0 : len -= 1;
     770           0 : ret += 1;
     771             : }
     772             : 
     773           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
     774           0 : if (e) return e;
     775           0 : p -= l; len -= l; ret += l;
     776             : 
     777           0 : *size = ret;
     778           0 : return 0;
     779             : }
     780             : 
     781             : int ASN1CALL
     782           0 : decode_HDBFlags(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDBFlags *data, size_t *size)
     783             : {
     784           0 : size_t ret = 0;
     785             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
     786             : int e HEIMDAL_UNUSED_ATTRIBUTE;
     787             : 
     788           0 : memset(data, 0, sizeof(*data));
     789             : {
     790             : size_t Top_datalen, Top_oldlen;
     791             : Der_type Top_type;
     792           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_BitString, &Top_datalen, &l);
     793           0 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
     794           0 : if(e) goto fail;
     795           0 : p += l; len -= l; ret += l;
     796           0 : Top_oldlen = len;
     797           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
     798           0 : len = Top_datalen;
     799           0 : if (len < 1) return ASN1_OVERRUN;
     800           0 : p++; len--; ret++;
     801             : do {
     802           0 : if (len < 1) break;
     803           0 : (data)->initial = (*p >> 7) & 1;
     804           0 : (data)->forwardable = (*p >> 6) & 1;
     805           0 : (data)->proxiable = (*p >> 5) & 1;
     806           0 : (data)->renewable = (*p >> 4) & 1;
     807           0 : (data)->postdate = (*p >> 3) & 1;
     808           0 : (data)->server = (*p >> 2) & 1;
     809           0 : (data)->client = (*p >> 1) & 1;
     810           0 : (data)->invalid = (*p >> 0) & 1;
     811           0 : p++; len--; ret++;
     812           0 : if (len < 1) break;
     813           0 : (data)->require_preauth = (*p >> 7) & 1;
     814           0 : (data)->change_pw = (*p >> 6) & 1;
     815           0 : (data)->require_hwauth = (*p >> 5) & 1;
     816           0 : (data)->ok_as_delegate = (*p >> 4) & 1;
     817           0 : (data)->user_to_user = (*p >> 3) & 1;
     818           0 : (data)->immutable = (*p >> 2) & 1;
     819           0 : (data)->trusted_for_delegation = (*p >> 1) & 1;
     820           0 : (data)->allow_kerberos4 = (*p >> 0) & 1;
     821           0 : p++; len--; ret++;
     822           0 : if (len < 1) break;
     823           0 : (data)->allow_digest = (*p >> 7) & 1;
     824           0 : (data)->locked_out = (*p >> 6) & 1;
     825           0 : p++; len--; ret++;
     826           0 : if (len < 1) break;
     827           0 : (data)->do_not_store = (*p >> 0) & 1;
     828             : } while(0);
     829           0 : p += len; ret += len;
     830           0 : len = Top_oldlen - Top_datalen;
     831             : }
     832           0 : if(size) *size = ret;
     833           0 : return 0;
     834           0 : fail:
     835           0 : free_HDBFlags(data);
     836           0 : return e;
     837             : }
     838             : 
     839             : void ASN1CALL
     840      244004 : free_HDBFlags(HDBFlags *data)
     841             : {
     842      244004 : }
     843             : 
     844             : size_t ASN1CALL
     845           0 : length_HDBFlags(const HDBFlags *data)
     846             : {
     847           0 : size_t ret = 0;
     848             : do {
     849           0 : if((data)->do_not_store) { ret += 4; break; }
     850           0 : if((data)->locked_out) { ret += 3; break; }
     851           0 : if((data)->allow_digest) { ret += 3; break; }
     852           0 : if((data)->allow_kerberos4) { ret += 2; break; }
     853           0 : if((data)->trusted_for_delegation) { ret += 2; break; }
     854           0 : if((data)->immutable) { ret += 2; break; }
     855           0 : if((data)->user_to_user) { ret += 2; break; }
     856           0 : if((data)->ok_as_delegate) { ret += 2; break; }
     857           0 : if((data)->require_hwauth) { ret += 2; break; }
     858           0 : if((data)->change_pw) { ret += 2; break; }
     859           0 : if((data)->require_preauth) { ret += 2; break; }
     860           0 : if((data)->invalid) { ret += 1; break; }
     861           0 : if((data)->client) { ret += 1; break; }
     862           0 : if((data)->server) { ret += 1; break; }
     863           0 : if((data)->postdate) { ret += 1; break; }
     864           0 : if((data)->renewable) { ret += 1; break; }
     865           0 : if((data)->proxiable) { ret += 1; break; }
     866           0 : if((data)->forwardable) { ret += 1; break; }
     867           0 : if((data)->initial) { ret += 1; break; }
     868             : } while(0);
     869           0 : ret += 1;
     870           0 : ret += 1 + der_length_len (ret);
     871           0 : return ret;
     872             : }
     873             : 
     874             : int ASN1CALL
     875           0 : copy_HDBFlags(const HDBFlags *from, HDBFlags *to)
     876             : {
     877           0 : memset(to, 0, sizeof(*to));
     878           0 : *(to) = *(from);
     879           0 : return 0;
     880             : }
     881             : 
     882           0 : unsigned HDBFlags2int(HDBFlags f)
     883             : {
     884           0 : unsigned r = 0;
     885           0 : if(f.initial) r |= (1U << 0);
     886           0 : if(f.forwardable) r |= (1U << 1);
     887           0 : if(f.proxiable) r |= (1U << 2);
     888           0 : if(f.renewable) r |= (1U << 3);
     889           0 : if(f.postdate) r |= (1U << 4);
     890           0 : if(f.server) r |= (1U << 5);
     891           0 : if(f.client) r |= (1U << 6);
     892           0 : if(f.invalid) r |= (1U << 7);
     893           0 : if(f.require_preauth) r |= (1U << 8);
     894           0 : if(f.change_pw) r |= (1U << 9);
     895           0 : if(f.require_hwauth) r |= (1U << 10);
     896           0 : if(f.ok_as_delegate) r |= (1U << 11);
     897           0 : if(f.user_to_user) r |= (1U << 12);
     898           0 : if(f.immutable) r |= (1U << 13);
     899           0 : if(f.trusted_for_delegation) r |= (1U << 14);
     900           0 : if(f.allow_kerberos4) r |= (1U << 15);
     901           0 : if(f.allow_digest) r |= (1U << 16);
     902           0 : if(f.locked_out) r |= (1U << 17);
     903           0 : if(f.do_not_store) r |= (1U << 31);
     904           0 : return r;
     905             : }
     906             : 
     907           0 : HDBFlags int2HDBFlags(unsigned n)
     908             : {
     909             :         HDBFlags flags;
     910             : 
     911           0 :         memset(&flags, 0, sizeof(flags));
     912             : 
     913           0 :         flags.initial = (n >> 0) & 1;
     914           0 :         flags.forwardable = (n >> 1) & 1;
     915           0 :         flags.proxiable = (n >> 2) & 1;
     916           0 :         flags.renewable = (n >> 3) & 1;
     917           0 :         flags.postdate = (n >> 4) & 1;
     918           0 :         flags.server = (n >> 5) & 1;
     919           0 :         flags.client = (n >> 6) & 1;
     920           0 :         flags.invalid = (n >> 7) & 1;
     921           0 :         flags.require_preauth = (n >> 8) & 1;
     922           0 :         flags.change_pw = (n >> 9) & 1;
     923           0 :         flags.require_hwauth = (n >> 10) & 1;
     924           0 :         flags.ok_as_delegate = (n >> 11) & 1;
     925           0 :         flags.user_to_user = (n >> 12) & 1;
     926           0 :         flags.immutable = (n >> 13) & 1;
     927           0 :         flags.trusted_for_delegation = (n >> 14) & 1;
     928           0 :         flags.allow_kerberos4 = (n >> 15) & 1;
     929           0 :         flags.allow_digest = (n >> 16) & 1;
     930           0 :         flags.locked_out = (n >> 17) & 1;
     931           0 :         flags.do_not_store = (n >> 31) & 1;
     932           0 :         return flags;
     933             : }
     934             : 
     935             : static struct units HDBFlags_units[] = {
     936             :         {"do-not-store",      1U << 31},
     937             :         {"locked-out",        1U << 17},
     938             :         {"allow-digest",      1U << 16},
     939             :         {"allow-kerberos4",   1U << 15},
     940             :         {"trusted-for-delegation",    1U << 14},
     941             :         {"immutable", 1U << 13},
     942             :         {"user-to-user",      1U << 12},
     943             :         {"ok-as-delegate",    1U << 11},
     944             :         {"require-hwauth",    1U << 10},
     945             :         {"change-pw", 1U << 9},
     946             :         {"require-preauth",   1U << 8},
     947             :         {"invalid",   1U << 7},
     948             :         {"client",    1U << 6},
     949             :         {"server",    1U << 5},
     950             :         {"postdate",  1U << 4},
     951             :         {"renewable", 1U << 3},
     952             :         {"proxiable", 1U << 2},
     953             :         {"forwardable",       1U << 1},
     954             :         {"initial",   1U << 0},
     955             :         {NULL,  0}
     956             : };
     957             : 
     958           0 : const struct units * asn1_HDBFlags_units(void){
     959           0 : return HDBFlags_units;
     960             : }
     961             : 
     962             : int ASN1CALL
     963           0 : encode_GENERATION(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const GENERATION *data, size_t *size)
     964             : {
     965           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
     966             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
     967             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
     968             : 
     969             : /* gen */
     970             : {
     971           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
     972           0 : ret = 0;
     973           0 : e = der_put_unsigned(p, len, &(data)->gen, &l);
     974           0 : if (e) return e;
     975           0 : p -= l; len -= l; ret += l;
     976             : 
     977           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
     978           0 : if (e) return e;
     979           0 : p -= l; len -= l; ret += l;
     980             : 
     981           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
     982           0 : if (e) return e;
     983           0 : p -= l; len -= l; ret += l;
     984             : 
     985           0 : ret += Top_tag_oldret;
     986             : }
     987             : /* usec */
     988             : {
     989           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
     990           0 : ret = 0;
     991           0 : e = der_put_unsigned(p, len, &(data)->usec, &l);
     992           0 : if (e) return e;
     993           0 : p -= l; len -= l; ret += l;
     994             : 
     995           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
     996           0 : if (e) return e;
     997           0 : p -= l; len -= l; ret += l;
     998             : 
     999           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
    1000           0 : if (e) return e;
    1001           0 : p -= l; len -= l; ret += l;
    1002             : 
    1003           0 : ret += Top_tag_oldret;
    1004             : }
    1005             : /* time */
    1006             : {
    1007           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    1008           0 : ret = 0;
    1009           0 : e = encode_KerberosTime(p, len, &(data)->time, &l);
    1010           0 : if (e) return e;
    1011           0 : p -= l; len -= l; ret += l;
    1012             : 
    1013           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    1014           0 : if (e) return e;
    1015           0 : p -= l; len -= l; ret += l;
    1016             : 
    1017           0 : ret += Top_tag_oldret;
    1018             : }
    1019           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    1020           0 : if (e) return e;
    1021           0 : p -= l; len -= l; ret += l;
    1022             : 
    1023           0 : *size = ret;
    1024           0 : return 0;
    1025             : }
    1026             : 
    1027             : int ASN1CALL
    1028           0 : decode_GENERATION(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, GENERATION *data, size_t *size)
    1029             : {
    1030           0 : size_t ret = 0;
    1031             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1032             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    1033             : 
    1034           0 : memset(data, 0, sizeof(*data));
    1035             : {
    1036             : size_t Top_datalen, Top_oldlen;
    1037             : Der_type Top_type;
    1038           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    1039           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    1040           0 : if(e) goto fail;
    1041           0 : p += l; len -= l; ret += l;
    1042           0 : Top_oldlen = len;
    1043           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1044           0 : len = Top_datalen;
    1045             : {
    1046             : size_t time_datalen, time_oldlen;
    1047             : Der_type time_type;
    1048           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &time_type, 0, &time_datalen, &l);
    1049           0 : if (e == 0 && time_type != CONS) { e = ASN1_BAD_ID; }
    1050           0 : if(e) goto fail;
    1051           0 : p += l; len -= l; ret += l;
    1052           0 : time_oldlen = len;
    1053           0 : if (time_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1054           0 : len = time_datalen;
    1055           0 : e = decode_KerberosTime(p, len, &(data)->time, &l);
    1056           0 : if(e) goto fail;
    1057           0 : p += l; len -= l; ret += l;
    1058           0 : len = time_oldlen - time_datalen;
    1059             : }
    1060             : {
    1061             : size_t usec_datalen, usec_oldlen;
    1062             : Der_type usec_type;
    1063           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &usec_type, 1, &usec_datalen, &l);
    1064           0 : if (e == 0 && usec_type != CONS) { e = ASN1_BAD_ID; }
    1065           0 : if(e) goto fail;
    1066           0 : p += l; len -= l; ret += l;
    1067           0 : usec_oldlen = len;
    1068           0 : if (usec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1069           0 : len = usec_datalen;
    1070             : {
    1071             : size_t usec_Tag_datalen, usec_Tag_oldlen;
    1072             : Der_type usec_Tag_type;
    1073           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &usec_Tag_type, UT_Integer, &usec_Tag_datalen, &l);
    1074           0 : if (e == 0 && usec_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    1075           0 : if(e) goto fail;
    1076           0 : p += l; len -= l; ret += l;
    1077           0 : usec_Tag_oldlen = len;
    1078           0 : if (usec_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1079           0 : len = usec_Tag_datalen;
    1080           0 : e = der_get_unsigned(p, len, &(data)->usec, &l);
    1081           0 : if(e) goto fail;
    1082           0 : p += l; len -= l; ret += l;
    1083           0 : len = usec_Tag_oldlen - usec_Tag_datalen;
    1084             : }
    1085           0 : len = usec_oldlen - usec_datalen;
    1086             : }
    1087             : {
    1088             : size_t gen_datalen, gen_oldlen;
    1089             : Der_type gen_type;
    1090           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &gen_type, 2, &gen_datalen, &l);
    1091           0 : if (e == 0 && gen_type != CONS) { e = ASN1_BAD_ID; }
    1092           0 : if(e) goto fail;
    1093           0 : p += l; len -= l; ret += l;
    1094           0 : gen_oldlen = len;
    1095           0 : if (gen_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1096           0 : len = gen_datalen;
    1097             : {
    1098             : size_t gen_Tag_datalen, gen_Tag_oldlen;
    1099             : Der_type gen_Tag_type;
    1100           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &gen_Tag_type, UT_Integer, &gen_Tag_datalen, &l);
    1101           0 : if (e == 0 && gen_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    1102           0 : if(e) goto fail;
    1103           0 : p += l; len -= l; ret += l;
    1104           0 : gen_Tag_oldlen = len;
    1105           0 : if (gen_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1106           0 : len = gen_Tag_datalen;
    1107           0 : e = der_get_unsigned(p, len, &(data)->gen, &l);
    1108           0 : if(e) goto fail;
    1109           0 : p += l; len -= l; ret += l;
    1110           0 : len = gen_Tag_oldlen - gen_Tag_datalen;
    1111             : }
    1112           0 : len = gen_oldlen - gen_datalen;
    1113             : }
    1114           0 : len = Top_oldlen - Top_datalen;
    1115             : }
    1116           0 : if(size) *size = ret;
    1117           0 : return 0;
    1118           0 : fail:
    1119           0 : free_GENERATION(data);
    1120           0 : return e;
    1121             : }
    1122             : 
    1123             : void ASN1CALL
    1124           0 : free_GENERATION(GENERATION *data)
    1125             : {
    1126           0 : free_KerberosTime(&(data)->time);
    1127           0 : }
    1128             : 
    1129             : size_t ASN1CALL
    1130           0 : length_GENERATION(const GENERATION *data)
    1131             : {
    1132           0 : size_t ret = 0;
    1133             : {
    1134           0 : size_t Top_tag_oldret = ret;
    1135           0 : ret = 0;
    1136           0 : ret += length_KerberosTime(&(data)->time);
    1137           0 : ret += 1 + der_length_len (ret);
    1138           0 : ret += Top_tag_oldret;
    1139             : }
    1140             : {
    1141           0 : size_t Top_tag_oldret = ret;
    1142           0 : ret = 0;
    1143           0 : ret += der_length_unsigned(&(data)->usec);
    1144           0 : ret += 1 + der_length_len (ret);
    1145           0 : ret += 1 + der_length_len (ret);
    1146           0 : ret += Top_tag_oldret;
    1147             : }
    1148             : {
    1149           0 : size_t Top_tag_oldret = ret;
    1150           0 : ret = 0;
    1151           0 : ret += der_length_unsigned(&(data)->gen);
    1152           0 : ret += 1 + der_length_len (ret);
    1153           0 : ret += 1 + der_length_len (ret);
    1154           0 : ret += Top_tag_oldret;
    1155             : }
    1156           0 : ret += 1 + der_length_len (ret);
    1157           0 : return ret;
    1158             : }
    1159             : 
    1160             : int ASN1CALL
    1161           0 : copy_GENERATION(const GENERATION *from, GENERATION *to)
    1162             : {
    1163           0 : memset(to, 0, sizeof(*to));
    1164           0 : if(copy_KerberosTime(&(from)->time, &(to)->time)) goto fail;
    1165           0 : *(&(to)->usec) = *(&(from)->usec);
    1166           0 : *(&(to)->gen) = *(&(from)->gen);
    1167           0 : return 0;
    1168           0 : fail:
    1169           0 : free_GENERATION(to);
    1170           0 : return ENOMEM;
    1171             : }
    1172             : 
    1173             : int ASN1CALL
    1174           0 : encode_HDB_Ext_PKINIT_acl(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_Ext_PKINIT_acl *data, size_t *size)
    1175             : {
    1176           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    1177             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1178             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    1179             : 
    1180           0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
    1181           0 : size_t Top_tag_for_oldret = ret;
    1182           0 : ret = 0;
    1183             : /* anchor */
    1184           0 : if((&(data)->val[i])->anchor) {
    1185           0 : size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    1186           0 : ret = 0;
    1187           0 : e = der_put_utf8string(p, len, (&(data)->val[i])->anchor, &l);
    1188           0 : if (e) return e;
    1189           0 : p -= l; len -= l; ret += l;
    1190             : 
    1191           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_UTF8String, &l);
    1192           0 : if (e) return e;
    1193           0 : p -= l; len -= l; ret += l;
    1194             : 
    1195           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
    1196           0 : if (e) return e;
    1197           0 : p -= l; len -= l; ret += l;
    1198             : 
    1199           0 : ret += Top_tag_S_Of_tag_oldret;
    1200             : }
    1201             : /* issuer */
    1202           0 : if((&(data)->val[i])->issuer) {
    1203           0 : size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    1204           0 : ret = 0;
    1205           0 : e = der_put_utf8string(p, len, (&(data)->val[i])->issuer, &l);
    1206           0 : if (e) return e;
    1207           0 : p -= l; len -= l; ret += l;
    1208             : 
    1209           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_UTF8String, &l);
    1210           0 : if (e) return e;
    1211           0 : p -= l; len -= l; ret += l;
    1212             : 
    1213           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
    1214           0 : if (e) return e;
    1215           0 : p -= l; len -= l; ret += l;
    1216             : 
    1217           0 : ret += Top_tag_S_Of_tag_oldret;
    1218             : }
    1219             : /* subject */
    1220             : {
    1221           0 : size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    1222           0 : ret = 0;
    1223           0 : e = der_put_utf8string(p, len, &(&(data)->val[i])->subject, &l);
    1224           0 : if (e) return e;
    1225           0 : p -= l; len -= l; ret += l;
    1226             : 
    1227           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_UTF8String, &l);
    1228           0 : if (e) return e;
    1229           0 : p -= l; len -= l; ret += l;
    1230             : 
    1231           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    1232           0 : if (e) return e;
    1233           0 : p -= l; len -= l; ret += l;
    1234             : 
    1235           0 : ret += Top_tag_S_Of_tag_oldret;
    1236             : }
    1237           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    1238           0 : if (e) return e;
    1239           0 : p -= l; len -= l; ret += l;
    1240             : 
    1241           0 : ret += Top_tag_for_oldret;
    1242             : }
    1243           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    1244           0 : if (e) return e;
    1245           0 : p -= l; len -= l; ret += l;
    1246             : 
    1247           0 : *size = ret;
    1248           0 : return 0;
    1249             : }
    1250             : 
    1251             : int ASN1CALL
    1252           0 : decode_HDB_Ext_PKINIT_acl(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_Ext_PKINIT_acl *data, size_t *size)
    1253             : {
    1254           0 : size_t ret = 0;
    1255             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1256             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    1257             : 
    1258           0 : memset(data, 0, sizeof(*data));
    1259             : {
    1260             : size_t Top_datalen, Top_oldlen;
    1261             : Der_type Top_type;
    1262           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    1263           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    1264           0 : if(e) goto fail;
    1265           0 : p += l; len -= l; ret += l;
    1266           0 : Top_oldlen = len;
    1267           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1268           0 : len = Top_datalen;
    1269             : {
    1270           0 : size_t Top_Tag_origlen = len;
    1271           0 : size_t Top_Tag_oldret = ret;
    1272           0 : size_t Top_Tag_olen = 0;
    1273             : void *Top_Tag_tmp;
    1274           0 : ret = 0;
    1275           0 : (data)->len = 0;
    1276           0 : (data)->val = NULL;
    1277           0 : while(ret < Top_Tag_origlen) {
    1278           0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
    1279           0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    1280           0 : Top_Tag_olen = Top_Tag_nlen;
    1281           0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
    1282           0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    1283           0 : (data)->val = Top_Tag_tmp;
    1284             : {
    1285             : size_t Top_Tag_s_of_datalen, Top_Tag_s_of_oldlen;
    1286             : Der_type Top_Tag_s_of_type;
    1287           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_s_of_type, UT_Sequence, &Top_Tag_s_of_datalen, &l);
    1288           0 : if (e == 0 && Top_Tag_s_of_type != CONS) { e = ASN1_BAD_ID; }
    1289           0 : if(e) goto fail;
    1290           0 : p += l; len -= l; ret += l;
    1291           0 : Top_Tag_s_of_oldlen = len;
    1292           0 : if (Top_Tag_s_of_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1293           0 : len = Top_Tag_s_of_datalen;
    1294             : {
    1295             : size_t subject_datalen, subject_oldlen;
    1296             : Der_type subject_type;
    1297           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &subject_type, 0, &subject_datalen, &l);
    1298           0 : if (e == 0 && subject_type != CONS) { e = ASN1_BAD_ID; }
    1299           0 : if(e) goto fail;
    1300           0 : p += l; len -= l; ret += l;
    1301           0 : subject_oldlen = len;
    1302           0 : if (subject_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1303           0 : len = subject_datalen;
    1304             : {
    1305             : size_t subject_Tag_datalen, subject_Tag_oldlen;
    1306             : Der_type subject_Tag_type;
    1307           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &subject_Tag_type, UT_UTF8String, &subject_Tag_datalen, &l);
    1308           0 : if (e == 0 && subject_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    1309           0 : if(e) goto fail;
    1310           0 : p += l; len -= l; ret += l;
    1311           0 : subject_Tag_oldlen = len;
    1312           0 : if (subject_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1313           0 : len = subject_Tag_datalen;
    1314           0 : e = der_get_utf8string(p, len, &(&(data)->val[(data)->len])->subject, &l);
    1315           0 : if(e) goto fail;
    1316           0 : p += l; len -= l; ret += l;
    1317           0 : len = subject_Tag_oldlen - subject_Tag_datalen;
    1318             : }
    1319           0 : len = subject_oldlen - subject_datalen;
    1320             : }
    1321             : {
    1322             : size_t issuer_datalen, issuer_oldlen;
    1323             : Der_type issuer_type;
    1324           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &issuer_type, 1, &issuer_datalen, &l);
    1325           0 : if (e == 0 && issuer_type != CONS) { e = ASN1_BAD_ID; }
    1326           0 : if(e) {
    1327           0 : (&(data)->val[(data)->len])->issuer = NULL;
    1328             : } else {
    1329           0 : (&(data)->val[(data)->len])->issuer = calloc(1, sizeof(*(&(data)->val[(data)->len])->issuer));
    1330           0 : if ((&(data)->val[(data)->len])->issuer == NULL) { e = ENOMEM; goto fail; }
    1331           0 : p += l; len -= l; ret += l;
    1332           0 : issuer_oldlen = len;
    1333           0 : if (issuer_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1334           0 : len = issuer_datalen;
    1335             : {
    1336             : size_t issuer_Tag_datalen, issuer_Tag_oldlen;
    1337             : Der_type issuer_Tag_type;
    1338           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &issuer_Tag_type, UT_UTF8String, &issuer_Tag_datalen, &l);
    1339           0 : if (e == 0 && issuer_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    1340           0 : if(e) goto fail;
    1341           0 : p += l; len -= l; ret += l;
    1342           0 : issuer_Tag_oldlen = len;
    1343           0 : if (issuer_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1344           0 : len = issuer_Tag_datalen;
    1345           0 : e = der_get_utf8string(p, len, (&(data)->val[(data)->len])->issuer, &l);
    1346           0 : if(e) goto fail;
    1347           0 : p += l; len -= l; ret += l;
    1348           0 : len = issuer_Tag_oldlen - issuer_Tag_datalen;
    1349             : }
    1350           0 : len = issuer_oldlen - issuer_datalen;
    1351             : }
    1352             : }
    1353             : {
    1354             : size_t anchor_datalen, anchor_oldlen;
    1355             : Der_type anchor_type;
    1356           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &anchor_type, 2, &anchor_datalen, &l);
    1357           0 : if (e == 0 && anchor_type != CONS) { e = ASN1_BAD_ID; }
    1358           0 : if(e) {
    1359           0 : (&(data)->val[(data)->len])->anchor = NULL;
    1360             : } else {
    1361           0 : (&(data)->val[(data)->len])->anchor = calloc(1, sizeof(*(&(data)->val[(data)->len])->anchor));
    1362           0 : if ((&(data)->val[(data)->len])->anchor == NULL) { e = ENOMEM; goto fail; }
    1363           0 : p += l; len -= l; ret += l;
    1364           0 : anchor_oldlen = len;
    1365           0 : if (anchor_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1366           0 : len = anchor_datalen;
    1367             : {
    1368             : size_t anchor_Tag_datalen, anchor_Tag_oldlen;
    1369             : Der_type anchor_Tag_type;
    1370           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &anchor_Tag_type, UT_UTF8String, &anchor_Tag_datalen, &l);
    1371           0 : if (e == 0 && anchor_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    1372           0 : if(e) goto fail;
    1373           0 : p += l; len -= l; ret += l;
    1374           0 : anchor_Tag_oldlen = len;
    1375           0 : if (anchor_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1376           0 : len = anchor_Tag_datalen;
    1377           0 : e = der_get_utf8string(p, len, (&(data)->val[(data)->len])->anchor, &l);
    1378           0 : if(e) goto fail;
    1379           0 : p += l; len -= l; ret += l;
    1380           0 : len = anchor_Tag_oldlen - anchor_Tag_datalen;
    1381             : }
    1382           0 : len = anchor_oldlen - anchor_datalen;
    1383             : }
    1384             : }
    1385           0 : len = Top_Tag_s_of_oldlen - Top_Tag_s_of_datalen;
    1386             : }
    1387           0 : (data)->len++;
    1388           0 : len = Top_Tag_origlen - ret;
    1389             : }
    1390           0 : ret += Top_Tag_oldret;
    1391             : }
    1392           0 : len = Top_oldlen - Top_datalen;
    1393             : }
    1394           0 : if(size) *size = ret;
    1395           0 : return 0;
    1396           0 : fail:
    1397           0 : free_HDB_Ext_PKINIT_acl(data);
    1398           0 : return e;
    1399             : }
    1400             : 
    1401             : void ASN1CALL
    1402           0 : free_HDB_Ext_PKINIT_acl(HDB_Ext_PKINIT_acl *data)
    1403             : {
    1404           0 : while((data)->len){
    1405           0 : der_free_utf8string(&(&(data)->val[(data)->len-1])->subject);
    1406           0 : if((&(data)->val[(data)->len-1])->issuer) {
    1407           0 : der_free_utf8string((&(data)->val[(data)->len-1])->issuer);
    1408           0 : free((&(data)->val[(data)->len-1])->issuer);
    1409           0 : (&(data)->val[(data)->len-1])->issuer = NULL;
    1410             : }
    1411           0 : if((&(data)->val[(data)->len-1])->anchor) {
    1412           0 : der_free_utf8string((&(data)->val[(data)->len-1])->anchor);
    1413           0 : free((&(data)->val[(data)->len-1])->anchor);
    1414           0 : (&(data)->val[(data)->len-1])->anchor = NULL;
    1415             : }
    1416           0 : (data)->len--;
    1417             : }
    1418           0 : free((data)->val);
    1419           0 : (data)->val = NULL;
    1420           0 : }
    1421             : 
    1422             : size_t ASN1CALL
    1423           0 : length_HDB_Ext_PKINIT_acl(const HDB_Ext_PKINIT_acl *data)
    1424             : {
    1425           0 : size_t ret = 0;
    1426             : {
    1427           0 : size_t Top_tag_oldret = ret;
    1428             : int i;
    1429           0 : ret = 0;
    1430           0 : for(i = (data)->len - 1; i >= 0; --i){
    1431           0 : size_t Top_tag_for_oldret = ret;
    1432           0 : ret = 0;
    1433             : {
    1434           0 : size_t Top_tag_S_Of_tag_oldret = ret;
    1435           0 : ret = 0;
    1436           0 : ret += der_length_utf8string(&(&(data)->val[i])->subject);
    1437           0 : ret += 1 + der_length_len (ret);
    1438           0 : ret += 1 + der_length_len (ret);
    1439           0 : ret += Top_tag_S_Of_tag_oldret;
    1440             : }
    1441           0 : if((&(data)->val[i])->issuer){
    1442           0 : size_t Top_tag_S_Of_tag_oldret = ret;
    1443           0 : ret = 0;
    1444           0 : ret += der_length_utf8string((&(data)->val[i])->issuer);
    1445           0 : ret += 1 + der_length_len (ret);
    1446           0 : ret += 1 + der_length_len (ret);
    1447           0 : ret += Top_tag_S_Of_tag_oldret;
    1448             : }
    1449           0 : if((&(data)->val[i])->anchor){
    1450           0 : size_t Top_tag_S_Of_tag_oldret = ret;
    1451           0 : ret = 0;
    1452           0 : ret += der_length_utf8string((&(data)->val[i])->anchor);
    1453           0 : ret += 1 + der_length_len (ret);
    1454           0 : ret += 1 + der_length_len (ret);
    1455           0 : ret += Top_tag_S_Of_tag_oldret;
    1456             : }
    1457           0 : ret += 1 + der_length_len (ret);
    1458           0 : ret += Top_tag_for_oldret;
    1459             : }
    1460           0 : ret += Top_tag_oldret;
    1461             : }
    1462           0 : ret += 1 + der_length_len (ret);
    1463           0 : return ret;
    1464             : }
    1465             : 
    1466             : int ASN1CALL
    1467           0 : copy_HDB_Ext_PKINIT_acl(const HDB_Ext_PKINIT_acl *from, HDB_Ext_PKINIT_acl *to)
    1468             : {
    1469           0 : memset(to, 0, sizeof(*to));
    1470           0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
    1471           0 : goto fail;
    1472           0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
    1473           0 : if(der_copy_utf8string(&(&(from)->val[(to)->len])->subject, &(&(to)->val[(to)->len])->subject)) goto fail;
    1474           0 : if((&(from)->val[(to)->len])->issuer) {
    1475           0 : (&(to)->val[(to)->len])->issuer = malloc(sizeof(*(&(to)->val[(to)->len])->issuer));
    1476           0 : if((&(to)->val[(to)->len])->issuer == NULL) goto fail;
    1477           0 : if(der_copy_utf8string((&(from)->val[(to)->len])->issuer, (&(to)->val[(to)->len])->issuer)) goto fail;
    1478             : }else
    1479           0 : (&(to)->val[(to)->len])->issuer = NULL;
    1480           0 : if((&(from)->val[(to)->len])->anchor) {
    1481           0 : (&(to)->val[(to)->len])->anchor = malloc(sizeof(*(&(to)->val[(to)->len])->anchor));
    1482           0 : if((&(to)->val[(to)->len])->anchor == NULL) goto fail;
    1483           0 : if(der_copy_utf8string((&(from)->val[(to)->len])->anchor, (&(to)->val[(to)->len])->anchor)) goto fail;
    1484             : }else
    1485           0 : (&(to)->val[(to)->len])->anchor = NULL;
    1486             : }
    1487           0 : return 0;
    1488           0 : fail:
    1489           0 : free_HDB_Ext_PKINIT_acl(to);
    1490           0 : return ENOMEM;
    1491             : }
    1492             : 
    1493             : int ASN1CALL
    1494           0 : encode_HDB_Ext_PKINIT_hash(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_Ext_PKINIT_hash *data, size_t *size)
    1495             : {
    1496           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    1497             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1498             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    1499             : 
    1500           0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
    1501           0 : size_t Top_tag_for_oldret = ret;
    1502           0 : ret = 0;
    1503             : /* digest */
    1504             : {
    1505           0 : size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    1506           0 : ret = 0;
    1507           0 : e = der_put_octet_string(p, len, &(&(data)->val[i])->digest, &l);
    1508           0 : if (e) return e;
    1509           0 : p -= l; len -= l; ret += l;
    1510             : 
    1511           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
    1512           0 : if (e) return e;
    1513           0 : p -= l; len -= l; ret += l;
    1514             : 
    1515           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
    1516           0 : if (e) return e;
    1517           0 : p -= l; len -= l; ret += l;
    1518             : 
    1519           0 : ret += Top_tag_S_Of_tag_oldret;
    1520             : }
    1521             : /* digest-type */
    1522             : {
    1523           0 : size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    1524           0 : ret = 0;
    1525           0 : e = der_put_oid(p, len, &(&(data)->val[i])->digest_type, &l);
    1526           0 : if (e) return e;
    1527           0 : p -= l; len -= l; ret += l;
    1528             : 
    1529           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OID, &l);
    1530           0 : if (e) return e;
    1531           0 : p -= l; len -= l; ret += l;
    1532             : 
    1533           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    1534           0 : if (e) return e;
    1535           0 : p -= l; len -= l; ret += l;
    1536             : 
    1537           0 : ret += Top_tag_S_Of_tag_oldret;
    1538             : }
    1539           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    1540           0 : if (e) return e;
    1541           0 : p -= l; len -= l; ret += l;
    1542             : 
    1543           0 : ret += Top_tag_for_oldret;
    1544             : }
    1545           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    1546           0 : if (e) return e;
    1547           0 : p -= l; len -= l; ret += l;
    1548             : 
    1549           0 : *size = ret;
    1550           0 : return 0;
    1551             : }
    1552             : 
    1553             : int ASN1CALL
    1554           0 : decode_HDB_Ext_PKINIT_hash(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_Ext_PKINIT_hash *data, size_t *size)
    1555             : {
    1556           0 : size_t ret = 0;
    1557             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1558             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    1559             : 
    1560           0 : memset(data, 0, sizeof(*data));
    1561             : {
    1562             : size_t Top_datalen, Top_oldlen;
    1563             : Der_type Top_type;
    1564           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    1565           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    1566           0 : if(e) goto fail;
    1567           0 : p += l; len -= l; ret += l;
    1568           0 : Top_oldlen = len;
    1569           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1570           0 : len = Top_datalen;
    1571             : {
    1572           0 : size_t Top_Tag_origlen = len;
    1573           0 : size_t Top_Tag_oldret = ret;
    1574           0 : size_t Top_Tag_olen = 0;
    1575             : void *Top_Tag_tmp;
    1576           0 : ret = 0;
    1577           0 : (data)->len = 0;
    1578           0 : (data)->val = NULL;
    1579           0 : while(ret < Top_Tag_origlen) {
    1580           0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
    1581           0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    1582           0 : Top_Tag_olen = Top_Tag_nlen;
    1583           0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
    1584           0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    1585           0 : (data)->val = Top_Tag_tmp;
    1586             : {
    1587             : size_t Top_Tag_s_of_datalen, Top_Tag_s_of_oldlen;
    1588             : Der_type Top_Tag_s_of_type;
    1589           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_s_of_type, UT_Sequence, &Top_Tag_s_of_datalen, &l);
    1590           0 : if (e == 0 && Top_Tag_s_of_type != CONS) { e = ASN1_BAD_ID; }
    1591           0 : if(e) goto fail;
    1592           0 : p += l; len -= l; ret += l;
    1593           0 : Top_Tag_s_of_oldlen = len;
    1594           0 : if (Top_Tag_s_of_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1595           0 : len = Top_Tag_s_of_datalen;
    1596             : {
    1597             : size_t digest_type_datalen, digest_type_oldlen;
    1598             : Der_type digest_type_type;
    1599           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &digest_type_type, 0, &digest_type_datalen, &l);
    1600           0 : if (e == 0 && digest_type_type != CONS) { e = ASN1_BAD_ID; }
    1601           0 : if(e) goto fail;
    1602           0 : p += l; len -= l; ret += l;
    1603           0 : digest_type_oldlen = len;
    1604           0 : if (digest_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1605           0 : len = digest_type_datalen;
    1606             : {
    1607             : size_t digest_type_Tag_datalen, digest_type_Tag_oldlen;
    1608             : Der_type digest_type_Tag_type;
    1609           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &digest_type_Tag_type, UT_OID, &digest_type_Tag_datalen, &l);
    1610           0 : if (e == 0 && digest_type_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    1611           0 : if(e) goto fail;
    1612           0 : p += l; len -= l; ret += l;
    1613           0 : digest_type_Tag_oldlen = len;
    1614           0 : if (digest_type_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1615           0 : len = digest_type_Tag_datalen;
    1616           0 : e = der_get_oid(p, len, &(&(data)->val[(data)->len])->digest_type, &l);
    1617           0 : if(e) goto fail;
    1618           0 : p += l; len -= l; ret += l;
    1619           0 : len = digest_type_Tag_oldlen - digest_type_Tag_datalen;
    1620             : }
    1621           0 : len = digest_type_oldlen - digest_type_datalen;
    1622             : }
    1623             : {
    1624             : size_t digest_datalen, digest_oldlen;
    1625             : Der_type digest_type;
    1626           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &digest_type, 1, &digest_datalen, &l);
    1627           0 : if (e == 0 && digest_type != CONS) { e = ASN1_BAD_ID; }
    1628           0 : if(e) goto fail;
    1629           0 : p += l; len -= l; ret += l;
    1630           0 : digest_oldlen = len;
    1631           0 : if (digest_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1632           0 : len = digest_datalen;
    1633             : {
    1634             : size_t digest_Tag_datalen, digest_Tag_oldlen;
    1635             : Der_type digest_Tag_type;
    1636           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &digest_Tag_type, UT_OctetString, &digest_Tag_datalen, &l);
    1637           0 : if (e == 0 && digest_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    1638           0 : if(e) goto fail;
    1639           0 : p += l; len -= l; ret += l;
    1640           0 : digest_Tag_oldlen = len;
    1641           0 : if (digest_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1642           0 : len = digest_Tag_datalen;
    1643           0 : e = der_get_octet_string(p, len, &(&(data)->val[(data)->len])->digest, &l);
    1644           0 : if(e) goto fail;
    1645           0 : p += l; len -= l; ret += l;
    1646           0 : len = digest_Tag_oldlen - digest_Tag_datalen;
    1647             : }
    1648           0 : len = digest_oldlen - digest_datalen;
    1649             : }
    1650           0 : len = Top_Tag_s_of_oldlen - Top_Tag_s_of_datalen;
    1651             : }
    1652           0 : (data)->len++;
    1653           0 : len = Top_Tag_origlen - ret;
    1654             : }
    1655           0 : ret += Top_Tag_oldret;
    1656             : }
    1657           0 : len = Top_oldlen - Top_datalen;
    1658             : }
    1659           0 : if(size) *size = ret;
    1660           0 : return 0;
    1661           0 : fail:
    1662           0 : free_HDB_Ext_PKINIT_hash(data);
    1663           0 : return e;
    1664             : }
    1665             : 
    1666             : void ASN1CALL
    1667           0 : free_HDB_Ext_PKINIT_hash(HDB_Ext_PKINIT_hash *data)
    1668             : {
    1669           0 : while((data)->len){
    1670           0 : der_free_oid(&(&(data)->val[(data)->len-1])->digest_type);
    1671           0 : der_free_octet_string(&(&(data)->val[(data)->len-1])->digest);
    1672           0 : (data)->len--;
    1673             : }
    1674           0 : free((data)->val);
    1675           0 : (data)->val = NULL;
    1676           0 : }
    1677             : 
    1678             : size_t ASN1CALL
    1679           0 : length_HDB_Ext_PKINIT_hash(const HDB_Ext_PKINIT_hash *data)
    1680             : {
    1681           0 : size_t ret = 0;
    1682             : {
    1683           0 : size_t Top_tag_oldret = ret;
    1684             : int i;
    1685           0 : ret = 0;
    1686           0 : for(i = (data)->len - 1; i >= 0; --i){
    1687           0 : size_t Top_tag_for_oldret = ret;
    1688           0 : ret = 0;
    1689             : {
    1690           0 : size_t Top_tag_S_Of_tag_oldret = ret;
    1691           0 : ret = 0;
    1692           0 : ret += der_length_oid(&(&(data)->val[i])->digest_type);
    1693           0 : ret += 1 + der_length_len (ret);
    1694           0 : ret += 1 + der_length_len (ret);
    1695           0 : ret += Top_tag_S_Of_tag_oldret;
    1696             : }
    1697             : {
    1698           0 : size_t Top_tag_S_Of_tag_oldret = ret;
    1699           0 : ret = 0;
    1700           0 : ret += der_length_octet_string(&(&(data)->val[i])->digest);
    1701           0 : ret += 1 + der_length_len (ret);
    1702           0 : ret += 1 + der_length_len (ret);
    1703           0 : ret += Top_tag_S_Of_tag_oldret;
    1704             : }
    1705           0 : ret += 1 + der_length_len (ret);
    1706           0 : ret += Top_tag_for_oldret;
    1707             : }
    1708           0 : ret += Top_tag_oldret;
    1709             : }
    1710           0 : ret += 1 + der_length_len (ret);
    1711           0 : return ret;
    1712             : }
    1713             : 
    1714             : int ASN1CALL
    1715           0 : copy_HDB_Ext_PKINIT_hash(const HDB_Ext_PKINIT_hash *from, HDB_Ext_PKINIT_hash *to)
    1716             : {
    1717           0 : memset(to, 0, sizeof(*to));
    1718           0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
    1719           0 : goto fail;
    1720           0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
    1721           0 : if(der_copy_oid(&(&(from)->val[(to)->len])->digest_type, &(&(to)->val[(to)->len])->digest_type)) goto fail;
    1722           0 : if(der_copy_octet_string(&(&(from)->val[(to)->len])->digest, &(&(to)->val[(to)->len])->digest)) goto fail;
    1723             : }
    1724           0 : return 0;
    1725           0 : fail:
    1726           0 : free_HDB_Ext_PKINIT_hash(to);
    1727           0 : return ENOMEM;
    1728             : }
    1729             : 
    1730             : int ASN1CALL
    1731           0 : encode_HDB_Ext_PKINIT_cert(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_Ext_PKINIT_cert *data, size_t *size)
    1732             : {
    1733           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    1734             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1735             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    1736             : 
    1737           0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
    1738           0 : size_t Top_tag_for_oldret = ret;
    1739           0 : ret = 0;
    1740             : /* cert */
    1741             : {
    1742           0 : size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    1743           0 : ret = 0;
    1744           0 : e = der_put_octet_string(p, len, &(&(data)->val[i])->cert, &l);
    1745           0 : if (e) return e;
    1746           0 : p -= l; len -= l; ret += l;
    1747             : 
    1748           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
    1749           0 : if (e) return e;
    1750           0 : p -= l; len -= l; ret += l;
    1751             : 
    1752           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    1753           0 : if (e) return e;
    1754           0 : p -= l; len -= l; ret += l;
    1755             : 
    1756           0 : ret += Top_tag_S_Of_tag_oldret;
    1757             : }
    1758           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    1759           0 : if (e) return e;
    1760           0 : p -= l; len -= l; ret += l;
    1761             : 
    1762           0 : ret += Top_tag_for_oldret;
    1763             : }
    1764           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    1765           0 : if (e) return e;
    1766           0 : p -= l; len -= l; ret += l;
    1767             : 
    1768           0 : *size = ret;
    1769           0 : return 0;
    1770             : }
    1771             : 
    1772             : int ASN1CALL
    1773           0 : decode_HDB_Ext_PKINIT_cert(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_Ext_PKINIT_cert *data, size_t *size)
    1774             : {
    1775           0 : size_t ret = 0;
    1776             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1777             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    1778             : 
    1779           0 : memset(data, 0, sizeof(*data));
    1780             : {
    1781             : size_t Top_datalen, Top_oldlen;
    1782             : Der_type Top_type;
    1783           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    1784           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    1785           0 : if(e) goto fail;
    1786           0 : p += l; len -= l; ret += l;
    1787           0 : Top_oldlen = len;
    1788           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1789           0 : len = Top_datalen;
    1790             : {
    1791           0 : size_t Top_Tag_origlen = len;
    1792           0 : size_t Top_Tag_oldret = ret;
    1793           0 : size_t Top_Tag_olen = 0;
    1794             : void *Top_Tag_tmp;
    1795           0 : ret = 0;
    1796           0 : (data)->len = 0;
    1797           0 : (data)->val = NULL;
    1798           0 : while(ret < Top_Tag_origlen) {
    1799           0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
    1800           0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    1801           0 : Top_Tag_olen = Top_Tag_nlen;
    1802           0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
    1803           0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    1804           0 : (data)->val = Top_Tag_tmp;
    1805             : {
    1806             : size_t Top_Tag_s_of_datalen, Top_Tag_s_of_oldlen;
    1807             : Der_type Top_Tag_s_of_type;
    1808           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_s_of_type, UT_Sequence, &Top_Tag_s_of_datalen, &l);
    1809           0 : if (e == 0 && Top_Tag_s_of_type != CONS) { e = ASN1_BAD_ID; }
    1810           0 : if(e) goto fail;
    1811           0 : p += l; len -= l; ret += l;
    1812           0 : Top_Tag_s_of_oldlen = len;
    1813           0 : if (Top_Tag_s_of_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1814           0 : len = Top_Tag_s_of_datalen;
    1815             : {
    1816             : size_t cert_datalen, cert_oldlen;
    1817             : Der_type cert_type;
    1818           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cert_type, 0, &cert_datalen, &l);
    1819           0 : if (e == 0 && cert_type != CONS) { e = ASN1_BAD_ID; }
    1820           0 : if(e) goto fail;
    1821           0 : p += l; len -= l; ret += l;
    1822           0 : cert_oldlen = len;
    1823           0 : if (cert_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1824           0 : len = cert_datalen;
    1825             : {
    1826             : size_t cert_Tag_datalen, cert_Tag_oldlen;
    1827             : Der_type cert_Tag_type;
    1828           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &cert_Tag_type, UT_OctetString, &cert_Tag_datalen, &l);
    1829           0 : if (e == 0 && cert_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    1830           0 : if(e) goto fail;
    1831           0 : p += l; len -= l; ret += l;
    1832           0 : cert_Tag_oldlen = len;
    1833           0 : if (cert_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1834           0 : len = cert_Tag_datalen;
    1835           0 : e = der_get_octet_string(p, len, &(&(data)->val[(data)->len])->cert, &l);
    1836           0 : if(e) goto fail;
    1837           0 : p += l; len -= l; ret += l;
    1838           0 : len = cert_Tag_oldlen - cert_Tag_datalen;
    1839             : }
    1840           0 : len = cert_oldlen - cert_datalen;
    1841             : }
    1842           0 : len = Top_Tag_s_of_oldlen - Top_Tag_s_of_datalen;
    1843             : }
    1844           0 : (data)->len++;
    1845           0 : len = Top_Tag_origlen - ret;
    1846             : }
    1847           0 : ret += Top_Tag_oldret;
    1848             : }
    1849           0 : len = Top_oldlen - Top_datalen;
    1850             : }
    1851           0 : if(size) *size = ret;
    1852           0 : return 0;
    1853           0 : fail:
    1854           0 : free_HDB_Ext_PKINIT_cert(data);
    1855           0 : return e;
    1856             : }
    1857             : 
    1858             : void ASN1CALL
    1859           0 : free_HDB_Ext_PKINIT_cert(HDB_Ext_PKINIT_cert *data)
    1860             : {
    1861           0 : while((data)->len){
    1862           0 : der_free_octet_string(&(&(data)->val[(data)->len-1])->cert);
    1863           0 : (data)->len--;
    1864             : }
    1865           0 : free((data)->val);
    1866           0 : (data)->val = NULL;
    1867           0 : }
    1868             : 
    1869             : size_t ASN1CALL
    1870           0 : length_HDB_Ext_PKINIT_cert(const HDB_Ext_PKINIT_cert *data)
    1871             : {
    1872           0 : size_t ret = 0;
    1873             : {
    1874           0 : size_t Top_tag_oldret = ret;
    1875             : int i;
    1876           0 : ret = 0;
    1877           0 : for(i = (data)->len - 1; i >= 0; --i){
    1878           0 : size_t Top_tag_for_oldret = ret;
    1879           0 : ret = 0;
    1880             : {
    1881           0 : size_t Top_tag_S_Of_tag_oldret = ret;
    1882           0 : ret = 0;
    1883           0 : ret += der_length_octet_string(&(&(data)->val[i])->cert);
    1884           0 : ret += 1 + der_length_len (ret);
    1885           0 : ret += 1 + der_length_len (ret);
    1886           0 : ret += Top_tag_S_Of_tag_oldret;
    1887             : }
    1888           0 : ret += 1 + der_length_len (ret);
    1889           0 : ret += Top_tag_for_oldret;
    1890             : }
    1891           0 : ret += Top_tag_oldret;
    1892             : }
    1893           0 : ret += 1 + der_length_len (ret);
    1894           0 : return ret;
    1895             : }
    1896             : 
    1897             : int ASN1CALL
    1898           0 : copy_HDB_Ext_PKINIT_cert(const HDB_Ext_PKINIT_cert *from, HDB_Ext_PKINIT_cert *to)
    1899             : {
    1900           0 : memset(to, 0, sizeof(*to));
    1901           0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
    1902           0 : goto fail;
    1903           0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
    1904           0 : if(der_copy_octet_string(&(&(from)->val[(to)->len])->cert, &(&(to)->val[(to)->len])->cert)) goto fail;
    1905             : }
    1906           0 : return 0;
    1907           0 : fail:
    1908           0 : free_HDB_Ext_PKINIT_cert(to);
    1909           0 : return ENOMEM;
    1910             : }
    1911             : 
    1912             : int ASN1CALL
    1913           0 : encode_HDB_Ext_Constrained_delegation_acl(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_Ext_Constrained_delegation_acl *data, size_t *size)
    1914             : {
    1915           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    1916             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1917             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    1918             : 
    1919           0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
    1920           0 : size_t Top_tag_for_oldret = ret;
    1921           0 : ret = 0;
    1922           0 : e = encode_Principal(p, len, &(data)->val[i], &l);
    1923           0 : if (e) return e;
    1924           0 : p -= l; len -= l; ret += l;
    1925             : 
    1926           0 : ret += Top_tag_for_oldret;
    1927             : }
    1928           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    1929           0 : if (e) return e;
    1930           0 : p -= l; len -= l; ret += l;
    1931             : 
    1932           0 : *size = ret;
    1933           0 : return 0;
    1934             : }
    1935             : 
    1936             : int ASN1CALL
    1937           0 : decode_HDB_Ext_Constrained_delegation_acl(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_Ext_Constrained_delegation_acl *data, size_t *size)
    1938             : {
    1939           0 : size_t ret = 0;
    1940             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    1941             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    1942             : 
    1943           0 : memset(data, 0, sizeof(*data));
    1944             : {
    1945             : size_t Top_datalen, Top_oldlen;
    1946             : Der_type Top_type;
    1947           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    1948           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    1949           0 : if(e) goto fail;
    1950           0 : p += l; len -= l; ret += l;
    1951           0 : Top_oldlen = len;
    1952           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    1953           0 : len = Top_datalen;
    1954             : {
    1955           0 : size_t Top_Tag_origlen = len;
    1956           0 : size_t Top_Tag_oldret = ret;
    1957           0 : size_t Top_Tag_olen = 0;
    1958             : void *Top_Tag_tmp;
    1959           0 : ret = 0;
    1960           0 : (data)->len = 0;
    1961           0 : (data)->val = NULL;
    1962           0 : while(ret < Top_Tag_origlen) {
    1963           0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
    1964           0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    1965           0 : Top_Tag_olen = Top_Tag_nlen;
    1966           0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
    1967           0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    1968           0 : (data)->val = Top_Tag_tmp;
    1969           0 : e = decode_Principal(p, len, &(data)->val[(data)->len], &l);
    1970           0 : if(e) goto fail;
    1971           0 : p += l; len -= l; ret += l;
    1972           0 : (data)->len++;
    1973           0 : len = Top_Tag_origlen - ret;
    1974             : }
    1975           0 : ret += Top_Tag_oldret;
    1976             : }
    1977           0 : len = Top_oldlen - Top_datalen;
    1978             : }
    1979           0 : if(size) *size = ret;
    1980           0 : return 0;
    1981           0 : fail:
    1982           0 : free_HDB_Ext_Constrained_delegation_acl(data);
    1983           0 : return e;
    1984             : }
    1985             : 
    1986             : void ASN1CALL
    1987           0 : free_HDB_Ext_Constrained_delegation_acl(HDB_Ext_Constrained_delegation_acl *data)
    1988             : {
    1989           0 : while((data)->len){
    1990           0 : free_Principal(&(data)->val[(data)->len-1]);
    1991           0 : (data)->len--;
    1992             : }
    1993           0 : free((data)->val);
    1994           0 : (data)->val = NULL;
    1995           0 : }
    1996             : 
    1997             : size_t ASN1CALL
    1998           0 : length_HDB_Ext_Constrained_delegation_acl(const HDB_Ext_Constrained_delegation_acl *data)
    1999             : {
    2000           0 : size_t ret = 0;
    2001             : {
    2002           0 : size_t Top_tag_oldret = ret;
    2003             : int i;
    2004           0 : ret = 0;
    2005           0 : for(i = (data)->len - 1; i >= 0; --i){
    2006           0 : size_t Top_tag_for_oldret = ret;
    2007           0 : ret = 0;
    2008           0 : ret += length_Principal(&(data)->val[i]);
    2009           0 : ret += Top_tag_for_oldret;
    2010             : }
    2011           0 : ret += Top_tag_oldret;
    2012             : }
    2013           0 : ret += 1 + der_length_len (ret);
    2014           0 : return ret;
    2015             : }
    2016             : 
    2017             : int ASN1CALL
    2018           0 : copy_HDB_Ext_Constrained_delegation_acl(const HDB_Ext_Constrained_delegation_acl *from, HDB_Ext_Constrained_delegation_acl *to)
    2019             : {
    2020           0 : memset(to, 0, sizeof(*to));
    2021           0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
    2022           0 : goto fail;
    2023           0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
    2024           0 : if(copy_Principal(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
    2025             : }
    2026           0 : return 0;
    2027           0 : fail:
    2028           0 : free_HDB_Ext_Constrained_delegation_acl(to);
    2029           0 : return ENOMEM;
    2030             : }
    2031             : 
    2032             : int ASN1CALL
    2033           0 : encode_HDB_Ext_Lan_Manager_OWF(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_Ext_Lan_Manager_OWF *data, size_t *size)
    2034             : {
    2035           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    2036             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2037             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    2038             : 
    2039           0 : e = der_put_octet_string(p, len, data, &l);
    2040           0 : if (e) return e;
    2041           0 : p -= l; len -= l; ret += l;
    2042             : 
    2043           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
    2044           0 : if (e) return e;
    2045           0 : p -= l; len -= l; ret += l;
    2046             : 
    2047           0 : *size = ret;
    2048           0 : return 0;
    2049             : }
    2050             : 
    2051             : int ASN1CALL
    2052           0 : decode_HDB_Ext_Lan_Manager_OWF(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_Ext_Lan_Manager_OWF *data, size_t *size)
    2053             : {
    2054           0 : size_t ret = 0;
    2055             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2056             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    2057             : 
    2058           0 : memset(data, 0, sizeof(*data));
    2059             : {
    2060             : size_t Top_datalen, Top_oldlen;
    2061             : Der_type Top_type;
    2062           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_OctetString, &Top_datalen, &l);
    2063           0 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
    2064           0 : if(e) goto fail;
    2065           0 : p += l; len -= l; ret += l;
    2066           0 : Top_oldlen = len;
    2067           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2068           0 : len = Top_datalen;
    2069           0 : e = der_get_octet_string(p, len, data, &l);
    2070           0 : if(e) goto fail;
    2071           0 : p += l; len -= l; ret += l;
    2072           0 : len = Top_oldlen - Top_datalen;
    2073             : }
    2074           0 : if(size) *size = ret;
    2075           0 : return 0;
    2076           0 : fail:
    2077           0 : free_HDB_Ext_Lan_Manager_OWF(data);
    2078           0 : return e;
    2079             : }
    2080             : 
    2081             : void ASN1CALL
    2082           0 : free_HDB_Ext_Lan_Manager_OWF(HDB_Ext_Lan_Manager_OWF *data)
    2083             : {
    2084           0 : der_free_octet_string(data);
    2085           0 : }
    2086             : 
    2087             : size_t ASN1CALL
    2088           0 : length_HDB_Ext_Lan_Manager_OWF(const HDB_Ext_Lan_Manager_OWF *data)
    2089             : {
    2090           0 : size_t ret = 0;
    2091           0 : ret += der_length_octet_string(data);
    2092           0 : ret += 1 + der_length_len (ret);
    2093           0 : return ret;
    2094             : }
    2095             : 
    2096             : int ASN1CALL
    2097           0 : copy_HDB_Ext_Lan_Manager_OWF(const HDB_Ext_Lan_Manager_OWF *from, HDB_Ext_Lan_Manager_OWF *to)
    2098             : {
    2099           0 : memset(to, 0, sizeof(*to));
    2100           0 : if(der_copy_octet_string(from, to)) goto fail;
    2101           0 : return 0;
    2102           0 : fail:
    2103           0 : free_HDB_Ext_Lan_Manager_OWF(to);
    2104           0 : return ENOMEM;
    2105             : }
    2106             : 
    2107             : int ASN1CALL
    2108           0 : encode_HDB_Ext_Password(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_Ext_Password *data, size_t *size)
    2109             : {
    2110           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    2111             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2112             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    2113             : 
    2114             : /* password */
    2115             : {
    2116           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    2117           0 : ret = 0;
    2118           0 : e = der_put_octet_string(p, len, &(data)->password, &l);
    2119           0 : if (e) return e;
    2120           0 : p -= l; len -= l; ret += l;
    2121             : 
    2122           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
    2123           0 : if (e) return e;
    2124           0 : p -= l; len -= l; ret += l;
    2125             : 
    2126           0 : ret += Top_tag_oldret;
    2127             : }
    2128             : /* mkvno */
    2129           0 : if((data)->mkvno) {
    2130           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    2131           0 : ret = 0;
    2132           0 : e = der_put_unsigned(p, len, (data)->mkvno, &l);
    2133           0 : if (e) return e;
    2134           0 : p -= l; len -= l; ret += l;
    2135             : 
    2136           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
    2137           0 : if (e) return e;
    2138           0 : p -= l; len -= l; ret += l;
    2139             : 
    2140           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    2141           0 : if (e) return e;
    2142           0 : p -= l; len -= l; ret += l;
    2143             : 
    2144           0 : ret += Top_tag_oldret;
    2145             : }
    2146           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    2147           0 : if (e) return e;
    2148           0 : p -= l; len -= l; ret += l;
    2149             : 
    2150           0 : *size = ret;
    2151           0 : return 0;
    2152             : }
    2153             : 
    2154             : int ASN1CALL
    2155           0 : decode_HDB_Ext_Password(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_Ext_Password *data, size_t *size)
    2156             : {
    2157           0 : size_t ret = 0;
    2158             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2159             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    2160             : 
    2161           0 : memset(data, 0, sizeof(*data));
    2162             : {
    2163             : size_t Top_datalen, Top_oldlen;
    2164             : Der_type Top_type;
    2165           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    2166           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    2167           0 : if(e) goto fail;
    2168           0 : p += l; len -= l; ret += l;
    2169           0 : Top_oldlen = len;
    2170           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2171           0 : len = Top_datalen;
    2172             : {
    2173             : size_t mkvno_datalen, mkvno_oldlen;
    2174             : Der_type mkvno_type;
    2175           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &mkvno_type, 0, &mkvno_datalen, &l);
    2176           0 : if (e == 0 && mkvno_type != CONS) { e = ASN1_BAD_ID; }
    2177           0 : if(e) {
    2178           0 : (data)->mkvno = NULL;
    2179             : } else {
    2180           0 : (data)->mkvno = calloc(1, sizeof(*(data)->mkvno));
    2181           0 : if ((data)->mkvno == NULL) { e = ENOMEM; goto fail; }
    2182           0 : p += l; len -= l; ret += l;
    2183           0 : mkvno_oldlen = len;
    2184           0 : if (mkvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2185           0 : len = mkvno_datalen;
    2186             : {
    2187             : size_t mkvno_Tag_datalen, mkvno_Tag_oldlen;
    2188             : Der_type mkvno_Tag_type;
    2189           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &mkvno_Tag_type, UT_Integer, &mkvno_Tag_datalen, &l);
    2190           0 : if (e == 0 && mkvno_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    2191           0 : if(e) goto fail;
    2192           0 : p += l; len -= l; ret += l;
    2193           0 : mkvno_Tag_oldlen = len;
    2194           0 : if (mkvno_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2195           0 : len = mkvno_Tag_datalen;
    2196           0 : e = der_get_unsigned(p, len, (data)->mkvno, &l);
    2197           0 : if(e) goto fail;
    2198           0 : p += l; len -= l; ret += l;
    2199           0 : len = mkvno_Tag_oldlen - mkvno_Tag_datalen;
    2200             : }
    2201           0 : len = mkvno_oldlen - mkvno_datalen;
    2202             : }
    2203             : }
    2204             : {
    2205             : size_t password_datalen, password_oldlen;
    2206             : Der_type password_type;
    2207           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &password_type, UT_OctetString, &password_datalen, &l);
    2208           0 : if (e == 0 && password_type != PRIM) { e = ASN1_BAD_ID; }
    2209           0 : if(e) goto fail;
    2210           0 : p += l; len -= l; ret += l;
    2211           0 : password_oldlen = len;
    2212           0 : if (password_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2213           0 : len = password_datalen;
    2214           0 : e = der_get_octet_string(p, len, &(data)->password, &l);
    2215           0 : if(e) goto fail;
    2216           0 : p += l; len -= l; ret += l;
    2217           0 : len = password_oldlen - password_datalen;
    2218             : }
    2219           0 : len = Top_oldlen - Top_datalen;
    2220             : }
    2221           0 : if(size) *size = ret;
    2222           0 : return 0;
    2223           0 : fail:
    2224           0 : free_HDB_Ext_Password(data);
    2225           0 : return e;
    2226             : }
    2227             : 
    2228             : void ASN1CALL
    2229           0 : free_HDB_Ext_Password(HDB_Ext_Password *data)
    2230             : {
    2231           0 : if((data)->mkvno) {
    2232           0 : free((data)->mkvno);
    2233           0 : (data)->mkvno = NULL;
    2234             : }
    2235           0 : der_free_octet_string(&(data)->password);
    2236           0 : }
    2237             : 
    2238             : size_t ASN1CALL
    2239           0 : length_HDB_Ext_Password(const HDB_Ext_Password *data)
    2240             : {
    2241           0 : size_t ret = 0;
    2242           0 : if((data)->mkvno){
    2243           0 : size_t Top_tag_oldret = ret;
    2244           0 : ret = 0;
    2245           0 : ret += der_length_unsigned((data)->mkvno);
    2246           0 : ret += 1 + der_length_len (ret);
    2247           0 : ret += 1 + der_length_len (ret);
    2248           0 : ret += Top_tag_oldret;
    2249             : }
    2250             : {
    2251           0 : size_t Top_tag_oldret = ret;
    2252           0 : ret = 0;
    2253           0 : ret += der_length_octet_string(&(data)->password);
    2254           0 : ret += 1 + der_length_len (ret);
    2255           0 : ret += Top_tag_oldret;
    2256             : }
    2257           0 : ret += 1 + der_length_len (ret);
    2258           0 : return ret;
    2259             : }
    2260             : 
    2261             : int ASN1CALL
    2262           0 : copy_HDB_Ext_Password(const HDB_Ext_Password *from, HDB_Ext_Password *to)
    2263             : {
    2264           0 : memset(to, 0, sizeof(*to));
    2265           0 : if((from)->mkvno) {
    2266           0 : (to)->mkvno = malloc(sizeof(*(to)->mkvno));
    2267           0 : if((to)->mkvno == NULL) goto fail;
    2268           0 : *((to)->mkvno) = *((from)->mkvno);
    2269             : }else
    2270           0 : (to)->mkvno = NULL;
    2271           0 : if(der_copy_octet_string(&(from)->password, &(to)->password)) goto fail;
    2272           0 : return 0;
    2273           0 : fail:
    2274           0 : free_HDB_Ext_Password(to);
    2275           0 : return ENOMEM;
    2276             : }
    2277             : 
    2278             : int ASN1CALL
    2279           0 : encode_HDB_Ext_Aliases(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_Ext_Aliases *data, size_t *size)
    2280             : {
    2281           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    2282             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2283             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    2284             : 
    2285             : /* aliases */
    2286             : {
    2287           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    2288           0 : ret = 0;
    2289           0 : for(i = (int)(&(data)->aliases)->len - 1; i >= 0; --i) {
    2290           0 : size_t aliases_tag_tag_for_oldret = ret;
    2291           0 : ret = 0;
    2292           0 : e = encode_Principal(p, len, &(&(data)->aliases)->val[i], &l);
    2293           0 : if (e) return e;
    2294           0 : p -= l; len -= l; ret += l;
    2295             : 
    2296           0 : ret += aliases_tag_tag_for_oldret;
    2297             : }
    2298           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    2299           0 : if (e) return e;
    2300           0 : p -= l; len -= l; ret += l;
    2301             : 
    2302           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
    2303           0 : if (e) return e;
    2304           0 : p -= l; len -= l; ret += l;
    2305             : 
    2306           0 : ret += Top_tag_oldret;
    2307             : }
    2308             : /* case-insensitive */
    2309             : {
    2310           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    2311           0 : ret = 0;
    2312           0 : e = der_put_boolean(p, len, &(data)->case_insensitive, &l);
    2313           0 : if (e) return e;
    2314           0 : p -= l; len -= l; ret += l;
    2315             : 
    2316           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Boolean, &l);
    2317           0 : if (e) return e;
    2318           0 : p -= l; len -= l; ret += l;
    2319             : 
    2320           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    2321           0 : if (e) return e;
    2322           0 : p -= l; len -= l; ret += l;
    2323             : 
    2324           0 : ret += Top_tag_oldret;
    2325             : }
    2326           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    2327           0 : if (e) return e;
    2328           0 : p -= l; len -= l; ret += l;
    2329             : 
    2330           0 : *size = ret;
    2331           0 : return 0;
    2332             : }
    2333             : 
    2334             : int ASN1CALL
    2335           0 : decode_HDB_Ext_Aliases(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_Ext_Aliases *data, size_t *size)
    2336             : {
    2337           0 : size_t ret = 0;
    2338             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2339             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    2340             : 
    2341           0 : memset(data, 0, sizeof(*data));
    2342             : {
    2343             : size_t Top_datalen, Top_oldlen;
    2344             : Der_type Top_type;
    2345           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    2346           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    2347           0 : if(e) goto fail;
    2348           0 : p += l; len -= l; ret += l;
    2349           0 : Top_oldlen = len;
    2350           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2351           0 : len = Top_datalen;
    2352             : {
    2353             : size_t case_insensitive_datalen, case_insensitive_oldlen;
    2354             : Der_type case_insensitive_type;
    2355           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &case_insensitive_type, 0, &case_insensitive_datalen, &l);
    2356           0 : if (e == 0 && case_insensitive_type != CONS) { e = ASN1_BAD_ID; }
    2357           0 : if(e) goto fail;
    2358           0 : p += l; len -= l; ret += l;
    2359           0 : case_insensitive_oldlen = len;
    2360           0 : if (case_insensitive_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2361           0 : len = case_insensitive_datalen;
    2362             : {
    2363             : size_t case_insensitive_Tag_datalen, case_insensitive_Tag_oldlen;
    2364             : Der_type case_insensitive_Tag_type;
    2365           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &case_insensitive_Tag_type, UT_Boolean, &case_insensitive_Tag_datalen, &l);
    2366           0 : if (e == 0 && case_insensitive_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    2367           0 : if(e) goto fail;
    2368           0 : p += l; len -= l; ret += l;
    2369           0 : case_insensitive_Tag_oldlen = len;
    2370           0 : if (case_insensitive_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2371           0 : len = case_insensitive_Tag_datalen;
    2372           0 : e = der_get_boolean(p, len, &(data)->case_insensitive, &l);
    2373           0 : if(e) goto fail;
    2374           0 : p += l; len -= l; ret += l;
    2375           0 : len = case_insensitive_Tag_oldlen - case_insensitive_Tag_datalen;
    2376             : }
    2377           0 : len = case_insensitive_oldlen - case_insensitive_datalen;
    2378             : }
    2379             : {
    2380             : size_t aliases_datalen, aliases_oldlen;
    2381             : Der_type aliases_type;
    2382           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &aliases_type, 1, &aliases_datalen, &l);
    2383           0 : if (e == 0 && aliases_type != CONS) { e = ASN1_BAD_ID; }
    2384           0 : if(e) goto fail;
    2385           0 : p += l; len -= l; ret += l;
    2386           0 : aliases_oldlen = len;
    2387           0 : if (aliases_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2388           0 : len = aliases_datalen;
    2389             : {
    2390             : size_t aliases_Tag_datalen, aliases_Tag_oldlen;
    2391             : Der_type aliases_Tag_type;
    2392           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &aliases_Tag_type, UT_Sequence, &aliases_Tag_datalen, &l);
    2393           0 : if (e == 0 && aliases_Tag_type != CONS) { e = ASN1_BAD_ID; }
    2394           0 : if(e) goto fail;
    2395           0 : p += l; len -= l; ret += l;
    2396           0 : aliases_Tag_oldlen = len;
    2397           0 : if (aliases_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2398           0 : len = aliases_Tag_datalen;
    2399             : {
    2400           0 : size_t aliases_Tag_Tag_origlen = len;
    2401           0 : size_t aliases_Tag_Tag_oldret = ret;
    2402           0 : size_t aliases_Tag_Tag_olen = 0;
    2403             : void *aliases_Tag_Tag_tmp;
    2404           0 : ret = 0;
    2405           0 : (&(data)->aliases)->len = 0;
    2406           0 : (&(data)->aliases)->val = NULL;
    2407           0 : while(ret < aliases_Tag_Tag_origlen) {
    2408           0 : size_t aliases_Tag_Tag_nlen = aliases_Tag_Tag_olen + sizeof(*((&(data)->aliases)->val));
    2409           0 : if (aliases_Tag_Tag_olen > aliases_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    2410           0 : aliases_Tag_Tag_olen = aliases_Tag_Tag_nlen;
    2411           0 : aliases_Tag_Tag_tmp = realloc((&(data)->aliases)->val, aliases_Tag_Tag_olen);
    2412           0 : if (aliases_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    2413           0 : (&(data)->aliases)->val = aliases_Tag_Tag_tmp;
    2414           0 : e = decode_Principal(p, len, &(&(data)->aliases)->val[(&(data)->aliases)->len], &l);
    2415           0 : if(e) goto fail;
    2416           0 : p += l; len -= l; ret += l;
    2417           0 : (&(data)->aliases)->len++;
    2418           0 : len = aliases_Tag_Tag_origlen - ret;
    2419             : }
    2420           0 : ret += aliases_Tag_Tag_oldret;
    2421             : }
    2422           0 : len = aliases_Tag_oldlen - aliases_Tag_datalen;
    2423             : }
    2424           0 : len = aliases_oldlen - aliases_datalen;
    2425             : }
    2426           0 : len = Top_oldlen - Top_datalen;
    2427             : }
    2428           0 : if(size) *size = ret;
    2429           0 : return 0;
    2430           0 : fail:
    2431           0 : free_HDB_Ext_Aliases(data);
    2432           0 : return e;
    2433             : }
    2434             : 
    2435             : void ASN1CALL
    2436           0 : free_HDB_Ext_Aliases(HDB_Ext_Aliases *data)
    2437             : {
    2438           0 : while((&(data)->aliases)->len){
    2439           0 : free_Principal(&(&(data)->aliases)->val[(&(data)->aliases)->len-1]);
    2440           0 : (&(data)->aliases)->len--;
    2441             : }
    2442           0 : free((&(data)->aliases)->val);
    2443           0 : (&(data)->aliases)->val = NULL;
    2444           0 : }
    2445             : 
    2446             : size_t ASN1CALL
    2447           0 : length_HDB_Ext_Aliases(const HDB_Ext_Aliases *data)
    2448             : {
    2449           0 : size_t ret = 0;
    2450             : {
    2451           0 : size_t Top_tag_oldret = ret;
    2452           0 : ret = 0;
    2453           0 : ret += 1;
    2454           0 : ret += 1 + der_length_len (ret);
    2455           0 : ret += 1 + der_length_len (ret);
    2456           0 : ret += Top_tag_oldret;
    2457             : }
    2458             : {
    2459           0 : size_t Top_tag_oldret = ret;
    2460           0 : ret = 0;
    2461             : {
    2462           0 : size_t aliases_tag_tag_oldret = ret;
    2463             : int i;
    2464           0 : ret = 0;
    2465           0 : for(i = (&(data)->aliases)->len - 1; i >= 0; --i){
    2466           0 : size_t aliases_tag_tag_for_oldret = ret;
    2467           0 : ret = 0;
    2468           0 : ret += length_Principal(&(&(data)->aliases)->val[i]);
    2469           0 : ret += aliases_tag_tag_for_oldret;
    2470             : }
    2471           0 : ret += aliases_tag_tag_oldret;
    2472             : }
    2473           0 : ret += 1 + der_length_len (ret);
    2474           0 : ret += 1 + der_length_len (ret);
    2475           0 : ret += Top_tag_oldret;
    2476             : }
    2477           0 : ret += 1 + der_length_len (ret);
    2478           0 : return ret;
    2479             : }
    2480             : 
    2481             : int ASN1CALL
    2482           0 : copy_HDB_Ext_Aliases(const HDB_Ext_Aliases *from, HDB_Ext_Aliases *to)
    2483             : {
    2484           0 : memset(to, 0, sizeof(*to));
    2485           0 : *(&(to)->case_insensitive) = *(&(from)->case_insensitive);
    2486           0 : if(((&(to)->aliases)->val = malloc((&(from)->aliases)->len * sizeof(*(&(to)->aliases)->val))) == NULL && (&(from)->aliases)->len != 0)
    2487           0 : goto fail;
    2488           0 : for((&(to)->aliases)->len = 0; (&(to)->aliases)->len < (&(from)->aliases)->len; (&(to)->aliases)->len++){
    2489           0 : if(copy_Principal(&(&(from)->aliases)->val[(&(to)->aliases)->len], &(&(to)->aliases)->val[(&(to)->aliases)->len])) goto fail;
    2490             : }
    2491           0 : return 0;
    2492           0 : fail:
    2493           0 : free_HDB_Ext_Aliases(to);
    2494           0 : return ENOMEM;
    2495             : }
    2496             : 
    2497             : int ASN1CALL
    2498           0 : encode_Keys(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Keys *data, size_t *size)
    2499             : {
    2500           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    2501             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2502             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    2503             : 
    2504           0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
    2505           0 : size_t Top_tag_for_oldret = ret;
    2506           0 : ret = 0;
    2507           0 : e = encode_Key(p, len, &(data)->val[i], &l);
    2508           0 : if (e) return e;
    2509           0 : p -= l; len -= l; ret += l;
    2510             : 
    2511           0 : ret += Top_tag_for_oldret;
    2512             : }
    2513           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    2514           0 : if (e) return e;
    2515           0 : p -= l; len -= l; ret += l;
    2516             : 
    2517           0 : *size = ret;
    2518           0 : return 0;
    2519             : }
    2520             : 
    2521             : int ASN1CALL
    2522           0 : decode_Keys(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Keys *data, size_t *size)
    2523             : {
    2524           0 : size_t ret = 0;
    2525             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2526             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    2527             : 
    2528           0 : memset(data, 0, sizeof(*data));
    2529             : {
    2530             : size_t Top_datalen, Top_oldlen;
    2531             : Der_type Top_type;
    2532           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    2533           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    2534           0 : if(e) goto fail;
    2535           0 : p += l; len -= l; ret += l;
    2536           0 : Top_oldlen = len;
    2537           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2538           0 : len = Top_datalen;
    2539             : {
    2540           0 : size_t Top_Tag_origlen = len;
    2541           0 : size_t Top_Tag_oldret = ret;
    2542           0 : size_t Top_Tag_olen = 0;
    2543             : void *Top_Tag_tmp;
    2544           0 : ret = 0;
    2545           0 : (data)->len = 0;
    2546           0 : (data)->val = NULL;
    2547           0 : while(ret < Top_Tag_origlen) {
    2548           0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
    2549           0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    2550           0 : Top_Tag_olen = Top_Tag_nlen;
    2551           0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
    2552           0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    2553           0 : (data)->val = Top_Tag_tmp;
    2554           0 : e = decode_Key(p, len, &(data)->val[(data)->len], &l);
    2555           0 : if(e) goto fail;
    2556           0 : p += l; len -= l; ret += l;
    2557           0 : (data)->len++;
    2558           0 : len = Top_Tag_origlen - ret;
    2559             : }
    2560           0 : ret += Top_Tag_oldret;
    2561             : }
    2562           0 : len = Top_oldlen - Top_datalen;
    2563             : }
    2564           0 : if(size) *size = ret;
    2565           0 : return 0;
    2566           0 : fail:
    2567           0 : free_Keys(data);
    2568           0 : return e;
    2569             : }
    2570             : 
    2571             : void ASN1CALL
    2572      244004 : free_Keys(Keys *data)
    2573             : {
    2574     1171378 : while((data)->len){
    2575      683370 : free_Key(&(data)->val[(data)->len-1]);
    2576      683370 : (data)->len--;
    2577             : }
    2578      244004 : free((data)->val);
    2579      244004 : (data)->val = NULL;
    2580      244004 : }
    2581             : 
    2582             : size_t ASN1CALL
    2583           0 : length_Keys(const Keys *data)
    2584             : {
    2585           0 : size_t ret = 0;
    2586             : {
    2587           0 : size_t Top_tag_oldret = ret;
    2588             : int i;
    2589           0 : ret = 0;
    2590           0 : for(i = (data)->len - 1; i >= 0; --i){
    2591           0 : size_t Top_tag_for_oldret = ret;
    2592           0 : ret = 0;
    2593           0 : ret += length_Key(&(data)->val[i]);
    2594           0 : ret += Top_tag_for_oldret;
    2595             : }
    2596           0 : ret += Top_tag_oldret;
    2597             : }
    2598           0 : ret += 1 + der_length_len (ret);
    2599           0 : return ret;
    2600             : }
    2601             : 
    2602             : int ASN1CALL
    2603           0 : copy_Keys(const Keys *from, Keys *to)
    2604             : {
    2605           0 : memset(to, 0, sizeof(*to));
    2606           0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
    2607           0 : goto fail;
    2608           0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
    2609           0 : if(copy_Key(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
    2610             : }
    2611           0 : return 0;
    2612           0 : fail:
    2613           0 : free_Keys(to);
    2614           0 : return ENOMEM;
    2615             : }
    2616             : 
    2617             : int ASN1CALL
    2618           0 : add_Keys(Keys *data, const Key *element)
    2619             : {
    2620             : int ret;
    2621             : void *ptr;
    2622             : 
    2623           0 : ptr = realloc(data->val, 
    2624           0 :         (data->len + 1) * sizeof(data->val[0]));
    2625           0 : if (ptr == NULL) return ENOMEM;
    2626           0 : data->val = ptr;
    2627             : 
    2628           0 : ret = copy_Key(element, &data->val[data->len]);
    2629           0 : if (ret) return ret;
    2630           0 : data->len++;
    2631           0 : return 0;
    2632             : }
    2633             : 
    2634             : int ASN1CALL
    2635           0 : remove_Keys(Keys *data, unsigned int element)
    2636             : {
    2637             : void *ptr;
    2638             : 
    2639           0 : if (data->len == 0 || element >= data->len)
    2640           0 :         return ASN1_OVERRUN;
    2641           0 : free_Key(&data->val[element]);
    2642           0 : data->len--;
    2643           0 : if (element < data->len)
    2644           0 :         memmove(&data->val[element], &data->val[element + 1], 
    2645           0 :                 sizeof(data->val[0]) * data->len);
    2646           0 : ptr = realloc(data->val, data->len * sizeof(data->val[0]));
    2647           0 : if (ptr != NULL || data->len == 0) data->val = ptr;
    2648           0 : return 0;
    2649             : }
    2650             : 
    2651             : int ASN1CALL
    2652           0 : encode_hdb_keyset(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const hdb_keyset *data, size_t *size)
    2653             : {
    2654           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    2655             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2656             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    2657             : 
    2658             : /* set-time */
    2659           0 : if((data)->set_time) {
    2660           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    2661           0 : ret = 0;
    2662           0 : e = encode_KerberosTime(p, len, (data)->set_time, &l);
    2663           0 : if (e) return e;
    2664           0 : p -= l; len -= l; ret += l;
    2665             : 
    2666           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
    2667           0 : if (e) return e;
    2668           0 : p -= l; len -= l; ret += l;
    2669             : 
    2670           0 : ret += Top_tag_oldret;
    2671             : }
    2672             : /* keys */
    2673             : {
    2674           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    2675           0 : ret = 0;
    2676           0 : e = encode_Keys(p, len, &(data)->keys, &l);
    2677           0 : if (e) return e;
    2678           0 : p -= l; len -= l; ret += l;
    2679             : 
    2680           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
    2681           0 : if (e) return e;
    2682           0 : p -= l; len -= l; ret += l;
    2683             : 
    2684           0 : ret += Top_tag_oldret;
    2685             : }
    2686             : /* kvno */
    2687             : {
    2688           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    2689           0 : ret = 0;
    2690           0 : e = der_put_unsigned(p, len, &(data)->kvno, &l);
    2691           0 : if (e) return e;
    2692           0 : p -= l; len -= l; ret += l;
    2693             : 
    2694           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
    2695           0 : if (e) return e;
    2696           0 : p -= l; len -= l; ret += l;
    2697             : 
    2698           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    2699           0 : if (e) return e;
    2700           0 : p -= l; len -= l; ret += l;
    2701             : 
    2702           0 : ret += Top_tag_oldret;
    2703             : }
    2704           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    2705           0 : if (e) return e;
    2706           0 : p -= l; len -= l; ret += l;
    2707             : 
    2708           0 : *size = ret;
    2709           0 : return 0;
    2710             : }
    2711             : 
    2712             : int ASN1CALL
    2713           0 : decode_hdb_keyset(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, hdb_keyset *data, size_t *size)
    2714             : {
    2715           0 : size_t ret = 0;
    2716             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2717             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    2718             : 
    2719           0 : memset(data, 0, sizeof(*data));
    2720             : {
    2721             : size_t Top_datalen, Top_oldlen;
    2722             : Der_type Top_type;
    2723           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    2724           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    2725           0 : if(e) goto fail;
    2726           0 : p += l; len -= l; ret += l;
    2727           0 : Top_oldlen = len;
    2728           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2729           0 : len = Top_datalen;
    2730             : {
    2731             : size_t kvno_datalen, kvno_oldlen;
    2732             : Der_type kvno_type;
    2733           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &kvno_type, 0, &kvno_datalen, &l);
    2734           0 : if (e == 0 && kvno_type != CONS) { e = ASN1_BAD_ID; }
    2735           0 : if(e) goto fail;
    2736           0 : p += l; len -= l; ret += l;
    2737           0 : kvno_oldlen = len;
    2738           0 : if (kvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2739           0 : len = kvno_datalen;
    2740             : {
    2741             : size_t kvno_Tag_datalen, kvno_Tag_oldlen;
    2742             : Der_type kvno_Tag_type;
    2743           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &kvno_Tag_type, UT_Integer, &kvno_Tag_datalen, &l);
    2744           0 : if (e == 0 && kvno_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    2745           0 : if(e) goto fail;
    2746           0 : p += l; len -= l; ret += l;
    2747           0 : kvno_Tag_oldlen = len;
    2748           0 : if (kvno_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2749           0 : len = kvno_Tag_datalen;
    2750           0 : e = der_get_unsigned(p, len, &(data)->kvno, &l);
    2751           0 : if(e) goto fail;
    2752           0 : p += l; len -= l; ret += l;
    2753           0 : len = kvno_Tag_oldlen - kvno_Tag_datalen;
    2754             : }
    2755           0 : len = kvno_oldlen - kvno_datalen;
    2756             : }
    2757             : {
    2758             : size_t keys_datalen, keys_oldlen;
    2759             : Der_type keys_type;
    2760           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &keys_type, 1, &keys_datalen, &l);
    2761           0 : if (e == 0 && keys_type != CONS) { e = ASN1_BAD_ID; }
    2762           0 : if(e) goto fail;
    2763           0 : p += l; len -= l; ret += l;
    2764           0 : keys_oldlen = len;
    2765           0 : if (keys_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2766           0 : len = keys_datalen;
    2767           0 : e = decode_Keys(p, len, &(data)->keys, &l);
    2768           0 : if(e) goto fail;
    2769           0 : p += l; len -= l; ret += l;
    2770           0 : len = keys_oldlen - keys_datalen;
    2771             : }
    2772             : {
    2773             : size_t set_time_datalen, set_time_oldlen;
    2774             : Der_type set_time_type;
    2775           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &set_time_type, 2, &set_time_datalen, &l);
    2776           0 : if (e == 0 && set_time_type != CONS) { e = ASN1_BAD_ID; }
    2777           0 : if(e) {
    2778           0 : (data)->set_time = NULL;
    2779             : } else {
    2780           0 : (data)->set_time = calloc(1, sizeof(*(data)->set_time));
    2781           0 : if ((data)->set_time == NULL) { e = ENOMEM; goto fail; }
    2782           0 : p += l; len -= l; ret += l;
    2783           0 : set_time_oldlen = len;
    2784           0 : if (set_time_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2785           0 : len = set_time_datalen;
    2786           0 : e = decode_KerberosTime(p, len, (data)->set_time, &l);
    2787           0 : if(e) goto fail;
    2788           0 : p += l; len -= l; ret += l;
    2789           0 : len = set_time_oldlen - set_time_datalen;
    2790             : }
    2791             : }
    2792           0 : len = Top_oldlen - Top_datalen;
    2793             : }
    2794           0 : if(size) *size = ret;
    2795           0 : return 0;
    2796           0 : fail:
    2797           0 : free_hdb_keyset(data);
    2798           0 : return e;
    2799             : }
    2800             : 
    2801             : void ASN1CALL
    2802           0 : free_hdb_keyset(hdb_keyset *data)
    2803             : {
    2804           0 : free_Keys(&(data)->keys);
    2805           0 : if((data)->set_time) {
    2806           0 : free_KerberosTime((data)->set_time);
    2807           0 : free((data)->set_time);
    2808           0 : (data)->set_time = NULL;
    2809             : }
    2810           0 : }
    2811             : 
    2812             : size_t ASN1CALL
    2813           0 : length_hdb_keyset(const hdb_keyset *data)
    2814             : {
    2815           0 : size_t ret = 0;
    2816             : {
    2817           0 : size_t Top_tag_oldret = ret;
    2818           0 : ret = 0;
    2819           0 : ret += der_length_unsigned(&(data)->kvno);
    2820           0 : ret += 1 + der_length_len (ret);
    2821           0 : ret += 1 + der_length_len (ret);
    2822           0 : ret += Top_tag_oldret;
    2823             : }
    2824             : {
    2825           0 : size_t Top_tag_oldret = ret;
    2826           0 : ret = 0;
    2827           0 : ret += length_Keys(&(data)->keys);
    2828           0 : ret += 1 + der_length_len (ret);
    2829           0 : ret += Top_tag_oldret;
    2830             : }
    2831           0 : if((data)->set_time){
    2832           0 : size_t Top_tag_oldret = ret;
    2833           0 : ret = 0;
    2834           0 : ret += length_KerberosTime((data)->set_time);
    2835           0 : ret += 1 + der_length_len (ret);
    2836           0 : ret += Top_tag_oldret;
    2837             : }
    2838           0 : ret += 1 + der_length_len (ret);
    2839           0 : return ret;
    2840             : }
    2841             : 
    2842             : int ASN1CALL
    2843           0 : copy_hdb_keyset(const hdb_keyset *from, hdb_keyset *to)
    2844             : {
    2845           0 : memset(to, 0, sizeof(*to));
    2846           0 : *(&(to)->kvno) = *(&(from)->kvno);
    2847           0 : if(copy_Keys(&(from)->keys, &(to)->keys)) goto fail;
    2848           0 : if((from)->set_time) {
    2849           0 : (to)->set_time = malloc(sizeof(*(to)->set_time));
    2850           0 : if((to)->set_time == NULL) goto fail;
    2851           0 : if(copy_KerberosTime((from)->set_time, (to)->set_time)) goto fail;
    2852             : }else
    2853           0 : (to)->set_time = NULL;
    2854           0 : return 0;
    2855           0 : fail:
    2856           0 : free_hdb_keyset(to);
    2857           0 : return ENOMEM;
    2858             : }
    2859             : 
    2860             : int ASN1CALL
    2861           0 : encode_HDB_Ext_KeySet(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_Ext_KeySet *data, size_t *size)
    2862             : {
    2863           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    2864             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2865             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    2866             : 
    2867           0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
    2868           0 : size_t Top_tag_for_oldret = ret;
    2869           0 : ret = 0;
    2870           0 : e = encode_hdb_keyset(p, len, &(data)->val[i], &l);
    2871           0 : if (e) return e;
    2872           0 : p -= l; len -= l; ret += l;
    2873             : 
    2874           0 : ret += Top_tag_for_oldret;
    2875             : }
    2876           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    2877           0 : if (e) return e;
    2878           0 : p -= l; len -= l; ret += l;
    2879             : 
    2880           0 : *size = ret;
    2881           0 : return 0;
    2882             : }
    2883             : 
    2884             : int ASN1CALL
    2885           0 : decode_HDB_Ext_KeySet(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_Ext_KeySet *data, size_t *size)
    2886             : {
    2887           0 : size_t ret = 0;
    2888             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    2889             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    2890             : 
    2891           0 : memset(data, 0, sizeof(*data));
    2892             : {
    2893             : size_t Top_datalen, Top_oldlen;
    2894             : Der_type Top_type;
    2895           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    2896           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    2897           0 : if(e) goto fail;
    2898           0 : p += l; len -= l; ret += l;
    2899           0 : Top_oldlen = len;
    2900           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    2901           0 : len = Top_datalen;
    2902             : {
    2903           0 : size_t Top_Tag_origlen = len;
    2904           0 : size_t Top_Tag_oldret = ret;
    2905           0 : size_t Top_Tag_olen = 0;
    2906             : void *Top_Tag_tmp;
    2907           0 : ret = 0;
    2908           0 : (data)->len = 0;
    2909           0 : (data)->val = NULL;
    2910           0 : while(ret < Top_Tag_origlen) {
    2911           0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
    2912           0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    2913           0 : Top_Tag_olen = Top_Tag_nlen;
    2914           0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
    2915           0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    2916           0 : (data)->val = Top_Tag_tmp;
    2917           0 : e = decode_hdb_keyset(p, len, &(data)->val[(data)->len], &l);
    2918           0 : if(e) goto fail;
    2919           0 : p += l; len -= l; ret += l;
    2920           0 : (data)->len++;
    2921           0 : len = Top_Tag_origlen - ret;
    2922             : }
    2923           0 : ret += Top_Tag_oldret;
    2924             : }
    2925           0 : len = Top_oldlen - Top_datalen;
    2926             : }
    2927           0 : if(size) *size = ret;
    2928           0 : return 0;
    2929           0 : fail:
    2930           0 : free_HDB_Ext_KeySet(data);
    2931           0 : return e;
    2932             : }
    2933             : 
    2934             : void ASN1CALL
    2935           0 : free_HDB_Ext_KeySet(HDB_Ext_KeySet *data)
    2936             : {
    2937           0 : while((data)->len){
    2938           0 : free_hdb_keyset(&(data)->val[(data)->len-1]);
    2939           0 : (data)->len--;
    2940             : }
    2941           0 : free((data)->val);
    2942           0 : (data)->val = NULL;
    2943           0 : }
    2944             : 
    2945             : size_t ASN1CALL
    2946           0 : length_HDB_Ext_KeySet(const HDB_Ext_KeySet *data)
    2947             : {
    2948           0 : size_t ret = 0;
    2949             : {
    2950           0 : size_t Top_tag_oldret = ret;
    2951             : int i;
    2952           0 : ret = 0;
    2953           0 : for(i = (data)->len - 1; i >= 0; --i){
    2954           0 : size_t Top_tag_for_oldret = ret;
    2955           0 : ret = 0;
    2956           0 : ret += length_hdb_keyset(&(data)->val[i]);
    2957           0 : ret += Top_tag_for_oldret;
    2958             : }
    2959           0 : ret += Top_tag_oldret;
    2960             : }
    2961           0 : ret += 1 + der_length_len (ret);
    2962           0 : return ret;
    2963             : }
    2964             : 
    2965             : int ASN1CALL
    2966           0 : copy_HDB_Ext_KeySet(const HDB_Ext_KeySet *from, HDB_Ext_KeySet *to)
    2967             : {
    2968           0 : memset(to, 0, sizeof(*to));
    2969           0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
    2970           0 : goto fail;
    2971           0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
    2972           0 : if(copy_hdb_keyset(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
    2973             : }
    2974           0 : return 0;
    2975           0 : fail:
    2976           0 : free_HDB_Ext_KeySet(to);
    2977           0 : return ENOMEM;
    2978             : }
    2979             : 
    2980             : int ASN1CALL
    2981           0 : add_HDB_Ext_KeySet(HDB_Ext_KeySet *data, const hdb_keyset *element)
    2982             : {
    2983             : int ret;
    2984             : void *ptr;
    2985             : 
    2986           0 : ptr = realloc(data->val, 
    2987           0 :         (data->len + 1) * sizeof(data->val[0]));
    2988           0 : if (ptr == NULL) return ENOMEM;
    2989           0 : data->val = ptr;
    2990             : 
    2991           0 : ret = copy_hdb_keyset(element, &data->val[data->len]);
    2992           0 : if (ret) return ret;
    2993           0 : data->len++;
    2994           0 : return 0;
    2995             : }
    2996             : 
    2997             : int ASN1CALL
    2998           0 : remove_HDB_Ext_KeySet(HDB_Ext_KeySet *data, unsigned int element)
    2999             : {
    3000             : void *ptr;
    3001             : 
    3002           0 : if (data->len == 0 || element >= data->len)
    3003           0 :         return ASN1_OVERRUN;
    3004           0 : free_hdb_keyset(&data->val[element]);
    3005           0 : data->len--;
    3006           0 : if (element < data->len)
    3007           0 :         memmove(&data->val[element], &data->val[element + 1], 
    3008           0 :                 sizeof(data->val[0]) * data->len);
    3009           0 : ptr = realloc(data->val, data->len * sizeof(data->val[0]));
    3010           0 : if (ptr != NULL || data->len == 0) data->val = ptr;
    3011           0 : return 0;
    3012             : }
    3013             : 
    3014             : int ASN1CALL
    3015           0 : encode_HDB_extension(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_extension *data, size_t *size)
    3016             : {
    3017           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    3018             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    3019             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    3020             : 
    3021             : /* data */
    3022             : {
    3023           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    3024           0 : ret = 0;
    3025             : 
    3026           0 : switch((&(data)->data)->element) {
    3027           0 : case choice_HDB_extension_data_policy: {size_t data_tag_oldret = ret;
    3028           0 : ret = 0;
    3029           0 : e = der_put_utf8string(p, len, &((&(data)->data))->u.policy, &l);
    3030           0 : if (e) return e;
    3031           0 : p -= l; len -= l; ret += l;
    3032             : 
    3033           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_UTF8String, &l);
    3034           0 : if (e) return e;
    3035           0 : p -= l; len -= l; ret += l;
    3036             : 
    3037           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 12, &l);
    3038           0 : if (e) return e;
    3039           0 : p -= l; len -= l; ret += l;
    3040             : 
    3041           0 : ret += data_tag_oldret;
    3042           0 : break;
    3043             : }
    3044           0 : case choice_HDB_extension_data_hist_kvno_diff_svc: {size_t data_tag_oldret = ret;
    3045           0 : ret = 0;
    3046           0 : e = der_put_unsigned(p, len, &((&(data)->data))->u.hist_kvno_diff_svc, &l);
    3047           0 : if (e) return e;
    3048           0 : p -= l; len -= l; ret += l;
    3049             : 
    3050           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
    3051           0 : if (e) return e;
    3052           0 : p -= l; len -= l; ret += l;
    3053             : 
    3054           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 11, &l);
    3055           0 : if (e) return e;
    3056           0 : p -= l; len -= l; ret += l;
    3057             : 
    3058           0 : ret += data_tag_oldret;
    3059           0 : break;
    3060             : }
    3061           0 : case choice_HDB_extension_data_hist_kvno_diff_clnt: {size_t data_tag_oldret = ret;
    3062           0 : ret = 0;
    3063           0 : e = der_put_unsigned(p, len, &((&(data)->data))->u.hist_kvno_diff_clnt, &l);
    3064           0 : if (e) return e;
    3065           0 : p -= l; len -= l; ret += l;
    3066             : 
    3067           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
    3068           0 : if (e) return e;
    3069           0 : p -= l; len -= l; ret += l;
    3070             : 
    3071           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
    3072           0 : if (e) return e;
    3073           0 : p -= l; len -= l; ret += l;
    3074             : 
    3075           0 : ret += data_tag_oldret;
    3076           0 : break;
    3077             : }
    3078           0 : case choice_HDB_extension_data_hist_keys: {size_t data_tag_oldret = ret;
    3079           0 : ret = 0;
    3080           0 : e = encode_HDB_Ext_KeySet(p, len, &((&(data)->data))->u.hist_keys, &l);
    3081           0 : if (e) return e;
    3082           0 : p -= l; len -= l; ret += l;
    3083             : 
    3084           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
    3085           0 : if (e) return e;
    3086           0 : p -= l; len -= l; ret += l;
    3087             : 
    3088           0 : ret += data_tag_oldret;
    3089           0 : break;
    3090             : }
    3091           0 : case choice_HDB_extension_data_pkinit_cert: {size_t data_tag_oldret = ret;
    3092           0 : ret = 0;
    3093           0 : e = encode_HDB_Ext_PKINIT_cert(p, len, &((&(data)->data))->u.pkinit_cert, &l);
    3094           0 : if (e) return e;
    3095           0 : p -= l; len -= l; ret += l;
    3096             : 
    3097           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
    3098           0 : if (e) return e;
    3099           0 : p -= l; len -= l; ret += l;
    3100             : 
    3101           0 : ret += data_tag_oldret;
    3102           0 : break;
    3103             : }
    3104           0 : case choice_HDB_extension_data_last_pw_change: {size_t data_tag_oldret = ret;
    3105           0 : ret = 0;
    3106           0 : e = encode_KerberosTime(p, len, &((&(data)->data))->u.last_pw_change, &l);
    3107           0 : if (e) return e;
    3108           0 : p -= l; len -= l; ret += l;
    3109             : 
    3110           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
    3111           0 : if (e) return e;
    3112           0 : p -= l; len -= l; ret += l;
    3113             : 
    3114           0 : ret += data_tag_oldret;
    3115           0 : break;
    3116             : }
    3117           0 : case choice_HDB_extension_data_aliases: {size_t data_tag_oldret = ret;
    3118           0 : ret = 0;
    3119           0 : e = encode_HDB_Ext_Aliases(p, len, &((&(data)->data))->u.aliases, &l);
    3120           0 : if (e) return e;
    3121           0 : p -= l; len -= l; ret += l;
    3122             : 
    3123           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
    3124           0 : if (e) return e;
    3125           0 : p -= l; len -= l; ret += l;
    3126             : 
    3127           0 : ret += data_tag_oldret;
    3128           0 : break;
    3129             : }
    3130           0 : case choice_HDB_extension_data_password: {size_t data_tag_oldret = ret;
    3131           0 : ret = 0;
    3132           0 : e = encode_HDB_Ext_Password(p, len, &((&(data)->data))->u.password, &l);
    3133           0 : if (e) return e;
    3134           0 : p -= l; len -= l; ret += l;
    3135             : 
    3136           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
    3137           0 : if (e) return e;
    3138           0 : p -= l; len -= l; ret += l;
    3139             : 
    3140           0 : ret += data_tag_oldret;
    3141           0 : break;
    3142             : }
    3143           0 : case choice_HDB_extension_data_lm_owf: {size_t data_tag_oldret = ret;
    3144           0 : ret = 0;
    3145           0 : e = encode_HDB_Ext_Lan_Manager_OWF(p, len, &((&(data)->data))->u.lm_owf, &l);
    3146           0 : if (e) return e;
    3147           0 : p -= l; len -= l; ret += l;
    3148             : 
    3149           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
    3150           0 : if (e) return e;
    3151           0 : p -= l; len -= l; ret += l;
    3152             : 
    3153           0 : ret += data_tag_oldret;
    3154           0 : break;
    3155             : }
    3156           0 : case choice_HDB_extension_data_allowed_to_delegate_to: {size_t data_tag_oldret = ret;
    3157           0 : ret = 0;
    3158           0 : e = encode_HDB_Ext_Constrained_delegation_acl(p, len, &((&(data)->data))->u.allowed_to_delegate_to, &l);
    3159           0 : if (e) return e;
    3160           0 : p -= l; len -= l; ret += l;
    3161             : 
    3162           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
    3163           0 : if (e) return e;
    3164           0 : p -= l; len -= l; ret += l;
    3165             : 
    3166           0 : ret += data_tag_oldret;
    3167           0 : break;
    3168             : }
    3169           0 : case choice_HDB_extension_data_pkinit_cert_hash: {size_t data_tag_oldret = ret;
    3170           0 : ret = 0;
    3171           0 : e = encode_HDB_Ext_PKINIT_hash(p, len, &((&(data)->data))->u.pkinit_cert_hash, &l);
    3172           0 : if (e) return e;
    3173           0 : p -= l; len -= l; ret += l;
    3174             : 
    3175           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
    3176           0 : if (e) return e;
    3177           0 : p -= l; len -= l; ret += l;
    3178             : 
    3179           0 : ret += data_tag_oldret;
    3180           0 : break;
    3181             : }
    3182           0 : case choice_HDB_extension_data_pkinit_acl: {size_t data_tag_oldret = ret;
    3183           0 : ret = 0;
    3184           0 : e = encode_HDB_Ext_PKINIT_acl(p, len, &((&(data)->data))->u.pkinit_acl, &l);
    3185           0 : if (e) return e;
    3186           0 : p -= l; len -= l; ret += l;
    3187             : 
    3188           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    3189           0 : if (e) return e;
    3190           0 : p -= l; len -= l; ret += l;
    3191             : 
    3192           0 : ret += data_tag_oldret;
    3193           0 : break;
    3194             : }
    3195           0 : case choice_HDB_extension_data_asn1_ellipsis: {
    3196           0 : if (len < (&(data)->data)->u.asn1_ellipsis.length)
    3197           0 : return ASN1_OVERFLOW;
    3198           0 : p -= (&(data)->data)->u.asn1_ellipsis.length;
    3199           0 : ret += (&(data)->data)->u.asn1_ellipsis.length;
    3200           0 : memcpy(p + 1, (&(data)->data)->u.asn1_ellipsis.data, (&(data)->data)->u.asn1_ellipsis.length);
    3201           0 : break;
    3202             : }
    3203             : };
    3204           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
    3205           0 : if (e) return e;
    3206           0 : p -= l; len -= l; ret += l;
    3207             : 
    3208           0 : ret += Top_tag_oldret;
    3209             : }
    3210             : /* mandatory */
    3211             : {
    3212           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    3213           0 : ret = 0;
    3214           0 : e = der_put_boolean(p, len, &(data)->mandatory, &l);
    3215           0 : if (e) return e;
    3216           0 : p -= l; len -= l; ret += l;
    3217             : 
    3218           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Boolean, &l);
    3219           0 : if (e) return e;
    3220           0 : p -= l; len -= l; ret += l;
    3221             : 
    3222           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    3223           0 : if (e) return e;
    3224           0 : p -= l; len -= l; ret += l;
    3225             : 
    3226           0 : ret += Top_tag_oldret;
    3227             : }
    3228           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    3229           0 : if (e) return e;
    3230           0 : p -= l; len -= l; ret += l;
    3231             : 
    3232           0 : *size = ret;
    3233           0 : return 0;
    3234             : }
    3235             : 
    3236             : int ASN1CALL
    3237           0 : decode_HDB_extension(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_extension *data, size_t *size)
    3238             : {
    3239           0 : size_t ret = 0;
    3240             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    3241             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    3242             : 
    3243           0 : memset(data, 0, sizeof(*data));
    3244             : {
    3245             : size_t Top_datalen, Top_oldlen;
    3246             : Der_type Top_type;
    3247           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    3248           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    3249           0 : if(e) goto fail;
    3250           0 : p += l; len -= l; ret += l;
    3251           0 : Top_oldlen = len;
    3252           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3253           0 : len = Top_datalen;
    3254             : {
    3255             : size_t mandatory_datalen, mandatory_oldlen;
    3256             : Der_type mandatory_type;
    3257           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &mandatory_type, 0, &mandatory_datalen, &l);
    3258           0 : if (e == 0 && mandatory_type != CONS) { e = ASN1_BAD_ID; }
    3259           0 : if(e) goto fail;
    3260           0 : p += l; len -= l; ret += l;
    3261           0 : mandatory_oldlen = len;
    3262           0 : if (mandatory_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3263           0 : len = mandatory_datalen;
    3264             : {
    3265             : size_t mandatory_Tag_datalen, mandatory_Tag_oldlen;
    3266             : Der_type mandatory_Tag_type;
    3267           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &mandatory_Tag_type, UT_Boolean, &mandatory_Tag_datalen, &l);
    3268           0 : if (e == 0 && mandatory_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    3269           0 : if(e) goto fail;
    3270           0 : p += l; len -= l; ret += l;
    3271           0 : mandatory_Tag_oldlen = len;
    3272           0 : if (mandatory_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3273           0 : len = mandatory_Tag_datalen;
    3274           0 : e = der_get_boolean(p, len, &(data)->mandatory, &l);
    3275           0 : if(e) goto fail;
    3276           0 : p += l; len -= l; ret += l;
    3277           0 : len = mandatory_Tag_oldlen - mandatory_Tag_datalen;
    3278             : }
    3279           0 : len = mandatory_oldlen - mandatory_datalen;
    3280             : }
    3281             : {
    3282             : size_t data_datalen, data_oldlen;
    3283             : Der_type data_type;
    3284           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &data_type, 1, &data_datalen, &l);
    3285           0 : if (e == 0 && data_type != CONS) { e = ASN1_BAD_ID; }
    3286           0 : if(e) goto fail;
    3287           0 : p += l; len -= l; ret += l;
    3288           0 : data_oldlen = len;
    3289           0 : if (data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3290           0 : len = data_datalen;
    3291           0 : if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, NULL) == 0) {
    3292             : {
    3293             : size_t pkinit_acl_datalen, pkinit_acl_oldlen;
    3294             : Der_type pkinit_acl_type;
    3295           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pkinit_acl_type, 0, &pkinit_acl_datalen, &l);
    3296           0 : if (e == 0 && pkinit_acl_type != CONS) { e = ASN1_BAD_ID; }
    3297           0 : if(e) goto fail;
    3298           0 : p += l; len -= l; ret += l;
    3299           0 : pkinit_acl_oldlen = len;
    3300           0 : if (pkinit_acl_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3301           0 : len = pkinit_acl_datalen;
    3302           0 : e = decode_HDB_Ext_PKINIT_acl(p, len, &(&(data)->data)->u.pkinit_acl, &l);
    3303           0 : if(e) goto fail;
    3304           0 : p += l; len -= l; ret += l;
    3305           0 : len = pkinit_acl_oldlen - pkinit_acl_datalen;
    3306             : }
    3307           0 : (&(data)->data)->element = choice_HDB_extension_data_pkinit_acl;
    3308             : }
    3309           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, NULL) == 0) {
    3310             : {
    3311             : size_t pkinit_cert_hash_datalen, pkinit_cert_hash_oldlen;
    3312             : Der_type pkinit_cert_hash_type;
    3313           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pkinit_cert_hash_type, 1, &pkinit_cert_hash_datalen, &l);
    3314           0 : if (e == 0 && pkinit_cert_hash_type != CONS) { e = ASN1_BAD_ID; }
    3315           0 : if(e) goto fail;
    3316           0 : p += l; len -= l; ret += l;
    3317           0 : pkinit_cert_hash_oldlen = len;
    3318           0 : if (pkinit_cert_hash_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3319           0 : len = pkinit_cert_hash_datalen;
    3320           0 : e = decode_HDB_Ext_PKINIT_hash(p, len, &(&(data)->data)->u.pkinit_cert_hash, &l);
    3321           0 : if(e) goto fail;
    3322           0 : p += l; len -= l; ret += l;
    3323           0 : len = pkinit_cert_hash_oldlen - pkinit_cert_hash_datalen;
    3324             : }
    3325           0 : (&(data)->data)->element = choice_HDB_extension_data_pkinit_cert_hash;
    3326             : }
    3327           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, NULL) == 0) {
    3328             : {
    3329             : size_t allowed_to_delegate_to_datalen, allowed_to_delegate_to_oldlen;
    3330             : Der_type allowed_to_delegate_to_type;
    3331           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &allowed_to_delegate_to_type, 2, &allowed_to_delegate_to_datalen, &l);
    3332           0 : if (e == 0 && allowed_to_delegate_to_type != CONS) { e = ASN1_BAD_ID; }
    3333           0 : if(e) goto fail;
    3334           0 : p += l; len -= l; ret += l;
    3335           0 : allowed_to_delegate_to_oldlen = len;
    3336           0 : if (allowed_to_delegate_to_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3337           0 : len = allowed_to_delegate_to_datalen;
    3338           0 : e = decode_HDB_Ext_Constrained_delegation_acl(p, len, &(&(data)->data)->u.allowed_to_delegate_to, &l);
    3339           0 : if(e) goto fail;
    3340           0 : p += l; len -= l; ret += l;
    3341           0 : len = allowed_to_delegate_to_oldlen - allowed_to_delegate_to_datalen;
    3342             : }
    3343           0 : (&(data)->data)->element = choice_HDB_extension_data_allowed_to_delegate_to;
    3344             : }
    3345           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 4, NULL) == 0) {
    3346             : {
    3347             : size_t lm_owf_datalen, lm_owf_oldlen;
    3348             : Der_type lm_owf_type;
    3349           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &lm_owf_type, 4, &lm_owf_datalen, &l);
    3350           0 : if (e == 0 && lm_owf_type != CONS) { e = ASN1_BAD_ID; }
    3351           0 : if(e) goto fail;
    3352           0 : p += l; len -= l; ret += l;
    3353           0 : lm_owf_oldlen = len;
    3354           0 : if (lm_owf_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3355           0 : len = lm_owf_datalen;
    3356           0 : e = decode_HDB_Ext_Lan_Manager_OWF(p, len, &(&(data)->data)->u.lm_owf, &l);
    3357           0 : if(e) goto fail;
    3358           0 : p += l; len -= l; ret += l;
    3359           0 : len = lm_owf_oldlen - lm_owf_datalen;
    3360             : }
    3361           0 : (&(data)->data)->element = choice_HDB_extension_data_lm_owf;
    3362             : }
    3363           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 5, NULL) == 0) {
    3364             : {
    3365             : size_t password_datalen, password_oldlen;
    3366             : Der_type password_type;
    3367           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &password_type, 5, &password_datalen, &l);
    3368           0 : if (e == 0 && password_type != CONS) { e = ASN1_BAD_ID; }
    3369           0 : if(e) goto fail;
    3370           0 : p += l; len -= l; ret += l;
    3371           0 : password_oldlen = len;
    3372           0 : if (password_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3373           0 : len = password_datalen;
    3374           0 : e = decode_HDB_Ext_Password(p, len, &(&(data)->data)->u.password, &l);
    3375           0 : if(e) goto fail;
    3376           0 : p += l; len -= l; ret += l;
    3377           0 : len = password_oldlen - password_datalen;
    3378             : }
    3379           0 : (&(data)->data)->element = choice_HDB_extension_data_password;
    3380             : }
    3381           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 6, NULL) == 0) {
    3382             : {
    3383             : size_t aliases_datalen, aliases_oldlen;
    3384             : Der_type aliases_type;
    3385           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &aliases_type, 6, &aliases_datalen, &l);
    3386           0 : if (e == 0 && aliases_type != CONS) { e = ASN1_BAD_ID; }
    3387           0 : if(e) goto fail;
    3388           0 : p += l; len -= l; ret += l;
    3389           0 : aliases_oldlen = len;
    3390           0 : if (aliases_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3391           0 : len = aliases_datalen;
    3392           0 : e = decode_HDB_Ext_Aliases(p, len, &(&(data)->data)->u.aliases, &l);
    3393           0 : if(e) goto fail;
    3394           0 : p += l; len -= l; ret += l;
    3395           0 : len = aliases_oldlen - aliases_datalen;
    3396             : }
    3397           0 : (&(data)->data)->element = choice_HDB_extension_data_aliases;
    3398             : }
    3399           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 7, NULL) == 0) {
    3400             : {
    3401             : size_t last_pw_change_datalen, last_pw_change_oldlen;
    3402             : Der_type last_pw_change_type;
    3403           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &last_pw_change_type, 7, &last_pw_change_datalen, &l);
    3404           0 : if (e == 0 && last_pw_change_type != CONS) { e = ASN1_BAD_ID; }
    3405           0 : if(e) goto fail;
    3406           0 : p += l; len -= l; ret += l;
    3407           0 : last_pw_change_oldlen = len;
    3408           0 : if (last_pw_change_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3409           0 : len = last_pw_change_datalen;
    3410           0 : e = decode_KerberosTime(p, len, &(&(data)->data)->u.last_pw_change, &l);
    3411           0 : if(e) goto fail;
    3412           0 : p += l; len -= l; ret += l;
    3413           0 : len = last_pw_change_oldlen - last_pw_change_datalen;
    3414             : }
    3415           0 : (&(data)->data)->element = choice_HDB_extension_data_last_pw_change;
    3416             : }
    3417           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 8, NULL) == 0) {
    3418             : {
    3419             : size_t pkinit_cert_datalen, pkinit_cert_oldlen;
    3420             : Der_type pkinit_cert_type;
    3421           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pkinit_cert_type, 8, &pkinit_cert_datalen, &l);
    3422           0 : if (e == 0 && pkinit_cert_type != CONS) { e = ASN1_BAD_ID; }
    3423           0 : if(e) goto fail;
    3424           0 : p += l; len -= l; ret += l;
    3425           0 : pkinit_cert_oldlen = len;
    3426           0 : if (pkinit_cert_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3427           0 : len = pkinit_cert_datalen;
    3428           0 : e = decode_HDB_Ext_PKINIT_cert(p, len, &(&(data)->data)->u.pkinit_cert, &l);
    3429           0 : if(e) goto fail;
    3430           0 : p += l; len -= l; ret += l;
    3431           0 : len = pkinit_cert_oldlen - pkinit_cert_datalen;
    3432             : }
    3433           0 : (&(data)->data)->element = choice_HDB_extension_data_pkinit_cert;
    3434             : }
    3435           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 9, NULL) == 0) {
    3436             : {
    3437             : size_t hist_keys_datalen, hist_keys_oldlen;
    3438             : Der_type hist_keys_type;
    3439           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &hist_keys_type, 9, &hist_keys_datalen, &l);
    3440           0 : if (e == 0 && hist_keys_type != CONS) { e = ASN1_BAD_ID; }
    3441           0 : if(e) goto fail;
    3442           0 : p += l; len -= l; ret += l;
    3443           0 : hist_keys_oldlen = len;
    3444           0 : if (hist_keys_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3445           0 : len = hist_keys_datalen;
    3446           0 : e = decode_HDB_Ext_KeySet(p, len, &(&(data)->data)->u.hist_keys, &l);
    3447           0 : if(e) goto fail;
    3448           0 : p += l; len -= l; ret += l;
    3449           0 : len = hist_keys_oldlen - hist_keys_datalen;
    3450             : }
    3451           0 : (&(data)->data)->element = choice_HDB_extension_data_hist_keys;
    3452             : }
    3453           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 10, NULL) == 0) {
    3454             : {
    3455             : size_t hist_kvno_diff_clnt_datalen, hist_kvno_diff_clnt_oldlen;
    3456             : Der_type hist_kvno_diff_clnt_type;
    3457           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &hist_kvno_diff_clnt_type, 10, &hist_kvno_diff_clnt_datalen, &l);
    3458           0 : if (e == 0 && hist_kvno_diff_clnt_type != CONS) { e = ASN1_BAD_ID; }
    3459           0 : if(e) goto fail;
    3460           0 : p += l; len -= l; ret += l;
    3461           0 : hist_kvno_diff_clnt_oldlen = len;
    3462           0 : if (hist_kvno_diff_clnt_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3463           0 : len = hist_kvno_diff_clnt_datalen;
    3464             : {
    3465             : size_t hist_kvno_diff_clnt_Tag_datalen, hist_kvno_diff_clnt_Tag_oldlen;
    3466             : Der_type hist_kvno_diff_clnt_Tag_type;
    3467           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &hist_kvno_diff_clnt_Tag_type, UT_Integer, &hist_kvno_diff_clnt_Tag_datalen, &l);
    3468           0 : if (e == 0 && hist_kvno_diff_clnt_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    3469           0 : if(e) goto fail;
    3470           0 : p += l; len -= l; ret += l;
    3471           0 : hist_kvno_diff_clnt_Tag_oldlen = len;
    3472           0 : if (hist_kvno_diff_clnt_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3473           0 : len = hist_kvno_diff_clnt_Tag_datalen;
    3474           0 : e = der_get_unsigned(p, len, &(&(data)->data)->u.hist_kvno_diff_clnt, &l);
    3475           0 : if(e) goto fail;
    3476           0 : p += l; len -= l; ret += l;
    3477           0 : len = hist_kvno_diff_clnt_Tag_oldlen - hist_kvno_diff_clnt_Tag_datalen;
    3478             : }
    3479           0 : len = hist_kvno_diff_clnt_oldlen - hist_kvno_diff_clnt_datalen;
    3480             : }
    3481           0 : (&(data)->data)->element = choice_HDB_extension_data_hist_kvno_diff_clnt;
    3482             : }
    3483           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 11, NULL) == 0) {
    3484             : {
    3485             : size_t hist_kvno_diff_svc_datalen, hist_kvno_diff_svc_oldlen;
    3486             : Der_type hist_kvno_diff_svc_type;
    3487           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &hist_kvno_diff_svc_type, 11, &hist_kvno_diff_svc_datalen, &l);
    3488           0 : if (e == 0 && hist_kvno_diff_svc_type != CONS) { e = ASN1_BAD_ID; }
    3489           0 : if(e) goto fail;
    3490           0 : p += l; len -= l; ret += l;
    3491           0 : hist_kvno_diff_svc_oldlen = len;
    3492           0 : if (hist_kvno_diff_svc_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3493           0 : len = hist_kvno_diff_svc_datalen;
    3494             : {
    3495             : size_t hist_kvno_diff_svc_Tag_datalen, hist_kvno_diff_svc_Tag_oldlen;
    3496             : Der_type hist_kvno_diff_svc_Tag_type;
    3497           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &hist_kvno_diff_svc_Tag_type, UT_Integer, &hist_kvno_diff_svc_Tag_datalen, &l);
    3498           0 : if (e == 0 && hist_kvno_diff_svc_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    3499           0 : if(e) goto fail;
    3500           0 : p += l; len -= l; ret += l;
    3501           0 : hist_kvno_diff_svc_Tag_oldlen = len;
    3502           0 : if (hist_kvno_diff_svc_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3503           0 : len = hist_kvno_diff_svc_Tag_datalen;
    3504           0 : e = der_get_unsigned(p, len, &(&(data)->data)->u.hist_kvno_diff_svc, &l);
    3505           0 : if(e) goto fail;
    3506           0 : p += l; len -= l; ret += l;
    3507           0 : len = hist_kvno_diff_svc_Tag_oldlen - hist_kvno_diff_svc_Tag_datalen;
    3508             : }
    3509           0 : len = hist_kvno_diff_svc_oldlen - hist_kvno_diff_svc_datalen;
    3510             : }
    3511           0 : (&(data)->data)->element = choice_HDB_extension_data_hist_kvno_diff_svc;
    3512             : }
    3513           0 : else if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 12, NULL) == 0) {
    3514             : {
    3515             : size_t policy_datalen, policy_oldlen;
    3516             : Der_type policy_type;
    3517           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &policy_type, 12, &policy_datalen, &l);
    3518           0 : if (e == 0 && policy_type != CONS) { e = ASN1_BAD_ID; }
    3519           0 : if(e) goto fail;
    3520           0 : p += l; len -= l; ret += l;
    3521           0 : policy_oldlen = len;
    3522           0 : if (policy_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3523           0 : len = policy_datalen;
    3524             : {
    3525             : size_t policy_Tag_datalen, policy_Tag_oldlen;
    3526             : Der_type policy_Tag_type;
    3527           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &policy_Tag_type, UT_UTF8String, &policy_Tag_datalen, &l);
    3528           0 : if (e == 0 && policy_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    3529           0 : if(e) goto fail;
    3530           0 : p += l; len -= l; ret += l;
    3531           0 : policy_Tag_oldlen = len;
    3532           0 : if (policy_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3533           0 : len = policy_Tag_datalen;
    3534           0 : e = der_get_utf8string(p, len, &(&(data)->data)->u.policy, &l);
    3535           0 : if(e) goto fail;
    3536           0 : p += l; len -= l; ret += l;
    3537           0 : len = policy_Tag_oldlen - policy_Tag_datalen;
    3538             : }
    3539           0 : len = policy_oldlen - policy_datalen;
    3540             : }
    3541           0 : (&(data)->data)->element = choice_HDB_extension_data_policy;
    3542             : }
    3543             : else {
    3544           0 : (&(data)->data)->u.asn1_ellipsis.data = calloc(1, len);
    3545           0 : if ((&(data)->data)->u.asn1_ellipsis.data == NULL) {
    3546           0 : e = ENOMEM; goto fail;
    3547             : }
    3548           0 : (&(data)->data)->u.asn1_ellipsis.length = len;
    3549           0 : memcpy((&(data)->data)->u.asn1_ellipsis.data, p, len);
    3550           0 : (&(data)->data)->element = choice_HDB_extension_data_asn1_ellipsis;
    3551           0 : p += len;
    3552           0 : ret += len;
    3553           0 : len = 0;
    3554             : }
    3555           0 : len = data_oldlen - data_datalen;
    3556             : }
    3557           0 : len = Top_oldlen - Top_datalen;
    3558             : }
    3559           0 : if(size) *size = ret;
    3560           0 : return 0;
    3561           0 : fail:
    3562           0 : free_HDB_extension(data);
    3563           0 : return e;
    3564             : }
    3565             : 
    3566             : void ASN1CALL
    3567           0 : free_HDB_extension(HDB_extension *data)
    3568             : {
    3569           0 : switch((&(data)->data)->element) {
    3570           0 : case choice_HDB_extension_data_pkinit_acl:
    3571           0 : free_HDB_Ext_PKINIT_acl(&(&(data)->data)->u.pkinit_acl);
    3572           0 : break;
    3573           0 : case choice_HDB_extension_data_pkinit_cert_hash:
    3574           0 : free_HDB_Ext_PKINIT_hash(&(&(data)->data)->u.pkinit_cert_hash);
    3575           0 : break;
    3576           0 : case choice_HDB_extension_data_allowed_to_delegate_to:
    3577           0 : free_HDB_Ext_Constrained_delegation_acl(&(&(data)->data)->u.allowed_to_delegate_to);
    3578           0 : break;
    3579           0 : case choice_HDB_extension_data_lm_owf:
    3580           0 : free_HDB_Ext_Lan_Manager_OWF(&(&(data)->data)->u.lm_owf);
    3581           0 : break;
    3582           0 : case choice_HDB_extension_data_password:
    3583           0 : free_HDB_Ext_Password(&(&(data)->data)->u.password);
    3584           0 : break;
    3585           0 : case choice_HDB_extension_data_aliases:
    3586           0 : free_HDB_Ext_Aliases(&(&(data)->data)->u.aliases);
    3587           0 : break;
    3588           0 : case choice_HDB_extension_data_last_pw_change:
    3589           0 : free_KerberosTime(&(&(data)->data)->u.last_pw_change);
    3590           0 : break;
    3591           0 : case choice_HDB_extension_data_pkinit_cert:
    3592           0 : free_HDB_Ext_PKINIT_cert(&(&(data)->data)->u.pkinit_cert);
    3593           0 : break;
    3594           0 : case choice_HDB_extension_data_hist_keys:
    3595           0 : free_HDB_Ext_KeySet(&(&(data)->data)->u.hist_keys);
    3596           0 : break;
    3597           0 : case choice_HDB_extension_data_hist_kvno_diff_clnt:
    3598           0 : break;
    3599           0 : case choice_HDB_extension_data_hist_kvno_diff_svc:
    3600           0 : break;
    3601           0 : case choice_HDB_extension_data_policy:
    3602           0 : der_free_utf8string(&(&(data)->data)->u.policy);
    3603           0 : break;
    3604           0 : case choice_HDB_extension_data_asn1_ellipsis:
    3605           0 : der_free_octet_string(&(&(data)->data)->u.asn1_ellipsis);
    3606           0 : break;}
    3607           0 : }
    3608             : 
    3609             : size_t ASN1CALL
    3610           0 : length_HDB_extension(const HDB_extension *data)
    3611             : {
    3612           0 : size_t ret = 0;
    3613             : {
    3614           0 : size_t Top_tag_oldret = ret;
    3615           0 : ret = 0;
    3616           0 : ret += 1;
    3617           0 : ret += 1 + der_length_len (ret);
    3618           0 : ret += 1 + der_length_len (ret);
    3619           0 : ret += Top_tag_oldret;
    3620             : }
    3621             : {
    3622           0 : size_t Top_tag_oldret = ret;
    3623           0 : ret = 0;
    3624           0 : switch((&(data)->data)->element) {
    3625           0 : case choice_HDB_extension_data_pkinit_acl:
    3626             : {
    3627           0 : size_t data_tag_oldret = ret;
    3628           0 : ret = 0;
    3629           0 : ret += length_HDB_Ext_PKINIT_acl(&(&(data)->data)->u.pkinit_acl);
    3630           0 : ret += 1 + der_length_len (ret);
    3631           0 : ret += data_tag_oldret;
    3632             : }
    3633           0 : break;
    3634           0 : case choice_HDB_extension_data_pkinit_cert_hash:
    3635             : {
    3636           0 : size_t data_tag_oldret = ret;
    3637           0 : ret = 0;
    3638           0 : ret += length_HDB_Ext_PKINIT_hash(&(&(data)->data)->u.pkinit_cert_hash);
    3639           0 : ret += 1 + der_length_len (ret);
    3640           0 : ret += data_tag_oldret;
    3641             : }
    3642           0 : break;
    3643           0 : case choice_HDB_extension_data_allowed_to_delegate_to:
    3644             : {
    3645           0 : size_t data_tag_oldret = ret;
    3646           0 : ret = 0;
    3647           0 : ret += length_HDB_Ext_Constrained_delegation_acl(&(&(data)->data)->u.allowed_to_delegate_to);
    3648           0 : ret += 1 + der_length_len (ret);
    3649           0 : ret += data_tag_oldret;
    3650             : }
    3651           0 : break;
    3652           0 : case choice_HDB_extension_data_lm_owf:
    3653             : {
    3654           0 : size_t data_tag_oldret = ret;
    3655           0 : ret = 0;
    3656           0 : ret += length_HDB_Ext_Lan_Manager_OWF(&(&(data)->data)->u.lm_owf);
    3657           0 : ret += 1 + der_length_len (ret);
    3658           0 : ret += data_tag_oldret;
    3659             : }
    3660           0 : break;
    3661           0 : case choice_HDB_extension_data_password:
    3662             : {
    3663           0 : size_t data_tag_oldret = ret;
    3664           0 : ret = 0;
    3665           0 : ret += length_HDB_Ext_Password(&(&(data)->data)->u.password);
    3666           0 : ret += 1 + der_length_len (ret);
    3667           0 : ret += data_tag_oldret;
    3668             : }
    3669           0 : break;
    3670           0 : case choice_HDB_extension_data_aliases:
    3671             : {
    3672           0 : size_t data_tag_oldret = ret;
    3673           0 : ret = 0;
    3674           0 : ret += length_HDB_Ext_Aliases(&(&(data)->data)->u.aliases);
    3675           0 : ret += 1 + der_length_len (ret);
    3676           0 : ret += data_tag_oldret;
    3677             : }
    3678           0 : break;
    3679           0 : case choice_HDB_extension_data_last_pw_change:
    3680             : {
    3681           0 : size_t data_tag_oldret = ret;
    3682           0 : ret = 0;
    3683           0 : ret += length_KerberosTime(&(&(data)->data)->u.last_pw_change);
    3684           0 : ret += 1 + der_length_len (ret);
    3685           0 : ret += data_tag_oldret;
    3686             : }
    3687           0 : break;
    3688           0 : case choice_HDB_extension_data_pkinit_cert:
    3689             : {
    3690           0 : size_t data_tag_oldret = ret;
    3691           0 : ret = 0;
    3692           0 : ret += length_HDB_Ext_PKINIT_cert(&(&(data)->data)->u.pkinit_cert);
    3693           0 : ret += 1 + der_length_len (ret);
    3694           0 : ret += data_tag_oldret;
    3695             : }
    3696           0 : break;
    3697           0 : case choice_HDB_extension_data_hist_keys:
    3698             : {
    3699           0 : size_t data_tag_oldret = ret;
    3700           0 : ret = 0;
    3701           0 : ret += length_HDB_Ext_KeySet(&(&(data)->data)->u.hist_keys);
    3702           0 : ret += 1 + der_length_len (ret);
    3703           0 : ret += data_tag_oldret;
    3704             : }
    3705           0 : break;
    3706           0 : case choice_HDB_extension_data_hist_kvno_diff_clnt:
    3707             : {
    3708           0 : size_t data_tag_oldret = ret;
    3709           0 : ret = 0;
    3710           0 : ret += der_length_unsigned(&(&(data)->data)->u.hist_kvno_diff_clnt);
    3711           0 : ret += 1 + der_length_len (ret);
    3712           0 : ret += 1 + der_length_len (ret);
    3713           0 : ret += data_tag_oldret;
    3714             : }
    3715           0 : break;
    3716           0 : case choice_HDB_extension_data_hist_kvno_diff_svc:
    3717             : {
    3718           0 : size_t data_tag_oldret = ret;
    3719           0 : ret = 0;
    3720           0 : ret += der_length_unsigned(&(&(data)->data)->u.hist_kvno_diff_svc);
    3721           0 : ret += 1 + der_length_len (ret);
    3722           0 : ret += 1 + der_length_len (ret);
    3723           0 : ret += data_tag_oldret;
    3724             : }
    3725           0 : break;
    3726           0 : case choice_HDB_extension_data_policy:
    3727             : {
    3728           0 : size_t data_tag_oldret = ret;
    3729           0 : ret = 0;
    3730           0 : ret += der_length_utf8string(&(&(data)->data)->u.policy);
    3731           0 : ret += 1 + der_length_len (ret);
    3732           0 : ret += 1 + der_length_len (ret);
    3733           0 : ret += data_tag_oldret;
    3734             : }
    3735           0 : break;
    3736           0 : case choice_HDB_extension_data_asn1_ellipsis:
    3737           0 : ret += (&(data)->data)->u.asn1_ellipsis.length;
    3738           0 : break;
    3739             : }
    3740           0 : ret += 1 + der_length_len (ret);
    3741           0 : ret += Top_tag_oldret;
    3742             : }
    3743           0 : ret += 1 + der_length_len (ret);
    3744           0 : return ret;
    3745             : }
    3746             : 
    3747             : int ASN1CALL
    3748           0 : copy_HDB_extension(const HDB_extension *from, HDB_extension *to)
    3749             : {
    3750           0 : memset(to, 0, sizeof(*to));
    3751           0 : *(&(to)->mandatory) = *(&(from)->mandatory);
    3752           0 : (&(to)->data)->element = (&(from)->data)->element;
    3753           0 : switch((&(from)->data)->element) {
    3754           0 : case choice_HDB_extension_data_pkinit_acl:
    3755           0 : if(copy_HDB_Ext_PKINIT_acl(&(&(from)->data)->u.pkinit_acl, &(&(to)->data)->u.pkinit_acl)) goto fail;
    3756           0 : break;
    3757           0 : case choice_HDB_extension_data_pkinit_cert_hash:
    3758           0 : if(copy_HDB_Ext_PKINIT_hash(&(&(from)->data)->u.pkinit_cert_hash, &(&(to)->data)->u.pkinit_cert_hash)) goto fail;
    3759           0 : break;
    3760           0 : case choice_HDB_extension_data_allowed_to_delegate_to:
    3761           0 : if(copy_HDB_Ext_Constrained_delegation_acl(&(&(from)->data)->u.allowed_to_delegate_to, &(&(to)->data)->u.allowed_to_delegate_to)) goto fail;
    3762           0 : break;
    3763           0 : case choice_HDB_extension_data_lm_owf:
    3764           0 : if(copy_HDB_Ext_Lan_Manager_OWF(&(&(from)->data)->u.lm_owf, &(&(to)->data)->u.lm_owf)) goto fail;
    3765           0 : break;
    3766           0 : case choice_HDB_extension_data_password:
    3767           0 : if(copy_HDB_Ext_Password(&(&(from)->data)->u.password, &(&(to)->data)->u.password)) goto fail;
    3768           0 : break;
    3769           0 : case choice_HDB_extension_data_aliases:
    3770           0 : if(copy_HDB_Ext_Aliases(&(&(from)->data)->u.aliases, &(&(to)->data)->u.aliases)) goto fail;
    3771           0 : break;
    3772           0 : case choice_HDB_extension_data_last_pw_change:
    3773           0 : if(copy_KerberosTime(&(&(from)->data)->u.last_pw_change, &(&(to)->data)->u.last_pw_change)) goto fail;
    3774           0 : break;
    3775           0 : case choice_HDB_extension_data_pkinit_cert:
    3776           0 : if(copy_HDB_Ext_PKINIT_cert(&(&(from)->data)->u.pkinit_cert, &(&(to)->data)->u.pkinit_cert)) goto fail;
    3777           0 : break;
    3778           0 : case choice_HDB_extension_data_hist_keys:
    3779           0 : if(copy_HDB_Ext_KeySet(&(&(from)->data)->u.hist_keys, &(&(to)->data)->u.hist_keys)) goto fail;
    3780           0 : break;
    3781           0 : case choice_HDB_extension_data_hist_kvno_diff_clnt:
    3782           0 : *(&(&(to)->data)->u.hist_kvno_diff_clnt) = *(&(&(from)->data)->u.hist_kvno_diff_clnt);
    3783           0 : break;
    3784           0 : case choice_HDB_extension_data_hist_kvno_diff_svc:
    3785           0 : *(&(&(to)->data)->u.hist_kvno_diff_svc) = *(&(&(from)->data)->u.hist_kvno_diff_svc);
    3786           0 : break;
    3787           0 : case choice_HDB_extension_data_policy:
    3788           0 : if(der_copy_utf8string(&(&(from)->data)->u.policy, &(&(to)->data)->u.policy)) goto fail;
    3789           0 : break;
    3790           0 : case choice_HDB_extension_data_asn1_ellipsis: {
    3791             : int ret;
    3792           0 : ret=der_copy_octet_string(&(&(from)->data)->u.asn1_ellipsis, &(&(to)->data)->u.asn1_ellipsis);
    3793           0 : if (ret) goto fail;
    3794           0 : break;
    3795             : }
    3796             : }
    3797           0 : return 0;
    3798           0 : fail:
    3799           0 : free_HDB_extension(to);
    3800           0 : return ENOMEM;
    3801             : }
    3802             : 
    3803             : int ASN1CALL
    3804           0 : encode_HDB_extensions(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HDB_extensions *data, size_t *size)
    3805             : {
    3806           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    3807             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    3808             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    3809             : 
    3810           0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
    3811           0 : size_t Top_tag_for_oldret = ret;
    3812           0 : ret = 0;
    3813           0 : e = encode_HDB_extension(p, len, &(data)->val[i], &l);
    3814           0 : if (e) return e;
    3815           0 : p -= l; len -= l; ret += l;
    3816             : 
    3817           0 : ret += Top_tag_for_oldret;
    3818             : }
    3819           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    3820           0 : if (e) return e;
    3821           0 : p -= l; len -= l; ret += l;
    3822             : 
    3823           0 : *size = ret;
    3824           0 : return 0;
    3825             : }
    3826             : 
    3827             : int ASN1CALL
    3828           0 : decode_HDB_extensions(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HDB_extensions *data, size_t *size)
    3829             : {
    3830           0 : size_t ret = 0;
    3831             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    3832             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    3833             : 
    3834           0 : memset(data, 0, sizeof(*data));
    3835             : {
    3836             : size_t Top_datalen, Top_oldlen;
    3837             : Der_type Top_type;
    3838           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    3839           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    3840           0 : if(e) goto fail;
    3841           0 : p += l; len -= l; ret += l;
    3842           0 : Top_oldlen = len;
    3843           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    3844           0 : len = Top_datalen;
    3845             : {
    3846           0 : size_t Top_Tag_origlen = len;
    3847           0 : size_t Top_Tag_oldret = ret;
    3848           0 : size_t Top_Tag_olen = 0;
    3849             : void *Top_Tag_tmp;
    3850           0 : ret = 0;
    3851           0 : (data)->len = 0;
    3852           0 : (data)->val = NULL;
    3853           0 : while(ret < Top_Tag_origlen) {
    3854           0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
    3855           0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    3856           0 : Top_Tag_olen = Top_Tag_nlen;
    3857           0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
    3858           0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    3859           0 : (data)->val = Top_Tag_tmp;
    3860           0 : e = decode_HDB_extension(p, len, &(data)->val[(data)->len], &l);
    3861           0 : if(e) goto fail;
    3862           0 : p += l; len -= l; ret += l;
    3863           0 : (data)->len++;
    3864           0 : len = Top_Tag_origlen - ret;
    3865             : }
    3866           0 : ret += Top_Tag_oldret;
    3867             : }
    3868           0 : len = Top_oldlen - Top_datalen;
    3869             : }
    3870           0 : if(size) *size = ret;
    3871           0 : return 0;
    3872           0 : fail:
    3873           0 : free_HDB_extensions(data);
    3874           0 : return e;
    3875             : }
    3876             : 
    3877             : void ASN1CALL
    3878           0 : free_HDB_extensions(HDB_extensions *data)
    3879             : {
    3880           0 : while((data)->len){
    3881           0 : free_HDB_extension(&(data)->val[(data)->len-1]);
    3882           0 : (data)->len--;
    3883             : }
    3884           0 : free((data)->val);
    3885           0 : (data)->val = NULL;
    3886           0 : }
    3887             : 
    3888             : size_t ASN1CALL
    3889           0 : length_HDB_extensions(const HDB_extensions *data)
    3890             : {
    3891           0 : size_t ret = 0;
    3892             : {
    3893           0 : size_t Top_tag_oldret = ret;
    3894             : int i;
    3895           0 : ret = 0;
    3896           0 : for(i = (data)->len - 1; i >= 0; --i){
    3897           0 : size_t Top_tag_for_oldret = ret;
    3898           0 : ret = 0;
    3899           0 : ret += length_HDB_extension(&(data)->val[i]);
    3900           0 : ret += Top_tag_for_oldret;
    3901             : }
    3902           0 : ret += Top_tag_oldret;
    3903             : }
    3904           0 : ret += 1 + der_length_len (ret);
    3905           0 : return ret;
    3906             : }
    3907             : 
    3908             : int ASN1CALL
    3909           0 : copy_HDB_extensions(const HDB_extensions *from, HDB_extensions *to)
    3910             : {
    3911           0 : memset(to, 0, sizeof(*to));
    3912           0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
    3913           0 : goto fail;
    3914           0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
    3915           0 : if(copy_HDB_extension(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
    3916             : }
    3917           0 : return 0;
    3918           0 : fail:
    3919           0 : free_HDB_extensions(to);
    3920           0 : return ENOMEM;
    3921             : }
    3922             : 
    3923             : int ASN1CALL
    3924           0 : encode_hdb_entry(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const hdb_entry *data, size_t *size)
    3925             : {
    3926           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    3927             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    3928             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    3929             : 
    3930             : /* extensions */
    3931           0 : if((data)->extensions) {
    3932           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    3933           0 : ret = 0;
    3934           0 : e = encode_HDB_extensions(p, len, (data)->extensions, &l);
    3935           0 : if (e) return e;
    3936           0 : p -= l; len -= l; ret += l;
    3937             : 
    3938           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 13, &l);
    3939           0 : if (e) return e;
    3940           0 : p -= l; len -= l; ret += l;
    3941             : 
    3942           0 : ret += Top_tag_oldret;
    3943             : }
    3944             : /* generation */
    3945           0 : if((data)->generation) {
    3946           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    3947           0 : ret = 0;
    3948           0 : e = encode_GENERATION(p, len, (data)->generation, &l);
    3949           0 : if (e) return e;
    3950           0 : p -= l; len -= l; ret += l;
    3951             : 
    3952           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 12, &l);
    3953           0 : if (e) return e;
    3954           0 : p -= l; len -= l; ret += l;
    3955             : 
    3956           0 : ret += Top_tag_oldret;
    3957             : }
    3958             : /* etypes */
    3959           0 : if((data)->etypes) {
    3960           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    3961           0 : ret = 0;
    3962           0 : for(i = (int)((data)->etypes)->len - 1; i >= 0; --i) {
    3963           0 : size_t etypes_tag_tag_for_oldret = ret;
    3964           0 : ret = 0;
    3965           0 : e = der_put_unsigned(p, len, &((data)->etypes)->val[i], &l);
    3966           0 : if (e) return e;
    3967           0 : p -= l; len -= l; ret += l;
    3968             : 
    3969           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
    3970           0 : if (e) return e;
    3971           0 : p -= l; len -= l; ret += l;
    3972             : 
    3973           0 : ret += etypes_tag_tag_for_oldret;
    3974             : }
    3975           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    3976           0 : if (e) return e;
    3977           0 : p -= l; len -= l; ret += l;
    3978             : 
    3979           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 11, &l);
    3980           0 : if (e) return e;
    3981           0 : p -= l; len -= l; ret += l;
    3982             : 
    3983           0 : ret += Top_tag_oldret;
    3984             : }
    3985             : /* flags */
    3986             : {
    3987           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    3988           0 : ret = 0;
    3989           0 : e = encode_HDBFlags(p, len, &(data)->flags, &l);
    3990           0 : if (e) return e;
    3991           0 : p -= l; len -= l; ret += l;
    3992             : 
    3993           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
    3994           0 : if (e) return e;
    3995           0 : p -= l; len -= l; ret += l;
    3996             : 
    3997           0 : ret += Top_tag_oldret;
    3998             : }
    3999             : /* max-renew */
    4000           0 : if((data)->max_renew) {
    4001           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4002           0 : ret = 0;
    4003           0 : e = der_put_unsigned(p, len, (data)->max_renew, &l);
    4004           0 : if (e) return e;
    4005           0 : p -= l; len -= l; ret += l;
    4006             : 
    4007           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
    4008           0 : if (e) return e;
    4009           0 : p -= l; len -= l; ret += l;
    4010             : 
    4011           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
    4012           0 : if (e) return e;
    4013           0 : p -= l; len -= l; ret += l;
    4014             : 
    4015           0 : ret += Top_tag_oldret;
    4016             : }
    4017             : /* max-life */
    4018           0 : if((data)->max_life) {
    4019           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4020           0 : ret = 0;
    4021           0 : e = der_put_unsigned(p, len, (data)->max_life, &l);
    4022           0 : if (e) return e;
    4023           0 : p -= l; len -= l; ret += l;
    4024             : 
    4025           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
    4026           0 : if (e) return e;
    4027           0 : p -= l; len -= l; ret += l;
    4028             : 
    4029           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
    4030           0 : if (e) return e;
    4031           0 : p -= l; len -= l; ret += l;
    4032             : 
    4033           0 : ret += Top_tag_oldret;
    4034             : }
    4035             : /* pw-end */
    4036           0 : if((data)->pw_end) {
    4037           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4038           0 : ret = 0;
    4039           0 : e = encode_KerberosTime(p, len, (data)->pw_end, &l);
    4040           0 : if (e) return e;
    4041           0 : p -= l; len -= l; ret += l;
    4042             : 
    4043           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
    4044           0 : if (e) return e;
    4045           0 : p -= l; len -= l; ret += l;
    4046             : 
    4047           0 : ret += Top_tag_oldret;
    4048             : }
    4049             : /* valid-end */
    4050           0 : if((data)->valid_end) {
    4051           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4052           0 : ret = 0;
    4053           0 : e = encode_KerberosTime(p, len, (data)->valid_end, &l);
    4054           0 : if (e) return e;
    4055           0 : p -= l; len -= l; ret += l;
    4056             : 
    4057           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
    4058           0 : if (e) return e;
    4059           0 : p -= l; len -= l; ret += l;
    4060             : 
    4061           0 : ret += Top_tag_oldret;
    4062             : }
    4063             : /* valid-start */
    4064           0 : if((data)->valid_start) {
    4065           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4066           0 : ret = 0;
    4067           0 : e = encode_KerberosTime(p, len, (data)->valid_start, &l);
    4068           0 : if (e) return e;
    4069           0 : p -= l; len -= l; ret += l;
    4070             : 
    4071           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
    4072           0 : if (e) return e;
    4073           0 : p -= l; len -= l; ret += l;
    4074             : 
    4075           0 : ret += Top_tag_oldret;
    4076             : }
    4077             : /* modified-by */
    4078           0 : if((data)->modified_by) {
    4079           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4080           0 : ret = 0;
    4081           0 : e = encode_Event(p, len, (data)->modified_by, &l);
    4082           0 : if (e) return e;
    4083           0 : p -= l; len -= l; ret += l;
    4084             : 
    4085           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
    4086           0 : if (e) return e;
    4087           0 : p -= l; len -= l; ret += l;
    4088             : 
    4089           0 : ret += Top_tag_oldret;
    4090             : }
    4091             : /* created-by */
    4092             : {
    4093           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4094           0 : ret = 0;
    4095           0 : e = encode_Event(p, len, &(data)->created_by, &l);
    4096           0 : if (e) return e;
    4097           0 : p -= l; len -= l; ret += l;
    4098             : 
    4099           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
    4100           0 : if (e) return e;
    4101           0 : p -= l; len -= l; ret += l;
    4102             : 
    4103           0 : ret += Top_tag_oldret;
    4104             : }
    4105             : /* keys */
    4106             : {
    4107           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4108           0 : ret = 0;
    4109           0 : e = encode_Keys(p, len, &(data)->keys, &l);
    4110           0 : if (e) return e;
    4111           0 : p -= l; len -= l; ret += l;
    4112             : 
    4113           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
    4114           0 : if (e) return e;
    4115           0 : p -= l; len -= l; ret += l;
    4116             : 
    4117           0 : ret += Top_tag_oldret;
    4118             : }
    4119             : /* kvno */
    4120             : {
    4121           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4122           0 : ret = 0;
    4123           0 : e = der_put_unsigned(p, len, &(data)->kvno, &l);
    4124           0 : if (e) return e;
    4125           0 : p -= l; len -= l; ret += l;
    4126             : 
    4127           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
    4128           0 : if (e) return e;
    4129           0 : p -= l; len -= l; ret += l;
    4130             : 
    4131           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
    4132           0 : if (e) return e;
    4133           0 : p -= l; len -= l; ret += l;
    4134             : 
    4135           0 : ret += Top_tag_oldret;
    4136             : }
    4137             : /* principal */
    4138           0 : if((data)->principal) {
    4139           0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4140           0 : ret = 0;
    4141           0 : e = encode_Principal(p, len, (data)->principal, &l);
    4142           0 : if (e) return e;
    4143           0 : p -= l; len -= l; ret += l;
    4144             : 
    4145           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    4146           0 : if (e) return e;
    4147           0 : p -= l; len -= l; ret += l;
    4148             : 
    4149           0 : ret += Top_tag_oldret;
    4150             : }
    4151           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    4152           0 : if (e) return e;
    4153           0 : p -= l; len -= l; ret += l;
    4154             : 
    4155           0 : *size = ret;
    4156           0 : return 0;
    4157             : }
    4158             : 
    4159             : int ASN1CALL
    4160           0 : decode_hdb_entry(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, hdb_entry *data, size_t *size)
    4161             : {
    4162           0 : size_t ret = 0;
    4163             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    4164             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    4165             : 
    4166           0 : memset(data, 0, sizeof(*data));
    4167             : {
    4168             : size_t Top_datalen, Top_oldlen;
    4169             : Der_type Top_type;
    4170           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
    4171           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    4172           0 : if(e) goto fail;
    4173           0 : p += l; len -= l; ret += l;
    4174           0 : Top_oldlen = len;
    4175           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4176           0 : len = Top_datalen;
    4177             : {
    4178             : size_t principal_datalen, principal_oldlen;
    4179             : Der_type principal_type;
    4180           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &principal_type, 0, &principal_datalen, &l);
    4181           0 : if (e == 0 && principal_type != CONS) { e = ASN1_BAD_ID; }
    4182           0 : if(e) {
    4183           0 : (data)->principal = NULL;
    4184             : } else {
    4185           0 : (data)->principal = calloc(1, sizeof(*(data)->principal));
    4186           0 : if ((data)->principal == NULL) { e = ENOMEM; goto fail; }
    4187           0 : p += l; len -= l; ret += l;
    4188           0 : principal_oldlen = len;
    4189           0 : if (principal_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4190           0 : len = principal_datalen;
    4191           0 : e = decode_Principal(p, len, (data)->principal, &l);
    4192           0 : if(e) goto fail;
    4193           0 : p += l; len -= l; ret += l;
    4194           0 : len = principal_oldlen - principal_datalen;
    4195             : }
    4196             : }
    4197             : {
    4198             : size_t kvno_datalen, kvno_oldlen;
    4199             : Der_type kvno_type;
    4200           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &kvno_type, 1, &kvno_datalen, &l);
    4201           0 : if (e == 0 && kvno_type != CONS) { e = ASN1_BAD_ID; }
    4202           0 : if(e) goto fail;
    4203           0 : p += l; len -= l; ret += l;
    4204           0 : kvno_oldlen = len;
    4205           0 : if (kvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4206           0 : len = kvno_datalen;
    4207             : {
    4208             : size_t kvno_Tag_datalen, kvno_Tag_oldlen;
    4209             : Der_type kvno_Tag_type;
    4210           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &kvno_Tag_type, UT_Integer, &kvno_Tag_datalen, &l);
    4211           0 : if (e == 0 && kvno_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    4212           0 : if(e) goto fail;
    4213           0 : p += l; len -= l; ret += l;
    4214           0 : kvno_Tag_oldlen = len;
    4215           0 : if (kvno_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4216           0 : len = kvno_Tag_datalen;
    4217           0 : e = der_get_unsigned(p, len, &(data)->kvno, &l);
    4218           0 : if(e) goto fail;
    4219           0 : p += l; len -= l; ret += l;
    4220           0 : len = kvno_Tag_oldlen - kvno_Tag_datalen;
    4221             : }
    4222           0 : len = kvno_oldlen - kvno_datalen;
    4223             : }
    4224             : {
    4225             : size_t keys_datalen, keys_oldlen;
    4226             : Der_type keys_type;
    4227           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &keys_type, 2, &keys_datalen, &l);
    4228           0 : if (e == 0 && keys_type != CONS) { e = ASN1_BAD_ID; }
    4229           0 : if(e) goto fail;
    4230           0 : p += l; len -= l; ret += l;
    4231           0 : keys_oldlen = len;
    4232           0 : if (keys_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4233           0 : len = keys_datalen;
    4234           0 : e = decode_Keys(p, len, &(data)->keys, &l);
    4235           0 : if(e) goto fail;
    4236           0 : p += l; len -= l; ret += l;
    4237           0 : len = keys_oldlen - keys_datalen;
    4238             : }
    4239             : {
    4240             : size_t created_by_datalen, created_by_oldlen;
    4241             : Der_type created_by_type;
    4242           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &created_by_type, 3, &created_by_datalen, &l);
    4243           0 : if (e == 0 && created_by_type != CONS) { e = ASN1_BAD_ID; }
    4244           0 : if(e) goto fail;
    4245           0 : p += l; len -= l; ret += l;
    4246           0 : created_by_oldlen = len;
    4247           0 : if (created_by_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4248           0 : len = created_by_datalen;
    4249           0 : e = decode_Event(p, len, &(data)->created_by, &l);
    4250           0 : if(e) goto fail;
    4251           0 : p += l; len -= l; ret += l;
    4252           0 : len = created_by_oldlen - created_by_datalen;
    4253             : }
    4254             : {
    4255             : size_t modified_by_datalen, modified_by_oldlen;
    4256             : Der_type modified_by_type;
    4257           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &modified_by_type, 4, &modified_by_datalen, &l);
    4258           0 : if (e == 0 && modified_by_type != CONS) { e = ASN1_BAD_ID; }
    4259           0 : if(e) {
    4260           0 : (data)->modified_by = NULL;
    4261             : } else {
    4262           0 : (data)->modified_by = calloc(1, sizeof(*(data)->modified_by));
    4263           0 : if ((data)->modified_by == NULL) { e = ENOMEM; goto fail; }
    4264           0 : p += l; len -= l; ret += l;
    4265           0 : modified_by_oldlen = len;
    4266           0 : if (modified_by_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4267           0 : len = modified_by_datalen;
    4268           0 : e = decode_Event(p, len, (data)->modified_by, &l);
    4269           0 : if(e) goto fail;
    4270           0 : p += l; len -= l; ret += l;
    4271           0 : len = modified_by_oldlen - modified_by_datalen;
    4272             : }
    4273             : }
    4274             : {
    4275             : size_t valid_start_datalen, valid_start_oldlen;
    4276             : Der_type valid_start_type;
    4277           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &valid_start_type, 5, &valid_start_datalen, &l);
    4278           0 : if (e == 0 && valid_start_type != CONS) { e = ASN1_BAD_ID; }
    4279           0 : if(e) {
    4280           0 : (data)->valid_start = NULL;
    4281             : } else {
    4282           0 : (data)->valid_start = calloc(1, sizeof(*(data)->valid_start));
    4283           0 : if ((data)->valid_start == NULL) { e = ENOMEM; goto fail; }
    4284           0 : p += l; len -= l; ret += l;
    4285           0 : valid_start_oldlen = len;
    4286           0 : if (valid_start_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4287           0 : len = valid_start_datalen;
    4288           0 : e = decode_KerberosTime(p, len, (data)->valid_start, &l);
    4289           0 : if(e) goto fail;
    4290           0 : p += l; len -= l; ret += l;
    4291           0 : len = valid_start_oldlen - valid_start_datalen;
    4292             : }
    4293             : }
    4294             : {
    4295             : size_t valid_end_datalen, valid_end_oldlen;
    4296             : Der_type valid_end_type;
    4297           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &valid_end_type, 6, &valid_end_datalen, &l);
    4298           0 : if (e == 0 && valid_end_type != CONS) { e = ASN1_BAD_ID; }
    4299           0 : if(e) {
    4300           0 : (data)->valid_end = NULL;
    4301             : } else {
    4302           0 : (data)->valid_end = calloc(1, sizeof(*(data)->valid_end));
    4303           0 : if ((data)->valid_end == NULL) { e = ENOMEM; goto fail; }
    4304           0 : p += l; len -= l; ret += l;
    4305           0 : valid_end_oldlen = len;
    4306           0 : if (valid_end_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4307           0 : len = valid_end_datalen;
    4308           0 : e = decode_KerberosTime(p, len, (data)->valid_end, &l);
    4309           0 : if(e) goto fail;
    4310           0 : p += l; len -= l; ret += l;
    4311           0 : len = valid_end_oldlen - valid_end_datalen;
    4312             : }
    4313             : }
    4314             : {
    4315             : size_t pw_end_datalen, pw_end_oldlen;
    4316             : Der_type pw_end_type;
    4317           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pw_end_type, 7, &pw_end_datalen, &l);
    4318           0 : if (e == 0 && pw_end_type != CONS) { e = ASN1_BAD_ID; }
    4319           0 : if(e) {
    4320           0 : (data)->pw_end = NULL;
    4321             : } else {
    4322           0 : (data)->pw_end = calloc(1, sizeof(*(data)->pw_end));
    4323           0 : if ((data)->pw_end == NULL) { e = ENOMEM; goto fail; }
    4324           0 : p += l; len -= l; ret += l;
    4325           0 : pw_end_oldlen = len;
    4326           0 : if (pw_end_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4327           0 : len = pw_end_datalen;
    4328           0 : e = decode_KerberosTime(p, len, (data)->pw_end, &l);
    4329           0 : if(e) goto fail;
    4330           0 : p += l; len -= l; ret += l;
    4331           0 : len = pw_end_oldlen - pw_end_datalen;
    4332             : }
    4333             : }
    4334             : {
    4335             : size_t max_life_datalen, max_life_oldlen;
    4336             : Der_type max_life_type;
    4337           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &max_life_type, 8, &max_life_datalen, &l);
    4338           0 : if (e == 0 && max_life_type != CONS) { e = ASN1_BAD_ID; }
    4339           0 : if(e) {
    4340           0 : (data)->max_life = NULL;
    4341             : } else {
    4342           0 : (data)->max_life = calloc(1, sizeof(*(data)->max_life));
    4343           0 : if ((data)->max_life == NULL) { e = ENOMEM; goto fail; }
    4344           0 : p += l; len -= l; ret += l;
    4345           0 : max_life_oldlen = len;
    4346           0 : if (max_life_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4347           0 : len = max_life_datalen;
    4348             : {
    4349             : size_t max_life_Tag_datalen, max_life_Tag_oldlen;
    4350             : Der_type max_life_Tag_type;
    4351           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &max_life_Tag_type, UT_Integer, &max_life_Tag_datalen, &l);
    4352           0 : if (e == 0 && max_life_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    4353           0 : if(e) goto fail;
    4354           0 : p += l; len -= l; ret += l;
    4355           0 : max_life_Tag_oldlen = len;
    4356           0 : if (max_life_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4357           0 : len = max_life_Tag_datalen;
    4358           0 : e = der_get_unsigned(p, len, (data)->max_life, &l);
    4359           0 : if(e) goto fail;
    4360           0 : p += l; len -= l; ret += l;
    4361           0 : len = max_life_Tag_oldlen - max_life_Tag_datalen;
    4362             : }
    4363           0 : len = max_life_oldlen - max_life_datalen;
    4364             : }
    4365             : }
    4366             : {
    4367             : size_t max_renew_datalen, max_renew_oldlen;
    4368             : Der_type max_renew_type;
    4369           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &max_renew_type, 9, &max_renew_datalen, &l);
    4370           0 : if (e == 0 && max_renew_type != CONS) { e = ASN1_BAD_ID; }
    4371           0 : if(e) {
    4372           0 : (data)->max_renew = NULL;
    4373             : } else {
    4374           0 : (data)->max_renew = calloc(1, sizeof(*(data)->max_renew));
    4375           0 : if ((data)->max_renew == NULL) { e = ENOMEM; goto fail; }
    4376           0 : p += l; len -= l; ret += l;
    4377           0 : max_renew_oldlen = len;
    4378           0 : if (max_renew_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4379           0 : len = max_renew_datalen;
    4380             : {
    4381             : size_t max_renew_Tag_datalen, max_renew_Tag_oldlen;
    4382             : Der_type max_renew_Tag_type;
    4383           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &max_renew_Tag_type, UT_Integer, &max_renew_Tag_datalen, &l);
    4384           0 : if (e == 0 && max_renew_Tag_type != PRIM) { e = ASN1_BAD_ID; }
    4385           0 : if(e) goto fail;
    4386           0 : p += l; len -= l; ret += l;
    4387           0 : max_renew_Tag_oldlen = len;
    4388           0 : if (max_renew_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4389           0 : len = max_renew_Tag_datalen;
    4390           0 : e = der_get_unsigned(p, len, (data)->max_renew, &l);
    4391           0 : if(e) goto fail;
    4392           0 : p += l; len -= l; ret += l;
    4393           0 : len = max_renew_Tag_oldlen - max_renew_Tag_datalen;
    4394             : }
    4395           0 : len = max_renew_oldlen - max_renew_datalen;
    4396             : }
    4397             : }
    4398             : {
    4399             : size_t flags_datalen, flags_oldlen;
    4400             : Der_type flags_type;
    4401           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &flags_type, 10, &flags_datalen, &l);
    4402           0 : if (e == 0 && flags_type != CONS) { e = ASN1_BAD_ID; }
    4403           0 : if(e) goto fail;
    4404           0 : p += l; len -= l; ret += l;
    4405           0 : flags_oldlen = len;
    4406           0 : if (flags_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4407           0 : len = flags_datalen;
    4408           0 : e = decode_HDBFlags(p, len, &(data)->flags, &l);
    4409           0 : if(e) goto fail;
    4410           0 : p += l; len -= l; ret += l;
    4411           0 : len = flags_oldlen - flags_datalen;
    4412             : }
    4413             : {
    4414             : size_t etypes_datalen, etypes_oldlen;
    4415             : Der_type etypes_type;
    4416           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &etypes_type, 11, &etypes_datalen, &l);
    4417           0 : if (e == 0 && etypes_type != CONS) { e = ASN1_BAD_ID; }
    4418           0 : if(e) {
    4419           0 : (data)->etypes = NULL;
    4420             : } else {
    4421           0 : (data)->etypes = calloc(1, sizeof(*(data)->etypes));
    4422           0 : if ((data)->etypes == NULL) { e = ENOMEM; goto fail; }
    4423           0 : p += l; len -= l; ret += l;
    4424           0 : etypes_oldlen = len;
    4425           0 : if (etypes_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4426           0 : len = etypes_datalen;
    4427             : {
    4428             : size_t etypes_Tag_datalen, etypes_Tag_oldlen;
    4429             : Der_type etypes_Tag_type;
    4430           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &etypes_Tag_type, UT_Sequence, &etypes_Tag_datalen, &l);
    4431           0 : if (e == 0 && etypes_Tag_type != CONS) { e = ASN1_BAD_ID; }
    4432           0 : if(e) goto fail;
    4433           0 : p += l; len -= l; ret += l;
    4434           0 : etypes_Tag_oldlen = len;
    4435           0 : if (etypes_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4436           0 : len = etypes_Tag_datalen;
    4437             : {
    4438           0 : size_t etypes_Tag_Tag_origlen = len;
    4439           0 : size_t etypes_Tag_Tag_oldret = ret;
    4440           0 : size_t etypes_Tag_Tag_olen = 0;
    4441             : void *etypes_Tag_Tag_tmp;
    4442           0 : ret = 0;
    4443           0 : ((data)->etypes)->len = 0;
    4444           0 : ((data)->etypes)->val = NULL;
    4445           0 : while(ret < etypes_Tag_Tag_origlen) {
    4446           0 : size_t etypes_Tag_Tag_nlen = etypes_Tag_Tag_olen + sizeof(*(((data)->etypes)->val));
    4447           0 : if (etypes_Tag_Tag_olen > etypes_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
    4448           0 : etypes_Tag_Tag_olen = etypes_Tag_Tag_nlen;
    4449           0 : etypes_Tag_Tag_tmp = realloc(((data)->etypes)->val, etypes_Tag_Tag_olen);
    4450           0 : if (etypes_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
    4451           0 : ((data)->etypes)->val = etypes_Tag_Tag_tmp;
    4452             : {
    4453             : size_t etypes_Tag_Tag_s_of_datalen, etypes_Tag_Tag_s_of_oldlen;
    4454             : Der_type etypes_Tag_Tag_s_of_type;
    4455           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &etypes_Tag_Tag_s_of_type, UT_Integer, &etypes_Tag_Tag_s_of_datalen, &l);
    4456           0 : if (e == 0 && etypes_Tag_Tag_s_of_type != PRIM) { e = ASN1_BAD_ID; }
    4457           0 : if(e) goto fail;
    4458           0 : p += l; len -= l; ret += l;
    4459           0 : etypes_Tag_Tag_s_of_oldlen = len;
    4460           0 : if (etypes_Tag_Tag_s_of_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4461           0 : len = etypes_Tag_Tag_s_of_datalen;
    4462           0 : e = der_get_unsigned(p, len, &((data)->etypes)->val[((data)->etypes)->len], &l);
    4463           0 : if(e) goto fail;
    4464           0 : p += l; len -= l; ret += l;
    4465           0 : len = etypes_Tag_Tag_s_of_oldlen - etypes_Tag_Tag_s_of_datalen;
    4466             : }
    4467           0 : ((data)->etypes)->len++;
    4468           0 : len = etypes_Tag_Tag_origlen - ret;
    4469             : }
    4470           0 : ret += etypes_Tag_Tag_oldret;
    4471             : }
    4472           0 : len = etypes_Tag_oldlen - etypes_Tag_datalen;
    4473             : }
    4474           0 : len = etypes_oldlen - etypes_datalen;
    4475             : }
    4476             : }
    4477             : {
    4478             : size_t generation_datalen, generation_oldlen;
    4479             : Der_type generation_type;
    4480           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &generation_type, 12, &generation_datalen, &l);
    4481           0 : if (e == 0 && generation_type != CONS) { e = ASN1_BAD_ID; }
    4482           0 : if(e) {
    4483           0 : (data)->generation = NULL;
    4484             : } else {
    4485           0 : (data)->generation = calloc(1, sizeof(*(data)->generation));
    4486           0 : if ((data)->generation == NULL) { e = ENOMEM; goto fail; }
    4487           0 : p += l; len -= l; ret += l;
    4488           0 : generation_oldlen = len;
    4489           0 : if (generation_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4490           0 : len = generation_datalen;
    4491           0 : e = decode_GENERATION(p, len, (data)->generation, &l);
    4492           0 : if(e) goto fail;
    4493           0 : p += l; len -= l; ret += l;
    4494           0 : len = generation_oldlen - generation_datalen;
    4495             : }
    4496             : }
    4497             : {
    4498             : size_t extensions_datalen, extensions_oldlen;
    4499             : Der_type extensions_type;
    4500           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &extensions_type, 13, &extensions_datalen, &l);
    4501           0 : if (e == 0 && extensions_type != CONS) { e = ASN1_BAD_ID; }
    4502           0 : if(e) {
    4503           0 : (data)->extensions = NULL;
    4504             : } else {
    4505           0 : (data)->extensions = calloc(1, sizeof(*(data)->extensions));
    4506           0 : if ((data)->extensions == NULL) { e = ENOMEM; goto fail; }
    4507           0 : p += l; len -= l; ret += l;
    4508           0 : extensions_oldlen = len;
    4509           0 : if (extensions_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4510           0 : len = extensions_datalen;
    4511           0 : e = decode_HDB_extensions(p, len, (data)->extensions, &l);
    4512           0 : if(e) goto fail;
    4513           0 : p += l; len -= l; ret += l;
    4514           0 : len = extensions_oldlen - extensions_datalen;
    4515             : }
    4516             : }
    4517           0 : len = Top_oldlen - Top_datalen;
    4518             : }
    4519           0 : if(size) *size = ret;
    4520           0 : return 0;
    4521           0 : fail:
    4522           0 : free_hdb_entry(data);
    4523           0 : return e;
    4524             : }
    4525             : 
    4526             : void ASN1CALL
    4527      244004 : free_hdb_entry(hdb_entry *data)
    4528             : {
    4529      244004 : if((data)->principal) {
    4530      244004 : free_Principal((data)->principal);
    4531      244004 : free((data)->principal);
    4532      244004 : (data)->principal = NULL;
    4533             : }
    4534      244004 : free_Keys(&(data)->keys);
    4535      244004 : free_Event(&(data)->created_by);
    4536      244004 : if((data)->modified_by) {
    4537           0 : free_Event((data)->modified_by);
    4538           0 : free((data)->modified_by);
    4539           0 : (data)->modified_by = NULL;
    4540             : }
    4541      244004 : if((data)->valid_start) {
    4542           0 : free_KerberosTime((data)->valid_start);
    4543           0 : free((data)->valid_start);
    4544           0 : (data)->valid_start = NULL;
    4545             : }
    4546      244004 : if((data)->valid_end) {
    4547           0 : free_KerberosTime((data)->valid_end);
    4548           0 : free((data)->valid_end);
    4549           0 : (data)->valid_end = NULL;
    4550             : }
    4551      244004 : if((data)->pw_end) {
    4552       63061 : free_KerberosTime((data)->pw_end);
    4553       63061 : free((data)->pw_end);
    4554       63061 : (data)->pw_end = NULL;
    4555             : }
    4556      244004 : if((data)->max_life) {
    4557      242814 : free((data)->max_life);
    4558      242814 : (data)->max_life = NULL;
    4559             : }
    4560      244004 : if((data)->max_renew) {
    4561      242814 : free((data)->max_renew);
    4562      242814 : (data)->max_renew = NULL;
    4563             : }
    4564      244004 : free_HDBFlags(&(data)->flags);
    4565      244004 : if((data)->etypes) {
    4566     1164686 : while(((data)->etypes)->len){
    4567      683370 : ((data)->etypes)->len--;
    4568             : }
    4569      243721 : free(((data)->etypes)->val);
    4570      243721 : ((data)->etypes)->val = NULL;
    4571      243721 : free((data)->etypes);
    4572      243721 : (data)->etypes = NULL;
    4573             : }
    4574      244004 : if((data)->generation) {
    4575           0 : free_GENERATION((data)->generation);
    4576           0 : free((data)->generation);
    4577           0 : (data)->generation = NULL;
    4578             : }
    4579      244004 : if((data)->extensions) {
    4580           0 : free_HDB_extensions((data)->extensions);
    4581           0 : free((data)->extensions);
    4582           0 : (data)->extensions = NULL;
    4583             : }
    4584      244004 : }
    4585             : 
    4586             : size_t ASN1CALL
    4587           0 : length_hdb_entry(const hdb_entry *data)
    4588             : {
    4589           0 : size_t ret = 0;
    4590           0 : if((data)->principal){
    4591           0 : size_t Top_tag_oldret = ret;
    4592           0 : ret = 0;
    4593           0 : ret += length_Principal((data)->principal);
    4594           0 : ret += 1 + der_length_len (ret);
    4595           0 : ret += Top_tag_oldret;
    4596             : }
    4597             : {
    4598           0 : size_t Top_tag_oldret = ret;
    4599           0 : ret = 0;
    4600           0 : ret += der_length_unsigned(&(data)->kvno);
    4601           0 : ret += 1 + der_length_len (ret);
    4602           0 : ret += 1 + der_length_len (ret);
    4603           0 : ret += Top_tag_oldret;
    4604             : }
    4605             : {
    4606           0 : size_t Top_tag_oldret = ret;
    4607           0 : ret = 0;
    4608           0 : ret += length_Keys(&(data)->keys);
    4609           0 : ret += 1 + der_length_len (ret);
    4610           0 : ret += Top_tag_oldret;
    4611             : }
    4612             : {
    4613           0 : size_t Top_tag_oldret = ret;
    4614           0 : ret = 0;
    4615           0 : ret += length_Event(&(data)->created_by);
    4616           0 : ret += 1 + der_length_len (ret);
    4617           0 : ret += Top_tag_oldret;
    4618             : }
    4619           0 : if((data)->modified_by){
    4620           0 : size_t Top_tag_oldret = ret;
    4621           0 : ret = 0;
    4622           0 : ret += length_Event((data)->modified_by);
    4623           0 : ret += 1 + der_length_len (ret);
    4624           0 : ret += Top_tag_oldret;
    4625             : }
    4626           0 : if((data)->valid_start){
    4627           0 : size_t Top_tag_oldret = ret;
    4628           0 : ret = 0;
    4629           0 : ret += length_KerberosTime((data)->valid_start);
    4630           0 : ret += 1 + der_length_len (ret);
    4631           0 : ret += Top_tag_oldret;
    4632             : }
    4633           0 : if((data)->valid_end){
    4634           0 : size_t Top_tag_oldret = ret;
    4635           0 : ret = 0;
    4636           0 : ret += length_KerberosTime((data)->valid_end);
    4637           0 : ret += 1 + der_length_len (ret);
    4638           0 : ret += Top_tag_oldret;
    4639             : }
    4640           0 : if((data)->pw_end){
    4641           0 : size_t Top_tag_oldret = ret;
    4642           0 : ret = 0;
    4643           0 : ret += length_KerberosTime((data)->pw_end);
    4644           0 : ret += 1 + der_length_len (ret);
    4645           0 : ret += Top_tag_oldret;
    4646             : }
    4647           0 : if((data)->max_life){
    4648           0 : size_t Top_tag_oldret = ret;
    4649           0 : ret = 0;
    4650           0 : ret += der_length_unsigned((data)->max_life);
    4651           0 : ret += 1 + der_length_len (ret);
    4652           0 : ret += 1 + der_length_len (ret);
    4653           0 : ret += Top_tag_oldret;
    4654             : }
    4655           0 : if((data)->max_renew){
    4656           0 : size_t Top_tag_oldret = ret;
    4657           0 : ret = 0;
    4658           0 : ret += der_length_unsigned((data)->max_renew);
    4659           0 : ret += 1 + der_length_len (ret);
    4660           0 : ret += 1 + der_length_len (ret);
    4661           0 : ret += Top_tag_oldret;
    4662             : }
    4663             : {
    4664           0 : size_t Top_tag_oldret = ret;
    4665           0 : ret = 0;
    4666           0 : ret += length_HDBFlags(&(data)->flags);
    4667           0 : ret += 1 + der_length_len (ret);
    4668           0 : ret += Top_tag_oldret;
    4669             : }
    4670           0 : if((data)->etypes){
    4671           0 : size_t Top_tag_oldret = ret;
    4672           0 : ret = 0;
    4673             : {
    4674           0 : size_t etypes_tag_tag_oldret = ret;
    4675             : int i;
    4676           0 : ret = 0;
    4677           0 : for(i = ((data)->etypes)->len - 1; i >= 0; --i){
    4678           0 : size_t etypes_tag_tag_for_oldret = ret;
    4679           0 : ret = 0;
    4680           0 : ret += der_length_unsigned(&((data)->etypes)->val[i]);
    4681           0 : ret += 1 + der_length_len (ret);
    4682           0 : ret += etypes_tag_tag_for_oldret;
    4683             : }
    4684           0 : ret += etypes_tag_tag_oldret;
    4685             : }
    4686           0 : ret += 1 + der_length_len (ret);
    4687           0 : ret += 1 + der_length_len (ret);
    4688           0 : ret += Top_tag_oldret;
    4689             : }
    4690           0 : if((data)->generation){
    4691           0 : size_t Top_tag_oldret = ret;
    4692           0 : ret = 0;
    4693           0 : ret += length_GENERATION((data)->generation);
    4694           0 : ret += 1 + der_length_len (ret);
    4695           0 : ret += Top_tag_oldret;
    4696             : }
    4697           0 : if((data)->extensions){
    4698           0 : size_t Top_tag_oldret = ret;
    4699           0 : ret = 0;
    4700           0 : ret += length_HDB_extensions((data)->extensions);
    4701           0 : ret += 1 + der_length_len (ret);
    4702           0 : ret += Top_tag_oldret;
    4703             : }
    4704           0 : ret += 1 + der_length_len (ret);
    4705           0 : return ret;
    4706             : }
    4707             : 
    4708             : int ASN1CALL
    4709           0 : copy_hdb_entry(const hdb_entry *from, hdb_entry *to)
    4710             : {
    4711           0 : memset(to, 0, sizeof(*to));
    4712           0 : if((from)->principal) {
    4713           0 : (to)->principal = malloc(sizeof(*(to)->principal));
    4714           0 : if((to)->principal == NULL) goto fail;
    4715           0 : if(copy_Principal((from)->principal, (to)->principal)) goto fail;
    4716             : }else
    4717           0 : (to)->principal = NULL;
    4718           0 : *(&(to)->kvno) = *(&(from)->kvno);
    4719           0 : if(copy_Keys(&(from)->keys, &(to)->keys)) goto fail;
    4720           0 : if(copy_Event(&(from)->created_by, &(to)->created_by)) goto fail;
    4721           0 : if((from)->modified_by) {
    4722           0 : (to)->modified_by = malloc(sizeof(*(to)->modified_by));
    4723           0 : if((to)->modified_by == NULL) goto fail;
    4724           0 : if(copy_Event((from)->modified_by, (to)->modified_by)) goto fail;
    4725             : }else
    4726           0 : (to)->modified_by = NULL;
    4727           0 : if((from)->valid_start) {
    4728           0 : (to)->valid_start = malloc(sizeof(*(to)->valid_start));
    4729           0 : if((to)->valid_start == NULL) goto fail;
    4730           0 : if(copy_KerberosTime((from)->valid_start, (to)->valid_start)) goto fail;
    4731             : }else
    4732           0 : (to)->valid_start = NULL;
    4733           0 : if((from)->valid_end) {
    4734           0 : (to)->valid_end = malloc(sizeof(*(to)->valid_end));
    4735           0 : if((to)->valid_end == NULL) goto fail;
    4736           0 : if(copy_KerberosTime((from)->valid_end, (to)->valid_end)) goto fail;
    4737             : }else
    4738           0 : (to)->valid_end = NULL;
    4739           0 : if((from)->pw_end) {
    4740           0 : (to)->pw_end = malloc(sizeof(*(to)->pw_end));
    4741           0 : if((to)->pw_end == NULL) goto fail;
    4742           0 : if(copy_KerberosTime((from)->pw_end, (to)->pw_end)) goto fail;
    4743             : }else
    4744           0 : (to)->pw_end = NULL;
    4745           0 : if((from)->max_life) {
    4746           0 : (to)->max_life = malloc(sizeof(*(to)->max_life));
    4747           0 : if((to)->max_life == NULL) goto fail;
    4748           0 : *((to)->max_life) = *((from)->max_life);
    4749             : }else
    4750           0 : (to)->max_life = NULL;
    4751           0 : if((from)->max_renew) {
    4752           0 : (to)->max_renew = malloc(sizeof(*(to)->max_renew));
    4753           0 : if((to)->max_renew == NULL) goto fail;
    4754           0 : *((to)->max_renew) = *((from)->max_renew);
    4755             : }else
    4756           0 : (to)->max_renew = NULL;
    4757           0 : if(copy_HDBFlags(&(from)->flags, &(to)->flags)) goto fail;
    4758           0 : if((from)->etypes) {
    4759           0 : (to)->etypes = malloc(sizeof(*(to)->etypes));
    4760           0 : if((to)->etypes == NULL) goto fail;
    4761           0 : if((((to)->etypes)->val = malloc(((from)->etypes)->len * sizeof(*((to)->etypes)->val))) == NULL && ((from)->etypes)->len != 0)
    4762           0 : goto fail;
    4763           0 : for(((to)->etypes)->len = 0; ((to)->etypes)->len < ((from)->etypes)->len; ((to)->etypes)->len++){
    4764           0 : *(&((to)->etypes)->val[((to)->etypes)->len]) = *(&((from)->etypes)->val[((to)->etypes)->len]);
    4765             : }
    4766             : }else
    4767           0 : (to)->etypes = NULL;
    4768           0 : if((from)->generation) {
    4769           0 : (to)->generation = malloc(sizeof(*(to)->generation));
    4770           0 : if((to)->generation == NULL) goto fail;
    4771           0 : if(copy_GENERATION((from)->generation, (to)->generation)) goto fail;
    4772             : }else
    4773           0 : (to)->generation = NULL;
    4774           0 : if((from)->extensions) {
    4775           0 : (to)->extensions = malloc(sizeof(*(to)->extensions));
    4776           0 : if((to)->extensions == NULL) goto fail;
    4777           0 : if(copy_HDB_extensions((from)->extensions, (to)->extensions)) goto fail;
    4778             : }else
    4779           0 : (to)->extensions = NULL;
    4780           0 : return 0;
    4781           0 : fail:
    4782           0 : free_hdb_entry(to);
    4783           0 : return ENOMEM;
    4784             : }
    4785             : 
    4786             : int ASN1CALL
    4787           0 : encode_hdb_entry_alias(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const hdb_entry_alias *data, size_t *size)
    4788             : {
    4789           0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
    4790             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    4791             : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
    4792             : 
    4793             : /* principal */
    4794           0 : if((data)->principal) {
    4795           0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
    4796           0 : ret = 0;
    4797           0 : e = encode_Principal(p, len, (data)->principal, &l);
    4798           0 : if (e) return e;
    4799           0 : p -= l; len -= l; ret += l;
    4800             : 
    4801           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
    4802           0 : if (e) return e;
    4803           0 : p -= l; len -= l; ret += l;
    4804             : 
    4805           0 : ret += Top_tag_tag_oldret;
    4806             : }
    4807           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
    4808           0 : if (e) return e;
    4809           0 : p -= l; len -= l; ret += l;
    4810             : 
    4811           0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 0, &l);
    4812           0 : if (e) return e;
    4813           0 : p -= l; len -= l; ret += l;
    4814             : 
    4815           0 : *size = ret;
    4816           0 : return 0;
    4817             : }
    4818             : 
    4819             : int ASN1CALL
    4820           0 : decode_hdb_entry_alias(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, hdb_entry_alias *data, size_t *size)
    4821             : {
    4822           0 : size_t ret = 0;
    4823             : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
    4824             : int e HEIMDAL_UNUSED_ATTRIBUTE;
    4825             : 
    4826           0 : memset(data, 0, sizeof(*data));
    4827             : {
    4828             : size_t Top_datalen, Top_oldlen;
    4829             : Der_type Top_type;
    4830           0 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 0, &Top_datalen, &l);
    4831           0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
    4832           0 : if(e) goto fail;
    4833           0 : p += l; len -= l; ret += l;
    4834           0 : Top_oldlen = len;
    4835           0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4836           0 : len = Top_datalen;
    4837             : {
    4838             : size_t Top_Tag_datalen, Top_Tag_oldlen;
    4839             : Der_type Top_Tag_type;
    4840           0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
    4841           0 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
    4842           0 : if(e) goto fail;
    4843           0 : p += l; len -= l; ret += l;
    4844           0 : Top_Tag_oldlen = len;
    4845           0 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4846           0 : len = Top_Tag_datalen;
    4847             : {
    4848             : size_t principal_datalen, principal_oldlen;
    4849             : Der_type principal_type;
    4850           0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &principal_type, 0, &principal_datalen, &l);
    4851           0 : if (e == 0 && principal_type != CONS) { e = ASN1_BAD_ID; }
    4852           0 : if(e) {
    4853           0 : (data)->principal = NULL;
    4854             : } else {
    4855           0 : (data)->principal = calloc(1, sizeof(*(data)->principal));
    4856           0 : if ((data)->principal == NULL) { e = ENOMEM; goto fail; }
    4857           0 : p += l; len -= l; ret += l;
    4858           0 : principal_oldlen = len;
    4859           0 : if (principal_datalen > len) { e = ASN1_OVERRUN; goto fail; }
    4860           0 : len = principal_datalen;
    4861           0 : e = decode_Principal(p, len, (data)->principal, &l);
    4862           0 : if(e) goto fail;
    4863           0 : p += l; len -= l; ret += l;
    4864           0 : len = principal_oldlen - principal_datalen;
    4865             : }
    4866             : }
    4867           0 : len = Top_Tag_oldlen - Top_Tag_datalen;
    4868             : }
    4869           0 : len = Top_oldlen - Top_datalen;
    4870             : }
    4871           0 : if(size) *size = ret;
    4872           0 : return 0;
    4873           0 : fail:
    4874           0 : free_hdb_entry_alias(data);
    4875           0 : return e;
    4876             : }
    4877             : 
    4878             : void ASN1CALL
    4879           0 : free_hdb_entry_alias(hdb_entry_alias *data)
    4880             : {
    4881           0 : if((data)->principal) {
    4882           0 : free_Principal((data)->principal);
    4883           0 : free((data)->principal);
    4884           0 : (data)->principal = NULL;
    4885             : }
    4886           0 : }
    4887             : 
    4888             : size_t ASN1CALL
    4889           0 : length_hdb_entry_alias(const hdb_entry_alias *data)
    4890             : {
    4891           0 : size_t ret = 0;
    4892           0 : if((data)->principal){
    4893           0 : size_t Top_tag_tag_oldret = ret;
    4894           0 : ret = 0;
    4895           0 : ret += length_Principal((data)->principal);
    4896           0 : ret += 1 + der_length_len (ret);
    4897           0 : ret += Top_tag_tag_oldret;
    4898             : }
    4899           0 : ret += 1 + der_length_len (ret);
    4900           0 : ret += 1 + der_length_len (ret);
    4901           0 : return ret;
    4902             : }
    4903             : 
    4904             : int ASN1CALL
    4905           0 : copy_hdb_entry_alias(const hdb_entry_alias *from, hdb_entry_alias *to)
    4906             : {
    4907           0 : memset(to, 0, sizeof(*to));
    4908           0 : if((from)->principal) {
    4909           0 : (to)->principal = malloc(sizeof(*(to)->principal));
    4910           0 : if((to)->principal == NULL) goto fail;
    4911           0 : if(copy_Principal((from)->principal, (to)->principal)) goto fail;
    4912             : }else
    4913           0 : (to)->principal = NULL;
    4914           0 : return 0;
    4915           0 : fail:
    4916           0 : free_hdb_entry_alias(to);
    4917           0 : return ENOMEM;
    4918             : }
    4919             : 

Generated by: LCOV version 1.13