rxkad: Update ticket5 from heimdal 87/13287/6
authorAndrew Deason <adeason@sinenomine.net>
Mon, 20 Aug 2018 20:47:13 +0000 (15:47 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 28 Jun 2019 14:31:47 +0000 (10:31 -0400)
This updates the rxkad code that we pull from heimdal to heimdal 7.7.0
(heimdal.git commit e1959605bd). This also updates the instructions in
README.v5 to accommodate changes in the heimdal tree, and converts
ticket5.c to use KRB5_ENCTYPE_* constants instead of ETYPE_*
constants (since heimdal has also similarly converted in krb5_asn1.h).

This removes a few -Werror=format-truncation warnings that were
present in the heimdal code before this commit.

README.v5 tweaked in collaboration with kaduk@mit.edu.

Change-Id: I5fdaab600b4a1b42658a60259fde3fc9f7dced04
Reviewed-on: https://gerrit.openafs.org/13287
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/rxkad/README.v5
src/rxkad/asn1_err.h
src/rxkad/der-protos.h
src/rxkad/ticket5.c
src/rxkad/v5der.c
src/rxkad/v5gen-rewrite.h
src/rxkad/v5gen.c
src/rxkad/v5gen.h

index c945fb3..f6f77aa 100644 (file)
@@ -33,7 +33,7 @@ htree=/home/lha/src/cvs/heimdal
 hotree=/sources/obj/heimdal
 otree=/sources/afs/openafs-rxkad5
 
-export htree otree
+export htree hotree otree
 
 (cd $htree/lib/asn1 ; \
  echo '#include "asn1_err.h"'; \
@@ -45,12 +45,12 @@ export htree otree
  der_free.c \
  der_length.c \
  der_copy.c \
-    )  \
+)  \
 | grep -v 'include "der_locl.h"' \
 | grep -v 'include <version.h>' \
 | sed 's!\(RCSID.*\)!/* \1 */!' \
 | sed 's!$Id: !Heimdal: !' \
-| cat > $otree/src/rxkad/v5der.c
+> $otree/src/rxkad/v5der.c
 
 grep -v 'struct units'  $hotree/lib/asn1/krb5_asn1.h \
  | sed s/uint16_t/afs_uint16/ \
@@ -58,49 +58,41 @@ grep -v 'struct units'  $hotree/lib/asn1/krb5_asn1.h \
    > $otree/src/rxkad/v5gen.h
 
 cp  $hotree/lib/asn1/der-protos.h \
-   > $otree/src/rxkad/der-protos.h
+    $otree/src/rxkad/der-protos.h
 
-cp  $hotree/lib/asn1/asn1_err.h \
-   > $otree/src/rxkad/asn1_err.h
+< $hotree/lib/asn1/asn1_err.h \
+ sed 's!#include <et/com_err[.]h>!struct et_list;!' \
+ > $otree/src/rxkad/asn1_err.h
 
 (cd $hotree/lib/asn1 ; \
- cat asn1_krb5int32.c \
-    asn1_Ticket.c \
-    asn1_AuthorizationDataElement.c \
-    asn1_EncryptedData.c \
-    asn1_PrincipalName.c \
-    asn1_HostAddresses.c \
-    asn1_HostAddress.c \
-    asn1_AuthorizationData.c \
-    asn1_EncTicketPart.c \
-    asn1_KerberosTime.c \
-    asn1_TransitedEncoding.c \
-    asn1_EncryptionKey.c \
-    asn1_TicketFlags.c \
-    asn1_Realm.c \
-    asn1_ENCTYPE.c \
-    asn1_NAME_TYPE.c \
-    ) \
+ echo '#define HEIMDAL_UNUSED_ATTRIBUTE AFS_UNUSED' ; \
+ cat krb5_asn1-priv.h ; \
+ cat asn1_krb5_asn1.x ) \
  | grep -v 'include <krb5-types.h>' \
- | grep -v 'include <krb5_asn1.h>' \
- | grep -v 'include <krb5_asn1-priv.h>' \
+ | grep -v 'include "krb5_asn1.h"' \
+ | grep -v 'include "krb5_asn1-priv.h"' \
  | grep -v 'include <der.h>' \
  | grep -v 'include <der-private.h>' \
  | grep -v 'include <parse_units.h>' \
  | grep -v 'include <asn1-template.h>' \
  | perl \
    -e '$f=0; while(<>){$f=1 if(/struct units/);print if($f eq 0);$f=0 if(/^}/);}' \
- | indent -npro -nbad -bap -nbc -br -ce -cd4 -brs -ncdb -di2 -ndj -nfc1 -i4 -lp -npcs -psl -sc -nsob \
- | cat > $otree/src/rxkad/v5gen.c
+ | sed -n '/^encode_Checksum[(]/q;p' \
+ | head -n -2 \
+ > $otree/src/rxkad/v5gen.c
 
 ( \
  perl -p -e 's/^(encode_|decode_|free_|copy_|length_)([^(]*)\([^)]*\)\n$/#define $1$2 _rxkad_v5_$1$2\n/' $otree/src/rxkad/v5gen.c ; \
-  perl -p -e 's/^(der_|copy_|encode_|decode_|len_|length_|free_|fix_dce|time2generalizedtime)([^(]*).*/#define $1$2 _rxkad_v5_$1$2/' /sources/afs/openafs-krb5/src/rxkad/v5der.c ; \
+  perl -p -e 's/^(der_|copy_|encode_|decode_|len_|length_|free_|fix_dce|time2generalizedtime)([^( ]*).*/#define $1$2 _rxkad_v5_$1$2/' $otree/src/rxkad/v5der.c ; \
   echo '#define TicketFlags2int _rxkad_v5_TicketFlags2int' ; \
   echo '#define int2TicketFlags _rxkad_v5_int2TicketFlags' ; \
   : ) | \
- (grep _rxkad_v5 ; \
-  echo '#ifndef HAVE_TIMEGM' ; \
-  echo '#define timegm _rxkad_timegm' ; \
-  echo '#endif' ; \
-  :) > $otree/src/rxkad/v5gen-rewrite.h
+  grep _rxkad_v5 \
+  > $otree/src/rxkad/v5gen-rewrite.h
+
+( \
+  < $otree/src/rxkad/v5gen.c \
+  indent -npro -nbad -bap -nbc -br -ce -cd4 -brs -ncdb -di2 -ndj -nfc1 -i4 -lp -npcs -psl -sc -nsob \
+  > $otree/src/rxkad/v5gen.c.indent ; \
+  mv $otree/src/rxkad/v5gen.c.indent $otree/src/rxkad/v5gen.c \
+)
index 63cfbfa..8e3be52 100644 (file)
@@ -1,40 +1,37 @@
-/* Generated from asn1_err.et */
-/* $Id$ */
-
-#ifndef __asn1_err_h__
-#define __asn1_err_h__
+/*
+ * asn1_err.h:
+ * This file is automatically generated; please do not edit it.
+ */
 
 struct et_list;
 
-void initialize_asn1_error_table_r(struct et_list **);
-
-void initialize_asn1_error_table(void);
+#define ASN1_BAD_TIMEFORMAT                      (1859794432L)
+#define ASN1_MISSING_FIELD                       (1859794433L)
+#define ASN1_MISPLACED_FIELD                     (1859794434L)
+#define ASN1_TYPE_MISMATCH                       (1859794435L)
+#define ASN1_OVERFLOW                            (1859794436L)
+#define ASN1_OVERRUN                             (1859794437L)
+#define ASN1_BAD_ID                              (1859794438L)
+#define ASN1_BAD_LENGTH                          (1859794439L)
+#define ASN1_BAD_FORMAT                          (1859794440L)
+#define ASN1_PARSE_ERROR                         (1859794441L)
+#define ASN1_EXTRA_DATA                          (1859794442L)
+#define ASN1_BAD_CHARACTER                       (1859794443L)
+#define ASN1_MIN_CONSTRAINT                      (1859794444L)
+#define ASN1_MAX_CONSTRAINT                      (1859794445L)
+#define ASN1_EXACT_CONSTRAINT                    (1859794446L)
+#define ASN1_INDEF_OVERRUN                       (1859794447L)
+#define ASN1_INDEF_UNDERRUN                      (1859794448L)
+#define ASN1_GOT_BER                             (1859794449L)
+#define ASN1_INDEF_EXTRA_DATA                    (1859794450L)
+extern const struct error_table et_asn1_error_table;
+extern void initialize_asn1_error_table(void);
+
+/* For compatibility with Heimdal */
+extern void initialize_asn1_error_table_r(struct et_list **list);
+
+#define ERROR_TABLE_BASE_asn1 (1859794432L)
+
+/* for compatibility with older versions... */
 #define init_asn1_err_tbl initialize_asn1_error_table
-
-typedef enum asn1_error_number{
-       ASN1_BAD_TIMEFORMAT = 1859794432,
-       ASN1_MISSING_FIELD = 1859794433,
-       ASN1_MISPLACED_FIELD = 1859794434,
-       ASN1_TYPE_MISMATCH = 1859794435,
-       ASN1_OVERFLOW = 1859794436,
-       ASN1_OVERRUN = 1859794437,
-       ASN1_BAD_ID = 1859794438,
-       ASN1_BAD_LENGTH = 1859794439,
-       ASN1_BAD_FORMAT = 1859794440,
-       ASN1_PARSE_ERROR = 1859794441,
-       ASN1_EXTRA_DATA = 1859794442,
-       ASN1_BAD_CHARACTER = 1859794443,
-       ASN1_MIN_CONSTRAINT = 1859794444,
-       ASN1_MAX_CONSTRAINT = 1859794445,
-       ASN1_EXACT_CONSTRAINT = 1859794446,
-       ASN1_INDEF_OVERRUN = 1859794447,
-       ASN1_INDEF_UNDERRUN = 1859794448,
-       ASN1_GOT_BER = 1859794449,
-       ASN1_INDEF_EXTRA_DATA = 1859794450
-} asn1_error_number;
-
-#define ERROR_TABLE_BASE_asn1 1859794432
-
-#define COM_ERR_BINDDOMAIN_asn1 "heim_com_err1859794432"
-
-#endif /* __asn1_err_h__ */
+#define asn1_err_base ERROR_TABLE_BASE_asn1
index 6ca5494..9f70941 100644 (file)
@@ -1,6 +1,7 @@
 /* This is a generated file */
 #ifndef __der_protos_h__
 #define __der_protos_h__
+#ifndef DOXY
 
 #include <stdarg.h>
 
@@ -9,575 +10,683 @@ extern "C" {
 #endif
 
 int
+asn1_fuzzer_done (void);
+
+int
+asn1_fuzzer_method (const char */*mode*/);
+
+void
+asn1_fuzzer_next (void);
+
+void
+asn1_fuzzer_reset (void);
+
+int
 copy_heim_any (
-       const heim_any * /*from*/,
-       heim_any * /*to*/);
+       const heim_any */*from*/,
+       heim_any */*to*/);
 
 int
 copy_heim_any_set (
-       const heim_any_set * /*from*/,
-       heim_any_set * /*to*/);
+       const heim_any_set */*from*/,
+       heim_any_set */*to*/);
 
 int
 decode_heim_any (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_any * /*data*/,
-       size_t * /*size*/);
+       heim_any */*data*/,
+       size_t */*size*/);
 
 int
 decode_heim_any_set (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_any_set * /*data*/,
-       size_t * /*size*/);
+       heim_any_set */*data*/,
+       size_t */*size*/);
 
 int
 der_copy_bit_string (
-       const heim_bit_string * /*from*/,
-       heim_bit_string * /*to*/);
+       const heim_bit_string */*from*/,
+       heim_bit_string */*to*/);
 
 int
 der_copy_bmp_string (
-       const heim_bmp_string * /*from*/,
-       heim_bmp_string * /*to*/);
+       const heim_bmp_string */*from*/,
+       heim_bmp_string */*to*/);
 
 int
 der_copy_general_string (
-       const heim_general_string * /*from*/,
-       heim_general_string * /*to*/);
+       const heim_general_string */*from*/,
+       heim_general_string */*to*/);
+
+int
+der_copy_generalized_time (
+       const time_t */*from*/,
+       time_t */*to*/);
 
 int
 der_copy_heim_integer (
-       const heim_integer * /*from*/,
-       heim_integer * /*to*/);
+       const heim_integer */*from*/,
+       heim_integer */*to*/);
 
 int
 der_copy_ia5_string (
-       const heim_printable_string * /*from*/,
-       heim_printable_string * /*to*/);
+       const heim_ia5_string */*from*/,
+       heim_ia5_string */*to*/);
+
+int
+der_copy_integer (
+       const int */*from*/,
+       int */*to*/);
+
+int
+der_copy_integer64 (
+       const int64_t */*from*/,
+       int64_t */*to*/);
 
 int
 der_copy_octet_string (
-       const heim_octet_string * /*from*/,
-       heim_octet_string * /*to*/);
+       const heim_octet_string */*from*/,
+       heim_octet_string */*to*/);
 
 int
 der_copy_oid (
-       const heim_oid * /*from*/,
-       heim_oid * /*to*/);
+       const heim_oid */*from*/,
+       heim_oid */*to*/);
 
 int
 der_copy_printable_string (
-       const heim_printable_string * /*from*/,
-       heim_printable_string * /*to*/);
+       const heim_printable_string */*from*/,
+       heim_printable_string */*to*/);
 
 int
 der_copy_universal_string (
-       const heim_universal_string * /*from*/,
-       heim_universal_string * /*to*/);
+       const heim_universal_string */*from*/,
+       heim_universal_string */*to*/);
+
+int
+der_copy_unsigned (
+       const unsigned */*from*/,
+       unsigned */*to*/);
+
+int
+der_copy_unsigned64 (
+       const uint64_t */*from*/,
+       uint64_t */*to*/);
+
+int
+der_copy_utctime (
+       const time_t */*from*/,
+       time_t */*to*/);
 
 int
 der_copy_utf8string (
-       const heim_utf8_string * /*from*/,
-       heim_utf8_string * /*to*/);
+       const heim_utf8_string */*from*/,
+       heim_utf8_string */*to*/);
 
 int
 der_copy_visible_string (
-       const heim_visible_string * /*from*/,
-       heim_visible_string * /*to*/);
+       const heim_visible_string */*from*/,
+       heim_visible_string */*to*/);
+
+void
+der_free_bit_string (heim_bit_string */*k*/);
 
 void
-der_free_bit_string (heim_bit_string * /*k*/);
+der_free_bmp_string (heim_bmp_string */*k*/);
 
 void
-der_free_bmp_string (heim_bmp_string * /*k*/);
+der_free_general_string (heim_general_string */*str*/);
 
 void
-der_free_general_string (heim_general_string * /*str*/);
+der_free_generalized_time (time_t */*t*/);
 
 void
-der_free_heim_integer (heim_integer * /*k*/);
+der_free_heim_integer (heim_integer */*k*/);
 
 void
-der_free_ia5_string (heim_ia5_string * /*str*/);
+der_free_ia5_string (heim_ia5_string */*str*/);
 
 void
-der_free_octet_string (heim_octet_string * /*k*/);
+der_free_integer (int */*i*/);
 
 void
-der_free_oid (heim_oid * /*k*/);
+der_free_integer64 (int64_t */*i*/);
 
 void
-der_free_printable_string (heim_printable_string * /*str*/);
+der_free_octet_string (heim_octet_string */*k*/);
 
 void
-der_free_universal_string (heim_universal_string * /*k*/);
+der_free_oid (heim_oid */*k*/);
 
 void
-der_free_utf8string (heim_utf8_string * /*str*/);
+der_free_printable_string (heim_printable_string */*str*/);
 
 void
-der_free_visible_string (heim_visible_string * /*str*/);
+der_free_universal_string (heim_universal_string */*k*/);
+
+void
+der_free_unsigned (unsigned */*u*/);
+
+void
+der_free_unsigned64 (uint64_t */*u*/);
+
+void
+der_free_utctime (time_t */*t*/);
+
+void
+der_free_utf8string (heim_utf8_string */*str*/);
+
+void
+der_free_visible_string (heim_visible_string */*str*/);
 
 int
 der_get_bit_string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_bit_string * /*data*/,
-       size_t * /*size*/);
+       heim_bit_string */*data*/,
+       size_t */*size*/);
 
 int
 der_get_bmp_string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_bmp_string * /*data*/,
-       size_t * /*size*/);
+       heim_bmp_string */*data*/,
+       size_t */*size*/);
 
 int
 der_get_boolean (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       int * /*data*/,
-       size_t * /*size*/);
+       int */*data*/,
+       size_t */*size*/);
 
 const char *
 der_get_class_name (unsigned /*num*/);
 
 int
-der_get_class_num (const char * /*name*/);
+der_get_class_num (const char */*name*/);
 
 int
 der_get_general_string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_general_string * /*str*/,
-       size_t * /*size*/);
+       heim_general_string */*str*/,
+       size_t */*size*/);
 
 int
 der_get_generalized_time (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       time_t * /*data*/,
-       size_t * /*size*/);
+       time_t */*data*/,
+       size_t */*size*/);
 
 int
 der_get_heim_integer (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_integer * /*data*/,
-       size_t * /*size*/);
+       heim_integer */*data*/,
+       size_t */*size*/);
 
 int
 der_get_ia5_string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_ia5_string * /*str*/,
-       size_t * /*size*/);
+       heim_ia5_string */*str*/,
+       size_t */*size*/);
 
 int
 der_get_integer (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       int * /*ret*/,
-       size_t * /*size*/);
+       int */*ret*/,
+       size_t */*size*/);
+
+int
+der_get_integer64 (
+       const unsigned char */*p*/,
+       size_t /*len*/,
+       int64_t */*ret*/,
+       size_t */*size*/);
 
 int
 der_get_length (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       size_t * /*val*/,
-       size_t * /*size*/);
+       size_t */*val*/,
+       size_t */*size*/);
 
 int
 der_get_octet_string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_octet_string * /*data*/,
-       size_t * /*size*/);
+       heim_octet_string */*data*/,
+       size_t */*size*/);
 
 int
 der_get_octet_string_ber (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_octet_string * /*data*/,
-       size_t * /*size*/);
+       heim_octet_string */*data*/,
+       size_t */*size*/);
 
 int
 der_get_oid (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_oid * /*data*/,
-       size_t * /*size*/);
+       heim_oid */*data*/,
+       size_t */*size*/);
 
 int
 der_get_printable_string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_printable_string * /*str*/,
-       size_t * /*size*/);
+       heim_printable_string */*str*/,
+       size_t */*size*/);
 
 int
 der_get_tag (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       Der_class * /*class*/,
-       Der_type * /*type*/,
-       unsigned int * /*tag*/,
-       size_t * /*size*/);
+       Der_class */*cls*/,
+       Der_type */*type*/,
+       unsigned int */*tag*/,
+       size_t */*size*/);
 
 const char *
 der_get_tag_name (unsigned /*num*/);
 
 int
-der_get_tag_num (const char * /*name*/);
+der_get_tag_num (const char */*name*/);
 
 const char *
 der_get_type_name (unsigned /*num*/);
 
 int
-der_get_type_num (const char * /*name*/);
+der_get_type_num (const char */*name*/);
 
 int
 der_get_universal_string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_universal_string * /*data*/,
-       size_t * /*size*/);
+       heim_universal_string */*data*/,
+       size_t */*size*/);
 
 int
 der_get_unsigned (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
+       size_t /*len*/,
+       unsigned */*ret*/,
+       size_t */*size*/);
+
+int
+der_get_unsigned64 (
+       const unsigned char */*p*/,
        size_t /*len*/,
-       unsigned * /*ret*/,
-       size_t * /*size*/);
+       uint64_t */*ret*/,
+       size_t */*size*/);
 
 int
 der_get_utctime (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       time_t * /*data*/,
-       size_t * /*size*/);
+       time_t */*data*/,
+       size_t */*size*/);
 
 int
 der_get_utf8string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_utf8_string * /*str*/,
-       size_t * /*size*/);
+       heim_utf8_string */*str*/,
+       size_t */*size*/);
 
 int
 der_get_visible_string (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       heim_visible_string * /*str*/,
-       size_t * /*size*/);
+       heim_visible_string */*str*/,
+       size_t */*size*/);
 
 int
 der_heim_bit_string_cmp (
-       const heim_bit_string * /*p*/,
-       const heim_bit_string * /*q*/);
+       const heim_bit_string */*p*/,
+       const heim_bit_string */*q*/);
 
 int
 der_heim_bmp_string_cmp (
-       const heim_bmp_string * /*p*/,
-       const heim_bmp_string * /*q*/);
+       const heim_bmp_string */*p*/,
+       const heim_bmp_string */*q*/);
 
 int
 der_heim_integer_cmp (
-       const heim_integer * /*p*/,
-       const heim_integer * /*q*/);
+       const heim_integer */*p*/,
+       const heim_integer */*q*/);
 
 int
 der_heim_octet_string_cmp (
-       const heim_octet_string * /*p*/,
-       const heim_octet_string * /*q*/);
+       const heim_octet_string */*p*/,
+       const heim_octet_string */*q*/);
 
 int
 der_heim_oid_cmp (
-       const heim_oid * /*p*/,
-       const heim_oid * /*q*/);
+       const heim_oid */*p*/,
+       const heim_oid */*q*/);
 
 int
 der_heim_universal_string_cmp (
-       const heim_universal_string * /*p*/,
-       const heim_universal_string * /*q*/);
+       const heim_universal_string */*p*/,
+       const heim_universal_string */*q*/);
+
+int
+der_ia5_string_cmp (
+       const heim_ia5_string */*p*/,
+       const heim_ia5_string */*q*/);
 
 size_t
-der_length_bit_string (const heim_bit_string * /*k*/);
+der_length_bit_string (const heim_bit_string */*k*/);
 
 size_t
-der_length_bmp_string (const heim_bmp_string * /*data*/);
+der_length_bmp_string (const heim_bmp_string */*data*/);
 
 size_t
-der_length_boolean (const int * /*k*/);
+der_length_boolean (const int */*k*/);
 
 size_t
-der_length_enumerated (const unsigned * /*data*/);
+der_length_enumerated (const unsigned */*data*/);
 
 size_t
-der_length_general_string (const heim_general_string * /*data*/);
+der_length_general_string (const heim_general_string */*data*/);
 
 size_t
-der_length_generalized_time (const time_t * /*t*/);
+der_length_generalized_time (const time_t */*t*/);
 
 size_t
-der_length_heim_integer (const heim_integer * /*k*/);
+der_length_heim_integer (const heim_integer */*k*/);
 
 size_t
-der_length_ia5_string (const heim_ia5_string * /*data*/);
+der_length_ia5_string (const heim_ia5_string */*data*/);
 
 size_t
-der_length_integer (const int * /*data*/);
+der_length_integer (const int */*data*/);
+
+size_t
+der_length_integer64 (const int64_t */*data*/);
 
 size_t
 der_length_len (size_t /*len*/);
 
 size_t
-der_length_octet_string (const heim_octet_string * /*k*/);
+der_length_octet_string (const heim_octet_string */*k*/);
+
+size_t
+der_length_oid (const heim_oid */*k*/);
+
+size_t
+der_length_printable_string (const heim_printable_string */*data*/);
 
 size_t
-der_length_oid (const heim_oid * /*k*/);
+der_length_tag (unsigned int /*tag*/);
 
 size_t
-der_length_printable_string (const heim_printable_string * /*data*/);
+der_length_universal_string (const heim_universal_string */*data*/);
 
 size_t
-der_length_universal_string (const heim_universal_string * /*data*/);
+der_length_unsigned (const unsigned */*data*/);
 
 size_t
-der_length_unsigned (const unsigned * /*data*/);
+der_length_unsigned64 (const uint64_t */*data*/);
 
 size_t
-der_length_utctime (const time_t * /*t*/);
+der_length_utctime (const time_t */*t*/);
 
 size_t
-der_length_utf8string (const heim_utf8_string * /*data*/);
+der_length_utf8string (const heim_utf8_string */*data*/);
 
 size_t
-der_length_visible_string (const heim_visible_string * /*data*/);
+der_length_visible_string (const heim_visible_string */*data*/);
 
 int
 der_match_tag (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       Der_class /*class*/,
+       Der_class /*cls*/,
        Der_type /*type*/,
        unsigned int /*tag*/,
-       size_t * /*size*/);
+       size_t */*size*/);
 
 int
 der_match_tag2 (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       Der_class /*class*/,
-       Der_type * /*type*/,
+       Der_class /*cls*/,
+       Der_type */*type*/,
        unsigned int /*tag*/,
-       size_t * /*size*/);
+       size_t */*size*/);
 
 int
 der_match_tag_and_length (
-       const unsigned char * /*p*/,
+       const unsigned char */*p*/,
        size_t /*len*/,
-       Der_class /*class*/,
-       Der_type * /*type*/,
+       Der_class /*cls*/,
+       Der_type */*type*/,
        unsigned int /*tag*/,
-       size_t * /*length_ret*/,
-       size_t * /*size*/);
+       size_t */*length_ret*/,
+       size_t */*size*/);
 
 int
 der_parse_heim_oid (
-       const char * /*str*/,
-       const char * /*sep*/,
-       heim_oid * /*data*/);
+       const char */*str*/,
+       const char */*sep*/,
+       heim_oid */*data*/);
 
 int
 der_parse_hex_heim_integer (
-       const char * /*p*/,
-       heim_integer * /*data*/);
+       const char */*p*/,
+       heim_integer */*data*/);
 
 int
 der_print_heim_oid (
-       const heim_oid * /*oid*/,
+       const heim_oid */*oid*/,
        char /*delim*/,
-       char ** /*str*/);
+       char **/*str*/);
 
 int
 der_print_hex_heim_integer (
-       const heim_integer * /*data*/,
-       char ** /*p*/);
+       const heim_integer */*data*/,
+       char **/*p*/);
+
+int
+der_printable_string_cmp (
+       const heim_printable_string */*p*/,
+       const heim_printable_string */*q*/);
 
 int
 der_put_bit_string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_bit_string * /*data*/,
-       size_t * /*size*/);
+       const heim_bit_string */*data*/,
+       size_t */*size*/);
 
 int
 der_put_bmp_string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_bmp_string * /*data*/,
-       size_t * /*size*/);
+       const heim_bmp_string */*data*/,
+       size_t */*size*/);
 
 int
 der_put_boolean (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const int * /*data*/,
-       size_t * /*size*/);
+       const int */*data*/,
+       size_t */*size*/);
 
 int
 der_put_general_string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_general_string * /*str*/,
-       size_t * /*size*/);
+       const heim_general_string */*str*/,
+       size_t */*size*/);
 
 int
 der_put_generalized_time (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const time_t * /*data*/,
-       size_t * /*size*/);
+       const time_t */*data*/,
+       size_t */*size*/);
 
 int
 der_put_heim_integer (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_integer * /*data*/,
-       size_t * /*size*/);
+       const heim_integer */*data*/,
+       size_t */*size*/);
 
 int
 der_put_ia5_string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_ia5_string * /*str*/,
-       size_t * /*size*/);
+       const heim_ia5_string */*str*/,
+       size_t */*size*/);
 
 int
 der_put_integer (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
+       size_t /*len*/,
+       const int */*v*/,
+       size_t */*size*/);
+
+int
+der_put_integer64 (
+       unsigned char */*p*/,
        size_t /*len*/,
-       const int * /*v*/,
-       size_t * /*size*/);
+       const int64_t */*v*/,
+       size_t */*size*/);
 
 int
 der_put_length (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
        size_t /*val*/,
-       size_t * /*size*/);
+       size_t */*size*/);
 
 int
 der_put_length_and_tag (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
        size_t /*len_val*/,
        Der_class /*class*/,
        Der_type /*type*/,
        unsigned int /*tag*/,
-       size_t * /*size*/);
+       size_t */*size*/);
 
 int
 der_put_octet_string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_octet_string * /*data*/,
-       size_t * /*size*/);
+       const heim_octet_string */*data*/,
+       size_t */*size*/);
 
 int
 der_put_oid (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_oid * /*data*/,
-       size_t * /*size*/);
+       const heim_oid */*data*/,
+       size_t */*size*/);
 
 int
 der_put_printable_string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_printable_string * /*str*/,
-       size_t * /*size*/);
+       const heim_printable_string */*str*/,
+       size_t */*size*/);
 
 int
 der_put_tag (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
        Der_class /*class*/,
        Der_type /*type*/,
        unsigned int /*tag*/,
-       size_t * /*size*/);
+       size_t */*size*/);
 
 int
 der_put_universal_string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_universal_string * /*data*/,
-       size_t * /*size*/);
+       const heim_universal_string */*data*/,
+       size_t */*size*/);
 
 int
 der_put_unsigned (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
+       size_t /*len*/,
+       const unsigned */*v*/,
+       size_t */*size*/);
+
+int
+der_put_unsigned64 (
+       unsigned char */*p*/,
        size_t /*len*/,
-       const unsigned * /*v*/,
-       size_t * /*size*/);
+       const uint64_t */*v*/,
+       size_t */*size*/);
 
 int
 der_put_utctime (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const time_t * /*data*/,
-       size_t * /*size*/);
+       const time_t */*data*/,
+       size_t */*size*/);
 
 int
 der_put_utf8string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_utf8_string * /*str*/,
-       size_t * /*size*/);
+       const heim_utf8_string */*str*/,
+       size_t */*size*/);
 
 int
 der_put_visible_string (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_visible_string * /*str*/,
-       size_t * /*size*/);
+       const heim_visible_string */*str*/,
+       size_t */*size*/);
 
 int
 encode_heim_any (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_any * /*data*/,
-       size_t * /*size*/);
+       const heim_any */*data*/,
+       size_t */*size*/);
 
 int
 encode_heim_any_set (
-       unsigned char * /*p*/,
+       unsigned char */*p*/,
        size_t /*len*/,
-       const heim_any_set * /*data*/,
-       size_t * /*size*/);
+       const heim_any_set */*data*/,
+       size_t */*size*/);
 
 void
-free_heim_any (heim_any * /*data*/);
+free_heim_any (heim_any */*data*/);
 
 void
-free_heim_any_set (heim_any_set * /*data*/);
+free_heim_any_set (heim_any_set */*data*/);
 
 int
 heim_any_cmp (
-       const heim_any_set * /*p*/,
-       const heim_any_set * /*q*/);
+       const heim_any_set */*p*/,
+       const heim_any_set */*q*/);
 
 size_t
-length_heim_any (const heim_any * /*data*/);
+length_heim_any (const heim_any */*data*/);
 
 size_t
-length_heim_any_set (const heim_any * /*data*/);
+length_heim_any_set (const heim_any */*data*/);
 
 #ifdef __cplusplus
 }
 #endif
 
+#endif /* DOXY */
 #endif /* __der_protos_h__ */
index af3ee33..1a59d4f 100644 (file)
@@ -234,9 +234,9 @@ tkt_DecodeTicket5(char *ticket, afs_int32 ticket_len,
 
     /* Check that the key type really fit into 8 bytes */
     switch (t5.enc_part.etype) {
-    case ETYPE_DES_CBC_CRC:
-    case ETYPE_DES_CBC_MD4:
-    case ETYPE_DES_CBC_MD5:
+    case KRB5_ENCTYPE_DES_CBC_CRC:
+    case KRB5_ENCTYPE_DES_CBC_MD4:
+    case KRB5_ENCTYPE_DES_CBC_MD5:
        /* check ticket */
        if (t5.enc_part.cipher.length > sizeof(plain)
            || t5.enc_part.cipher.length % 8 != 0)
@@ -494,17 +494,17 @@ krb5_des_decrypt(struct ktc_encryptionKey *key, int etype, void *in,
 #define CONFOUNDERSZ 8
 
     switch (etype) {
-    case ETYPE_DES_CBC_CRC:
+    case KRB5_ENCTYPE_DES_CBC_CRC:
        memcpy(&ivec, key, sizeof(ivec));
        cksumsz = 4;
        cksum_func = verify_checksum_crc;
        break;
-    case ETYPE_DES_CBC_MD4:
+    case KRB5_ENCTYPE_DES_CBC_MD4:
        memset(&ivec, 0, sizeof(ivec));
        cksumsz = 16;
        cksum_func = verify_checksum_md4;
        break;
-    case ETYPE_DES_CBC_MD5:
+    case KRB5_ENCTYPE_DES_CBC_MD5:
        memset(&ivec, 0, sizeof(ivec));
        cksumsz = 16;
        cksum_func = verify_checksum_md5;
@@ -554,7 +554,7 @@ tkt_MakeTicket5(char *ticket, int *ticketLen, int enctype, int *kvno,
     memset(&data, 0, sizeof(data));
 
     data.flags.transited_policy_checked = 1;
-    data.key.keytype=ETYPE_DES_CBC_CRC;
+    data.key.keytype=KRB5_ENCTYPE_DES_CBC_CRC;
     data.key.keyvalue.data=sessionKey->data;
     data.key.keyvalue.length=8;
     data.crealm=cell;
@@ -718,16 +718,16 @@ tkt_DeriveDesKey(int enctype, void *keydata, size_t keylen,
                 struct ktc_encryptionKey *output)
 {
     switch (enctype) {
-    case ETYPE_DES_CBC_CRC:
-    case ETYPE_DES_CBC_MD4:
-    case ETYPE_DES_CBC_MD5:
+    case KRB5_ENCTYPE_DES_CBC_CRC:
+    case KRB5_ENCTYPE_DES_CBC_MD4:
+    case KRB5_ENCTYPE_DES_CBC_MD5:
        if (keylen != 8)
            return 1;
 
        /* Extract session key */
        memcpy(output, keydata, 8);
        break;
-    case ETYPE_NULL:
+    case KRB5_ENCTYPE_NULL:
     case 4:
     case 6:
     case 8:
@@ -741,9 +741,9 @@ tkt_DeriveDesKey(int enctype, void *keydata, size_t keylen,
        return 1;
        /*In order to become a "Cryptographic Key" as specified in
         * SP800-108, it must be indistinguishable from a random bitstring. */
-    case ETYPE_DES3_CBC_MD5:
-    case ETYPE_OLD_DES3_CBC_SHA1:
-    case ETYPE_DES3_CBC_SHA1:
+    case KRB5_ENCTYPE_DES3_CBC_MD5:
+    case KRB5_ENCTYPE_OLD_DES3_CBC_SHA1:
+    case KRB5_ENCTYPE_DES3_CBC_SHA1:
        if (compress_parity_bits(keydata, &keylen))
            return 1;
        /* FALLTHROUGH */
index 46ac9ce..98545b1 100644 (file)
@@ -35,7 +35,7 @@
  */
 
 
-/* RCSID("$Id$"); */
+#define ASN1_MAX_YEAR  2000
 
 static int
 is_leap(unsigned y)
@@ -44,6 +44,10 @@ is_leap(unsigned y)
     return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
 }
 
+static const unsigned ndays[2][12] ={
+    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+    {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
+
 /*
  * This is a simplifed version of timegm(3) that doesn't accept out of
  * bound values that timegm(3) normally accepts but those are not
@@ -53,17 +57,20 @@ is_leap(unsigned y)
 time_t
 _der_timegm (struct tm *tm)
 {
-  static const unsigned ndays[2][12] ={
-    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
-    {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
   time_t res = 0;
-  unsigned i;
+  int i;
+
+  /*
+   * See comment in _der_gmtime
+   */
+  if (tm->tm_year > ASN1_MAX_YEAR)
+      return 0;
 
   if (tm->tm_year < 0)
       return -1;
   if (tm->tm_mon < 0 || tm->tm_mon > 11)
       return -1;
-  if (tm->tm_mday < 1 || tm->tm_mday > ndays[is_leap(tm->tm_year)][tm->tm_mon])
+  if (tm->tm_mday < 1 || tm->tm_mday > (int)ndays[is_leap(tm->tm_year)][tm->tm_mon])
       return -1;
   if (tm->tm_hour < 0 || tm->tm_hour > 23)
       return -1;
@@ -86,6 +93,49 @@ _der_timegm (struct tm *tm)
   res += tm->tm_sec;
   return res;
 }
+
+struct tm *
+_der_gmtime(time_t t, struct tm *tm)
+{
+    time_t secday = t % (3600 * 24);
+    time_t days = t / (3600 * 24);
+
+    memset(tm, 0, sizeof(*tm));
+
+    tm->tm_sec = secday % 60;
+    tm->tm_min = (secday % 3600) / 60;
+    tm->tm_hour = (int)(secday / 3600);
+
+    /*
+     * Refuse to calculate time ~ 2000 years into the future, this is
+     * not possible for systems where time_t is a int32_t, however,
+     * when time_t is a int64_t, that can happen, and this becomes a
+     * denial of sevice.
+     */
+    if (days > (ASN1_MAX_YEAR * 365))
+       return NULL;
+
+    tm->tm_year = 70;
+    while(1) {
+       unsigned dayinyear = (is_leap(tm->tm_year) ? 366 : 365);
+       if (days < dayinyear)
+           break;
+       tm->tm_year += 1;
+       days -= dayinyear;
+    }
+    tm->tm_mon = 0;
+
+    while (1) {
+       unsigned daysinmonth = ndays[is_leap(tm->tm_year)][tm->tm_mon];
+       if (days < daysinmonth)
+           break;
+       days -= daysinmonth;
+       tm->tm_mon++;
+    }
+    tm->tm_mday = (int)(days + 1);
+
+    return tm;
+}
 /*
  * Copyright (c) 1997 - 2007 Kungliga Tekniska Högskolan
  * (Royal Institute of Technology, Stockholm, Sweden).
@@ -135,9 +185,28 @@ der_get_unsigned (const unsigned char *p, size_t len,
     unsigned val = 0;
     size_t oldlen = len;
 
-    if (len == sizeof(unsigned) + 1 && p[0] == 0)
+    if (len == sizeof(val) + 1 && p[0] == 0)
        ;
-    else if (len > sizeof(unsigned))
+    else if (len > sizeof(val))
+       return ASN1_OVERRUN;
+
+    while (len--)
+       val = val * 256 + *p++;
+    *ret = val;
+    if(size) *size = oldlen;
+    return 0;
+}
+
+int
+der_get_unsigned64 (const unsigned char *p, size_t len,
+                   uint64_t *ret, size_t *size)
+{
+    uint64_t val = 0;
+    size_t oldlen = len;
+
+    if (len == sizeof(val) + 1 && p[0] == 0)
+       ;
+    else if (len > sizeof(val))
        return ASN1_OVERRUN;
 
     while (len--)
@@ -154,7 +223,7 @@ der_get_integer (const unsigned char *p, size_t len,
     int val = 0;
     size_t oldlen = len;
 
-    if (len > sizeof(int))
+    if (len > sizeof(val))
        return ASN1_OVERRUN;
 
     if (len > 0) {
@@ -168,6 +237,27 @@ der_get_integer (const unsigned char *p, size_t len,
 }
 
 int
+der_get_integer64 (const unsigned char *p, size_t len,
+                  int64_t *ret, size_t *size)
+{
+    int64_t val = 0;
+    size_t oldlen = len;
+
+    if (len > sizeof(val))
+        return ASN1_OVERRUN;
+
+    if (len > 0) {
+       val = (signed char)*p++;
+       while (--len)
+           val = val * 256 + *p++;
+    }
+    *ret = val;
+    if(size) *size = oldlen;
+    return 0;
+}
+
+
+int
 der_get_length (const unsigned char *p, size_t len,
                size_t *val, size_t *size)
 {
@@ -228,20 +318,24 @@ der_get_general_string (const unsigned char *p, size_t len,
         * an strings in the NEED_PREAUTH case that includes a
         * trailing NUL.
         */
-       while (p1 - p < len && *p1 == '\0')
+       while ((size_t)(p1 - p) < len && *p1 == '\0')
            p1++;
-       if (p1 - p != len)
+       if ((size_t)(p1 - p) != len) {
+           *str = NULL;
            return ASN1_BAD_CHARACTER;
+       }
     }
-    if (len > len + 1)
+    if (len == SIZE_MAX) {
+       *str = NULL;
        return ASN1_BAD_LENGTH;
+    }
 
-    s = malloc (len + 1);
+    *str = s = malloc (len + 1);
     if (s == NULL)
        return ENOMEM;
     memcpy (s, p, len);
     s[len] = '\0';
-    *str = s;
+
     if(size) *size = len;
     return 0;
 }
@@ -253,18 +347,34 @@ der_get_utf8string (const unsigned char *p, size_t len,
     return der_get_general_string(p, len, str, size);
 }
 
+#define gen_data_zero(_data) \
+       do { (_data)->length = 0; (_data)->data = NULL; } while(0)
+
 int
-der_get_printable_string (const unsigned char *p, size_t len,
-                         heim_printable_string *str, size_t *size)
+der_get_printable_string(const unsigned char *p, size_t len,
+                        heim_printable_string *str, size_t *size)
 {
-    return der_get_general_string(p, len, str, size);
+    if (len == SIZE_MAX) {
+       gen_data_zero(str);
+       return ASN1_BAD_LENGTH;
+    }
+    str->length = len;
+    str->data = malloc(len + 1);
+    if (str->data == NULL) {
+       gen_data_zero(str);
+       return ENOMEM;
+    }
+    memcpy(str->data, p, len);
+    ((char *)str->data)[len] = '\0';
+    if(size) *size = len;
+    return 0;
 }
 
 int
-der_get_ia5_string (const unsigned char *p, size_t len,
-                   heim_ia5_string *str, size_t *size)
+der_get_ia5_string(const unsigned char *p, size_t len,
+                  heim_ia5_string *str, size_t *size)
 {
-    return der_get_general_string(p, len, str, size);
+    return der_get_printable_string(p, len, str, size);
 }
 
 int
@@ -273,14 +383,20 @@ der_get_bmp_string (const unsigned char *p, size_t len,
 {
     size_t i;
 
-    if (len & 1)
+    if (len & 1) {
+       gen_data_zero(data);
        return ASN1_BAD_FORMAT;
+    }
     data->length = len / 2;
-    if (data->length > UINT_MAX/sizeof(data->data[0]))
+    if (data->length > UINT_MAX/sizeof(data->data[0])) {
+       gen_data_zero(data);
        return ERANGE;
+    }
     data->data = malloc(data->length * sizeof(data->data[0]));
-    if (data->data == NULL && data->length != 0)
+    if (data->data == NULL && data->length != 0) {
+       gen_data_zero(data);
        return ENOMEM;
+    }
 
     for (i = 0; i < data->length; i++) {
        data->data[i] = (p[0] << 8) | p[1];
@@ -288,8 +404,7 @@ der_get_bmp_string (const unsigned char *p, size_t len,
        /* check for NUL in the middle of the string */
        if (data->data[i] == 0 && i != (data->length - 1)) {
            free(data->data);
-           data->data = NULL;
-           data->length = 0;
+           gen_data_zero(data);
            return ASN1_BAD_CHARACTER;
        }
     }
@@ -304,14 +419,20 @@ der_get_universal_string (const unsigned char *p, size_t len,
 {
     size_t i;
 
-    if (len & 3)
+    if (len & 3) {
+       gen_data_zero(data);
        return ASN1_BAD_FORMAT;
+    }
     data->length = len / 4;
-    if (data->length > UINT_MAX/sizeof(data->data[0]))
+    if (data->length > UINT_MAX/sizeof(data->data[0])) {
+       gen_data_zero(data);
        return ERANGE;
+    }
     data->data = malloc(data->length * sizeof(data->data[0]));
-    if (data->data == NULL && data->length != 0)
+    if (data->data == NULL && data->length != 0) {
+       gen_data_zero(data);
        return ENOMEM;
+    }
 
     for (i = 0; i < data->length; i++) {
        data->data[i] = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
@@ -319,8 +440,7 @@ der_get_universal_string (const unsigned char *p, size_t len,
        /* check for NUL in the middle of the string */
        if (data->data[i] == 0 && i != (data->length - 1)) {
            free(data->data);
-           data->data = NULL;
-           data->length = 0;
+           gen_data_zero(data);
            return ASN1_BAD_CHARACTER;
        }
     }
@@ -354,7 +474,7 @@ der_get_octet_string_ber (const unsigned char *p, size_t len,
 {
     int e;
     Der_type type;
-    Der_class class;
+    Der_class cls;
     unsigned int tag, depth = 0;
     size_t l, datalen, oldlen = len;
 
@@ -362,9 +482,9 @@ der_get_octet_string_ber (const unsigned char *p, size_t len,
     data->data = NULL;
 
     while (len) {
-       e = der_get_tag (p, len, &class, &type, &tag, &l);
+       e = der_get_tag (p, len, &cls, &type, &tag, &l);
        if (e) goto out;
-       if (class != ASN1_C_UNIV) {
+       if (cls != ASN1_C_UNIV) {
            e = ASN1_BAD_ID;
            goto out;
        }
@@ -510,7 +630,7 @@ der_get_time (const unsigned char *p, size_t len,
     char *times;
     int e;
 
-    if (len > len + 1 || len == 0)
+    if (len == SIZE_MAX || len == 0)
        return ASN1_BAD_LENGTH;
 
     times = malloc(len + 1);
@@ -548,7 +668,7 @@ der_get_oid (const unsigned char *p, size_t len,
     if (len < 1)
        return ASN1_OVERRUN;
 
-    if (len > len + 1)
+    if (len == SIZE_MAX)
        return ASN1_BAD_LENGTH;
 
     if (len + 1 > UINT_MAX/sizeof(data->components[0]))
@@ -588,13 +708,13 @@ der_get_oid (const unsigned char *p, size_t len,
 
 int
 der_get_tag (const unsigned char *p, size_t len,
-            Der_class *class, Der_type *type,
+            Der_class *cls, Der_type *type,
             unsigned int *tag, size_t *size)
 {
     size_t ret = 0;
     if (len < 1)
        return ASN1_OVERRUN;
-    *class = (Der_class)(((*p) >> 6) & 0x03);
+    *cls = (Der_class)(((*p) >> 6) & 0x03);
     *type = (Der_type)(((*p) >> 5) & 0x01);
     *tag = (*p) & 0x1f;
     p++; len--; ret++;
@@ -620,13 +740,13 @@ der_get_tag (const unsigned char *p, size_t len,
 
 int
 der_match_tag (const unsigned char *p, size_t len,
-              Der_class class, Der_type type,
+              Der_class cls, Der_type type,
               unsigned int tag, size_t *size)
 {
     Der_type thistype;
     int e;
 
-    e = der_match_tag2(p, len, class, &thistype, tag, size);
+    e = der_match_tag2(p, len, cls, &thistype, tag, size);
     if (e) return e;
     if (thistype != type) return ASN1_BAD_ID;
     return 0;
@@ -634,7 +754,7 @@ der_match_tag (const unsigned char *p, size_t len,
 
 int
 der_match_tag2 (const unsigned char *p, size_t len,
-               Der_class class, Der_type *type,
+               Der_class cls, Der_type *type,
                unsigned int tag, size_t *size)
 {
     size_t l;
@@ -644,7 +764,7 @@ der_match_tag2 (const unsigned char *p, size_t len,
 
     e = der_get_tag (p, len, &thisclass, type, &thistag, &l);
     if (e) return e;
-    if (class != thisclass)
+    if (cls != thisclass)
        return ASN1_BAD_ID;
     if(tag > thistag)
        return ASN1_MISPLACED_FIELD;
@@ -656,13 +776,13 @@ der_match_tag2 (const unsigned char *p, size_t len,
 
 int
 der_match_tag_and_length (const unsigned char *p, size_t len,
-                         Der_class class, Der_type *type, unsigned int tag,
+                         Der_class cls, Der_type *type, unsigned int tag,
                          size_t *length_ret, size_t *size)
 {
     size_t l, ret = 0;
     int e;
 
-    e = der_match_tag2 (p, len, class, type, tag, &l);
+    e = der_match_tag2 (p, len, cls, type, tag, &l);
     if (e) return e;
     p += l;
     len -= l;
@@ -713,14 +833,19 @@ der_get_bit_string (const unsigned char *p, size_t len,
      * any of them will cause a interger overrun */
     if ((len - 1) >> (sizeof(len) * 8 - 3))
        return ASN1_OVERRUN;
-    data->length = (len - 1) * 8;
-    data->data = malloc(len - 1);
-    if (data->data == NULL && (len - 1) != 0)
-       return ENOMEM;
-    /* copy data is there is data to copy */
-    if (len - 1 != 0) {
-      memcpy (data->data, p + 1, len - 1);
-      data->length -= p[0];
+    /*
+     * If there is data to copy, do that now.
+     */
+    if (len - 1 > 0) {
+       data->length = (len - 1) * 8;
+       data->data = malloc(len - 1);
+       if (data->data == NULL)
+           return ENOMEM;
+       memcpy (data->data, p + 1, len - 1);
+       data->length -= p[0];
+    } else {
+       data->data = NULL;
+       data->length = 0;
     }
     if(size) *size = len;
     return 0;
@@ -802,6 +927,38 @@ der_put_unsigned (unsigned char *p, size_t len, const unsigned *v, size_t *size)
 }
 
 int
+der_put_unsigned64 (unsigned char *p, size_t len, const uint64_t *v, size_t *size)
+{
+    unsigned char *base = p;
+    uint64_t val = *v;
+
+    if (val) {
+       while (len > 0 && val) {
+           *p-- = val % 256;
+           val /= 256;
+           --len;
+       }
+       if (val != 0)
+           return ASN1_OVERFLOW;
+       else {
+           if(p[1] >= 128) {
+               if(len < 1)
+                   return ASN1_OVERFLOW;
+               *p-- = 0;
+           }
+           *size = base - p;
+           return 0;
+       }
+    } else if (len < 1)
+       return ASN1_OVERFLOW;
+    else {
+       *p    = 0;
+       *size = 1;
+       return 0;
+    }
+}
+
+int
 der_put_integer (unsigned char *p, size_t len, const int *v, size_t *size)
 {
     unsigned char *base = p;
@@ -841,6 +998,46 @@ der_put_integer (unsigned char *p, size_t len, const int *v, size_t *size)
     return 0;
 }
 
+int
+der_put_integer64 (unsigned char *p, size_t len, const int64_t *v, size_t *size)
+{
+    unsigned char *base = p;
+    int64_t val = *v;
+
+    if(val >= 0) {
+       do {
+           if(len < 1)
+               return ASN1_OVERFLOW;
+           *p-- = val % 256;
+           len--;
+           val /= 256;
+       } while(val);
+       if(p[1] >= 128) {
+           if(len < 1)
+               return ASN1_OVERFLOW;
+           *p-- = 0;
+           len--;
+       }
+    } else {
+       val = ~val;
+       do {
+           if(len < 1)
+               return ASN1_OVERFLOW;
+           *p-- = ~(val % 256);
+           len--;
+           val /= 256;
+       } while(val);
+       if(p[1] < 128) {
+           if(len < 1)
+               return ASN1_OVERFLOW;
+           *p-- = 0xff;
+           len--;
+       }
+    }
+    *size = base - p;
+    return 0;
+}
+
 
 int
 der_put_length (unsigned char *p, size_t len, size_t val, size_t *size)
@@ -907,14 +1104,14 @@ int
 der_put_printable_string (unsigned char *p, size_t len,
                          const heim_printable_string *str, size_t *size)
 {
-    return der_put_general_string(p, len, str, size);
+    return der_put_octet_string(p, len, str, size);
 }
 
 int
 der_put_ia5_string (unsigned char *p, size_t len,
                    const heim_ia5_string *str, size_t *size)
 {
-    return der_put_general_string(p, len, str, size);
+    return der_put_octet_string(p, len, str, size);
 }
 
 int
@@ -993,7 +1190,8 @@ der_put_heim_integer (unsigned char *p, size_t len,
     len -= data->length;
 
     if (data->negative) {
-       int i, carry;
+       ssize_t i;
+       int carry;
        for (i = data->length - 1, carry = 1; i >= 0; i--) {
            *p = buf[i] ^ 0xff;
            if (carry)
@@ -1069,7 +1267,7 @@ der_put_oid (unsigned char *p, size_t len,
             const heim_oid *data, size_t *size)
 {
     unsigned char *base = p;
-    int n;
+    size_t n;
 
     for (n = data->length - 1; n >= 2; --n) {
        unsigned u = data->components[n];
@@ -1152,22 +1350,25 @@ der_put_length_and_tag (unsigned char *p, size_t len, size_t len_val,
 int
 _heim_time2generalizedtime (time_t t, heim_octet_string *s, int gtimep)
 {
-     struct tm *tm;
+     struct tm tm;
      const size_t len = gtimep ? 15 : 13;
 
+     s->data = NULL;
+     s->length = 0;
+     if (_der_gmtime(t, &tm) == NULL)
+        return ASN1_BAD_TIMEFORMAT;
      s->data = malloc(len + 1);
      if (s->data == NULL)
         return ENOMEM;
      s->length = len;
-     tm = gmtime (&t);
      if (gtimep)
         snprintf (s->data, len + 1, "%04d%02d%02d%02d%02d%02dZ",
-                  tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
-                  tm->tm_hour, tm->tm_min, tm->tm_sec);
+                  tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
+                  tm.tm_hour, tm.tm_min, tm.tm_sec);
      else
         snprintf (s->data, len + 1, "%02d%02d%02d%02d%02d%02dZ",
-                  tm->tm_year % 100, tm->tm_mon + 1, tm->tm_mday,
-                  tm->tm_hour, tm->tm_min, tm->tm_sec);
+                  tm.tm_year % 100, tm.tm_mon + 1, tm.tm_mday,
+                  tm.tm_hour, tm.tm_min, tm.tm_sec);
 
      return 0;
 }
@@ -1193,14 +1394,14 @@ der_put_bit_string (unsigned char *p, size_t len,
 int
 _heim_der_set_sort(const void *a1, const void *a2)
 {
-    const struct heim_octet_string *s1 = a1, *s2 = a2;
+    const heim_octet_string *s1 = a1, *s2 = a2;
     int ret;
 
     ret = memcmp(s1->data, s2->data,
                 s1->length < s2->length ? s1->length : s2->length);
     if(ret)
        return ret;
-    return s1->length - s2->length;
+    return (int)(s1->length - s2->length);
 }
 /*
  * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan
@@ -1254,12 +1455,24 @@ der_free_integer (int *i)
 }
 
 void
+der_free_integer64 (int64_t *i)
+{
+    *i = 0;
+}
+
+void
 der_free_unsigned (unsigned *u)
 {
     *u = 0;
 }
 
 void
+der_free_unsigned64 (uint64_t *u)
+{
+    *u = 0;
+}
+
+void
 der_free_generalized_time(time_t *t)
 {
     *t = 0;
@@ -1282,15 +1495,13 @@ der_free_utf8string (heim_utf8_string *str)
 void
 der_free_printable_string (heim_printable_string *str)
 {
-    free(*str);
-    *str = NULL;
+    der_free_octet_string(str);
 }
 
 void
 der_free_ia5_string (heim_ia5_string *str)
 {
-    free(*str);
-    *str = NULL;
+    der_free_octet_string(str);
 }
 
 void
@@ -1404,6 +1615,24 @@ _heim_len_unsigned (unsigned val)
 }
 
 size_t
+_heim_len_unsigned64 (uint64_t val)
+{
+    size_t ret = 0;
+    int last_val_gt_128;
+
+    do {
+       ++ret;
+       last_val_gt_128 = (val >= 128);
+       val /= 256;
+    } while (val);
+
+    if(last_val_gt_128)
+       ret++;
+
+    return ret;
+}
+
+size_t
 _heim_len_int (int val)
 {
     unsigned char q;
@@ -1430,11 +1659,38 @@ _heim_len_int (int val)
     return ret;
 }
 
+size_t
+_heim_len_int64 (int64_t val)
+{
+    unsigned char q;
+    size_t ret = 0;
+
+    if (val >= 0) {
+       do {
+           q = val % 256;
+           ret++;
+           val /= 256;
+       } while(val);
+       if(q >= 128)
+           ret++;
+    } else {
+       val = ~val;
+       do {
+           q = ~(val % 256);
+           ret++;
+           val /= 256;
+       } while(val);
+       if(q < 128)
+           ret++;
+    }
+    return ret;
+}
+
 static size_t
 len_oid (const heim_oid *oid)
 {
     size_t ret = 1;
-    int n;
+    size_t n;
 
     for (n = 2; n < oid->length; ++n) {
        unsigned u = oid->components[n];
@@ -1483,12 +1739,24 @@ der_length_integer (const int *data)
 }
 
 size_t
+der_length_integer64 (const int64_t *data)
+{
+    return _heim_len_int64 (*data);
+}
+
+size_t
 der_length_unsigned (const unsigned *data)
 {
     return _heim_len_unsigned(*data);
 }
 
 size_t
+der_length_unsigned64 (const uint64_t *data)
+{
+    return _heim_len_unsigned64(*data);
+}
+
+size_t
 der_length_enumerated (const unsigned *data)
 {
   return _heim_len_int (*data);
@@ -1509,13 +1777,13 @@ der_length_utf8string (const heim_utf8_string *data)
 size_t
 der_length_printable_string (const heim_printable_string *data)
 {
-    return strlen(*data);
+    return data->length;
 }
 
 size_t
 der_length_ia5_string (const heim_ia5_string *data)
 {
-    return strlen(*data);
+    return data->length;
 }
 
 size_t
@@ -1650,6 +1918,13 @@ der_copy_integer (const int *from, int *to)
 }
 
 int
+der_copy_integer64 (const int64_t *from, int64_t *to)
+{
+    *to = *from;
+    return 0;
+}
+
+int
 der_copy_unsigned (const unsigned *from, unsigned *to)
 {
     *to = *from;
@@ -1657,6 +1932,13 @@ der_copy_unsigned (const unsigned *from, unsigned *to)
 }
 
 int
+der_copy_unsigned64 (const uint64_t *from, uint64_t *to)
+{
+    *to = *from;
+    return 0;
+}
+
+int
 der_copy_generalized_time (const time_t *from, time_t *to)
 {
     *to = *from;
@@ -1680,14 +1962,20 @@ int
 der_copy_printable_string (const heim_printable_string *from,
                       heim_printable_string *to)
 {
-    return der_copy_general_string(from, to);
+    to->length = from->length;
+    to->data   = malloc(to->length + 1);
+    if(to->data == NULL)
+       return ENOMEM;
+    memcpy(to->data, from->data, to->length);
+    ((char *)to->data)[to->length] = '\0';
+    return 0;
 }
 
 int
-der_copy_ia5_string (const heim_printable_string *from,
-                    heim_printable_string *to)
+der_copy_ia5_string (const heim_ia5_string *from,
+                    heim_ia5_string *to)
 {
-    return der_copy_general_string(from, to);
+    return der_copy_printable_string(from, to);
 }
 
 int
index ce9220f..36c7f9d 100644 (file)
+#define encode_NAME_TYPE _rxkad_v5_encode_NAME_TYPE
+#define decode_NAME_TYPE _rxkad_v5_decode_NAME_TYPE
+#define free_NAME_TYPE _rxkad_v5_free_NAME_TYPE
+#define length_NAME_TYPE _rxkad_v5_length_NAME_TYPE
+#define copy_NAME_TYPE _rxkad_v5_copy_NAME_TYPE
+#define encode_MESSAGE_TYPE _rxkad_v5_encode_MESSAGE_TYPE
+#define decode_MESSAGE_TYPE _rxkad_v5_decode_MESSAGE_TYPE
+#define free_MESSAGE_TYPE _rxkad_v5_free_MESSAGE_TYPE
+#define length_MESSAGE_TYPE _rxkad_v5_length_MESSAGE_TYPE
+#define copy_MESSAGE_TYPE _rxkad_v5_copy_MESSAGE_TYPE
+#define encode_PADATA_TYPE _rxkad_v5_encode_PADATA_TYPE
+#define decode_PADATA_TYPE _rxkad_v5_decode_PADATA_TYPE
+#define free_PADATA_TYPE _rxkad_v5_free_PADATA_TYPE
+#define length_PADATA_TYPE _rxkad_v5_length_PADATA_TYPE
+#define copy_PADATA_TYPE _rxkad_v5_copy_PADATA_TYPE
+#define encode_AUTHDATA_TYPE _rxkad_v5_encode_AUTHDATA_TYPE
+#define decode_AUTHDATA_TYPE _rxkad_v5_decode_AUTHDATA_TYPE
+#define free_AUTHDATA_TYPE _rxkad_v5_free_AUTHDATA_TYPE
+#define length_AUTHDATA_TYPE _rxkad_v5_length_AUTHDATA_TYPE
+#define copy_AUTHDATA_TYPE _rxkad_v5_copy_AUTHDATA_TYPE
+#define encode_CKSUMTYPE _rxkad_v5_encode_CKSUMTYPE
+#define decode_CKSUMTYPE _rxkad_v5_decode_CKSUMTYPE
+#define free_CKSUMTYPE _rxkad_v5_free_CKSUMTYPE
+#define length_CKSUMTYPE _rxkad_v5_length_CKSUMTYPE
+#define copy_CKSUMTYPE _rxkad_v5_copy_CKSUMTYPE
+#define encode_ENCTYPE _rxkad_v5_encode_ENCTYPE
+#define decode_ENCTYPE _rxkad_v5_decode_ENCTYPE
+#define free_ENCTYPE _rxkad_v5_free_ENCTYPE
+#define length_ENCTYPE _rxkad_v5_length_ENCTYPE
+#define copy_ENCTYPE _rxkad_v5_copy_ENCTYPE
+#define encode_krb5uint32 _rxkad_v5_encode_krb5uint32
+#define decode_krb5uint32 _rxkad_v5_decode_krb5uint32
+#define free_krb5uint32 _rxkad_v5_free_krb5uint32
+#define length_krb5uint32 _rxkad_v5_length_krb5uint32
+#define copy_krb5uint32 _rxkad_v5_copy_krb5uint32
 #define encode_krb5int32 _rxkad_v5_encode_krb5int32
 #define decode_krb5int32 _rxkad_v5_decode_krb5int32
 #define free_krb5int32 _rxkad_v5_free_krb5int32
 #define length_krb5int32 _rxkad_v5_length_krb5int32
 #define copy_krb5int32 _rxkad_v5_copy_krb5int32
-#define encode_AuthorizationDataElement _rxkad_v5_encode_AuthorizationDataElement
-#define decode_AuthorizationDataElement _rxkad_v5_decode_AuthorizationDataElement
-#define free_AuthorizationDataElement _rxkad_v5_free_AuthorizationDataElement
-#define length_AuthorizationDataElement _rxkad_v5_length_AuthorizationDataElement
-#define copy_AuthorizationDataElement _rxkad_v5_copy_AuthorizationDataElement
-#define encode_Ticket _rxkad_v5_encode_Ticket
-#define decode_Ticket _rxkad_v5_decode_Ticket
-#define free_Ticket _rxkad_v5_free_Ticket
-#define length_Ticket _rxkad_v5_length_Ticket
-#define copy_Ticket _rxkad_v5_copy_Ticket
-#define encode_EncryptedData _rxkad_v5_encode_EncryptedData
-#define decode_EncryptedData _rxkad_v5_decode_EncryptedData
-#define free_EncryptedData _rxkad_v5_free_EncryptedData
-#define length_EncryptedData _rxkad_v5_length_EncryptedData
-#define copy_EncryptedData _rxkad_v5_copy_EncryptedData
+#define encode_KerberosString _rxkad_v5_encode_KerberosString
+#define decode_KerberosString _rxkad_v5_decode_KerberosString
+#define free_KerberosString _rxkad_v5_free_KerberosString
+#define length_KerberosString _rxkad_v5_length_KerberosString
+#define copy_KerberosString _rxkad_v5_copy_KerberosString
+#define encode_Realm _rxkad_v5_encode_Realm
+#define decode_Realm _rxkad_v5_decode_Realm
+#define free_Realm _rxkad_v5_free_Realm
+#define length_Realm _rxkad_v5_length_Realm
+#define copy_Realm _rxkad_v5_copy_Realm
 #define encode_PrincipalName _rxkad_v5_encode_PrincipalName
 #define decode_PrincipalName _rxkad_v5_decode_PrincipalName
 #define free_PrincipalName _rxkad_v5_free_PrincipalName
 #define length_PrincipalName _rxkad_v5_length_PrincipalName
 #define copy_PrincipalName _rxkad_v5_copy_PrincipalName
-#define encode_HostAddresses _rxkad_v5_encode_HostAddresses
-#define decode_HostAddresses _rxkad_v5_decode_HostAddresses
-#define free_HostAddresses _rxkad_v5_free_HostAddresses
-#define length_HostAddresses _rxkad_v5_length_HostAddresses
-#define copy_HostAddresses _rxkad_v5_copy_HostAddresses
+#define encode_Principal _rxkad_v5_encode_Principal
+#define decode_Principal _rxkad_v5_decode_Principal
+#define free_Principal _rxkad_v5_free_Principal
+#define length_Principal _rxkad_v5_length_Principal
+#define copy_Principal _rxkad_v5_copy_Principal
+#define encode_Principals _rxkad_v5_encode_Principals
+#define decode_Principals _rxkad_v5_decode_Principals
+#define free_Principals _rxkad_v5_free_Principals
+#define length_Principals _rxkad_v5_length_Principals
+#define copy_Principals _rxkad_v5_copy_Principals
 #define encode_HostAddress _rxkad_v5_encode_HostAddress
 #define decode_HostAddress _rxkad_v5_decode_HostAddress
 #define free_HostAddress _rxkad_v5_free_HostAddress
 #define length_HostAddress _rxkad_v5_length_HostAddress
 #define copy_HostAddress _rxkad_v5_copy_HostAddress
-#define add_AuthorizationData _rxkad_v5_add_AuthorizationData
-#define remove_AuthorizationData _rxkad_v5_remove_AuthorizationData
-#define encode_AuthorizationData _rxkad_v5_encode_AuthorizationData
-#define decode_AuthorizationData _rxkad_v5_decode_AuthorizationData
-#define free_AuthorizationData _rxkad_v5_free_AuthorizationData
-#define length_AuthorizationData _rxkad_v5_length_AuthorizationData
-#define copy_AuthorizationData _rxkad_v5_copy_AuthorizationData
-#define encode_EncTicketPart _rxkad_v5_encode_EncTicketPart
-#define decode_EncTicketPart _rxkad_v5_decode_EncTicketPart
-#define free_EncTicketPart _rxkad_v5_free_EncTicketPart
-#define length_EncTicketPart _rxkad_v5_length_EncTicketPart
-#define copy_EncTicketPart _rxkad_v5_copy_EncTicketPart
+#define encode_HostAddresses _rxkad_v5_encode_HostAddresses
+#define decode_HostAddresses _rxkad_v5_decode_HostAddresses
+#define free_HostAddresses _rxkad_v5_free_HostAddresses
+#define length_HostAddresses _rxkad_v5_length_HostAddresses
+#define copy_HostAddresses _rxkad_v5_copy_HostAddresses
 #define encode_KerberosTime _rxkad_v5_encode_KerberosTime
 #define decode_KerberosTime _rxkad_v5_decode_KerberosTime
 #define free_KerberosTime _rxkad_v5_free_KerberosTime
 #define length_KerberosTime _rxkad_v5_length_KerberosTime
 #define copy_KerberosTime _rxkad_v5_copy_KerberosTime
-#define encode_TransitedEncoding _rxkad_v5_encode_TransitedEncoding
-#define decode_TransitedEncoding _rxkad_v5_decode_TransitedEncoding
-#define free_TransitedEncoding _rxkad_v5_free_TransitedEncoding
-#define length_TransitedEncoding _rxkad_v5_length_TransitedEncoding
-#define copy_TransitedEncoding _rxkad_v5_copy_TransitedEncoding
-#define encode_EncryptionKey _rxkad_v5_encode_EncryptionKey
-#define decode_EncryptionKey _rxkad_v5_decode_EncryptionKey
-#define free_EncryptionKey _rxkad_v5_free_EncryptionKey
-#define length_EncryptionKey _rxkad_v5_length_EncryptionKey
-#define copy_EncryptionKey _rxkad_v5_copy_EncryptionKey
+#define encode_AuthorizationDataElement _rxkad_v5_encode_AuthorizationDataElement
+#define decode_AuthorizationDataElement _rxkad_v5_decode_AuthorizationDataElement
+#define free_AuthorizationDataElement _rxkad_v5_free_AuthorizationDataElement
+#define length_AuthorizationDataElement _rxkad_v5_length_AuthorizationDataElement
+#define copy_AuthorizationDataElement _rxkad_v5_copy_AuthorizationDataElement
+#define encode_AuthorizationData _rxkad_v5_encode_AuthorizationData
+#define decode_AuthorizationData _rxkad_v5_decode_AuthorizationData
+#define free_AuthorizationData _rxkad_v5_free_AuthorizationData
+#define length_AuthorizationData _rxkad_v5_length_AuthorizationData
+#define copy_AuthorizationData _rxkad_v5_copy_AuthorizationData
+#define encode_APOptions _rxkad_v5_encode_APOptions
+#define decode_APOptions _rxkad_v5_decode_APOptions
+#define free_APOptions _rxkad_v5_free_APOptions
+#define length_APOptions _rxkad_v5_length_APOptions
+#define copy_APOptions _rxkad_v5_copy_APOptions
 #define encode_TicketFlags _rxkad_v5_encode_TicketFlags
 #define decode_TicketFlags _rxkad_v5_decode_TicketFlags
 #define free_TicketFlags _rxkad_v5_free_TicketFlags
 #define length_TicketFlags _rxkad_v5_length_TicketFlags
 #define copy_TicketFlags _rxkad_v5_copy_TicketFlags
-#define encode_Realm _rxkad_v5_encode_Realm
-#define decode_Realm _rxkad_v5_decode_Realm
-#define free_Realm _rxkad_v5_free_Realm
-#define length_Realm _rxkad_v5_length_Realm
-#define copy_Realm _rxkad_v5_copy_Realm
-#define encode_ENCTYPE _rxkad_v5_encode_ENCTYPE
-#define decode_ENCTYPE _rxkad_v5_decode_ENCTYPE
-#define free_ENCTYPE _rxkad_v5_free_ENCTYPE
-#define length_ENCTYPE _rxkad_v5_length_ENCTYPE
-#define copy_ENCTYPE _rxkad_v5_copy_ENCTYPE
-#define encode_NAME_TYPE _rxkad_v5_encode_NAME_TYPE
-#define decode_NAME_TYPE _rxkad_v5_decode_NAME_TYPE
-#define free_NAME_TYPE _rxkad_v5_free_NAME_TYPE
-#define length_NAME_TYPE _rxkad_v5_length_NAME_TYPE
-#define copy_NAME_TYPE _rxkad_v5_copy_NAME_TYPE
-#define der_copy_bit_string _rxkad_v5_der_copy_bit_string
-#define der_copy_bmp_string _rxkad_v5_der_copy_bmp_string
-#define der_copy_general_string _rxkad_v5_der_copy_general_string
-#define der_copy_generalized_time _rxkad_v5_der_copy_generalized_time
-#define der_copy_heim_integer _rxkad_v5_der_copy_heim_integer
-#define der_copy_ia5_string _rxkad_v5_der_copy_ia5_string
-#define der_copy_integer _rxkad_v5_der_copy_integer
-#define der_copy_octet_string _rxkad_v5_der_copy_octet_string
-#define der_copy_oid _rxkad_v5_der_copy_oid
-#define der_copy_printable_string _rxkad_v5_der_copy_printable_string
-#define der_copy_universal_string _rxkad_v5_der_copy_universal_string
-#define der_copy_unsigned _rxkad_v5_der_copy_unsigned
-#define der_copy_utctime _rxkad_v5_der_copy_utctime
-#define der_copy_utf8string _rxkad_v5_der_copy_utf8string
-#define der_copy_visible_string _rxkad_v5_der_copy_visible_string
-#define der_free_bit_string _rxkad_v5_der_free_bit_string
-#define der_free_bmp_string _rxkad_v5_der_free_bmp_string
+#define encode_KDCOptions _rxkad_v5_encode_KDCOptions
+#define decode_KDCOptions _rxkad_v5_decode_KDCOptions
+#define free_KDCOptions _rxkad_v5_free_KDCOptions
+#define length_KDCOptions _rxkad_v5_length_KDCOptions
+#define copy_KDCOptions _rxkad_v5_copy_KDCOptions
+#define encode_LR_TYPE _rxkad_v5_encode_LR_TYPE
+#define decode_LR_TYPE _rxkad_v5_decode_LR_TYPE
+#define free_LR_TYPE _rxkad_v5_free_LR_TYPE
+#define length_LR_TYPE _rxkad_v5_length_LR_TYPE
+#define copy_LR_TYPE _rxkad_v5_copy_LR_TYPE
+#define encode_LastReq _rxkad_v5_encode_LastReq
+#define decode_LastReq _rxkad_v5_decode_LastReq
+#define free_LastReq _rxkad_v5_free_LastReq
+#define length_LastReq _rxkad_v5_length_LastReq
+#define copy_LastReq _rxkad_v5_copy_LastReq
+#define encode_EncryptedData _rxkad_v5_encode_EncryptedData
+#define decode_EncryptedData _rxkad_v5_decode_EncryptedData
+#define free_EncryptedData _rxkad_v5_free_EncryptedData
+#define length_EncryptedData _rxkad_v5_length_EncryptedData
+#define copy_EncryptedData _rxkad_v5_copy_EncryptedData
+#define encode_EncryptionKey _rxkad_v5_encode_EncryptionKey
+#define decode_EncryptionKey _rxkad_v5_decode_EncryptionKey
+#define free_EncryptionKey _rxkad_v5_free_EncryptionKey
+#define length_EncryptionKey _rxkad_v5_length_EncryptionKey
+#define copy_EncryptionKey _rxkad_v5_copy_EncryptionKey
+#define encode_TransitedEncoding _rxkad_v5_encode_TransitedEncoding
+#define decode_TransitedEncoding _rxkad_v5_decode_TransitedEncoding
+#define free_TransitedEncoding _rxkad_v5_free_TransitedEncoding
+#define length_TransitedEncoding _rxkad_v5_length_TransitedEncoding
+#define copy_TransitedEncoding _rxkad_v5_copy_TransitedEncoding
+#define encode_Ticket _rxkad_v5_encode_Ticket
+#define decode_Ticket _rxkad_v5_decode_Ticket
+#define free_Ticket _rxkad_v5_free_Ticket
+#define length_Ticket _rxkad_v5_length_Ticket
+#define copy_Ticket _rxkad_v5_copy_Ticket
+#define encode_EncTicketPart _rxkad_v5_encode_EncTicketPart
+#define decode_EncTicketPart _rxkad_v5_decode_EncTicketPart
+#define free_EncTicketPart _rxkad_v5_free_EncTicketPart
+#define length_EncTicketPart _rxkad_v5_length_EncTicketPart
+#define copy_EncTicketPart _rxkad_v5_copy_EncTicketPart
+#define der_get_unsigned _rxkad_v5_der_get_unsigned
+#define der_get_unsigned64 _rxkad_v5_der_get_unsigned64
+#define der_get_integer _rxkad_v5_der_get_integer
+#define der_get_integer64 _rxkad_v5_der_get_integer64
+#define der_get_length _rxkad_v5_der_get_length
+#define der_get_boolean _rxkad_v5_der_get_boolean
+#define der_get_general_string _rxkad_v5_der_get_general_string
+#define der_get_utf8string _rxkad_v5_der_get_utf8string
+#define der_get_printable_string _rxkad_v5_der_get_printable_string
+#define der_get_ia5_string _rxkad_v5_der_get_ia5_string
+#define der_get_bmp_string _rxkad_v5_der_get_bmp_string
+#define der_get_universal_string _rxkad_v5_der_get_universal_string
+#define der_get_visible_string _rxkad_v5_der_get_visible_string
+#define der_get_octet_string _rxkad_v5_der_get_octet_string
+#define der_get_octet_string_ber _rxkad_v5_der_get_octet_string_ber
+#define der_get_heim_integer _rxkad_v5_der_get_heim_integer
+#define der_get_time _rxkad_v5_der_get_time
+#define der_get_generalized_time _rxkad_v5_der_get_generalized_time
+#define der_get_utctime _rxkad_v5_der_get_utctime
+#define der_get_oid _rxkad_v5_der_get_oid
+#define der_get_tag _rxkad_v5_der_get_tag
+#define der_match_tag _rxkad_v5_der_match_tag
+#define der_match_tag2 _rxkad_v5_der_match_tag2
+#define der_match_tag_and_length _rxkad_v5_der_match_tag_and_length
+#define der_get_bit_string _rxkad_v5_der_get_bit_string
+#define der_put_unsigned _rxkad_v5_der_put_unsigned
+#define der_put_unsigned64 _rxkad_v5_der_put_unsigned64
+#define der_put_integer _rxkad_v5_der_put_integer
+#define der_put_integer64 _rxkad_v5_der_put_integer64
+#define der_put_length _rxkad_v5_der_put_length
+#define der_put_boolean _rxkad_v5_der_put_boolean
+#define der_put_general_string _rxkad_v5_der_put_general_string
+#define der_put_utf8string _rxkad_v5_der_put_utf8string
+#define der_put_printable_string _rxkad_v5_der_put_printable_string
+#define der_put_ia5_string _rxkad_v5_der_put_ia5_string
+#define der_put_bmp_string _rxkad_v5_der_put_bmp_string
+#define der_put_universal_string _rxkad_v5_der_put_universal_string
+#define der_put_visible_string _rxkad_v5_der_put_visible_string
+#define der_put_octet_string _rxkad_v5_der_put_octet_string
+#define der_put_heim_integer _rxkad_v5_der_put_heim_integer
+#define der_put_generalized_time _rxkad_v5_der_put_generalized_time
+#define der_put_utctime _rxkad_v5_der_put_utctime
+#define der_put_oid _rxkad_v5_der_put_oid
+#define der_put_tag _rxkad_v5_der_put_tag
+#define der_put_length_and_tag _rxkad_v5_der_put_length_and_tag
+#define der_put_bit_string _rxkad_v5_der_put_bit_string
 #define der_free_general_string _rxkad_v5_der_free_general_string
-#define der_free_generalized_time _rxkad_v5_der_free_generalized_time
-#define der_free_heim_integer _rxkad_v5_der_free_heim_integer
-#define der_free_ia5_string _rxkad_v5_der_free_ia5_string
 #define der_free_integer _rxkad_v5_der_free_integer
-#define der_free_octet_string _rxkad_v5_der_free_octet_string
-#define der_free_oid _rxkad_v5_der_free_oid
-#define der_free_printable_string _rxkad_v5_der_free_printable_string
-#define der_free_universal_string _rxkad_v5_der_free_universal_string
+#define der_free_integer64 _rxkad_v5_der_free_integer64
 #define der_free_unsigned _rxkad_v5_der_free_unsigned
+#define der_free_unsigned64 _rxkad_v5_der_free_unsigned64
+#define der_free_generalized_time _rxkad_v5_der_free_generalized_time
 #define der_free_utctime _rxkad_v5_der_free_utctime
 #define der_free_utf8string _rxkad_v5_der_free_utf8string
+#define der_free_printable_string _rxkad_v5_der_free_printable_string
+#define der_free_ia5_string _rxkad_v5_der_free_ia5_string
+#define der_free_bmp_string _rxkad_v5_der_free_bmp_string
+#define der_free_universal_string _rxkad_v5_der_free_universal_string
 #define der_free_visible_string _rxkad_v5_der_free_visible_string
-#define der_get_bit_string _rxkad_v5_der_get_bit_string
-#define der_get_generalized_time _rxkad_v5_der_get_generalized_time
-#define der_get_heim_integer _rxkad_v5_der_get_heim_integer
-#define der_get_ia5_string _rxkad_v5_der_get_ia5_string
-#define der_get_octet_string_ber _rxkad_v5_der_get_octet_string_ber
-#define der_get_printable_string _rxkad_v5_der_get_printable_string
-#define der_get_time _rxkad_v5_der_get_time
-#define der_get_utf8string _rxkad_v5_der_get_utf8string
-#define der_get_visible_string _rxkad_v5_der_get_visible_string
-#define der_get_bmp_string _rxkad_v5_der_get_bmp_string
-#define der_get_boolean _rxkad_v5_der_get_boolean
-#define der_get_unsigned  _rxkad_v5_der_get_unsigned
-#define der_get_integer _rxkad_v5_der_get_integer
-#define der_get_int  _rxkad_v5_der_get_int
-#define der_get_length  _rxkad_v5_der_get_length
-#define der_get_general_string  _rxkad_v5_der_get_general_string
-#define der_get_octet_string  _rxkad_v5_der_get_octet_string
-#define der_get_oid  _rxkad_v5_der_get_oid
-#define der_get_tag  _rxkad_v5_der_get_tag
-#define der_get_universal_string _rxkad_v5_der_get_universal_string
-#define der_get_utctime _rxkad_v5_der_get_utctime
-#define der_length_bit_string _rxkad_v5_der_length_bit_string
-#define der_length_bmp_string _rxkad_v5_der_length_bmp_string
-#define der_length_boolean _rxkad_v5_der_length_boolean
+#define der_free_octet_string _rxkad_v5_der_free_octet_string
+#define der_free_heim_integer _rxkad_v5_der_free_heim_integer
+#define der_free_oid _rxkad_v5_der_free_oid
+#define der_free_bit_string _rxkad_v5_der_free_bit_string
+#define len_oid _rxkad_v5_len_oid
+#define der_length_len _rxkad_v5_der_length_len
+#define der_length_tag _rxkad_v5_der_length_tag
+#define der_length_integer _rxkad_v5_der_length_integer
+#define der_length_integer64 _rxkad_v5_der_length_integer64
+#define der_length_unsigned _rxkad_v5_der_length_unsigned
+#define der_length_unsigned64 _rxkad_v5_der_length_unsigned64
 #define der_length_enumerated _rxkad_v5_der_length_enumerated
 #define der_length_general_string _rxkad_v5_der_length_general_string
-#define der_length_generalized_time _rxkad_v5_der_length_generalized_time
-#define der_length_heim_integer _rxkad_v5_der_length_heim_integer
+#define der_length_utf8string _rxkad_v5_der_length_utf8string
+#define der_length_printable_string _rxkad_v5_der_length_printable_string
 #define der_length_ia5_string _rxkad_v5_der_length_ia5_string
-#define der_length_integer _rxkad_v5_der_length_integer
-#define der_length_len _rxkad_v5_der_length_len
+#define der_length_bmp_string _rxkad_v5_der_length_bmp_string
+#define der_length_universal_string _rxkad_v5_der_length_universal_string
+#define der_length_visible_string _rxkad_v5_der_length_visible_string
 #define der_length_octet_string _rxkad_v5_der_length_octet_string
+#define der_length_heim_integer _rxkad_v5_der_length_heim_integer
 #define der_length_oid _rxkad_v5_der_length_oid
-#define der_length_printable_string _rxkad_v5_der_length_printable_string
-#define der_length_tag _rxkad_v5_der_length_tag
-#define der_length_universal_string _rxkad_v5_der_length_universal_string
-#define der_length_unsigned _rxkad_v5_der_length_unsigned
+#define der_length_generalized_time _rxkad_v5_der_length_generalized_time
 #define der_length_utctime _rxkad_v5_der_length_utctime
-#define der_length_utf8string _rxkad_v5_der_length_utf8string
-#define der_length_visible_string _rxkad_v5_der_length_visible_string
-#define der_match_tag  _rxkad_v5_der_match_tag
-#define der_match_tag_and_length  _rxkad_v5_der_match_tag_and_length
-#define der_match_tag2 _rxkad_v5_der_match_tag2
-#define decode_integer  _rxkad_v5_decode_integer
-#define decode_unsigned  _rxkad_v5_decode_unsigned
-#define decode_enumerated  _rxkad_v5_decode_enumerated
-#define decode_general_string  _rxkad_v5_decode_general_string
-#define decode_octet_string  _rxkad_v5_decode_octet_string
-#define decode_oid  _rxkad_v5_decode_oid
-#define decode_generalized_time  _rxkad_v5_decode_generalized_time
-#define fix_dce _rxkad_v5_fix_dce
-#define der_put_bit_string _rxkad_v5_der_put_bit_string
-#define der_put_generalized_time _rxkad_v5_der_put_generalized_time
-#define der_put_heim_integer _rxkad_v5_der_put_heim_integer
-#define der_put_ia5_string _rxkad_v5_der_put_ia5_string
-#define der_put_printable_string _rxkad_v5_der_put_printable_string
-#define der_put_utf8string _rxkad_v5_der_put_utf8string
-#define der_put_visible_string _rxkad_v5_der_put_visible_string
-#define der_put_bmp_string _rxkad_v5_der_put_bmp_string
-#define der_put_boolean _rxkad_v5_der_put_boolean
-#define der_put_unsigned  _rxkad_v5_der_put_unsigned
-#define der_put_int  _rxkad_v5_der_put_int
-#define der_put_integer _rxkad_v5_der_put_integer
-#define der_put_length  _rxkad_v5_der_put_length
-#define der_put_general_string  _rxkad_v5_der_put_general_string
-#define der_put_octet_string  _rxkad_v5_der_put_octet_string
-#define der_put_oid  _rxkad_v5_der_put_oid
-#define der_put_tag  _rxkad_v5_der_put_tag
-#define der_put_length_and_tag  _rxkad_v5_der_put_length_and_tag
-#define der_put_universal_string _rxkad_v5_der_put_universal_string
-#define der_put_utctime _rxkad_v5_der_put_utctime
-#define encode_integer  _rxkad_v5_encode_integer
-#define encode_unsigned  _rxkad_v5_encode_unsigned
-#define encode_enumerated  _rxkad_v5_encode_enumerated
-#define encode_general_string  _rxkad_v5_encode_general_string
-#define encode_octet_string  _rxkad_v5_encode_octet_string
-#define encode_oid _rxkad_v5_encode_oid
-#define time2generalizedtime  _rxkad_v5_time2generalizedtime
-#define encode_generalized_time  _rxkad_v5_encode_generalized_time
-#define free_general_string  _rxkad_v5_free_general_string
-#define free_octet_string  _rxkad_v5_free_octet_string
-#define free_oid  _rxkad_v5_free_oid
-#define len_unsigned  _rxkad_v5_len_unsigned
-#define len_int  _rxkad_v5_len_int
-#define len_oid  _rxkad_v5_len_oid
-#define length_len  _rxkad_v5_length_len
-#define length_integer  _rxkad_v5_length_integer
-#define length_unsigned  _rxkad_v5_length_unsigned
-#define length_enumerated  _rxkad_v5_length_enumerated
-#define length_general_string  _rxkad_v5_length_general_string
-#define length_octet_string  _rxkad_v5_length_octet_string
-#define length_oid  _rxkad_v5_length_oid
-#define length_generalized_time  _rxkad_v5_length_generalized_time
-#define copy_general_string  _rxkad_v5_copy_general_string
-#define copy_octet_string  _rxkad_v5_copy_octet_string
-#define copy_oid  _rxkad_v5_copy_oid
+#define der_length_boolean _rxkad_v5_der_length_boolean
+#define der_length_bit_string _rxkad_v5_der_length_bit_string
+#define der_copy_general_string _rxkad_v5_der_copy_general_string
+#define der_copy_integer _rxkad_v5_der_copy_integer
+#define der_copy_integer64 _rxkad_v5_der_copy_integer64
+#define der_copy_unsigned _rxkad_v5_der_copy_unsigned
+#define der_copy_unsigned64 _rxkad_v5_der_copy_unsigned64
+#define der_copy_generalized_time _rxkad_v5_der_copy_generalized_time
+#define der_copy_utctime _rxkad_v5_der_copy_utctime
+#define der_copy_utf8string _rxkad_v5_der_copy_utf8string
+#define der_copy_printable_string _rxkad_v5_der_copy_printable_string
+#define der_copy_ia5_string _rxkad_v5_der_copy_ia5_string
+#define der_copy_bmp_string _rxkad_v5_der_copy_bmp_string
+#define der_copy_universal_string _rxkad_v5_der_copy_universal_string
+#define der_copy_visible_string _rxkad_v5_der_copy_visible_string
+#define der_copy_octet_string _rxkad_v5_der_copy_octet_string
+#define der_copy_heim_integer _rxkad_v5_der_copy_heim_integer
+#define der_copy_oid _rxkad_v5_der_copy_oid
+#define der_copy_bit_string _rxkad_v5_der_copy_bit_string
 #define TicketFlags2int _rxkad_v5_TicketFlags2int
 #define int2TicketFlags _rxkad_v5_int2TicketFlags
-#ifndef HAVE_TIMEGM
-#define timegm _rxkad_timegm
-#endif
-#define _heim_fix_dce _rxkad_v5__heim_fix_dce
-#define _der_timegm _rxkad_v5__der_timegm
-#define _heim_der_set_sort _rxkad_v5__heim_der_set_sort
-#define _heim_len_int _rxkad_v5__heim_len_int
-#define _heim_len_unsigned _rxkad_v5__heim_len_unsigned
-#define _heim_time2generalizedtime _rxkad_v5__heim_time2generalizedtime
index f182325..83a419b 100644 (file)
@@ -1,6 +1,214 @@
+#define HEIMDAL_UNUSED_ATTRIBUTE AFS_UNUSED
+int ASN1CALL decode_MESSAGE_TYPE(const unsigned char *, size_t,
+                                MESSAGE_TYPE *, size_t *);
+int ASN1CALL encode_MESSAGE_TYPE(unsigned char *, size_t,
+                                const MESSAGE_TYPE *, size_t *);
+size_t ASN1CALL length_MESSAGE_TYPE(const MESSAGE_TYPE *);
+int ASN1CALL copy_MESSAGE_TYPE(const MESSAGE_TYPE *, MESSAGE_TYPE *);
+void ASN1CALL free_MESSAGE_TYPE(MESSAGE_TYPE *);
+
+
+int ASN1CALL decode_krb5uint32(const unsigned char *, size_t, krb5uint32 *,
+                              size_t *);
+int ASN1CALL encode_krb5uint32(unsigned char *, size_t, const krb5uint32 *,
+                              size_t *);
+size_t ASN1CALL length_krb5uint32(const krb5uint32 *);
+int ASN1CALL copy_krb5uint32(const krb5uint32 *, krb5uint32 *);
+void ASN1CALL free_krb5uint32(krb5uint32 *);
+
+
+int ASN1CALL decode_krb5int32(const unsigned char *, size_t, krb5int32 *,
+                             size_t *);
+int ASN1CALL encode_krb5int32(unsigned char *, size_t, const krb5int32 *,
+                             size_t *);
+size_t ASN1CALL length_krb5int32(const krb5int32 *);
+int ASN1CALL copy_krb5int32(const krb5int32 *, krb5int32 *);
+void ASN1CALL free_krb5int32(krb5int32 *);
+
+
+int ASN1CALL decode_APOptions(const unsigned char *, size_t, APOptions *,
+                             size_t *);
+int ASN1CALL encode_APOptions(unsigned char *, size_t, const APOptions *,
+                             size_t *);
+size_t ASN1CALL length_APOptions(const APOptions *);
+int ASN1CALL copy_APOptions(const APOptions *, APOptions *);
+void ASN1CALL free_APOptions(APOptions *);
+
+
+int ASN1CALL decode_TYPED_DATA(const unsigned char *, size_t, TYPED_DATA *,
+                              size_t *);
+int ASN1CALL encode_TYPED_DATA(unsigned char *, size_t, const TYPED_DATA *,
+                              size_t *);
+size_t ASN1CALL length_TYPED_DATA(const TYPED_DATA *);
+int ASN1CALL copy_TYPED_DATA(const TYPED_DATA *, TYPED_DATA *);
+void ASN1CALL free_TYPED_DATA(TYPED_DATA *);
+
+
+int ASN1CALL decode_KDC_REQ(const unsigned char *, size_t, KDC_REQ *,
+                           size_t *);
+int ASN1CALL encode_KDC_REQ(unsigned char *, size_t, const KDC_REQ *,
+                           size_t *);
+size_t ASN1CALL length_KDC_REQ(const KDC_REQ *);
+int ASN1CALL copy_KDC_REQ(const KDC_REQ *, KDC_REQ *);
+void ASN1CALL free_KDC_REQ(KDC_REQ *);
+
+
+int ASN1CALL decode_PROV_SRV_LOCATION(const unsigned char *, size_t,
+                                     PROV_SRV_LOCATION *, size_t *);
+int ASN1CALL encode_PROV_SRV_LOCATION(unsigned char *, size_t,
+                                     const PROV_SRV_LOCATION *, size_t *);
+size_t ASN1CALL length_PROV_SRV_LOCATION(const PROV_SRV_LOCATION *);
+int ASN1CALL copy_PROV_SRV_LOCATION(const PROV_SRV_LOCATION *,
+                                   PROV_SRV_LOCATION *);
+void ASN1CALL free_PROV_SRV_LOCATION(PROV_SRV_LOCATION *);
+
+
+int ASN1CALL decode_AD_MANDATORY_FOR_KDC(const unsigned char *, size_t,
+                                        AD_MANDATORY_FOR_KDC *, size_t *);
+int ASN1CALL encode_AD_MANDATORY_FOR_KDC(unsigned char *, size_t,
+                                        const AD_MANDATORY_FOR_KDC *,
+                                        size_t *);
+size_t ASN1CALL length_AD_MANDATORY_FOR_KDC(const AD_MANDATORY_FOR_KDC *);
+int ASN1CALL copy_AD_MANDATORY_FOR_KDC(const AD_MANDATORY_FOR_KDC *,
+                                      AD_MANDATORY_FOR_KDC *);
+void ASN1CALL free_AD_MANDATORY_FOR_KDC(AD_MANDATORY_FOR_KDC *);
+
+
+int ASN1CALL decode_PA_SAM_TYPE(const unsigned char *, size_t, PA_SAM_TYPE *,
+                               size_t *);
+int ASN1CALL encode_PA_SAM_TYPE(unsigned char *, size_t, const PA_SAM_TYPE *,
+                               size_t *);
+size_t ASN1CALL length_PA_SAM_TYPE(const PA_SAM_TYPE *);
+int ASN1CALL copy_PA_SAM_TYPE(const PA_SAM_TYPE *, PA_SAM_TYPE *);
+void ASN1CALL free_PA_SAM_TYPE(PA_SAM_TYPE *);
+
+
+int ASN1CALL decode_PA_SAM_REDIRECT(const unsigned char *, size_t,
+                                   PA_SAM_REDIRECT *, size_t *);
+int ASN1CALL encode_PA_SAM_REDIRECT(unsigned char *, size_t,
+                                   const PA_SAM_REDIRECT *, size_t *);
+size_t ASN1CALL length_PA_SAM_REDIRECT(const PA_SAM_REDIRECT *);
+int ASN1CALL copy_PA_SAM_REDIRECT(const PA_SAM_REDIRECT *, PA_SAM_REDIRECT *);
+void ASN1CALL free_PA_SAM_REDIRECT(PA_SAM_REDIRECT *);
+
+
+int ASN1CALL decode_SAMFlags(const unsigned char *, size_t, SAMFlags *,
+                            size_t *);
+int ASN1CALL encode_SAMFlags(unsigned char *, size_t, const SAMFlags *,
+                            size_t *);
+size_t ASN1CALL length_SAMFlags(const SAMFlags *);
+int ASN1CALL copy_SAMFlags(const SAMFlags *, SAMFlags *);
+void ASN1CALL free_SAMFlags(SAMFlags *);
+
+
+int ASN1CALL decode_PA_SAM_CHALLENGE_2_BODY(const unsigned char *, size_t,
+                                           PA_SAM_CHALLENGE_2_BODY *,
+                                           size_t *);
+int ASN1CALL encode_PA_SAM_CHALLENGE_2_BODY(unsigned char *, size_t,
+                                           const PA_SAM_CHALLENGE_2_BODY *,
+                                           size_t *);
+size_t ASN1CALL length_PA_SAM_CHALLENGE_2_BODY(const PA_SAM_CHALLENGE_2_BODY
+                                              *);
+int ASN1CALL copy_PA_SAM_CHALLENGE_2_BODY(const PA_SAM_CHALLENGE_2_BODY *,
+                                         PA_SAM_CHALLENGE_2_BODY *);
+void ASN1CALL free_PA_SAM_CHALLENGE_2_BODY(PA_SAM_CHALLENGE_2_BODY *);
+
+
+int ASN1CALL decode_PA_SAM_CHALLENGE_2(const unsigned char *, size_t,
+                                      PA_SAM_CHALLENGE_2 *, size_t *);
+int ASN1CALL encode_PA_SAM_CHALLENGE_2(unsigned char *, size_t,
+                                      const PA_SAM_CHALLENGE_2 *, size_t *);
+size_t ASN1CALL length_PA_SAM_CHALLENGE_2(const PA_SAM_CHALLENGE_2 *);
+int ASN1CALL copy_PA_SAM_CHALLENGE_2(const PA_SAM_CHALLENGE_2 *,
+                                    PA_SAM_CHALLENGE_2 *);
+void ASN1CALL free_PA_SAM_CHALLENGE_2(PA_SAM_CHALLENGE_2 *);
+
+
+int ASN1CALL decode_PA_SAM_RESPONSE_2(const unsigned char *, size_t,
+                                     PA_SAM_RESPONSE_2 *, size_t *);
+int ASN1CALL encode_PA_SAM_RESPONSE_2(unsigned char *, size_t,
+                                     const PA_SAM_RESPONSE_2 *, size_t *);
+size_t ASN1CALL length_PA_SAM_RESPONSE_2(const PA_SAM_RESPONSE_2 *);
+int ASN1CALL copy_PA_SAM_RESPONSE_2(const PA_SAM_RESPONSE_2 *,
+                                   PA_SAM_RESPONSE_2 *);
+void ASN1CALL free_PA_SAM_RESPONSE_2(PA_SAM_RESPONSE_2 *);
+
+
+int ASN1CALL decode_PA_ENC_SAM_RESPONSE_ENC(const unsigned char *, size_t,
+                                           PA_ENC_SAM_RESPONSE_ENC *,
+                                           size_t *);
+int ASN1CALL encode_PA_ENC_SAM_RESPONSE_ENC(unsigned char *, size_t,
+                                           const PA_ENC_SAM_RESPONSE_ENC *,
+                                           size_t *);
+size_t ASN1CALL length_PA_ENC_SAM_RESPONSE_ENC(const PA_ENC_SAM_RESPONSE_ENC
+                                              *);
+int ASN1CALL copy_PA_ENC_SAM_RESPONSE_ENC(const PA_ENC_SAM_RESPONSE_ENC *,
+                                         PA_ENC_SAM_RESPONSE_ENC *);
+void ASN1CALL free_PA_ENC_SAM_RESPONSE_ENC(PA_ENC_SAM_RESPONSE_ENC *);
+
+
+int ASN1CALL decode_FastOptions(const unsigned char *, size_t, FastOptions *,
+                               size_t *);
+int ASN1CALL encode_FastOptions(unsigned char *, size_t, const FastOptions *,
+                               size_t *);
+size_t ASN1CALL length_FastOptions(const FastOptions *);
+int ASN1CALL copy_FastOptions(const FastOptions *, FastOptions *);
+void ASN1CALL free_FastOptions(FastOptions *);
+
+
+int ASN1CALL decode_KrbFastArmoredReq(const unsigned char *, size_t,
+                                     KrbFastArmoredReq *, size_t *);
+int ASN1CALL encode_KrbFastArmoredReq(unsigned char *, size_t,
+                                     const KrbFastArmoredReq *, size_t *);
+size_t ASN1CALL length_KrbFastArmoredReq(const KrbFastArmoredReq *);
+int ASN1CALL copy_KrbFastArmoredReq(const KrbFastArmoredReq *,
+                                   KrbFastArmoredReq *);
+void ASN1CALL free_KrbFastArmoredReq(KrbFastArmoredReq *);
+
+
+int ASN1CALL decode_KrbFastArmoredRep(const unsigned char *, size_t,
+                                     KrbFastArmoredRep *, size_t *);
+int ASN1CALL encode_KrbFastArmoredRep(unsigned char *, size_t,
+                                     const KrbFastArmoredRep *, size_t *);
+size_t ASN1CALL length_KrbFastArmoredRep(const KrbFastArmoredRep *);
+int ASN1CALL copy_KrbFastArmoredRep(const KrbFastArmoredRep *,
+                                   KrbFastArmoredRep *);
+void ASN1CALL free_KrbFastArmoredRep(KrbFastArmoredRep *);
+
+
+int ASN1CALL decode_KDCFastFlags(const unsigned char *, size_t,
+                                KDCFastFlags *, size_t *);
+int ASN1CALL encode_KDCFastFlags(unsigned char *, size_t,
+                                const KDCFastFlags *, size_t *);
+size_t ASN1CALL length_KDCFastFlags(const KDCFastFlags *);
+int ASN1CALL copy_KDCFastFlags(const KDCFastFlags *, KDCFastFlags *);
+void ASN1CALL free_KDCFastFlags(KDCFastFlags *);
+
+
+int ASN1CALL decode_KERB_TGS_REP_IN(const unsigned char *, size_t,
+                                   KERB_TGS_REP_IN *, size_t *);
+int ASN1CALL encode_KERB_TGS_REP_IN(unsigned char *, size_t,
+                                   const KERB_TGS_REP_IN *, size_t *);
+size_t ASN1CALL length_KERB_TGS_REP_IN(const KERB_TGS_REP_IN *);
+int ASN1CALL copy_KERB_TGS_REP_IN(const KERB_TGS_REP_IN *, KERB_TGS_REP_IN *);
+void ASN1CALL free_KERB_TGS_REP_IN(KERB_TGS_REP_IN *);
+
+
+int ASN1CALL decode_KERB_TGS_REP_OUT(const unsigned char *, size_t,
+                                    KERB_TGS_REP_OUT *, size_t *);
+int ASN1CALL encode_KERB_TGS_REP_OUT(unsigned char *, size_t,
+                                    const KERB_TGS_REP_OUT *, size_t *);
+size_t ASN1CALL length_KERB_TGS_REP_OUT(const KERB_TGS_REP_OUT *);
+int ASN1CALL copy_KERB_TGS_REP_OUT(const KERB_TGS_REP_OUT *,
+                                  KERB_TGS_REP_OUT *);
+void ASN1CALL free_KERB_TGS_REP_OUT(KERB_TGS_REP_OUT *);
+
+
 /* Generated from ./krb5.asn1 */
 /* Do not edit */
 
+#define  ASN1_LIB
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 #include <limits.h>
 #include <asn1_err.h>
 
-int
-encode_krb5int32(unsigned char *p, size_t len, const krb5int32 * data, size_t * size)
+
+int ASN1CALL
+encode_NAME_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, const NAME_TYPE * data,
+                size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    i = 0;
-    e = der_put_integer(p, len, data, &l);
-    if (e)
-       return e;
-    p -= l;
-    len -= l;
-    ret += l;
+    {
+       int enumint = (int) *data;
+       e = der_put_integer(p, len, &enumint, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
 
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
+    }
+    ;
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -35,18 +250,21 @@ encode_krb5int32(unsigned char *p, size_t len, const krb5int32 * data, size_t *
     return 0;
 }
 
-int
-decode_krb5int32(const unsigned char *p, size_t len, krb5int32 * data, size_t * size)
+int ASN1CALL
+decode_NAME_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, NAME_TYPE * data,
+                size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
        if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
@@ -61,153 +279,285 @@ decode_krb5int32(const unsigned char *p, size_t len, krb5int32 * data, size_t *
            goto fail;
        }
        len = Top_datalen;
-       e = der_get_integer(p, len, data, &l);
-       if (e)
-           goto fail;
-       p += l;
-       len -= l;
-       ret += l;
+       {
+           int enumint;
+           e = der_get_integer(p, len, &enumint, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           *data = enumint;
+       }
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_krb5int32(data);
+  fail:
+    free_NAME_TYPE(data);
     return e;
 }
 
-void
-free_krb5int32(krb5int32 * data)
+void ASN1CALL
+free_NAME_TYPE(NAME_TYPE * data)
 {
 }
 
-size_t
-length_krb5int32(const krb5int32 * data)
+size_t ASN1CALL
+length_NAME_TYPE(const NAME_TYPE * data)
 {
     size_t ret = 0;
-    ret += der_length_integer(data);
+    {
+       int enumint = *data;
+       ret += der_length_integer(&enumint);
+    }
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_krb5int32(const krb5int32 * from, krb5int32 * to)
+int ASN1CALL
+copy_NAME_TYPE(const NAME_TYPE * from, NAME_TYPE * to)
 {
     memset(to, 0, sizeof(*to));
     *(to) = *(from);
     return 0;
 }
 
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_Ticket(unsigned char *p, size_t len, const Ticket * data, size_t * size)
+int ASN1CALL
+encode_MESSAGE_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                   size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                   const MESSAGE_TYPE * data, size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    i = 0;
-/* enc-part */
     {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_EncryptedData(p, len, &(data)->enc_part, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
+       int enumint = (int) *data;
+       e = der_put_integer(p, len, &enumint, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_tag_oldret;
     }
-/* sname */
+    ;
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_MESSAGE_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                   size_t len HEIMDAL_UNUSED_ATTRIBUTE, MESSAGE_TYPE * data,
+                   size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
     {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_PrincipalName(p, len, &(data)->sname, &l);
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
+           e = ASN1_BAD_ID;
+       }
        if (e)
-           return e;
-       p -= l;
+           goto fail;
+       p += l;
        len -= l;
        ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           int enumint;
+           e = der_get_integer(p, len, &enumint, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           *data = enumint;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_MESSAGE_TYPE(data);
+    return e;
+}
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+void ASN1CALL
+free_MESSAGE_TYPE(MESSAGE_TYPE * data)
+{
+}
 
-       ret += Top_tag_tag_oldret;
-    }
-/* realm */
+size_t ASN1CALL
+length_MESSAGE_TYPE(const MESSAGE_TYPE * data)
+{
+    size_t ret = 0;
     {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_Realm(p, len, &(data)->realm, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+       int enumint = *data;
+       ret += der_length_integer(&enumint);
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+int ASN1CALL
+copy_MESSAGE_TYPE(const MESSAGE_TYPE * from, MESSAGE_TYPE * to)
+{
+    memset(to, 0, sizeof(*to));
+    *(to) = *(from);
+    return 0;
+}
+
+int ASN1CALL
+encode_PADATA_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                  size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                  const PADATA_TYPE * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    {
+       int enumint = (int) *data;
+       e = der_put_integer(p, len, &enumint, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_tag_oldret;
     }
-/* tkt-vno */
+    ;
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_PADATA_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                  size_t len HEIMDAL_UNUSED_ATTRIBUTE, PADATA_TYPE * data,
+                  size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
     {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_krb5int32(p, len, &(data)->tkt_vno, &l);
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
+           e = ASN1_BAD_ID;
+       }
        if (e)
-           return e;
-       p -= l;
+           goto fail;
+       p += l;
        len -= l;
        ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           int enumint;
+           e = der_get_integer(p, len, &enumint, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           *data = enumint;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_PADATA_TYPE(data);
+    return e;
+}
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+void ASN1CALL
+free_PADATA_TYPE(PADATA_TYPE * data)
+{
+}
+
+size_t ASN1CALL
+length_PADATA_TYPE(const PADATA_TYPE * data)
+{
+    size_t ret = 0;
+    {
+       int enumint = *data;
+       ret += der_length_integer(&enumint);
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_PADATA_TYPE(const PADATA_TYPE * from, PADATA_TYPE * to)
+{
+    memset(to, 0, sizeof(*to));
+    *(to) = *(from);
+    return 0;
+}
+
+int ASN1CALL
+encode_AUTHDATA_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    const AUTHDATA_TYPE * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    {
+       int enumint = (int) *data;
+       e = der_put_integer(p, len, &enumint, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_tag_oldret;
     }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
-    if (e)
-       return e;
-    p -= l;
-    len -= l;
-    ret += l;
-
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_APPL, CONS, 1, &l);
+    ;
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -218,19 +568,22 @@ encode_Ticket(unsigned char *p, size_t len, const Ticket * data, size_t * size)
     return 0;
 }
 
-int
-decode_Ticket(const unsigned char *p, size_t len, Ticket * data, size_t * size)
+int ASN1CALL
+decode_AUTHDATA_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    AUTHDATA_TYPE * data, size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 1, &Top_datalen, &l);
-       if (e == 0 && Top_type != CONS) {
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
        if (e)
@@ -245,272 +598,72 @@ decode_Ticket(const unsigned char *p, size_t len, Ticket * data, size_t * size)
        }
        len = Top_datalen;
        {
-           size_t Top_Tag_datalen, Top_Tag_oldlen;
-           Der_type Top_Tag_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
-           if (e == 0 && Top_Tag_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
+           int enumint;
+           e = der_get_integer(p, len, &enumint, &l);
            if (e)
                goto fail;
            p += l;
            len -= l;
            ret += l;
-           Top_Tag_oldlen = len;
-           if (Top_Tag_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = Top_Tag_datalen;
-           {
-               size_t tkt_vno_datalen, tkt_vno_oldlen;
-               Der_type tkt_vno_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &tkt_vno_type, 0, &tkt_vno_datalen, &l);
-               if (e == 0 && tkt_vno_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               tkt_vno_oldlen = len;
-               if (tkt_vno_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = tkt_vno_datalen;
-               e = decode_krb5int32(p, len, &(data)->tkt_vno, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = tkt_vno_oldlen - tkt_vno_datalen;
-           }
-           {
-               size_t realm_datalen, realm_oldlen;
-               Der_type realm_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &realm_type, 1, &realm_datalen, &l);
-               if (e == 0 && realm_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               realm_oldlen = len;
-               if (realm_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = realm_datalen;
-               e = decode_Realm(p, len, &(data)->realm, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = realm_oldlen - realm_datalen;
-           }
-           {
-               size_t sname_datalen, sname_oldlen;
-               Der_type sname_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sname_type, 2, &sname_datalen, &l);
-               if (e == 0 && sname_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               sname_oldlen = len;
-               if (sname_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = sname_datalen;
-               e = decode_PrincipalName(p, len, &(data)->sname, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = sname_oldlen - sname_datalen;
-           }
-           {
-               size_t enc_part_datalen, enc_part_oldlen;
-               Der_type enc_part_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_part_type, 3, &enc_part_datalen, &l);
-               if (e == 0 && enc_part_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               enc_part_oldlen = len;
-               if (enc_part_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = enc_part_datalen;
-               e = decode_EncryptedData(p, len, &(data)->enc_part, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = enc_part_oldlen - enc_part_datalen;
-           }
-           len = Top_Tag_oldlen - Top_Tag_datalen;
+           *data = enumint;
        }
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_Ticket(data);
+  fail:
+    free_AUTHDATA_TYPE(data);
     return e;
 }
 
-void
-free_Ticket(Ticket * data)
+void ASN1CALL
+free_AUTHDATA_TYPE(AUTHDATA_TYPE * data)
 {
-    free_krb5int32(&(data)->tkt_vno);
-    free_Realm(&(data)->realm);
-    free_PrincipalName(&(data)->sname);
-    free_EncryptedData(&(data)->enc_part);
 }
 
-size_t
-length_Ticket(const Ticket * data)
+size_t ASN1CALL
+length_AUTHDATA_TYPE(const AUTHDATA_TYPE * data)
 {
     size_t ret = 0;
     {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_krb5int32(&(data)->tkt_vno);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_Realm(&(data)->realm);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_PrincipalName(&(data)->sname);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_EncryptedData(&(data)->enc_part);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
+       int enumint = *data;
+       ret += der_length_integer(&enumint);
     }
     ret += 1 + der_length_len(ret);
-    ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_Ticket(const Ticket * from, Ticket * to)
+int ASN1CALL
+copy_AUTHDATA_TYPE(const AUTHDATA_TYPE * from, AUTHDATA_TYPE * to)
 {
     memset(to, 0, sizeof(*to));
-    if (copy_krb5int32(&(from)->tkt_vno, &(to)->tkt_vno))
-       goto fail;
-    if (copy_Realm(&(from)->realm, &(to)->realm))
-       goto fail;
-    if (copy_PrincipalName(&(from)->sname, &(to)->sname))
-       goto fail;
-    if (copy_EncryptedData(&(from)->enc_part, &(to)->enc_part))
-       goto fail;
+    *(to) = *(from);
     return 0;
-fail:
-    free_Ticket(to);
-    return ENOMEM;
 }
 
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_AuthorizationDataElement(unsigned char *p, size_t len, const AuthorizationDataElement * data, size_t * size)
+int ASN1CALL
+encode_CKSUMTYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, const CKSUMTYPE * data,
+                size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
-
-    i = 0;
-/* ad-data */
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = der_put_octet_string(p, len, &(data)->ad_data, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-       ret += Top_tag_oldret;
-    }
-/* ad-type */
     {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = encode_krb5int32(p, len, &(data)->ad_type, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       int enumint = (int) *data;
+       e = der_put_integer(p, len, &enumint, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_oldret;
     }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
+    ;
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -521,19 +674,22 @@ encode_AuthorizationDataElement(unsigned char *p, size_t len, const Authorizatio
     return 0;
 }
 
-int
-decode_AuthorizationDataElement(const unsigned char *p, size_t len, AuthorizationDataElement * data, size_t * size)
+int ASN1CALL
+decode_CKSUMTYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, CKSUMTYPE * data,
+                size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
-       if (e == 0 && Top_type != CONS) {
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
        if (e)
@@ -548,220 +704,72 @@ decode_AuthorizationDataElement(const unsigned char *p, size_t len, Authorizatio
        }
        len = Top_datalen;
        {
-           size_t ad_type_datalen, ad_type_oldlen;
-           Der_type ad_type_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ad_type_type, 0, &ad_type_datalen, &l);
-           if (e == 0 && ad_type_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           ad_type_oldlen = len;
-           if (ad_type_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = ad_type_datalen;
-           e = decode_krb5int32(p, len, &(data)->ad_type, &l);
+           int enumint;
+           e = der_get_integer(p, len, &enumint, &l);
            if (e)
                goto fail;
            p += l;
            len -= l;
            ret += l;
-           len = ad_type_oldlen - ad_type_datalen;
-       }
-       {
-           size_t ad_data_datalen, ad_data_oldlen;
-           Der_type ad_data_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ad_data_type, 1, &ad_data_datalen, &l);
-           if (e == 0 && ad_data_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           ad_data_oldlen = len;
-           if (ad_data_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = ad_data_datalen;
-           {
-               size_t ad_data_Tag_datalen, ad_data_Tag_oldlen;
-               Der_type ad_data_Tag_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &ad_data_Tag_type, UT_OctetString, &ad_data_Tag_datalen, &l);
-               if (e == 0 && ad_data_Tag_type != PRIM) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               ad_data_Tag_oldlen = len;
-               if (ad_data_Tag_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = ad_data_Tag_datalen;
-               e = der_get_octet_string(p, len, &(data)->ad_data, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = ad_data_Tag_oldlen - ad_data_Tag_datalen;
-           }
-           len = ad_data_oldlen - ad_data_datalen;
+           *data = enumint;
        }
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_AuthorizationDataElement(data);
+  fail:
+    free_CKSUMTYPE(data);
     return e;
 }
 
-void
-free_AuthorizationDataElement(AuthorizationDataElement * data)
+void ASN1CALL
+free_CKSUMTYPE(CKSUMTYPE * data)
 {
-    free_krb5int32(&(data)->ad_type);
-    der_free_octet_string(&(data)->ad_data);
 }
 
-size_t
-length_AuthorizationDataElement(const AuthorizationDataElement * data)
+size_t ASN1CALL
+length_CKSUMTYPE(const CKSUMTYPE * data)
 {
     size_t ret = 0;
     {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += length_krb5int32(&(data)->ad_type);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    }
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += der_length_octet_string(&(data)->ad_data);
-       ret += 1 + der_length_len(ret);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
+       int enumint = *data;
+       ret += der_length_integer(&enumint);
     }
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_AuthorizationDataElement(const AuthorizationDataElement * from, AuthorizationDataElement * to)
+int ASN1CALL
+copy_CKSUMTYPE(const CKSUMTYPE * from, CKSUMTYPE * to)
 {
     memset(to, 0, sizeof(*to));
-    if (copy_krb5int32(&(from)->ad_type, &(to)->ad_type))
-       goto fail;
-    if (der_copy_octet_string(&(from)->ad_data, &(to)->ad_data))
-       goto fail;
+    *(to) = *(from);
     return 0;
-fail:
-    free_AuthorizationDataElement(to);
-    return ENOMEM;
 }
 
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_EncryptedData(unsigned char *p, size_t len, const EncryptedData * data, size_t * size)
+int ASN1CALL
+encode_ENCTYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+              size_t len HEIMDAL_UNUSED_ATTRIBUTE, const ENCTYPE * data,
+              size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
-
-    i = 0;
-/* cipher */
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = der_put_octet_string(p, len, &(data)->cipher, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       ret += Top_tag_oldret;
-    }
-/* kvno */
-    if ((data)->kvno) {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = encode_krb5int32(p, len, (data)->kvno, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-       ret += Top_tag_oldret;
-    }
-/* etype */
     {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = encode_ENCTYPE(p, len, &(data)->etype, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       int enumint = (int) *data;
+       e = der_put_integer(p, len, &enumint, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_oldret;
     }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
+    ;
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -772,19 +780,22 @@ encode_EncryptedData(unsigned char *p, size_t len, const EncryptedData * data, s
     return 0;
 }
 
-int
-decode_EncryptedData(const unsigned char *p, size_t len, EncryptedData * data, size_t * size)
+int ASN1CALL
+decode_ENCTYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+              size_t len HEIMDAL_UNUSED_ATTRIBUTE, ENCTYPE * data,
+              size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
-       if (e == 0 && Top_type != CONS) {
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
        if (e)
@@ -799,264 +810,163 @@ decode_EncryptedData(const unsigned char *p, size_t len, EncryptedData * data, s
        }
        len = Top_datalen;
        {
-           size_t etype_datalen, etype_oldlen;
-           Der_type etype_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &etype_type, 0, &etype_datalen, &l);
-           if (e == 0 && etype_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           etype_oldlen = len;
-           if (etype_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = etype_datalen;
-           e = decode_ENCTYPE(p, len, &(data)->etype, &l);
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           len = etype_oldlen - etype_datalen;
-       }
-       {
-           size_t kvno_datalen, kvno_oldlen;
-           Der_type kvno_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &kvno_type, 1, &kvno_datalen, &l);
-           if (e == 0 && kvno_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e) {
-               (data)->kvno = NULL;
-           } else {
-               (data)->kvno = calloc(1, sizeof(*(data)->kvno));
-               if ((data)->kvno == NULL) {
-                   e = ENOMEM;
-                   goto fail;
-               }
-               p += l;
-               len -= l;
-               ret += l;
-               kvno_oldlen = len;
-               if (kvno_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = kvno_datalen;
-               e = decode_krb5int32(p, len, (data)->kvno, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = kvno_oldlen - kvno_datalen;
-           }
-       }
-       {
-           size_t cipher_datalen, cipher_oldlen;
-           Der_type cipher_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cipher_type, 2, &cipher_datalen, &l);
-           if (e == 0 && cipher_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
+           int enumint;
+           e = der_get_integer(p, len, &enumint, &l);
            if (e)
                goto fail;
            p += l;
            len -= l;
            ret += l;
-           cipher_oldlen = len;
-           if (cipher_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = cipher_datalen;
-           {
-               size_t cipher_Tag_datalen, cipher_Tag_oldlen;
-               Der_type cipher_Tag_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &cipher_Tag_type, UT_OctetString, &cipher_Tag_datalen, &l);
-               if (e == 0 && cipher_Tag_type != PRIM) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               cipher_Tag_oldlen = len;
-               if (cipher_Tag_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = cipher_Tag_datalen;
-               e = der_get_octet_string(p, len, &(data)->cipher, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = cipher_Tag_oldlen - cipher_Tag_datalen;
-           }
-           len = cipher_oldlen - cipher_datalen;
+           *data = enumint;
        }
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_EncryptedData(data);
+  fail:
+    free_ENCTYPE(data);
     return e;
 }
 
-void
-free_EncryptedData(EncryptedData * data)
+void ASN1CALL
+free_ENCTYPE(ENCTYPE * data)
 {
-    free_ENCTYPE(&(data)->etype);
-    if ((data)->kvno) {
-       free_krb5int32((data)->kvno);
-       free((data)->kvno);
-       (data)->kvno = NULL;
-    }
-    der_free_octet_string(&(data)->cipher);
 }
 
-size_t
-length_EncryptedData(const EncryptedData * data)
+size_t ASN1CALL
+length_ENCTYPE(const ENCTYPE * data)
 {
     size_t ret = 0;
     {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += length_ENCTYPE(&(data)->etype);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    }
-    if ((data)->kvno) {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += length_krb5int32((data)->kvno);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    } {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += der_length_octet_string(&(data)->cipher);
-       ret += 1 + der_length_len(ret);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
+       int enumint = *data;
+       ret += der_length_integer(&enumint);
     }
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_EncryptedData(const EncryptedData * from, EncryptedData * to)
+int ASN1CALL
+copy_ENCTYPE(const ENCTYPE * from, ENCTYPE * to)
 {
     memset(to, 0, sizeof(*to));
-    if (copy_ENCTYPE(&(from)->etype, &(to)->etype))
-       goto fail;
-    if ((from)->kvno) {
-       (to)->kvno = malloc(sizeof(*(to)->kvno));
-       if ((to)->kvno == NULL)
-           goto fail;
-       if (copy_krb5int32((from)->kvno, (to)->kvno))
-           goto fail;
-    } else
-       (to)->kvno = NULL;
-    if (der_copy_octet_string(&(from)->cipher, &(to)->cipher))
-       goto fail;
+    *(to) = *(from);
     return 0;
-fail:
-    free_EncryptedData(to);
-    return ENOMEM;
 }
 
+int ASN1CALL
+encode_krb5uint32(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                 size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                 const krb5uint32 * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
+    e = der_put_unsigned(p, len, data, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
 
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
+    *size = ret;
+    return 0;
+}
 
-int
-encode_PrincipalName(unsigned char *p, size_t len, const PrincipalName * data, size_t * size)
+int ASN1CALL
+decode_krb5uint32(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                 size_t len HEIMDAL_UNUSED_ATTRIBUTE, krb5uint32 * data,
+                 size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int i, e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    i = 0;
-/* name-string */
+    memset(data, 0, sizeof(*data));
     {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       for (i = (&(data)->name_string)->len - 1; i >= 0; --i) {
-           size_t name_string_tag_tag_for_oldret = ret;
-           ret = 0;
-           e = der_put_general_string(p, len, &(&(data)->name_string)->val[i], &l);
-           if (e)
-               return e;
-           p -= l;
-           len -= l;
-           ret += l;
-
-           e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
-           if (e)
-               return e;
-           p -= l;
-           len -= l;
-           ret += l;
-
-           ret += name_string_tag_tag_for_oldret;
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
+           e = ASN1_BAD_ID;
        }
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
        if (e)
-           return e;
-       p -= l;
+           goto fail;
+       p += l;
        len -= l;
        ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       e = der_get_unsigned(p, len, data, &l);
        if (e)
-           return e;
-       p -= l;
+           goto fail;
+       p += l;
        len -= l;
        ret += l;
-
-       ret += Top_tag_oldret;
+       len = Top_oldlen - Top_datalen;
     }
-/* name-type */
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = encode_NAME_TYPE(p, len, &(data)->name_type, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_krb5uint32(data);
+    return e;
+}
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+void ASN1CALL
+free_krb5uint32(krb5uint32 * data)
+{
+}
 
-       ret += Top_tag_oldret;
-    }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
+size_t ASN1CALL
+length_krb5uint32(const krb5uint32 * data)
+{
+    size_t ret = 0;
+    ret += der_length_unsigned(data);
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_krb5uint32(const krb5uint32 * from, krb5uint32 * to)
+{
+    memset(to, 0, sizeof(*to));
+    *(to) = *(from);
+    return 0;
+}
+
+int ASN1CALL
+encode_krb5int32(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, const krb5int32 * data,
+                size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    e = der_put_integer(p, len, data, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -1067,19 +977,22 @@ encode_PrincipalName(unsigned char *p, size_t len, const PrincipalName * data, s
     return 0;
 }
 
-int
-decode_PrincipalName(const unsigned char *p, size_t len, PrincipalName * data, size_t * size)
+int ASN1CALL
+decode_krb5int32(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, krb5int32 * data,
+                size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
-       if (e == 0 && Top_type != CONS) {
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
        if (e)
@@ -1093,233 +1006,162 @@ decode_PrincipalName(const unsigned char *p, size_t len, PrincipalName * data, s
            goto fail;
        }
        len = Top_datalen;
-       {
-           size_t name_type_datalen, name_type_oldlen;
-           Der_type name_type_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &name_type_type, 0, &name_type_datalen, &l);
-           if (e == 0 && name_type_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           name_type_oldlen = len;
-           if (name_type_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = name_type_datalen;
-           e = decode_NAME_TYPE(p, len, &(data)->name_type, &l);
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           len = name_type_oldlen - name_type_datalen;
-       }
-       {
-           size_t name_string_datalen, name_string_oldlen;
-           Der_type name_string_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &name_string_type, 1, &name_string_datalen, &l);
-           if (e == 0 && name_string_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           name_string_oldlen = len;
-           if (name_string_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = name_string_datalen;
-           {
-               size_t name_string_Tag_datalen, name_string_Tag_oldlen;
-               Der_type name_string_Tag_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &name_string_Tag_type, UT_Sequence, &name_string_Tag_datalen, &l);
-               if (e == 0 && name_string_Tag_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               name_string_Tag_oldlen = len;
-               if (name_string_Tag_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = name_string_Tag_datalen;
-               {
-                   size_t name_string_Tag_Tag_origlen = len;
-                   size_t name_string_Tag_Tag_oldret = ret;
-                   size_t name_string_Tag_Tag_olen = 0;
-                   void *name_string_Tag_Tag_tmp;
-                   ret = 0;
-                   (&(data)->name_string)->len = 0;
-                   (&(data)->name_string)->val = NULL;
-                   while (ret < name_string_Tag_Tag_origlen) {
-                       size_t name_string_Tag_Tag_nlen = name_string_Tag_Tag_olen + sizeof(*((&(data)->name_string)->val));
-                       if (name_string_Tag_Tag_olen > name_string_Tag_Tag_nlen) {
-                           e = ASN1_OVERFLOW;
-                           goto fail;
-                       }
-                       name_string_Tag_Tag_olen = name_string_Tag_Tag_nlen;
-                       name_string_Tag_Tag_tmp = realloc((&(data)->name_string)->val, name_string_Tag_Tag_olen);
-                       if (name_string_Tag_Tag_tmp == NULL) {
-                           e = ENOMEM;
-                           goto fail;
-                       }
-                       (&(data)->name_string)->val = name_string_Tag_Tag_tmp;
-                       {
-                           size_t name_string_Tag_Tag_s_of_datalen, name_string_Tag_Tag_s_of_oldlen;
-                           Der_type name_string_Tag_Tag_s_of_type;
-                           e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &name_string_Tag_Tag_s_of_type, UT_GeneralString, &name_string_Tag_Tag_s_of_datalen, &l);
-                           if (e == 0 && name_string_Tag_Tag_s_of_type != PRIM) {
-                               e = ASN1_BAD_ID;
-                           }
-                           if (e)
-                               goto fail;
-                           p += l;
-                           len -= l;
-                           ret += l;
-                           name_string_Tag_Tag_s_of_oldlen = len;
-                           if (name_string_Tag_Tag_s_of_datalen > len) {
-                               e = ASN1_OVERRUN;
-                               goto fail;
-                           }
-                           len = name_string_Tag_Tag_s_of_datalen;
-                           e = der_get_general_string(p, len, &(&(data)->name_string)->val[(&(data)->name_string)->len], &l);
-                           if (e)
-                               goto fail;
-                           p += l;
-                           len -= l;
-                           ret += l;
-                           len = name_string_Tag_Tag_s_of_oldlen - name_string_Tag_Tag_s_of_datalen;
-                       }
-                       (&(data)->name_string)->len++;
-                       len = name_string_Tag_Tag_origlen - ret;
-                   }
-                   ret += name_string_Tag_Tag_oldret;
-               }
-               len = name_string_Tag_oldlen - name_string_Tag_datalen;
-           }
-           len = name_string_oldlen - name_string_datalen;
-       }
+       e = der_get_integer(p, len, data, &l);
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_PrincipalName(data);
+  fail:
+    free_krb5int32(data);
     return e;
 }
 
-void
-free_PrincipalName(PrincipalName * data)
+void ASN1CALL
+free_krb5int32(krb5int32 * data)
 {
-    free_NAME_TYPE(&(data)->name_type);
-    while ((&(data)->name_string)->len) {
-       der_free_general_string(&(&(data)->name_string)->val[(&(data)->name_string)->len - 1]);
-       (&(data)->name_string)->len--;
-    }
-    free((&(data)->name_string)->val);
-    (&(data)->name_string)->val = NULL;
 }
 
-size_t
-length_PrincipalName(const PrincipalName * data)
+size_t ASN1CALL
+length_krb5int32(const krb5int32 * data)
 {
     size_t ret = 0;
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += length_NAME_TYPE(&(data)->name_type);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    }
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       {
-           int name_string_tag_tag_oldret = ret;
-           int i;
-           ret = 0;
-           for (i = (&(data)->name_string)->len - 1; i >= 0; --i) {
-               int name_string_tag_tag_for_oldret = ret;
-               ret = 0;
-               ret += der_length_general_string(&(&(data)->name_string)->val[i]);
-               ret += 1 + der_length_len(ret);
-               ret += name_string_tag_tag_for_oldret;
-           }
-           ret += name_string_tag_tag_oldret;
-       }
-       ret += 1 + der_length_len(ret);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    }
+    ret += der_length_integer(data);
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_PrincipalName(const PrincipalName * from, PrincipalName * to)
+int ASN1CALL
+copy_krb5int32(const krb5int32 * from, krb5int32 * to)
 {
     memset(to, 0, sizeof(*to));
-    if (copy_NAME_TYPE(&(from)->name_type, &(to)->name_type))
-       goto fail;
-    if (((&(to)->name_string)->val = malloc((&(from)->name_string)->len * sizeof(*(&(to)->name_string)->val))) == NULL && (&(from)->name_string)->len != 0)
-       goto fail;
-    for ((&(to)->name_string)->len = 0; (&(to)->name_string)->len < (&(from)->name_string)->len; (&(to)->name_string)->len++) {
-       if (der_copy_general_string(&(&(from)->name_string)->val[(&(to)->name_string)->len], &(&(to)->name_string)->val[(&(to)->name_string)->len]))
-           goto fail;
-    }
+    *(to) = *(from);
     return 0;
-fail:
-    free_PrincipalName(to);
-    return ENOMEM;
 }
 
+int ASN1CALL
+encode_KerberosString(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                     size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                     const KerberosString * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
+    e = der_put_general_string(p, len, data, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
 
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                              UT_GeneralString, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
+    *size = ret;
+    return 0;
+}
 
-int
-encode_HostAddresses(unsigned char *p, size_t len, const HostAddresses * data, size_t * size)
+int ASN1CALL
+decode_KerberosString(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                     size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                     KerberosString * data, size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int i, e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    i = 0;
-    for (i = (data)->len - 1; i >= 0; --i) {
-       size_t Top_tag_for_oldret = ret;
-       ret = 0;
-       e = encode_HostAddress(p, len, &(data)->val[i], &l);
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_GeneralString, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
+           e = ASN1_BAD_ID;
+       }
        if (e)
-           return e;
-       p -= l;
+           goto fail;
+       p += l;
        len -= l;
        ret += l;
-
-       ret += Top_tag_for_oldret;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       e = der_get_general_string(p, len, data, &l);
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       len = Top_oldlen - Top_datalen;
     }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_KerberosString(data);
+    return e;
+}
+
+void ASN1CALL
+free_KerberosString(KerberosString * data)
+{
+    der_free_general_string(data);
+}
+
+size_t ASN1CALL
+length_KerberosString(const KerberosString * data)
+{
+    size_t ret = 0;
+    ret += der_length_general_string(data);
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_KerberosString(const KerberosString * from, KerberosString * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (der_copy_general_string(from, to))
+       goto fail;
+    return 0;
+  fail:
+    free_KerberosString(to);
+    return ENOMEM;
+}
+
+int ASN1CALL
+encode_Realm(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+            size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Realm * data,
+            size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    e = der_put_general_string(p, len, data, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                              UT_GeneralString, &l);
     if (e)
        return e;
     p -= l;
@@ -1330,19 +1172,21 @@ encode_HostAddresses(unsigned char *p, size_t len, const HostAddresses * data, s
     return 0;
 }
 
-int
-decode_HostAddresses(const unsigned char *p, size_t len, HostAddresses * data, size_t * size)
+int ASN1CALL
+decode_Realm(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+            size_t len HEIMDAL_UNUSED_ATTRIBUTE, Realm * data, size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
-       if (e == 0 && Top_type != CONS) {
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_GeneralString, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
        if (e)
@@ -1356,128 +1200,85 @@ decode_HostAddresses(const unsigned char *p, size_t len, HostAddresses * data, s
            goto fail;
        }
        len = Top_datalen;
-       {
-           size_t Top_Tag_origlen = len;
-           size_t Top_Tag_oldret = ret;
-           size_t Top_Tag_olen = 0;
-           void *Top_Tag_tmp;
-           ret = 0;
-           (data)->len = 0;
-           (data)->val = NULL;
-           while (ret < Top_Tag_origlen) {
-               size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
-               if (Top_Tag_olen > Top_Tag_nlen) {
-                   e = ASN1_OVERFLOW;
-                   goto fail;
-               }
-               Top_Tag_olen = Top_Tag_nlen;
-               Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
-               if (Top_Tag_tmp == NULL) {
-                   e = ENOMEM;
-                   goto fail;
-               }
-               (data)->val = Top_Tag_tmp;
-               e = decode_HostAddress(p, len, &(data)->val[(data)->len], &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               (data)->len++;
-               len = Top_Tag_origlen - ret;
-           }
-           ret += Top_Tag_oldret;
-       }
+       e = der_get_general_string(p, len, data, &l);
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_HostAddresses(data);
+  fail:
+    free_Realm(data);
     return e;
 }
 
-void
-free_HostAddresses(HostAddresses * data)
+void ASN1CALL
+free_Realm(Realm * data)
 {
-    while ((data)->len) {
-       free_HostAddress(&(data)->val[(data)->len - 1]);
-       (data)->len--;
-    }
-    free((data)->val);
-    (data)->val = NULL;
+    der_free_general_string(data);
 }
 
-size_t
-length_HostAddresses(const HostAddresses * data)
+size_t ASN1CALL
+length_Realm(const Realm * data)
 {
     size_t ret = 0;
-    {
-       int Top_tag_oldret = ret;
-       int i;
-       ret = 0;
-       for (i = (data)->len - 1; i >= 0; --i) {
-           int Top_tag_for_oldret = ret;
-           ret = 0;
-           ret += length_HostAddress(&(data)->val[i]);
-           ret += Top_tag_for_oldret;
-       }
-       ret += Top_tag_oldret;
-    }
+    ret += der_length_general_string(data);
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_HostAddresses(const HostAddresses * from, HostAddresses * to)
+int ASN1CALL
+copy_Realm(const Realm * from, Realm * to)
 {
     memset(to, 0, sizeof(*to));
-    if (((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
+    if (der_copy_general_string(from, to))
        goto fail;
-    for ((to)->len = 0; (to)->len < (from)->len; (to)->len++) {
-       if (copy_HostAddress(&(from)->val[(to)->len], &(to)->val[(to)->len]))
-           goto fail;
-    }
     return 0;
-fail:
-    free_HostAddresses(to);
+  fail:
+    free_Realm(to);
     return ENOMEM;
 }
 
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_HostAddress(unsigned char *p, size_t len, const HostAddress * data, size_t * size)
+int ASN1CALL
+encode_PrincipalName(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    const PrincipalName * data, size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    i = 0;
-/* address */
+/* name-string */
     {
-       size_t Top_tag_oldret = ret;
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
        ret = 0;
-       e = der_put_octet_string(p, len, &(data)->address, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+       for (i = (int) (&(data)->name_string)->len - 1; i >= 0; --i) {
+           size_t name_string_tag_tag_for_oldret = ret;
+           ret = 0;
+           e = der_put_general_string(p, len,
+                                      &(&(data)->name_string)->val[i], &l);
+           if (e)
+               return e;
+           p -= l;
+           len -= l;
+           ret += l;
+
+           e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                                      UT_GeneralString, &l);
+           if (e)
+               return e;
+           p -= l;
+           len -= l;
+           ret += l;
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
+           ret += name_string_tag_tag_for_oldret;
+       }
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS,
+                                  UT_Sequence, &l);
        if (e)
            return e;
        p -= l;
@@ -1493,11 +1294,11 @@ encode_HostAddress(unsigned char *p, size_t len, const HostAddress * data, size_
 
        ret += Top_tag_oldret;
     }
-/* addr-type */
+/* name-type */
     {
-       size_t Top_tag_oldret = ret;
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
        ret = 0;
-       e = encode_krb5int32(p, len, &(data)->addr_type, &l);
+       e = encode_NAME_TYPE(p, len, &(data)->name_type, &l);
        if (e)
            return e;
        p -= l;
@@ -1513,7 +1314,8 @@ encode_HostAddress(unsigned char *p, size_t len, const HostAddress * data, size_
 
        ret += Top_tag_oldret;
     }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -1524,18 +1326,21 @@ encode_HostAddress(unsigned char *p, size_t len, const HostAddress * data, size_
     return 0;
 }
 
-int
-decode_HostAddress(const unsigned char *p, size_t len, HostAddress * data, size_t * size)
+int ASN1CALL
+decode_PrincipalName(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    PrincipalName * data, size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
        if (e == 0 && Top_type != CONS) {
            e = ASN1_BAD_ID;
        }
@@ -1551,10 +1356,12 @@ decode_HostAddress(const unsigned char *p, size_t len, HostAddress * data, size_
        }
        len = Top_datalen;
        {
-           size_t addr_type_datalen, addr_type_oldlen;
-           Der_type addr_type_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &addr_type_type, 0, &addr_type_datalen, &l);
-           if (e == 0 && addr_type_type != CONS) {
+           size_t name_type_datalen, name_type_oldlen;
+           Der_type name_type_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &name_type_type, 0,
+                                        &name_type_datalen, &l);
+           if (e == 0 && name_type_type != CONS) {
                e = ASN1_BAD_ID;
            }
            if (e)
@@ -1562,25 +1369,27 @@ decode_HostAddress(const unsigned char *p, size_t len, HostAddress * data, size_
            p += l;
            len -= l;
            ret += l;
-           addr_type_oldlen = len;
-           if (addr_type_datalen > len) {
+           name_type_oldlen = len;
+           if (name_type_datalen > len) {
                e = ASN1_OVERRUN;
                goto fail;
            }
-           len = addr_type_datalen;
-           e = decode_krb5int32(p, len, &(data)->addr_type, &l);
+           len = name_type_datalen;
+           e = decode_NAME_TYPE(p, len, &(data)->name_type, &l);
            if (e)
                goto fail;
            p += l;
            len -= l;
            ret += l;
-           len = addr_type_oldlen - addr_type_datalen;
+           len = name_type_oldlen - name_type_datalen;
        }
        {
-           size_t address_datalen, address_oldlen;
-           Der_type address_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &address_type, 1, &address_datalen, &l);
-           if (e == 0 && address_type != CONS) {
+           size_t name_string_datalen, name_string_oldlen;
+           Der_type name_string_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &name_string_type, 1,
+                                        &name_string_datalen, &l);
+           if (e == 0 && name_string_type != CONS) {
                e = ASN1_BAD_ID;
            }
            if (e)
@@ -1588,17 +1397,20 @@ decode_HostAddress(const unsigned char *p, size_t len, HostAddress * data, size_
            p += l;
            len -= l;
            ret += l;
-           address_oldlen = len;
-           if (address_datalen > len) {
+           name_string_oldlen = len;
+           if (name_string_datalen > len) {
                e = ASN1_OVERRUN;
                goto fail;
            }
-           len = address_datalen;
+           len = name_string_datalen;
            {
-               size_t address_Tag_datalen, address_Tag_oldlen;
-               Der_type address_Tag_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &address_Tag_type, UT_OctetString, &address_Tag_datalen, &l);
-               if (e == 0 && address_Tag_type != PRIM) {
+               size_t name_string_Tag_datalen, name_string_Tag_oldlen;
+               Der_type name_string_Tag_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_UNIV,
+                                            &name_string_Tag_type,
+                                            UT_Sequence,
+                                            &name_string_Tag_datalen, &l);
+               if (e == 0 && name_string_Tag_type != CONS) {
                    e = ASN1_BAD_ID;
                }
                if (e)
@@ -1606,54 +1418,139 @@ decode_HostAddress(const unsigned char *p, size_t len, HostAddress * data, size_
                p += l;
                len -= l;
                ret += l;
-               address_Tag_oldlen = len;
-               if (address_Tag_datalen > len) {
+               name_string_Tag_oldlen = len;
+               if (name_string_Tag_datalen > len) {
                    e = ASN1_OVERRUN;
                    goto fail;
                }
-               len = address_Tag_datalen;
-               e = der_get_octet_string(p, len, &(data)->address, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = address_Tag_oldlen - address_Tag_datalen;
+               len = name_string_Tag_datalen;
+               {
+                   size_t name_string_Tag_Tag_origlen = len;
+                   size_t name_string_Tag_Tag_oldret = ret;
+                   size_t name_string_Tag_Tag_olen = 0;
+                   void *name_string_Tag_Tag_tmp;
+                   ret = 0;
+                   (&(data)->name_string)->len = 0;
+                   (&(data)->name_string)->val = NULL;
+                   while (ret < name_string_Tag_Tag_origlen) {
+                       size_t name_string_Tag_Tag_nlen =
+                           name_string_Tag_Tag_olen +
+                           sizeof(*((&(data)->name_string)->val));
+                       if (name_string_Tag_Tag_olen >
+                           name_string_Tag_Tag_nlen) {
+                           e = ASN1_OVERFLOW;
+                           goto fail;
+                       }
+                       name_string_Tag_Tag_olen = name_string_Tag_Tag_nlen;
+                       name_string_Tag_Tag_tmp =
+                           realloc((&(data)->name_string)->val,
+                                   name_string_Tag_Tag_olen);
+                       if (name_string_Tag_Tag_tmp == NULL) {
+                           e = ENOMEM;
+                           goto fail;
+                       }
+                       (&(data)->name_string)->val = name_string_Tag_Tag_tmp;
+                       {
+                           size_t name_string_Tag_Tag_s_of_datalen,
+                               name_string_Tag_Tag_s_of_oldlen;
+                           Der_type name_string_Tag_Tag_s_of_type;
+                           e = der_match_tag_and_length(p, len, ASN1_C_UNIV,
+                                                        &name_string_Tag_Tag_s_of_type,
+                                                        UT_GeneralString,
+                                                        &name_string_Tag_Tag_s_of_datalen,
+                                                        &l);
+                           if (e == 0
+                               && name_string_Tag_Tag_s_of_type != PRIM) {
+                               e = ASN1_BAD_ID;
+                           }
+                           if (e)
+                               goto fail;
+                           p += l;
+                           len -= l;
+                           ret += l;
+                           name_string_Tag_Tag_s_of_oldlen = len;
+                           if (name_string_Tag_Tag_s_of_datalen > len) {
+                               e = ASN1_OVERRUN;
+                               goto fail;
+                           }
+                           len = name_string_Tag_Tag_s_of_datalen;
+                           e = der_get_general_string(p, len,
+                                                      &(&(data)->
+                                                        name_string)->
+                                                      val[(&(data)->
+                                                           name_string)->
+                                                          len], &l);
+                           if (e)
+                               goto fail;
+                           p += l;
+                           len -= l;
+                           ret += l;
+                           len =
+                               name_string_Tag_Tag_s_of_oldlen -
+                               name_string_Tag_Tag_s_of_datalen;
+                       }
+                       (&(data)->name_string)->len++;
+                       len = name_string_Tag_Tag_origlen - ret;
+                   }
+                   ret += name_string_Tag_Tag_oldret;
+               }
+               len = name_string_Tag_oldlen - name_string_Tag_datalen;
            }
-           len = address_oldlen - address_datalen;
+           len = name_string_oldlen - name_string_datalen;
        }
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_HostAddress(data);
+  fail:
+    free_PrincipalName(data);
     return e;
 }
 
-void
-free_HostAddress(HostAddress * data)
+void ASN1CALL
+free_PrincipalName(PrincipalName * data)
 {
-    free_krb5int32(&(data)->addr_type);
-    der_free_octet_string(&(data)->address);
+    free_NAME_TYPE(&(data)->name_type);
+    while ((&(data)->name_string)->len) {
+       der_free_general_string(&(&(data)->name_string)->
+                               val[(&(data)->name_string)->len - 1]);
+       (&(data)->name_string)->len--;
+    }
+    free((&(data)->name_string)->val);
+    (&(data)->name_string)->val = NULL;
 }
 
-size_t
-length_HostAddress(const HostAddress * data)
+size_t ASN1CALL
+length_PrincipalName(const PrincipalName * data)
 {
     size_t ret = 0;
     {
        size_t Top_tag_oldret = ret;
        ret = 0;
-       ret += length_krb5int32(&(data)->addr_type);
+       ret += length_NAME_TYPE(&(data)->name_type);
        ret += 1 + der_length_len(ret);
        ret += Top_tag_oldret;
     }
     {
        size_t Top_tag_oldret = ret;
        ret = 0;
-       ret += der_length_octet_string(&(data)->address);
+       {
+           size_t name_string_tag_tag_oldret = ret;
+           unsigned int n_name_string_tag_tag;
+           ret = 0;
+           for (n_name_string_tag_tag = (&(data)->name_string)->len;
+                n_name_string_tag_tag > 0; --n_name_string_tag_tag) {
+               size_t name_string_tag_tag_for_oldret = ret;
+               ret = 0;
+               ret +=
+                   der_length_general_string(&(&(data)->name_string)->
+                                             val[n_name_string_tag_tag - 1]);
+               ret += 1 + der_length_len(ret);
+               ret += name_string_tag_tag_for_oldret;
+           }
+           ret += name_string_tag_tag_oldret;
+       }
        ret += 1 + der_length_len(ret);
        ret += 1 + der_length_len(ret);
        ret += Top_tag_oldret;
@@ -1662,54 +1559,82 @@ length_HostAddress(const HostAddress * data)
     return ret;
 }
 
-int
-copy_HostAddress(const HostAddress * from, HostAddress * to)
+int ASN1CALL
+copy_PrincipalName(const PrincipalName * from, PrincipalName * to)
 {
     memset(to, 0, sizeof(*to));
-    if (copy_krb5int32(&(from)->addr_type, &(to)->addr_type))
+    if (copy_NAME_TYPE(&(from)->name_type, &(to)->name_type))
        goto fail;
-    if (der_copy_octet_string(&(from)->address, &(to)->address))
+    if (((&(to)->name_string)->val =
+        malloc((&(from)->name_string)->len *
+               sizeof(*(&(to)->name_string)->val))) == NULL
+       && (&(from)->name_string)->len != 0)
        goto fail;
+    for ((&(to)->name_string)->len = 0;
+        (&(to)->name_string)->len < (&(from)->name_string)->len;
+        (&(to)->name_string)->len++) {
+       if (der_copy_general_string
+           (&(&(from)->name_string)->val[(&(to)->name_string)->len],
+            &(&(to)->name_string)->val[(&(to)->name_string)->len]))
+           goto fail;
+    }
     return 0;
-fail:
-    free_HostAddress(to);
+  fail:
+    free_PrincipalName(to);
     return ENOMEM;
 }
 
+int ASN1CALL
+encode_Principal(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Principal * data,
+                size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
+/* realm */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_Realm(p, len, &(data)->realm, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
 
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_AuthorizationData(unsigned char *p, size_t len, const AuthorizationData * data, size_t * size)
-{
-    size_t ret = 0;
-    size_t l;
-    int i, e;
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
 
-    i = 0;
-    for (i = (data)->len - 1; i >= 0; --i) {
-       size_t Top_tag_for_oldret = ret;
+       ret += Top_tag_oldret;
+    }
+/* name */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
        ret = 0;
-       e = encode_AuthorizationDataElement(p, len, &(data)->val[i], &l);
+       e = encode_PrincipalName(p, len, &(data)->name, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_for_oldret;
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
     }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -1720,18 +1645,21 @@ encode_AuthorizationData(unsigned char *p, size_t len, const AuthorizationData *
     return 0;
 }
 
-int
-decode_AuthorizationData(const unsigned char *p, size_t len, AuthorizationData * data, size_t * size)
+int ASN1CALL
+decode_Principal(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, Principal * data,
+                size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
        if (e == 0 && Top_type != CONS) {
            e = ASN1_BAD_ID;
        }
@@ -1747,380 +1675,554 @@ decode_AuthorizationData(const unsigned char *p, size_t len, AuthorizationData *
        }
        len = Top_datalen;
        {
-           size_t Top_Tag_origlen = len;
-           size_t Top_Tag_oldret = ret;
-           size_t Top_Tag_olen = 0;
-           void *Top_Tag_tmp;
-           ret = 0;
-           (data)->len = 0;
-           (data)->val = NULL;
-           while (ret < Top_Tag_origlen) {
-               size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
-               if (Top_Tag_olen > Top_Tag_nlen) {
-                   e = ASN1_OVERFLOW;
-                   goto fail;
-               }
-               Top_Tag_olen = Top_Tag_nlen;
-               Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
-               if (Top_Tag_tmp == NULL) {
-                   e = ENOMEM;
-                   goto fail;
-               }
-               (data)->val = Top_Tag_tmp;
-               e = decode_AuthorizationDataElement(p, len, &(data)->val[(data)->len], &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               (data)->len++;
-               len = Top_Tag_origlen - ret;
+           size_t name_datalen, name_oldlen;
+           Der_type name_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &name_type,
+                                        0, &name_datalen, &l);
+           if (e == 0 && name_type != CONS) {
+               e = ASN1_BAD_ID;
            }
-           ret += Top_Tag_oldret;
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           name_oldlen = len;
+           if (name_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = name_datalen;
+           e = decode_PrincipalName(p, len, &(data)->name, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           len = name_oldlen - name_datalen;
+       }
+       {
+           size_t realm_datalen, realm_oldlen;
+           Der_type realm_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &realm_type,
+                                        1, &realm_datalen, &l);
+           if (e == 0 && realm_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           realm_oldlen = len;
+           if (realm_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = realm_datalen;
+           e = decode_Realm(p, len, &(data)->realm, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           len = realm_oldlen - realm_datalen;
        }
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_AuthorizationData(data);
+  fail:
+    free_Principal(data);
     return e;
 }
 
-void
-free_AuthorizationData(AuthorizationData * data)
+void ASN1CALL
+free_Principal(Principal * data)
 {
-    while ((data)->len) {
-       free_AuthorizationDataElement(&(data)->val[(data)->len - 1]);
-       (data)->len--;
-    }
-    free((data)->val);
-    (data)->val = NULL;
+    free_PrincipalName(&(data)->name);
+    free_Realm(&(data)->realm);
 }
 
-size_t
-length_AuthorizationData(const AuthorizationData * data)
+size_t ASN1CALL
+length_Principal(const Principal * data)
 {
     size_t ret = 0;
     {
-       int Top_tag_oldret = ret;
-       int i;
+       size_t Top_tag_oldret = ret;
+       ret = 0;
+       ret += length_PrincipalName(&(data)->name);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    {
+       size_t Top_tag_oldret = ret;
        ret = 0;
-       for (i = (data)->len - 1; i >= 0; --i) {
-           int Top_tag_for_oldret = ret;
-           ret = 0;
-           ret += length_AuthorizationDataElement(&(data)->val[i]);
-           ret += Top_tag_for_oldret;
-       }
+       ret += length_Realm(&(data)->realm);
+       ret += 1 + der_length_len(ret);
        ret += Top_tag_oldret;
     }
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_AuthorizationData(const AuthorizationData * from, AuthorizationData * to)
+int ASN1CALL
+copy_Principal(const Principal * from, Principal * to)
 {
     memset(to, 0, sizeof(*to));
-    if (((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
+    if (copy_PrincipalName(&(from)->name, &(to)->name))
+       goto fail;
+    if (copy_Realm(&(from)->realm, &(to)->realm))
        goto fail;
-    for ((to)->len = 0; (to)->len < (from)->len; (to)->len++) {
-       if (copy_AuthorizationDataElement(&(from)->val[(to)->len], &(to)->val[(to)->len]))
-           goto fail;
-    }
     return 0;
-fail:
-    free_AuthorizationData(to);
+  fail:
+    free_Principal(to);
     return ENOMEM;
 }
 
-int
-add_AuthorizationData(AuthorizationData * data, const AuthorizationDataElement * element)
+int ASN1CALL
+encode_Principals(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                 size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                 const Principals * data, size_t * size)
 {
-    int ret;
-    void *ptr;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    ptr = realloc(data->val,
-                 (data->len + 1) * sizeof(data->val[0]));
-    if (ptr == NULL)
-       return ENOMEM;
-    data->val = ptr;
+    for (i = (int) (data)->len - 1; i >= 0; --i) {
+       size_t Top_tag_for_oldret = ret;
+       ret = 0;
+       e = encode_Principal(p, len, &(data)->val[i], &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
 
-    ret = copy_AuthorizationDataElement(element, &data->val[data->len]);
-    if (ret)
+       ret += Top_tag_for_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_Principals(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                 size_t len HEIMDAL_UNUSED_ATTRIBUTE, Principals * data,
+                 size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t Top_Tag_origlen = len;
+           size_t Top_Tag_oldret = ret;
+           size_t Top_Tag_olen = 0;
+           void *Top_Tag_tmp;
+           ret = 0;
+           (data)->len = 0;
+           (data)->val = NULL;
+           while (ret < Top_Tag_origlen) {
+               size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
+               if (Top_Tag_olen > Top_Tag_nlen) {
+                   e = ASN1_OVERFLOW;
+                   goto fail;
+               }
+               Top_Tag_olen = Top_Tag_nlen;
+               Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
+               if (Top_Tag_tmp == NULL) {
+                   e = ENOMEM;
+                   goto fail;
+               }
+               (data)->val = Top_Tag_tmp;
+               e = decode_Principal(p, len, &(data)->val[(data)->len], &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               (data)->len++;
+               len = Top_Tag_origlen - ret;
+           }
+           ret += Top_Tag_oldret;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_Principals(data);
+    return e;
+}
+
+void ASN1CALL
+free_Principals(Principals * data)
+{
+    while ((data)->len) {
+       free_Principal(&(data)->val[(data)->len - 1]);
+       (data)->len--;
+    }
+    free((data)->val);
+    (data)->val = NULL;
+}
+
+size_t ASN1CALL
+length_Principals(const Principals * data)
+{
+    size_t ret = 0;
+    {
+       size_t Top_tag_oldret = ret;
+       unsigned int n_Top_tag;
+       ret = 0;
+       for (n_Top_tag = (data)->len; n_Top_tag > 0; --n_Top_tag) {
+           size_t Top_tag_for_oldret = ret;
+           ret = 0;
+           ret += length_Principal(&(data)->val[n_Top_tag - 1]);
+           ret += Top_tag_for_oldret;
+       }
+       ret += Top_tag_oldret;
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_Principals(const Principals * from, Principals * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL
+       && (from)->len != 0)
+       goto fail;
+    for ((to)->len = 0; (to)->len < (from)->len; (to)->len++) {
+       if (copy_Principal(&(from)->val[(to)->len], &(to)->val[(to)->len]))
+           goto fail;
+    }
+    return 0;
+  fail:
+    free_Principals(to);
+    return ENOMEM;
+}
+
+int ASN1CALL
+add_Principals(Principals * data, const Principal * element)
+{
+    int ret;
+    void *ptr;
+
+    ptr = realloc(data->val, (data->len + 1) * sizeof(data->val[0]));
+    if (ptr == NULL)
+       return ENOMEM;
+    data->val = ptr;
+
+    ret = copy_Principal(element, &data->val[data->len]);
+    if (ret)
        return ret;
     data->len++;
     return 0;
 }
 
-int
-remove_AuthorizationData(AuthorizationData * data, unsigned int element)
+int ASN1CALL
+remove_Principals(Principals * data, unsigned int element)
 {
     void *ptr;
 
     if (data->len == 0 || element >= data->len)
        return ASN1_OVERRUN;
-    free_AuthorizationDataElement(&data->val[element]);
+    free_Principal(&data->val[element]);
     data->len--;
     if (element < data->len)
        memmove(&data->val[element], &data->val[element + 1],
-               sizeof(data->val[0]) * data->len);
+               sizeof(data->val[0]) * (data->len - element));
     ptr = realloc(data->val, data->len * sizeof(data->val[0]));
     if (ptr != NULL || data->len == 0)
        data->val = ptr;
     return 0;
 }
 
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_EncTicketPart(unsigned char *p, size_t len, const EncTicketPart * data, size_t * size)
+int ASN1CALL
+encode_HostAddress(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                  size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                  const HostAddress * data, size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
-
-    i = 0;
-/* authorization-data */
-    if ((data)->authorization_data) {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_AuthorizationData(p, len, (data)->authorization_data, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-       ret += Top_tag_tag_oldret;
-    }
-/* caddr */
-    if ((data)->caddr) {
-       size_t Top_tag_tag_oldret = ret;
+/* address */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
        ret = 0;
-       e = encode_HostAddresses(p, len, (data)->caddr, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
+       e = der_put_octet_string(p, len, &(data)->address, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_tag_oldret;
-    }
-/* renew-till */
-    if ((data)->renew_till) {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_KerberosTime(p, len, (data)->renew_till, &l);
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                                  UT_OctetString, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_tag_oldret;
+       ret += Top_tag_oldret;
     }
-/* endtime */
+/* addr-type */
     {
-       size_t Top_tag_tag_oldret = ret;
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
        ret = 0;
-       e = encode_KerberosTime(p, len, &(data)->endtime, &l);
+       e = encode_krb5int32(p, len, &(data)->addr_type, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_tag_oldret;
+       ret += Top_tag_oldret;
     }
-/* starttime */
-    if ((data)->starttime) {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_KerberosTime(p, len, (data)->starttime, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
 
-       ret += Top_tag_tag_oldret;
-    }
-/* authtime */
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_KerberosTime(p, len, &(data)->authtime, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+    *size = ret;
+    return 0;
+}
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+int ASN1CALL
+decode_HostAddress(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                  size_t len HEIMDAL_UNUSED_ATTRIBUTE, HostAddress * data,
+                  size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
-       ret += Top_tag_tag_oldret;
-    }
-/* transited */
+    memset(data, 0, sizeof(*data));
     {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_TransitedEncoding(p, len, &(data)->transited, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
        if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       ret += Top_tag_tag_oldret;
-    }
-/* cname */
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_PrincipalName(p, len, &(data)->cname, &l);
-       if (e)
-           return e;
-       p -= l;
+           goto fail;
+       p += l;
        len -= l;
        ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t addr_type_datalen, addr_type_oldlen;
+           Der_type addr_type_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &addr_type_type, 0,
+                                        &addr_type_datalen, &l);
+           if (e == 0 && addr_type_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           addr_type_oldlen = len;
+           if (addr_type_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = addr_type_datalen;
+           e = decode_krb5int32(p, len, &(data)->addr_type, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           len = addr_type_oldlen - addr_type_datalen;
+       }
+       {
+           size_t address_datalen, address_oldlen;
+           Der_type address_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &address_type, 1, &address_datalen,
+                                        &l);
+           if (e == 0 && address_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           address_oldlen = len;
+           if (address_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = address_datalen;
+           {
+               size_t address_Tag_datalen, address_Tag_oldlen;
+               Der_type address_Tag_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_UNIV,
+                                            &address_Tag_type,
+                                            UT_OctetString,
+                                            &address_Tag_datalen, &l);
+               if (e == 0 && address_Tag_type != PRIM) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               address_Tag_oldlen = len;
+               if (address_Tag_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = address_Tag_datalen;
+               e = der_get_octet_string(p, len, &(data)->address, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = address_Tag_oldlen - address_Tag_datalen;
+           }
+           len = address_oldlen - address_datalen;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_HostAddress(data);
+    return e;
+}
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+void ASN1CALL
+free_HostAddress(HostAddress * data)
+{
+    free_krb5int32(&(data)->addr_type);
+    der_free_octet_string(&(data)->address);
+}
 
-       ret += Top_tag_tag_oldret;
-    }
-/* crealm */
+size_t ASN1CALL
+length_HostAddress(const HostAddress * data)
+{
+    size_t ret = 0;
     {
-       size_t Top_tag_tag_oldret = ret;
+       size_t Top_tag_oldret = ret;
        ret = 0;
-       e = encode_Realm(p, len, &(data)->crealm, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       ret += Top_tag_tag_oldret;
+       ret += length_krb5int32(&(data)->addr_type);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
     }
-/* key */
     {
-       size_t Top_tag_tag_oldret = ret;
+       size_t Top_tag_oldret = ret;
        ret = 0;
-       e = encode_EncryptionKey(p, len, &(data)->key, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+       ret += der_length_octet_string(&(data)->address);
+       ret += 1 + der_length_len(ret);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+int ASN1CALL
+copy_HostAddress(const HostAddress * from, HostAddress * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (copy_krb5int32(&(from)->addr_type, &(to)->addr_type))
+       goto fail;
+    if (der_copy_octet_string(&(from)->address, &(to)->address))
+       goto fail;
+    return 0;
+  fail:
+    free_HostAddress(to);
+    return ENOMEM;
+}
 
-       ret += Top_tag_tag_oldret;
-    }
-/* flags */
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       e = encode_TicketFlags(p, len, &(data)->flags, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+int ASN1CALL
+encode_HostAddresses(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    const HostAddresses * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+    for (i = (int) (data)->len - 1; i >= 0; --i) {
+       size_t Top_tag_for_oldret = ret;
+       ret = 0;
+       e = encode_HostAddress(p, len, &(data)->val[i], &l);
        if (e)
            return e;
        p -= l;
        len -= l;
        ret += l;
 
-       ret += Top_tag_tag_oldret;
+       ret += Top_tag_for_oldret;
     }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
-    if (e)
-       return e;
-    p -= l;
-    len -= l;
-    ret += l;
-
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_APPL, CONS, 3, &l);
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -2131,18 +2233,21 @@ encode_EncTicketPart(unsigned char *p, size_t len, const EncTicketPart * data, s
     return 0;
 }
 
-int
-decode_EncTicketPart(const unsigned char *p, size_t len, EncTicketPart * data, size_t * size)
+int ASN1CALL
+decode_HostAddresses(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    HostAddresses * data, size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 3, &Top_datalen, &l);
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
        if (e == 0 && Top_type != CONS) {
            e = ASN1_BAD_ID;
        }
@@ -2158,80 +2263,347 @@ decode_EncTicketPart(const unsigned char *p, size_t len, EncTicketPart * data, s
        }
        len = Top_datalen;
        {
-           size_t Top_Tag_datalen, Top_Tag_oldlen;
-           Der_type Top_Tag_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
-           if (e == 0 && Top_Tag_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           Top_Tag_oldlen = len;
-           if (Top_Tag_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = Top_Tag_datalen;
-           {
-               size_t flags_datalen, flags_oldlen;
-               Der_type flags_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &flags_type, 0, &flags_datalen, &l);
-               if (e == 0 && flags_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               flags_oldlen = len;
-               if (flags_datalen > len) {
-                   e = ASN1_OVERRUN;
+           size_t Top_Tag_origlen = len;
+           size_t Top_Tag_oldret = ret;
+           size_t Top_Tag_olen = 0;
+           void *Top_Tag_tmp;
+           ret = 0;
+           (data)->len = 0;
+           (data)->val = NULL;
+           while (ret < Top_Tag_origlen) {
+               size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
+               if (Top_Tag_olen > Top_Tag_nlen) {
+                   e = ASN1_OVERFLOW;
                    goto fail;
                }
-               len = flags_datalen;
-               e = decode_TicketFlags(p, len, &(data)->flags, &l);
-               if (e)
+               Top_Tag_olen = Top_Tag_nlen;
+               Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
+               if (Top_Tag_tmp == NULL) {
+                   e = ENOMEM;
                    goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = flags_oldlen - flags_datalen;
-           }
-           {
-               size_t key_datalen, key_oldlen;
-               Der_type key_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &key_type, 1, &key_datalen, &l);
-               if (e == 0 && key_type != CONS) {
-                   e = ASN1_BAD_ID;
                }
+               (data)->val = Top_Tag_tmp;
+               e = decode_HostAddress(p, len, &(data)->val[(data)->len], &l);
                if (e)
                    goto fail;
                p += l;
                len -= l;
                ret += l;
-               key_oldlen = len;
-               if (key_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = key_datalen;
-               e = decode_EncryptionKey(p, len, &(data)->key, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = key_oldlen - key_datalen;
+               (data)->len++;
+               len = Top_Tag_origlen - ret;
+           }
+           ret += Top_Tag_oldret;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_HostAddresses(data);
+    return e;
+}
+
+void ASN1CALL
+free_HostAddresses(HostAddresses * data)
+{
+    while ((data)->len) {
+       free_HostAddress(&(data)->val[(data)->len - 1]);
+       (data)->len--;
+    }
+    free((data)->val);
+    (data)->val = NULL;
+}
+
+size_t ASN1CALL
+length_HostAddresses(const HostAddresses * data)
+{
+    size_t ret = 0;
+    {
+       size_t Top_tag_oldret = ret;
+       unsigned int n_Top_tag;
+       ret = 0;
+       for (n_Top_tag = (data)->len; n_Top_tag > 0; --n_Top_tag) {
+           size_t Top_tag_for_oldret = ret;
+           ret = 0;
+           ret += length_HostAddress(&(data)->val[n_Top_tag - 1]);
+           ret += Top_tag_for_oldret;
+       }
+       ret += Top_tag_oldret;
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_HostAddresses(const HostAddresses * from, HostAddresses * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL
+       && (from)->len != 0)
+       goto fail;
+    for ((to)->len = 0; (to)->len < (from)->len; (to)->len++) {
+       if (copy_HostAddress(&(from)->val[(to)->len], &(to)->val[(to)->len]))
+           goto fail;
+    }
+    return 0;
+  fail:
+    free_HostAddresses(to);
+    return ENOMEM;
+}
+
+int ASN1CALL
+encode_KerberosTime(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                   size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                   const KerberosTime * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    e = der_put_generalized_time(p, len, data, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                              UT_GeneralizedTime, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_KerberosTime(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                   size_t len HEIMDAL_UNUSED_ATTRIBUTE, KerberosTime * data,
+                   size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_GeneralizedTime, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       e = der_get_generalized_time(p, len, data, &l);
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_KerberosTime(data);
+    return e;
+}
+
+void ASN1CALL
+free_KerberosTime(KerberosTime * data)
+{
+}
+
+size_t ASN1CALL
+length_KerberosTime(const KerberosTime * data)
+{
+    size_t ret = 0;
+    ret += der_length_generalized_time(data);
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_KerberosTime(const KerberosTime * from, KerberosTime * to)
+{
+    memset(to, 0, sizeof(*to));
+    *(to) = *(from);
+    return 0;
+}
+
+int ASN1CALL
+encode_AuthorizationDataElement(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                               size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                               const AuthorizationDataElement * data,
+                               size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+/* ad-data */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = der_put_octet_string(p, len, &(data)->ad_data, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                                  UT_OctetString, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+/* ad-type */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_krb5int32(p, len, &(data)->ad_type, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_AuthorizationDataElement(const unsigned char *p
+                               HEIMDAL_UNUSED_ATTRIBUTE,
+                               size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                               AuthorizationDataElement * data,
+                               size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t ad_type_datalen, ad_type_oldlen;
+           Der_type ad_type_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &ad_type_type, 0, &ad_type_datalen,
+                                        &l);
+           if (e == 0 && ad_type_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           ad_type_oldlen = len;
+           if (ad_type_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = ad_type_datalen;
+           e = decode_krb5int32(p, len, &(data)->ad_type, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           len = ad_type_oldlen - ad_type_datalen;
+       }
+       {
+           size_t ad_data_datalen, ad_data_oldlen;
+           Der_type ad_data_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &ad_data_type, 1, &ad_data_datalen,
+                                        &l);
+           if (e == 0 && ad_data_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           ad_data_oldlen = len;
+           if (ad_data_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
            }
+           len = ad_data_datalen;
            {
-               size_t crealm_datalen, crealm_oldlen;
-               Der_type crealm_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &crealm_type, 2, &crealm_datalen, &l);
-               if (e == 0 && crealm_type != CONS) {
+               size_t ad_data_Tag_datalen, ad_data_Tag_oldlen;
+               Der_type ad_data_Tag_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_UNIV,
+                                            &ad_data_Tag_type,
+                                            UT_OctetString,
+                                            &ad_data_Tag_datalen, &l);
+               if (e == 0 && ad_data_Tag_type != PRIM) {
                    e = ASN1_BAD_ID;
                }
                if (e)
@@ -2239,470 +2611,100 @@ decode_EncTicketPart(const unsigned char *p, size_t len, EncTicketPart * data, s
                p += l;
                len -= l;
                ret += l;
-               crealm_oldlen = len;
-               if (crealm_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = crealm_datalen;
-               e = decode_Realm(p, len, &(data)->crealm, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = crealm_oldlen - crealm_datalen;
-           }
-           {
-               size_t cname_datalen, cname_oldlen;
-               Der_type cname_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cname_type, 3, &cname_datalen, &l);
-               if (e == 0 && cname_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               cname_oldlen = len;
-               if (cname_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = cname_datalen;
-               e = decode_PrincipalName(p, len, &(data)->cname, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = cname_oldlen - cname_datalen;
-           }
-           {
-               size_t transited_datalen, transited_oldlen;
-               Der_type transited_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &transited_type, 4, &transited_datalen, &l);
-               if (e == 0 && transited_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               transited_oldlen = len;
-               if (transited_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = transited_datalen;
-               e = decode_TransitedEncoding(p, len, &(data)->transited, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = transited_oldlen - transited_datalen;
-           }
-           {
-               size_t authtime_datalen, authtime_oldlen;
-               Der_type authtime_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authtime_type, 5, &authtime_datalen, &l);
-               if (e == 0 && authtime_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               authtime_oldlen = len;
-               if (authtime_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = authtime_datalen;
-               e = decode_KerberosTime(p, len, &(data)->authtime, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = authtime_oldlen - authtime_datalen;
-           }
-           {
-               size_t starttime_datalen, starttime_oldlen;
-               Der_type starttime_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &starttime_type, 6, &starttime_datalen, &l);
-               if (e == 0 && starttime_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e) {
-                   (data)->starttime = NULL;
-               } else {
-                   (data)->starttime = calloc(1, sizeof(*(data)->starttime));
-                   if ((data)->starttime == NULL) {
-                       e = ENOMEM;
-                       goto fail;
-                   }
-                   p += l;
-                   len -= l;
-                   ret += l;
-                   starttime_oldlen = len;
-                   if (starttime_datalen > len) {
-                       e = ASN1_OVERRUN;
-                       goto fail;
-                   }
-                   len = starttime_datalen;
-                   e = decode_KerberosTime(p, len, (data)->starttime, &l);
-                   if (e)
-                       goto fail;
-                   p += l;
-                   len -= l;
-                   ret += l;
-                   len = starttime_oldlen - starttime_datalen;
-               }
-           }
-           {
-               size_t endtime_datalen, endtime_oldlen;
-               Der_type endtime_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &endtime_type, 7, &endtime_datalen, &l);
-               if (e == 0 && endtime_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               endtime_oldlen = len;
-               if (endtime_datalen > len) {
+               ad_data_Tag_oldlen = len;
+               if (ad_data_Tag_datalen > len) {
                    e = ASN1_OVERRUN;
                    goto fail;
                }
-               len = endtime_datalen;
-               e = decode_KerberosTime(p, len, &(data)->endtime, &l);
+               len = ad_data_Tag_datalen;
+               e = der_get_octet_string(p, len, &(data)->ad_data, &l);
                if (e)
                    goto fail;
                p += l;
                len -= l;
                ret += l;
-               len = endtime_oldlen - endtime_datalen;
-           }
-           {
-               size_t renew_till_datalen, renew_till_oldlen;
-               Der_type renew_till_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &renew_till_type, 8, &renew_till_datalen, &l);
-               if (e == 0 && renew_till_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e) {
-                   (data)->renew_till = NULL;
-               } else {
-                   (data)->renew_till = calloc(1, sizeof(*(data)->renew_till));
-                   if ((data)->renew_till == NULL) {
-                       e = ENOMEM;
-                       goto fail;
-                   }
-                   p += l;
-                   len -= l;
-                   ret += l;
-                   renew_till_oldlen = len;
-                   if (renew_till_datalen > len) {
-                       e = ASN1_OVERRUN;
-                       goto fail;
-                   }
-                   len = renew_till_datalen;
-                   e = decode_KerberosTime(p, len, (data)->renew_till, &l);
-                   if (e)
-                       goto fail;
-                   p += l;
-                   len -= l;
-                   ret += l;
-                   len = renew_till_oldlen - renew_till_datalen;
-               }
-           }
-           {
-               size_t caddr_datalen, caddr_oldlen;
-               Der_type caddr_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &caddr_type, 9, &caddr_datalen, &l);
-               if (e == 0 && caddr_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e) {
-                   (data)->caddr = NULL;
-               } else {
-                   (data)->caddr = calloc(1, sizeof(*(data)->caddr));
-                   if ((data)->caddr == NULL) {
-                       e = ENOMEM;
-                       goto fail;
-                   }
-                   p += l;
-                   len -= l;
-                   ret += l;
-                   caddr_oldlen = len;
-                   if (caddr_datalen > len) {
-                       e = ASN1_OVERRUN;
-                       goto fail;
-                   }
-                   len = caddr_datalen;
-                   e = decode_HostAddresses(p, len, (data)->caddr, &l);
-                   if (e)
-                       goto fail;
-                   p += l;
-                   len -= l;
-                   ret += l;
-                   len = caddr_oldlen - caddr_datalen;
-               }
-           }
-           {
-               size_t authorization_data_datalen, authorization_data_oldlen;
-               Der_type authorization_data_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authorization_data_type, 10, &authorization_data_datalen, &l);
-               if (e == 0 && authorization_data_type != CONS) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e) {
-                   (data)->authorization_data = NULL;
-               } else {
-                   (data)->authorization_data = calloc(1, sizeof(*(data)->authorization_data));
-                   if ((data)->authorization_data == NULL) {
-                       e = ENOMEM;
-                       goto fail;
-                   }
-                   p += l;
-                   len -= l;
-                   ret += l;
-                   authorization_data_oldlen = len;
-                   if (authorization_data_datalen > len) {
-                       e = ASN1_OVERRUN;
-                       goto fail;
-                   }
-                   len = authorization_data_datalen;
-                   e = decode_AuthorizationData(p, len, (data)->authorization_data, &l);
-                   if (e)
-                       goto fail;
-                   p += l;
-                   len -= l;
-                   ret += l;
-                   len = authorization_data_oldlen - authorization_data_datalen;
-               }
+               len = ad_data_Tag_oldlen - ad_data_Tag_datalen;
            }
-           len = Top_Tag_oldlen - Top_Tag_datalen;
+           len = ad_data_oldlen - ad_data_datalen;
        }
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_EncTicketPart(data);
+  fail:
+    free_AuthorizationDataElement(data);
     return e;
 }
 
-void
-free_EncTicketPart(EncTicketPart * data)
+void ASN1CALL
+free_AuthorizationDataElement(AuthorizationDataElement * data)
 {
-    free_TicketFlags(&(data)->flags);
-    free_EncryptionKey(&(data)->key);
-    free_Realm(&(data)->crealm);
-    free_PrincipalName(&(data)->cname);
-    free_TransitedEncoding(&(data)->transited);
-    free_KerberosTime(&(data)->authtime);
-    if ((data)->starttime) {
-       free_KerberosTime((data)->starttime);
-       free((data)->starttime);
-       (data)->starttime = NULL;
-    }
-    free_KerberosTime(&(data)->endtime);
-    if ((data)->renew_till) {
-       free_KerberosTime((data)->renew_till);
-       free((data)->renew_till);
-       (data)->renew_till = NULL;
-    }
-    if ((data)->caddr) {
-       free_HostAddresses((data)->caddr);
-       free((data)->caddr);
-       (data)->caddr = NULL;
-    }
-    if ((data)->authorization_data) {
-       free_AuthorizationData((data)->authorization_data);
-       free((data)->authorization_data);
-       (data)->authorization_data = NULL;
-    }
+    free_krb5int32(&(data)->ad_type);
+    der_free_octet_string(&(data)->ad_data);
 }
 
-size_t
-length_EncTicketPart(const EncTicketPart * data)
+size_t ASN1CALL
+length_AuthorizationDataElement(const AuthorizationDataElement * data)
 {
     size_t ret = 0;
     {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_TicketFlags(&(data)->flags);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_EncryptionKey(&(data)->key);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_Realm(&(data)->crealm);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_PrincipalName(&(data)->cname);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    {
-       size_t Top_tag_tag_oldret = ret;
+       size_t Top_tag_oldret = ret;
        ret = 0;
-       ret += length_TransitedEncoding(&(data)->transited);
+       ret += length_krb5int32(&(data)->ad_type);
        ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
+       ret += Top_tag_oldret;
     }
     {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_KerberosTime(&(data)->authtime);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    if ((data)->starttime) {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_KerberosTime((data)->starttime);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    } {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_KerberosTime(&(data)->endtime);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    if ((data)->renew_till) {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_KerberosTime((data)->renew_till);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    if ((data)->caddr) {
-       size_t Top_tag_tag_oldret = ret;
+       size_t Top_tag_oldret = ret;
        ret = 0;
-       ret += length_HostAddresses((data)->caddr);
+       ret += der_length_octet_string(&(data)->ad_data);
        ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
-    }
-    if ((data)->authorization_data) {
-       size_t Top_tag_tag_oldret = ret;
-       ret = 0;
-       ret += length_AuthorizationData((data)->authorization_data);
        ret += 1 + der_length_len(ret);
-       ret += Top_tag_tag_oldret;
+       ret += Top_tag_oldret;
     }
     ret += 1 + der_length_len(ret);
-    ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_EncTicketPart(const EncTicketPart * from, EncTicketPart * to)
+int ASN1CALL
+copy_AuthorizationDataElement(const AuthorizationDataElement * from,
+                             AuthorizationDataElement * to)
 {
     memset(to, 0, sizeof(*to));
-    if (copy_TicketFlags(&(from)->flags, &(to)->flags))
-       goto fail;
-    if (copy_EncryptionKey(&(from)->key, &(to)->key))
-       goto fail;
-    if (copy_Realm(&(from)->crealm, &(to)->crealm))
-       goto fail;
-    if (copy_PrincipalName(&(from)->cname, &(to)->cname))
-       goto fail;
-    if (copy_TransitedEncoding(&(from)->transited, &(to)->transited))
-       goto fail;
-    if (copy_KerberosTime(&(from)->authtime, &(to)->authtime))
+    if (copy_krb5int32(&(from)->ad_type, &(to)->ad_type))
        goto fail;
-    if ((from)->starttime) {
-       (to)->starttime = malloc(sizeof(*(to)->starttime));
-       if ((to)->starttime == NULL)
-           goto fail;
-       if (copy_KerberosTime((from)->starttime, (to)->starttime))
-           goto fail;
-    } else
-       (to)->starttime = NULL;
-    if (copy_KerberosTime(&(from)->endtime, &(to)->endtime))
+    if (der_copy_octet_string(&(from)->ad_data, &(to)->ad_data))
        goto fail;
-    if ((from)->renew_till) {
-       (to)->renew_till = malloc(sizeof(*(to)->renew_till));
-       if ((to)->renew_till == NULL)
-           goto fail;
-       if (copy_KerberosTime((from)->renew_till, (to)->renew_till))
-           goto fail;
-    } else
-       (to)->renew_till = NULL;
-    if ((from)->caddr) {
-       (to)->caddr = malloc(sizeof(*(to)->caddr));
-       if ((to)->caddr == NULL)
-           goto fail;
-       if (copy_HostAddresses((from)->caddr, (to)->caddr))
-           goto fail;
-    } else
-       (to)->caddr = NULL;
-    if ((from)->authorization_data) {
-       (to)->authorization_data = malloc(sizeof(*(to)->authorization_data));
-       if ((to)->authorization_data == NULL)
-           goto fail;
-       if (copy_AuthorizationData((from)->authorization_data, (to)->authorization_data))
-           goto fail;
-    } else
-       (to)->authorization_data = NULL;
     return 0;
-fail:
-    free_EncTicketPart(to);
+  fail:
+    free_AuthorizationDataElement(to);
     return ENOMEM;
 }
 
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_KerberosTime(unsigned char *p, size_t len, const KerberosTime * data, size_t * size)
+int ASN1CALL
+encode_AuthorizationData(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                        size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                        const AuthorizationData * data, size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    i = 0;
-    e = der_put_generalized_time(p, len, data, &l);
-    if (e)
-       return e;
-    p -= l;
-    len -= l;
-    ret += l;
+    for (i = (int) (data)->len - 1; i >= 0; --i) {
+       size_t Top_tag_for_oldret = ret;
+       ret = 0;
+       e = encode_AuthorizationDataElement(p, len, &(data)->val[i], &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
 
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralizedTime, &l);
+       ret += Top_tag_for_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -2713,19 +2715,22 @@ encode_KerberosTime(unsigned char *p, size_t len, const KerberosTime * data, siz
     return 0;
 }
 
-int
-decode_KerberosTime(const unsigned char *p, size_t len, KerberosTime * data, size_t * size)
+int ASN1CALL
+decode_AuthorizationData(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                        size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                        AuthorizationData * data, size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_GeneralizedTime, &Top_datalen, &l);
-       if (e == 0 && Top_type != PRIM) {
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
            e = ASN1_BAD_ID;
        }
        if (e)
@@ -2739,113 +2744,189 @@ decode_KerberosTime(const unsigned char *p, size_t len, KerberosTime * data, siz
            goto fail;
        }
        len = Top_datalen;
-       e = der_get_generalized_time(p, len, data, &l);
-       if (e)
-           goto fail;
-       p += l;
-       len -= l;
-       ret += l;
+       {
+           size_t Top_Tag_origlen = len;
+           size_t Top_Tag_oldret = ret;
+           size_t Top_Tag_olen = 0;
+           void *Top_Tag_tmp;
+           ret = 0;
+           (data)->len = 0;
+           (data)->val = NULL;
+           while (ret < Top_Tag_origlen) {
+               size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
+               if (Top_Tag_olen > Top_Tag_nlen) {
+                   e = ASN1_OVERFLOW;
+                   goto fail;
+               }
+               Top_Tag_olen = Top_Tag_nlen;
+               Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
+               if (Top_Tag_tmp == NULL) {
+                   e = ENOMEM;
+                   goto fail;
+               }
+               (data)->val = Top_Tag_tmp;
+               e = decode_AuthorizationDataElement(p, len,
+                                                   &(data)->val[(data)->len],
+                                                   &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               (data)->len++;
+               len = Top_Tag_origlen - ret;
+           }
+           ret += Top_Tag_oldret;
+       }
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_KerberosTime(data);
+  fail:
+    free_AuthorizationData(data);
     return e;
 }
 
-void
-free_KerberosTime(KerberosTime * data)
+void ASN1CALL
+free_AuthorizationData(AuthorizationData * data)
 {
+    while ((data)->len) {
+       free_AuthorizationDataElement(&(data)->val[(data)->len - 1]);
+       (data)->len--;
+    }
+    free((data)->val);
+    (data)->val = NULL;
 }
 
-size_t
-length_KerberosTime(const KerberosTime * data)
+size_t ASN1CALL
+length_AuthorizationData(const AuthorizationData * data)
 {
     size_t ret = 0;
-    ret += der_length_generalized_time(data);
+    {
+       size_t Top_tag_oldret = ret;
+       unsigned int n_Top_tag;
+       ret = 0;
+       for (n_Top_tag = (data)->len; n_Top_tag > 0; --n_Top_tag) {
+           size_t Top_tag_for_oldret = ret;
+           ret = 0;
+           ret +=
+               length_AuthorizationDataElement(&(data)->val[n_Top_tag - 1]);
+           ret += Top_tag_for_oldret;
+       }
+       ret += Top_tag_oldret;
+    }
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_KerberosTime(const KerberosTime * from, KerberosTime * to)
+int ASN1CALL
+copy_AuthorizationData(const AuthorizationData * from, AuthorizationData * to)
 {
     memset(to, 0, sizeof(*to));
-    *(to) = *(from);
+    if (((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL
+       && (from)->len != 0)
+       goto fail;
+    for ((to)->len = 0; (to)->len < (from)->len; (to)->len++) {
+       if (copy_AuthorizationDataElement
+           (&(from)->val[(to)->len], &(to)->val[(to)->len]))
+           goto fail;
+    }
     return 0;
+  fail:
+    free_AuthorizationData(to);
+    return ENOMEM;
 }
 
+int ASN1CALL
+add_AuthorizationData(AuthorizationData * data,
+                     const AuthorizationDataElement * element)
+{
+    int ret;
+    void *ptr;
 
+    ptr = realloc(data->val, (data->len + 1) * sizeof(data->val[0]));
+    if (ptr == NULL)
+       return ENOMEM;
+    data->val = ptr;
 
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
+    ret = copy_AuthorizationDataElement(element, &data->val[data->len]);
+    if (ret)
+       return ret;
+    data->len++;
+    return 0;
+}
 
-int
-encode_TransitedEncoding(unsigned char *p, size_t len, const TransitedEncoding * data, size_t * size)
+int ASN1CALL
+remove_AuthorizationData(AuthorizationData * data, unsigned int element)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
-
-    i = 0;
-/* contents */
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = der_put_octet_string(p, len, &(data)->contents, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+    void *ptr;
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+    if (data->len == 0 || element >= data->len)
+       return ASN1_OVERRUN;
+    free_AuthorizationDataElement(&data->val[element]);
+    data->len--;
+    if (element < data->len)
+       memmove(&data->val[element], &data->val[element + 1],
+               sizeof(data->val[0]) * (data->len - element));
+    ptr = realloc(data->val, data->len * sizeof(data->val[0]));
+    if (ptr != NULL || data->len == 0)
+       data->val = ptr;
+    return 0;
+}
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+int ASN1CALL
+encode_APOptions(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, const APOptions * data,
+                size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-       ret += Top_tag_oldret;
-    }
-/* tr-type */
     {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = encode_krb5int32(p, len, &(data)->tr_type, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       ret += Top_tag_oldret;
+       unsigned char c = 0;
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = c;
+       len--;
+       ret++;
+       c = 0;
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = c;
+       len--;
+       ret++;
+       c = 0;
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = c;
+       len--;
+       ret++;
+       c = 0;
+       if ((data)->mutual_required) {
+           c |= 1 << 5;
+       }
+       if ((data)->use_session_key) {
+           c |= 1 << 6;
+       }
+       if ((data)->reserved) {
+           c |= 1 << 7;
+       }
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = c;
+       len--;
+       ret++;
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = 0;
+       len -= 1;
+       ret += 1;
     }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
+
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -2856,19 +2937,22 @@ encode_TransitedEncoding(unsigned char *p, size_t len, const TransitedEncoding *
     return 0;
 }
 
-int
-decode_TransitedEncoding(const unsigned char *p, size_t len, TransitedEncoding * data, size_t * size)
+int ASN1CALL
+decode_APOptions(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                size_t len HEIMDAL_UNUSED_ATTRIBUTE, APOptions * data,
+                size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
-       if (e == 0 && Top_type != CONS) {
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_BitString, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
        if (e)
@@ -2882,384 +2966,89 @@ decode_TransitedEncoding(const unsigned char *p, size_t len, TransitedEncoding *
            goto fail;
        }
        len = Top_datalen;
-       {
-           size_t tr_type_datalen, tr_type_oldlen;
-           Der_type tr_type_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &tr_type_type, 0, &tr_type_datalen, &l);
-           if (e == 0 && tr_type_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           tr_type_oldlen = len;
-           if (tr_type_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = tr_type_datalen;
-           e = decode_krb5int32(p, len, &(data)->tr_type, &l);
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           len = tr_type_oldlen - tr_type_datalen;
-       }
-       {
-           size_t contents_datalen, contents_oldlen;
-           Der_type contents_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &contents_type, 1, &contents_datalen, &l);
-           if (e == 0 && contents_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           contents_oldlen = len;
-           if (contents_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = contents_datalen;
-           {
-               size_t contents_Tag_datalen, contents_Tag_oldlen;
-               Der_type contents_Tag_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &contents_Tag_type, UT_OctetString, &contents_Tag_datalen, &l);
-               if (e == 0 && contents_Tag_type != PRIM) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               contents_Tag_oldlen = len;
-               if (contents_Tag_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = contents_Tag_datalen;
-               e = der_get_octet_string(p, len, &(data)->contents, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = contents_Tag_oldlen - contents_Tag_datalen;
-           }
-           len = contents_oldlen - contents_datalen;
-       }
+       if (len < 1)
+           return ASN1_OVERRUN;
+       p++;
+       len--;
+       ret++;
+       do {
+           if (len < 1)
+               break;
+           (data)->reserved = (*p >> 7) & 1;
+           (data)->use_session_key = (*p >> 6) & 1;
+           (data)->mutual_required = (*p >> 5) & 1;
+       } while (0);
+       p += len;
+       ret += len;
        len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_TransitedEncoding(data);
+  fail:
+    free_APOptions(data);
     return e;
 }
 
-void
-free_TransitedEncoding(TransitedEncoding * data)
+void ASN1CALL
+free_APOptions(APOptions * data)
 {
-    free_krb5int32(&(data)->tr_type);
-    der_free_octet_string(&(data)->contents);
 }
 
-size_t
-length_TransitedEncoding(const TransitedEncoding * data)
+size_t ASN1CALL
+length_APOptions(const APOptions * data)
 {
     size_t ret = 0;
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += length_krb5int32(&(data)->tr_type);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    }
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += der_length_octet_string(&(data)->contents);
-       ret += 1 + der_length_len(ret);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    }
+    ret += 5;
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_TransitedEncoding(const TransitedEncoding * from, TransitedEncoding * to)
+int ASN1CALL
+copy_APOptions(const APOptions * from, APOptions * to)
 {
     memset(to, 0, sizeof(*to));
-    if (copy_krb5int32(&(from)->tr_type, &(to)->tr_type))
-       goto fail;
-    if (der_copy_octet_string(&(from)->contents, &(to)->contents))
-       goto fail;
+    *(to) = *(from);
     return 0;
-fail:
-    free_TransitedEncoding(to);
-    return ENOMEM;
 }
 
+unsigned
+APOptions2int(APOptions f)
+{
+    unsigned r = 0;
+    if (f.reserved)
+       r |= (1U << 0);
+    if (f.use_session_key)
+       r |= (1U << 1);
+    if (f.mutual_required)
+       r |= (1U << 2);
+    return r;
+}
 
+APOptions
+int2APOptions(unsigned n)
+{
+    APOptions flags;
 
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
+    memset(&flags, 0, sizeof(flags));
 
-int
-encode_EncryptionKey(unsigned char *p, size_t len, const EncryptionKey * data, size_t * size)
-{
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
+    flags.reserved = (n >> 0) & 1;
+    flags.use_session_key = (n >> 1) & 1;
+    flags.mutual_required = (n >> 2) & 1;
+    return flags;
+}
 
-    i = 0;
-/* keyvalue */
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = der_put_octet_string(p, len, &(data)->keyvalue, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
 
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
+int ASN1CALL
+encode_TicketFlags(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                  size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                  const TicketFlags * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-       ret += Top_tag_oldret;
-    }
-/* keytype */
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       e = encode_krb5int32(p, len, &(data)->keytype, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
-       ret += Top_tag_oldret;
-    }
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
-    if (e)
-       return e;
-    p -= l;
-    len -= l;
-    ret += l;
-
-    *size = ret;
-    return 0;
-}
-
-int
-decode_EncryptionKey(const unsigned char *p, size_t len, EncryptionKey * data, size_t * size)
-{
-    size_t ret = 0;
-    size_t l;
-    int e;
-
-    memset(data, 0, sizeof(*data));
-    {
-       size_t Top_datalen, Top_oldlen;
-       Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
-       if (e == 0 && Top_type != CONS) {
-           e = ASN1_BAD_ID;
-       }
-       if (e)
-           goto fail;
-       p += l;
-       len -= l;
-       ret += l;
-       Top_oldlen = len;
-       if (Top_datalen > len) {
-           e = ASN1_OVERRUN;
-           goto fail;
-       }
-       len = Top_datalen;
-       {
-           size_t keytype_datalen, keytype_oldlen;
-           Der_type keytype_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &keytype_type, 0, &keytype_datalen, &l);
-           if (e == 0 && keytype_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           keytype_oldlen = len;
-           if (keytype_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = keytype_datalen;
-           e = decode_krb5int32(p, len, &(data)->keytype, &l);
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           len = keytype_oldlen - keytype_datalen;
-       }
-       {
-           size_t keyvalue_datalen, keyvalue_oldlen;
-           Der_type keyvalue_type;
-           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &keyvalue_type, 1, &keyvalue_datalen, &l);
-           if (e == 0 && keyvalue_type != CONS) {
-               e = ASN1_BAD_ID;
-           }
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           keyvalue_oldlen = len;
-           if (keyvalue_datalen > len) {
-               e = ASN1_OVERRUN;
-               goto fail;
-           }
-           len = keyvalue_datalen;
-           {
-               size_t keyvalue_Tag_datalen, keyvalue_Tag_oldlen;
-               Der_type keyvalue_Tag_type;
-               e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &keyvalue_Tag_type, UT_OctetString, &keyvalue_Tag_datalen, &l);
-               if (e == 0 && keyvalue_Tag_type != PRIM) {
-                   e = ASN1_BAD_ID;
-               }
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               keyvalue_Tag_oldlen = len;
-               if (keyvalue_Tag_datalen > len) {
-                   e = ASN1_OVERRUN;
-                   goto fail;
-               }
-               len = keyvalue_Tag_datalen;
-               e = der_get_octet_string(p, len, &(data)->keyvalue, &l);
-               if (e)
-                   goto fail;
-               p += l;
-               len -= l;
-               ret += l;
-               len = keyvalue_Tag_oldlen - keyvalue_Tag_datalen;
-           }
-           len = keyvalue_oldlen - keyvalue_datalen;
-       }
-       len = Top_oldlen - Top_datalen;
-    }
-    if (size)
-       *size = ret;
-    return 0;
-fail:
-    free_EncryptionKey(data);
-    return e;
-}
-
-void
-free_EncryptionKey(EncryptionKey * data)
-{
-    free_krb5int32(&(data)->keytype);
-    der_free_octet_string(&(data)->keyvalue);
-}
-
-size_t
-length_EncryptionKey(const EncryptionKey * data)
-{
-    size_t ret = 0;
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += length_krb5int32(&(data)->keytype);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    }
-    {
-       size_t Top_tag_oldret = ret;
-       ret = 0;
-       ret += der_length_octet_string(&(data)->keyvalue);
-       ret += 1 + der_length_len(ret);
-       ret += 1 + der_length_len(ret);
-       ret += Top_tag_oldret;
-    }
-    ret += 1 + der_length_len(ret);
-    return ret;
-}
-
-int
-copy_EncryptionKey(const EncryptionKey * from, EncryptionKey * to)
-{
-    memset(to, 0, sizeof(*to));
-    if (copy_krb5int32(&(from)->keytype, &(to)->keytype))
-       goto fail;
-    if (der_copy_octet_string(&(from)->keyvalue, &(to)->keyvalue))
-       goto fail;
-    return 0;
-fail:
-    free_EncryptionKey(to);
-    return ENOMEM;
-}
-
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_TicketFlags(unsigned char *p, size_t len, const TicketFlags * data, size_t * size)
-{
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
-
-    i = 0;
     {
        unsigned char c = 0;
        if (len < 1)
@@ -3268,14 +3057,17 @@ encode_TicketFlags(unsigned char *p, size_t len, const TicketFlags * data, size_
        len--;
        ret++;
        c = 0;
+       if ((data)->anonymous) {
+           c |= 1 << 7;
+       }
        if (len < 1)
            return ASN1_OVERFLOW;
        *p-- = c;
        len--;
        ret++;
        c = 0;
-       if ((data)->anonymous) {
-           c |= 1 << 1;
+       if ((data)->enc_pa_rep) {
+           c |= 1 << 0;
        }
        if ((data)->ok_as_delegate) {
            c |= 1 << 2;
@@ -3337,7 +3129,8 @@ encode_TicketFlags(unsigned char *p, size_t len, const TicketFlags * data, size_
        ret += 1;
     }
 
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -3348,18 +3141,21 @@ encode_TicketFlags(unsigned char *p, size_t len, const TicketFlags * data, size_
     return 0;
 }
 
-int
-decode_TicketFlags(const unsigned char *p, size_t len, TicketFlags * data, size_t * size)
+int ASN1CALL
+decode_TicketFlags(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                  size_t len HEIMDAL_UNUSED_ATTRIBUTE, TicketFlags * data,
+                  size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_BitString, &Top_datalen, &l);
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_BitString, &Top_datalen, &l);
        if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
@@ -3401,7 +3197,13 @@ decode_TicketFlags(const unsigned char *p, size_t len, TicketFlags * data, size_
            (data)->hw_authent = (*p >> 4) & 1;
            (data)->transited_policy_checked = (*p >> 3) & 1;
            (data)->ok_as_delegate = (*p >> 2) & 1;
-           (data)->anonymous = (*p >> 1) & 1;
+           (data)->enc_pa_rep = (*p >> 0) & 1;
+           p++;
+           len--;
+           ret++;
+           if (len < 1)
+               break;
+           (data)->anonymous = (*p >> 7) & 1;
        } while (0);
        p += len;
        ret += len;
@@ -3410,17 +3212,17 @@ decode_TicketFlags(const unsigned char *p, size_t len, TicketFlags * data, size_
     if (size)
        *size = ret;
     return 0;
-fail:
+  fail:
     free_TicketFlags(data);
     return e;
 }
 
-void
+void ASN1CALL
 free_TicketFlags(TicketFlags * data)
 {
 }
 
-size_t
+size_t ASN1CALL
 length_TicketFlags(const TicketFlags * data)
 {
     size_t ret = 0;
@@ -3429,7 +3231,7 @@ length_TicketFlags(const TicketFlags * data)
     return ret;
 }
 
-int
+int ASN1CALL
 copy_TicketFlags(const TicketFlags * from, TicketFlags * to)
 {
     memset(to, 0, sizeof(*to));
@@ -3469,8 +3271,10 @@ TicketFlags2int(TicketFlags f)
        r |= (1U << 12);
     if (f.ok_as_delegate)
        r |= (1U << 13);
+    if (f.enc_pa_rep)
+       r |= (1U << 15);
     if (f.anonymous)
-       r |= (1U << 14);
+       r |= (1U << 16);
     return r;
 }
 
@@ -3495,141 +3299,293 @@ int2TicketFlags(unsigned n)
     flags.hw_authent = (n >> 11) & 1;
     flags.transited_policy_checked = (n >> 12) & 1;
     flags.ok_as_delegate = (n >> 13) & 1;
-    flags.anonymous = (n >> 14) & 1;
+    flags.enc_pa_rep = (n >> 15) & 1;
+    flags.anonymous = (n >> 16) & 1;
     return flags;
 }
 
 
 
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_Realm(unsigned char *p, size_t len, const Realm * data, size_t * size)
-{
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
-
-    i = 0;
-    e = der_put_general_string(p, len, data, &l);
-    if (e)
-       return e;
-    p -= l;
-    len -= l;
-    ret += l;
-
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
-    if (e)
-       return e;
-    p -= l;
-    len -= l;
-    ret += l;
-
-    *size = ret;
-    return 0;
-}
-
-int
-decode_Realm(const unsigned char *p, size_t len, Realm * data, size_t * size)
+int ASN1CALL
+encode_KDCOptions(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                 size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                 const KDCOptions * data, size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int e;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    memset(data, 0, sizeof(*data));
     {
-       size_t Top_datalen, Top_oldlen;
-       Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_GeneralString, &Top_datalen, &l);
-       if (e == 0 && Top_type != PRIM) {
-           e = ASN1_BAD_ID;
+       unsigned char c = 0;
+       if ((data)->validate) {
+           c |= 1 << 0;
        }
-       if (e)
-           goto fail;
-       p += l;
-       len -= l;
-       ret += l;
-       Top_oldlen = len;
-       if (Top_datalen > len) {
-           e = ASN1_OVERRUN;
-           goto fail;
+       if ((data)->renew) {
+           c |= 1 << 1;
        }
-       len = Top_datalen;
-       e = der_get_general_string(p, len, data, &l);
-       if (e)
-           goto fail;
-       p += l;
-       len -= l;
-       ret += l;
-       len = Top_oldlen - Top_datalen;
+       if ((data)->enc_tkt_in_skey) {
+           c |= 1 << 3;
+       }
+       if ((data)->renewable_ok) {
+           c |= 1 << 4;
+       }
+       if ((data)->disable_transited_check) {
+           c |= 1 << 5;
+       }
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = c;
+       len--;
+       ret++;
+       c = 0;
+       if ((data)->request_anonymous) {
+           c |= 1 << 7;
+       }
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = c;
+       len--;
+       ret++;
+       c = 0;
+       if ((data)->canonicalize) {
+           c |= 1 << 0;
+       }
+       if ((data)->cname_in_addl_tkt) {
+           c |= 1 << 1;
+       }
+       if ((data)->renewable) {
+           c |= 1 << 7;
+       }
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = c;
+       len--;
+       ret++;
+       c = 0;
+       if ((data)->postdated) {
+           c |= 1 << 1;
+       }
+       if ((data)->allow_postdate) {
+           c |= 1 << 2;
+       }
+       if ((data)->proxy) {
+           c |= 1 << 3;
+       }
+       if ((data)->proxiable) {
+           c |= 1 << 4;
+       }
+       if ((data)->forwarded) {
+           c |= 1 << 5;
+       }
+       if ((data)->forwardable) {
+           c |= 1 << 6;
+       }
+       if ((data)->reserved) {
+           c |= 1 << 7;
+       }
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = c;
+       len--;
+       ret++;
+       if (len < 1)
+           return ASN1_OVERFLOW;
+       *p-- = 0;
+       len -= 1;
+       ret += 1;
+    }
+
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_KDCOptions(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                 size_t len HEIMDAL_UNUSED_ATTRIBUTE, KDCOptions * data,
+                 size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_BitString, &Top_datalen, &l);
+       if (e == 0 && Top_type != PRIM) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       if (len < 1)
+           return ASN1_OVERRUN;
+       p++;
+       len--;
+       ret++;
+       do {
+           if (len < 1)
+               break;
+           (data)->reserved = (*p >> 7) & 1;
+           (data)->forwardable = (*p >> 6) & 1;
+           (data)->forwarded = (*p >> 5) & 1;
+           (data)->proxiable = (*p >> 4) & 1;
+           (data)->proxy = (*p >> 3) & 1;
+           (data)->allow_postdate = (*p >> 2) & 1;
+           (data)->postdated = (*p >> 1) & 1;
+           p++;
+           len--;
+           ret++;
+           if (len < 1)
+               break;
+           (data)->renewable = (*p >> 7) & 1;
+           (data)->cname_in_addl_tkt = (*p >> 1) & 1;
+           (data)->canonicalize = (*p >> 0) & 1;
+           p++;
+           len--;
+           ret++;
+           if (len < 1)
+               break;
+           (data)->request_anonymous = (*p >> 7) & 1;
+           p++;
+           len--;
+           ret++;
+           if (len < 1)
+               break;
+           (data)->disable_transited_check = (*p >> 5) & 1;
+           (data)->renewable_ok = (*p >> 4) & 1;
+           (data)->enc_tkt_in_skey = (*p >> 3) & 1;
+           (data)->renew = (*p >> 1) & 1;
+           (data)->validate = (*p >> 0) & 1;
+       } while (0);
+       p += len;
+       ret += len;
+       len = Top_oldlen - Top_datalen;
     }
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_Realm(data);
+  fail:
+    free_KDCOptions(data);
     return e;
 }
 
-void
-free_Realm(Realm * data)
+void ASN1CALL
+free_KDCOptions(KDCOptions * data)
 {
-    der_free_general_string(data);
 }
 
-size_t
-length_Realm(const Realm * data)
+size_t ASN1CALL
+length_KDCOptions(const KDCOptions * data)
 {
     size_t ret = 0;
-    ret += der_length_general_string(data);
+    ret += 5;
     ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_Realm(const Realm * from, Realm * to)
+int ASN1CALL
+copy_KDCOptions(const KDCOptions * from, KDCOptions * to)
 {
     memset(to, 0, sizeof(*to));
-    if (der_copy_general_string(from, to))
-       goto fail;
+    *(to) = *(from);
     return 0;
-fail:
-    free_Realm(to);
-    return ENOMEM;
 }
 
+unsigned
+KDCOptions2int(KDCOptions f)
+{
+    unsigned r = 0;
+    if (f.reserved)
+       r |= (1U << 0);
+    if (f.forwardable)
+       r |= (1U << 1);
+    if (f.forwarded)
+       r |= (1U << 2);
+    if (f.proxiable)
+       r |= (1U << 3);
+    if (f.proxy)
+       r |= (1U << 4);
+    if (f.allow_postdate)
+       r |= (1U << 5);
+    if (f.postdated)
+       r |= (1U << 6);
+    if (f.renewable)
+       r |= (1U << 8);
+    if (f.cname_in_addl_tkt)
+       r |= (1U << 14);
+    if (f.canonicalize)
+       r |= (1U << 15);
+    if (f.request_anonymous)
+       r |= (1U << 16);
+    if (f.disable_transited_check)
+       r |= (1U << 26);
+    if (f.renewable_ok)
+       r |= (1U << 27);
+    if (f.enc_tkt_in_skey)
+       r |= (1U << 28);
+    if (f.renew)
+       r |= (1U << 30);
+    if (f.validate)
+       r |= (1U << 31);
+    return r;
+}
+
+KDCOptions
+int2KDCOptions(unsigned n)
+{
+    KDCOptions flags;
 
+    memset(&flags, 0, sizeof(flags));
 
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
+    flags.reserved = (n >> 0) & 1;
+    flags.forwardable = (n >> 1) & 1;
+    flags.forwarded = (n >> 2) & 1;
+    flags.proxiable = (n >> 3) & 1;
+    flags.proxy = (n >> 4) & 1;
+    flags.allow_postdate = (n >> 5) & 1;
+    flags.postdated = (n >> 6) & 1;
+    flags.renewable = (n >> 8) & 1;
+    flags.cname_in_addl_tkt = (n >> 14) & 1;
+    flags.canonicalize = (n >> 15) & 1;
+    flags.request_anonymous = (n >> 16) & 1;
+    flags.disable_transited_check = (n >> 26) & 1;
+    flags.renewable_ok = (n >> 27) & 1;
+    flags.enc_tkt_in_skey = (n >> 28) & 1;
+    flags.renew = (n >> 30) & 1;
+    flags.validate = (n >> 31) & 1;
+    return flags;
+}
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
 
-int
-encode_ENCTYPE(unsigned char *p, size_t len, const ENCTYPE * data, size_t * size)
+
+int ASN1CALL
+encode_LR_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+              size_t len HEIMDAL_UNUSED_ATTRIBUTE, const LR_TYPE * data,
+              size_t * size)
 {
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
 
-    i = 0;
     {
        int enumint = (int) *data;
        e = der_put_integer(p, len, &enumint, &l);
@@ -3641,7 +3597,8 @@ encode_ENCTYPE(unsigned char *p, size_t len, const ENCTYPE * data, size_t * size
 
     }
     ;
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer,
+                              &l);
     if (e)
        return e;
     p -= l;
@@ -3652,18 +3609,21 @@ encode_ENCTYPE(unsigned char *p, size_t len, const ENCTYPE * data, size_t * size
     return 0;
 }
 
-int
-decode_ENCTYPE(const unsigned char *p, size_t len, ENCTYPE * data, size_t * size)
+int ASN1CALL
+decode_LR_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+              size_t len HEIMDAL_UNUSED_ATTRIBUTE, LR_TYPE * data,
+              size_t * size)
 {
     size_t ret = 0;
-    size_t l;
-    int e;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
 
     memset(data, 0, sizeof(*data));
     {
        size_t Top_datalen, Top_oldlen;
        Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Integer, &Top_datalen, &l);
        if (e == 0 && Top_type != PRIM) {
            e = ASN1_BAD_ID;
        }
@@ -3693,146 +3653,2260 @@ decode_ENCTYPE(const unsigned char *p, size_t len, ENCTYPE * data, size_t * size
     if (size)
        *size = ret;
     return 0;
-fail:
-    free_ENCTYPE(data);
+  fail:
+    free_LR_TYPE(data);
+    return e;
+}
+
+void ASN1CALL
+free_LR_TYPE(LR_TYPE * data)
+{
+}
+
+size_t ASN1CALL
+length_LR_TYPE(const LR_TYPE * data)
+{
+    size_t ret = 0;
+    {
+       int enumint = *data;
+       ret += der_length_integer(&enumint);
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_LR_TYPE(const LR_TYPE * from, LR_TYPE * to)
+{
+    memset(to, 0, sizeof(*to));
+    *(to) = *(from);
+    return 0;
+}
+
+int ASN1CALL
+encode_LastReq(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+              size_t len HEIMDAL_UNUSED_ATTRIBUTE, const LastReq * data,
+              size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    for (i = (int) (data)->len - 1; i >= 0; --i) {
+       size_t Top_tag_for_oldret = ret;
+       ret = 0;
+/* lr-value */
+       {
+           size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+           ret = 0;
+           e = encode_KerberosTime(p, len, &(&(data)->val[i])->lr_value, &l);
+           if (e)
+               return e;
+           p -= l;
+           len -= l;
+           ret += l;
+
+           e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1,
+                                      &l);
+           if (e)
+               return e;
+           p -= l;
+           len -= l;
+           ret += l;
+
+           ret += Top_tag_S_Of_tag_oldret;
+       }
+/* lr-type */
+       {
+           size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+           ret = 0;
+           e = encode_LR_TYPE(p, len, &(&(data)->val[i])->lr_type, &l);
+           if (e)
+               return e;
+           p -= l;
+           len -= l;
+           ret += l;
+
+           e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0,
+                                      &l);
+           if (e)
+               return e;
+           p -= l;
+           len -= l;
+           ret += l;
+
+           ret += Top_tag_S_Of_tag_oldret;
+       }
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS,
+                                  UT_Sequence, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_for_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_LastReq(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+              size_t len HEIMDAL_UNUSED_ATTRIBUTE, LastReq * data,
+              size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t Top_Tag_origlen = len;
+           size_t Top_Tag_oldret = ret;
+           size_t Top_Tag_olen = 0;
+           void *Top_Tag_tmp;
+           ret = 0;
+           (data)->len = 0;
+           (data)->val = NULL;
+           while (ret < Top_Tag_origlen) {
+               size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
+               if (Top_Tag_olen > Top_Tag_nlen) {
+                   e = ASN1_OVERFLOW;
+                   goto fail;
+               }
+               Top_Tag_olen = Top_Tag_nlen;
+               Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
+               if (Top_Tag_tmp == NULL) {
+                   e = ENOMEM;
+                   goto fail;
+               }
+               (data)->val = Top_Tag_tmp;
+               {
+                   size_t Top_Tag_s_of_datalen, Top_Tag_s_of_oldlen;
+                   Der_type Top_Tag_s_of_type;
+                   e = der_match_tag_and_length(p, len, ASN1_C_UNIV,
+                                                &Top_Tag_s_of_type,
+                                                UT_Sequence,
+                                                &Top_Tag_s_of_datalen, &l);
+                   if (e == 0 && Top_Tag_s_of_type != CONS) {
+                       e = ASN1_BAD_ID;
+                   }
+                   if (e)
+                       goto fail;
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   Top_Tag_s_of_oldlen = len;
+                   if (Top_Tag_s_of_datalen > len) {
+                       e = ASN1_OVERRUN;
+                       goto fail;
+                   }
+                   len = Top_Tag_s_of_datalen;
+                   {
+                       size_t lr_type_datalen, lr_type_oldlen;
+                       Der_type lr_type_type;
+                       e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                                    &lr_type_type, 0,
+                                                    &lr_type_datalen, &l);
+                       if (e == 0 && lr_type_type != CONS) {
+                           e = ASN1_BAD_ID;
+                       }
+                       if (e)
+                           goto fail;
+                       p += l;
+                       len -= l;
+                       ret += l;
+                       lr_type_oldlen = len;
+                       if (lr_type_datalen > len) {
+                           e = ASN1_OVERRUN;
+                           goto fail;
+                       }
+                       len = lr_type_datalen;
+                       e = decode_LR_TYPE(p, len,
+                                          &(&(data)->val[(data)->len])->
+                                          lr_type, &l);
+                       if (e)
+                           goto fail;
+                       p += l;
+                       len -= l;
+                       ret += l;
+                       len = lr_type_oldlen - lr_type_datalen;
+                   }
+                   {
+                       size_t lr_value_datalen, lr_value_oldlen;
+                       Der_type lr_value_type;
+                       e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                                    &lr_value_type, 1,
+                                                    &lr_value_datalen, &l);
+                       if (e == 0 && lr_value_type != CONS) {
+                           e = ASN1_BAD_ID;
+                       }
+                       if (e)
+                           goto fail;
+                       p += l;
+                       len -= l;
+                       ret += l;
+                       lr_value_oldlen = len;
+                       if (lr_value_datalen > len) {
+                           e = ASN1_OVERRUN;
+                           goto fail;
+                       }
+                       len = lr_value_datalen;
+                       e = decode_KerberosTime(p, len,
+                                               &(&(data)->val[(data)->len])->
+                                               lr_value, &l);
+                       if (e)
+                           goto fail;
+                       p += l;
+                       len -= l;
+                       ret += l;
+                       len = lr_value_oldlen - lr_value_datalen;
+                   }
+                   len = Top_Tag_s_of_oldlen - Top_Tag_s_of_datalen;
+               }
+               (data)->len++;
+               len = Top_Tag_origlen - ret;
+           }
+           ret += Top_Tag_oldret;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_LastReq(data);
+    return e;
+}
+
+void ASN1CALL
+free_LastReq(LastReq * data)
+{
+    while ((data)->len) {
+       free_LR_TYPE(&(&(data)->val[(data)->len - 1])->lr_type);
+       free_KerberosTime(&(&(data)->val[(data)->len - 1])->lr_value);
+       (data)->len--;
+    }
+    free((data)->val);
+    (data)->val = NULL;
+}
+
+size_t ASN1CALL
+length_LastReq(const LastReq * data)
+{
+    size_t ret = 0;
+    {
+       size_t Top_tag_oldret = ret;
+       unsigned int n_Top_tag;
+       ret = 0;
+       for (n_Top_tag = (data)->len; n_Top_tag > 0; --n_Top_tag) {
+           size_t Top_tag_for_oldret = ret;
+           ret = 0;
+           {
+               size_t Top_tag_S_Of_tag_oldret = ret;
+               ret = 0;
+               ret +=
+                   length_LR_TYPE(&(&(data)->val[n_Top_tag - 1])->lr_type);
+               ret += 1 + der_length_len(ret);
+               ret += Top_tag_S_Of_tag_oldret;
+           }
+           {
+               size_t Top_tag_S_Of_tag_oldret = ret;
+               ret = 0;
+               ret +=
+                   length_KerberosTime(&(&(data)->val[n_Top_tag - 1])->
+                                       lr_value);
+               ret += 1 + der_length_len(ret);
+               ret += Top_tag_S_Of_tag_oldret;
+           }
+           ret += 1 + der_length_len(ret);
+           ret += Top_tag_for_oldret;
+       }
+       ret += Top_tag_oldret;
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_LastReq(const LastReq * from, LastReq * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL
+       && (from)->len != 0)
+       goto fail;
+    for ((to)->len = 0; (to)->len < (from)->len; (to)->len++) {
+       if (copy_LR_TYPE
+           (&(&(from)->val[(to)->len])->lr_type,
+            &(&(to)->val[(to)->len])->lr_type))
+           goto fail;
+       if (copy_KerberosTime
+           (&(&(from)->val[(to)->len])->lr_value,
+            &(&(to)->val[(to)->len])->lr_value))
+           goto fail;
+    }
+    return 0;
+  fail:
+    free_LastReq(to);
+    return ENOMEM;
+}
+
+int ASN1CALL
+encode_EncryptedData(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    const EncryptedData * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+/* cipher */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = der_put_octet_string(p, len, &(data)->cipher, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                                  UT_OctetString, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+/* kvno */
+    if ((data)->kvno) {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_krb5int32(p, len, (data)->kvno, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+/* etype */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_ENCTYPE(p, len, &(data)->etype, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_EncryptedData(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    EncryptedData * data, size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t etype_datalen, etype_oldlen;
+           Der_type etype_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &etype_type,
+                                        0, &etype_datalen, &l);
+           if (e == 0 && etype_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           etype_oldlen = len;
+           if (etype_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = etype_datalen;
+           e = decode_ENCTYPE(p, len, &(data)->etype, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           len = etype_oldlen - etype_datalen;
+       }
+       {
+           size_t kvno_datalen, kvno_oldlen;
+           Der_type kvno_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &kvno_type,
+                                        1, &kvno_datalen, &l);
+           if (e == 0 && kvno_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e) {
+               (data)->kvno = NULL;
+           } else {
+               (data)->kvno = calloc(1, sizeof(*(data)->kvno));
+               if ((data)->kvno == NULL) {
+                   e = ENOMEM;
+                   goto fail;
+               }
+               p += l;
+               len -= l;
+               ret += l;
+               kvno_oldlen = len;
+               if (kvno_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = kvno_datalen;
+               e = decode_krb5int32(p, len, (data)->kvno, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = kvno_oldlen - kvno_datalen;
+           }
+       }
+       {
+           size_t cipher_datalen, cipher_oldlen;
+           Der_type cipher_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cipher_type,
+                                        2, &cipher_datalen, &l);
+           if (e == 0 && cipher_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           cipher_oldlen = len;
+           if (cipher_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = cipher_datalen;
+           {
+               size_t cipher_Tag_datalen, cipher_Tag_oldlen;
+               Der_type cipher_Tag_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_UNIV,
+                                            &cipher_Tag_type, UT_OctetString,
+                                            &cipher_Tag_datalen, &l);
+               if (e == 0 && cipher_Tag_type != PRIM) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               cipher_Tag_oldlen = len;
+               if (cipher_Tag_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = cipher_Tag_datalen;
+               e = der_get_octet_string(p, len, &(data)->cipher, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = cipher_Tag_oldlen - cipher_Tag_datalen;
+           }
+           len = cipher_oldlen - cipher_datalen;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_EncryptedData(data);
+    return e;
+}
+
+void ASN1CALL
+free_EncryptedData(EncryptedData * data)
+{
+    free_ENCTYPE(&(data)->etype);
+    if ((data)->kvno) {
+       free_krb5int32((data)->kvno);
+       free((data)->kvno);
+       (data)->kvno = NULL;
+    }
+    der_free_octet_string(&(data)->cipher);
+}
+
+size_t ASN1CALL
+length_EncryptedData(const EncryptedData * data)
+{
+    size_t ret = 0;
+    {
+       size_t Top_tag_oldret = ret;
+       ret = 0;
+       ret += length_ENCTYPE(&(data)->etype);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    if ((data)->kvno) {
+       size_t Top_tag_oldret = ret;
+       ret = 0;
+       ret += length_krb5int32((data)->kvno);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    {
+       size_t Top_tag_oldret = ret;
+       ret = 0;
+       ret += der_length_octet_string(&(data)->cipher);
+       ret += 1 + der_length_len(ret);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_EncryptedData(const EncryptedData * from, EncryptedData * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (copy_ENCTYPE(&(from)->etype, &(to)->etype))
+       goto fail;
+    if ((from)->kvno) {
+       (to)->kvno = malloc(sizeof(*(to)->kvno));
+       if ((to)->kvno == NULL)
+           goto fail;
+       if (copy_krb5int32((from)->kvno, (to)->kvno))
+           goto fail;
+    } else
+       (to)->kvno = NULL;
+    if (der_copy_octet_string(&(from)->cipher, &(to)->cipher))
+       goto fail;
+    return 0;
+  fail:
+    free_EncryptedData(to);
+    return ENOMEM;
+}
+
+int ASN1CALL
+encode_EncryptionKey(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    const EncryptionKey * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+/* keyvalue */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = der_put_octet_string(p, len, &(data)->keyvalue, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                                  UT_OctetString, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+/* keytype */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_krb5int32(p, len, &(data)->keytype, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_EncryptionKey(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    EncryptionKey * data, size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t keytype_datalen, keytype_oldlen;
+           Der_type keytype_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &keytype_type, 0, &keytype_datalen,
+                                        &l);
+           if (e == 0 && keytype_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           keytype_oldlen = len;
+           if (keytype_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = keytype_datalen;
+           e = decode_krb5int32(p, len, &(data)->keytype, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           len = keytype_oldlen - keytype_datalen;
+       }
+       {
+           size_t keyvalue_datalen, keyvalue_oldlen;
+           Der_type keyvalue_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &keyvalue_type, 1, &keyvalue_datalen,
+                                        &l);
+           if (e == 0 && keyvalue_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           keyvalue_oldlen = len;
+           if (keyvalue_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = keyvalue_datalen;
+           {
+               size_t keyvalue_Tag_datalen, keyvalue_Tag_oldlen;
+               Der_type keyvalue_Tag_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_UNIV,
+                                            &keyvalue_Tag_type,
+                                            UT_OctetString,
+                                            &keyvalue_Tag_datalen, &l);
+               if (e == 0 && keyvalue_Tag_type != PRIM) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               keyvalue_Tag_oldlen = len;
+               if (keyvalue_Tag_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = keyvalue_Tag_datalen;
+               e = der_get_octet_string(p, len, &(data)->keyvalue, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = keyvalue_Tag_oldlen - keyvalue_Tag_datalen;
+           }
+           len = keyvalue_oldlen - keyvalue_datalen;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_EncryptionKey(data);
+    return e;
+}
+
+void ASN1CALL
+free_EncryptionKey(EncryptionKey * data)
+{
+    free_krb5int32(&(data)->keytype);
+    der_free_octet_string(&(data)->keyvalue);
+}
+
+size_t ASN1CALL
+length_EncryptionKey(const EncryptionKey * data)
+{
+    size_t ret = 0;
+    {
+       size_t Top_tag_oldret = ret;
+       ret = 0;
+       ret += length_krb5int32(&(data)->keytype);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    {
+       size_t Top_tag_oldret = ret;
+       ret = 0;
+       ret += der_length_octet_string(&(data)->keyvalue);
+       ret += 1 + der_length_len(ret);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_EncryptionKey(const EncryptionKey * from, EncryptionKey * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (copy_krb5int32(&(from)->keytype, &(to)->keytype))
+       goto fail;
+    if (der_copy_octet_string(&(from)->keyvalue, &(to)->keyvalue))
+       goto fail;
+    return 0;
+  fail:
+    free_EncryptionKey(to);
+    return ENOMEM;
+}
+
+int ASN1CALL
+encode_TransitedEncoding(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                        size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                        const TransitedEncoding * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+/* contents */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = der_put_octet_string(p, len, &(data)->contents, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM,
+                                  UT_OctetString, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+/* tr-type */
+    {
+       size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_krb5int32(p, len, &(data)->tr_type, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_TransitedEncoding(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                        size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                        TransitedEncoding * data, size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type,
+                                    UT_Sequence, &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t tr_type_datalen, tr_type_oldlen;
+           Der_type tr_type_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &tr_type_type, 0, &tr_type_datalen,
+                                        &l);
+           if (e == 0 && tr_type_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           tr_type_oldlen = len;
+           if (tr_type_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = tr_type_datalen;
+           e = decode_krb5int32(p, len, &(data)->tr_type, &l);
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           len = tr_type_oldlen - tr_type_datalen;
+       }
+       {
+           size_t contents_datalen, contents_oldlen;
+           Der_type contents_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                        &contents_type, 1, &contents_datalen,
+                                        &l);
+           if (e == 0 && contents_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           contents_oldlen = len;
+           if (contents_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = contents_datalen;
+           {
+               size_t contents_Tag_datalen, contents_Tag_oldlen;
+               Der_type contents_Tag_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_UNIV,
+                                            &contents_Tag_type,
+                                            UT_OctetString,
+                                            &contents_Tag_datalen, &l);
+               if (e == 0 && contents_Tag_type != PRIM) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               contents_Tag_oldlen = len;
+               if (contents_Tag_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = contents_Tag_datalen;
+               e = der_get_octet_string(p, len, &(data)->contents, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = contents_Tag_oldlen - contents_Tag_datalen;
+           }
+           len = contents_oldlen - contents_datalen;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_TransitedEncoding(data);
+    return e;
+}
+
+void ASN1CALL
+free_TransitedEncoding(TransitedEncoding * data)
+{
+    free_krb5int32(&(data)->tr_type);
+    der_free_octet_string(&(data)->contents);
+}
+
+size_t ASN1CALL
+length_TransitedEncoding(const TransitedEncoding * data)
+{
+    size_t ret = 0;
+    {
+       size_t Top_tag_oldret = ret;
+       ret = 0;
+       ret += length_krb5int32(&(data)->tr_type);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    {
+       size_t Top_tag_oldret = ret;
+       ret = 0;
+       ret += der_length_octet_string(&(data)->contents);
+       ret += 1 + der_length_len(ret);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_oldret;
+    }
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_TransitedEncoding(const TransitedEncoding * from, TransitedEncoding * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (copy_krb5int32(&(from)->tr_type, &(to)->tr_type))
+       goto fail;
+    if (der_copy_octet_string(&(from)->contents, &(to)->contents))
+       goto fail;
+    return 0;
+  fail:
+    free_TransitedEncoding(to);
+    return ENOMEM;
+}
+
+int ASN1CALL
+encode_Ticket(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+             size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Ticket * data,
+             size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+/* enc-part */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_EncryptedData(p, len, &(data)->enc_part, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* sname */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_PrincipalName(p, len, &(data)->sname, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* realm */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_Realm(p, len, &(data)->realm, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* tkt-vno */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_krb5int32(p, len, &(data)->tkt_vno, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_APPL, CONS, 1, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_Ticket(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+             size_t len HEIMDAL_UNUSED_ATTRIBUTE, Ticket * data,
+             size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 1,
+                                    &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t Top_Tag_datalen, Top_Tag_oldlen;
+           Der_type Top_Tag_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type,
+                                        UT_Sequence, &Top_Tag_datalen, &l);
+           if (e == 0 && Top_Tag_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           Top_Tag_oldlen = len;
+           if (Top_Tag_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = Top_Tag_datalen;
+           {
+               size_t tkt_vno_datalen, tkt_vno_oldlen;
+               Der_type tkt_vno_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &tkt_vno_type, 0,
+                                            &tkt_vno_datalen, &l);
+               if (e == 0 && tkt_vno_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               tkt_vno_oldlen = len;
+               if (tkt_vno_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = tkt_vno_datalen;
+               e = decode_krb5int32(p, len, &(data)->tkt_vno, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = tkt_vno_oldlen - tkt_vno_datalen;
+           }
+           {
+               size_t realm_datalen, realm_oldlen;
+               Der_type realm_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &realm_type, 1, &realm_datalen,
+                                            &l);
+               if (e == 0 && realm_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               realm_oldlen = len;
+               if (realm_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = realm_datalen;
+               e = decode_Realm(p, len, &(data)->realm, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = realm_oldlen - realm_datalen;
+           }
+           {
+               size_t sname_datalen, sname_oldlen;
+               Der_type sname_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &sname_type, 2, &sname_datalen,
+                                            &l);
+               if (e == 0 && sname_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               sname_oldlen = len;
+               if (sname_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = sname_datalen;
+               e = decode_PrincipalName(p, len, &(data)->sname, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = sname_oldlen - sname_datalen;
+           }
+           {
+               size_t enc_part_datalen, enc_part_oldlen;
+               Der_type enc_part_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &enc_part_type, 3,
+                                            &enc_part_datalen, &l);
+               if (e == 0 && enc_part_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               enc_part_oldlen = len;
+               if (enc_part_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = enc_part_datalen;
+               e = decode_EncryptedData(p, len, &(data)->enc_part, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = enc_part_oldlen - enc_part_datalen;
+           }
+           len = Top_Tag_oldlen - Top_Tag_datalen;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_Ticket(data);
+    return e;
+}
+
+void ASN1CALL
+free_Ticket(Ticket * data)
+{
+    free_krb5int32(&(data)->tkt_vno);
+    free_Realm(&(data)->realm);
+    free_PrincipalName(&(data)->sname);
+    free_EncryptedData(&(data)->enc_part);
+}
+
+size_t ASN1CALL
+length_Ticket(const Ticket * data)
+{
+    size_t ret = 0;
+    {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_krb5int32(&(data)->tkt_vno);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_Realm(&(data)->realm);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_PrincipalName(&(data)->sname);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_EncryptedData(&(data)->enc_part);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    ret += 1 + der_length_len(ret);
+    ret += 1 + der_length_len(ret);
+    return ret;
+}
+
+int ASN1CALL
+copy_Ticket(const Ticket * from, Ticket * to)
+{
+    memset(to, 0, sizeof(*to));
+    if (copy_krb5int32(&(from)->tkt_vno, &(to)->tkt_vno))
+       goto fail;
+    if (copy_Realm(&(from)->realm, &(to)->realm))
+       goto fail;
+    if (copy_PrincipalName(&(from)->sname, &(to)->sname))
+       goto fail;
+    if (copy_EncryptedData(&(from)->enc_part, &(to)->enc_part))
+       goto fail;
+    return 0;
+  fail:
+    free_Ticket(to);
+    return ENOMEM;
+}
+
+int ASN1CALL
+encode_EncTicketPart(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    const EncTicketPart * data, size_t * size)
+{
+    size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
+
+/* authorization-data */
+    if ((data)->authorization_data) {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_AuthorizationData(p, len, (data)->authorization_data, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* caddr */
+    if ((data)->caddr) {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_HostAddresses(p, len, (data)->caddr, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* renew-till */
+    if ((data)->renew_till) {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_KerberosTime(p, len, (data)->renew_till, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* endtime */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_KerberosTime(p, len, &(data)->endtime, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* starttime */
+    if ((data)->starttime) {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_KerberosTime(p, len, (data)->starttime, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* authtime */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_KerberosTime(p, len, &(data)->authtime, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* transited */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_TransitedEncoding(p, len, &(data)->transited, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* cname */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_PrincipalName(p, len, &(data)->cname, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* crealm */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_Realm(p, len, &(data)->crealm, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* key */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_EncryptionKey(p, len, &(data)->key, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+/* flags */
+    {
+       size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
+       ret = 0;
+       e = encode_TicketFlags(p, len, &(data)->flags, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
+       if (e)
+           return e;
+       p -= l;
+       len -= l;
+       ret += l;
+
+       ret += Top_tag_tag_oldret;
+    }
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence,
+                              &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    e = der_put_length_and_tag(p, len, ret, ASN1_C_APPL, CONS, 3, &l);
+    if (e)
+       return e;
+    p -= l;
+    len -= l;
+    ret += l;
+
+    *size = ret;
+    return 0;
+}
+
+int ASN1CALL
+decode_EncTicketPart(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE,
+                    size_t len HEIMDAL_UNUSED_ATTRIBUTE,
+                    EncTicketPart * data, size_t * size)
+{
+    size_t ret = 0;
+    size_t l HEIMDAL_UNUSED_ATTRIBUTE;
+    int e HEIMDAL_UNUSED_ATTRIBUTE;
+
+    memset(data, 0, sizeof(*data));
+    {
+       size_t Top_datalen, Top_oldlen;
+       Der_type Top_type;
+       e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 3,
+                                    &Top_datalen, &l);
+       if (e == 0 && Top_type != CONS) {
+           e = ASN1_BAD_ID;
+       }
+       if (e)
+           goto fail;
+       p += l;
+       len -= l;
+       ret += l;
+       Top_oldlen = len;
+       if (Top_datalen > len) {
+           e = ASN1_OVERRUN;
+           goto fail;
+       }
+       len = Top_datalen;
+       {
+           size_t Top_Tag_datalen, Top_Tag_oldlen;
+           Der_type Top_Tag_type;
+           e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type,
+                                        UT_Sequence, &Top_Tag_datalen, &l);
+           if (e == 0 && Top_Tag_type != CONS) {
+               e = ASN1_BAD_ID;
+           }
+           if (e)
+               goto fail;
+           p += l;
+           len -= l;
+           ret += l;
+           Top_Tag_oldlen = len;
+           if (Top_Tag_datalen > len) {
+               e = ASN1_OVERRUN;
+               goto fail;
+           }
+           len = Top_Tag_datalen;
+           {
+               size_t flags_datalen, flags_oldlen;
+               Der_type flags_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &flags_type, 0, &flags_datalen,
+                                            &l);
+               if (e == 0 && flags_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               flags_oldlen = len;
+               if (flags_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = flags_datalen;
+               e = decode_TicketFlags(p, len, &(data)->flags, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = flags_oldlen - flags_datalen;
+           }
+           {
+               size_t key_datalen, key_oldlen;
+               Der_type key_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &key_type, 1, &key_datalen, &l);
+               if (e == 0 && key_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               key_oldlen = len;
+               if (key_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = key_datalen;
+               e = decode_EncryptionKey(p, len, &(data)->key, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = key_oldlen - key_datalen;
+           }
+           {
+               size_t crealm_datalen, crealm_oldlen;
+               Der_type crealm_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &crealm_type, 2, &crealm_datalen,
+                                            &l);
+               if (e == 0 && crealm_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               crealm_oldlen = len;
+               if (crealm_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = crealm_datalen;
+               e = decode_Realm(p, len, &(data)->crealm, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = crealm_oldlen - crealm_datalen;
+           }
+           {
+               size_t cname_datalen, cname_oldlen;
+               Der_type cname_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &cname_type, 3, &cname_datalen,
+                                            &l);
+               if (e == 0 && cname_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               cname_oldlen = len;
+               if (cname_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = cname_datalen;
+               e = decode_PrincipalName(p, len, &(data)->cname, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = cname_oldlen - cname_datalen;
+           }
+           {
+               size_t transited_datalen, transited_oldlen;
+               Der_type transited_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &transited_type, 4,
+                                            &transited_datalen, &l);
+               if (e == 0 && transited_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               transited_oldlen = len;
+               if (transited_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = transited_datalen;
+               e = decode_TransitedEncoding(p, len, &(data)->transited, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = transited_oldlen - transited_datalen;
+           }
+           {
+               size_t authtime_datalen, authtime_oldlen;
+               Der_type authtime_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &authtime_type, 5,
+                                            &authtime_datalen, &l);
+               if (e == 0 && authtime_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               authtime_oldlen = len;
+               if (authtime_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = authtime_datalen;
+               e = decode_KerberosTime(p, len, &(data)->authtime, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = authtime_oldlen - authtime_datalen;
+           }
+           {
+               size_t starttime_datalen, starttime_oldlen;
+               Der_type starttime_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &starttime_type, 6,
+                                            &starttime_datalen, &l);
+               if (e == 0 && starttime_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e) {
+                   (data)->starttime = NULL;
+               } else {
+                   (data)->starttime = calloc(1, sizeof(*(data)->starttime));
+                   if ((data)->starttime == NULL) {
+                       e = ENOMEM;
+                       goto fail;
+                   }
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   starttime_oldlen = len;
+                   if (starttime_datalen > len) {
+                       e = ASN1_OVERRUN;
+                       goto fail;
+                   }
+                   len = starttime_datalen;
+                   e = decode_KerberosTime(p, len, (data)->starttime, &l);
+                   if (e)
+                       goto fail;
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   len = starttime_oldlen - starttime_datalen;
+               }
+           }
+           {
+               size_t endtime_datalen, endtime_oldlen;
+               Der_type endtime_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &endtime_type, 7,
+                                            &endtime_datalen, &l);
+               if (e == 0 && endtime_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               endtime_oldlen = len;
+               if (endtime_datalen > len) {
+                   e = ASN1_OVERRUN;
+                   goto fail;
+               }
+               len = endtime_datalen;
+               e = decode_KerberosTime(p, len, &(data)->endtime, &l);
+               if (e)
+                   goto fail;
+               p += l;
+               len -= l;
+               ret += l;
+               len = endtime_oldlen - endtime_datalen;
+           }
+           {
+               size_t renew_till_datalen, renew_till_oldlen;
+               Der_type renew_till_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &renew_till_type, 8,
+                                            &renew_till_datalen, &l);
+               if (e == 0 && renew_till_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e) {
+                   (data)->renew_till = NULL;
+               } else {
+                   (data)->renew_till =
+                       calloc(1, sizeof(*(data)->renew_till));
+                   if ((data)->renew_till == NULL) {
+                       e = ENOMEM;
+                       goto fail;
+                   }
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   renew_till_oldlen = len;
+                   if (renew_till_datalen > len) {
+                       e = ASN1_OVERRUN;
+                       goto fail;
+                   }
+                   len = renew_till_datalen;
+                   e = decode_KerberosTime(p, len, (data)->renew_till, &l);
+                   if (e)
+                       goto fail;
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   len = renew_till_oldlen - renew_till_datalen;
+               }
+           }
+           {
+               size_t caddr_datalen, caddr_oldlen;
+               Der_type caddr_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &caddr_type, 9, &caddr_datalen,
+                                            &l);
+               if (e == 0 && caddr_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e) {
+                   (data)->caddr = NULL;
+               } else {
+                   (data)->caddr = calloc(1, sizeof(*(data)->caddr));
+                   if ((data)->caddr == NULL) {
+                       e = ENOMEM;
+                       goto fail;
+                   }
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   caddr_oldlen = len;
+                   if (caddr_datalen > len) {
+                       e = ASN1_OVERRUN;
+                       goto fail;
+                   }
+                   len = caddr_datalen;
+                   e = decode_HostAddresses(p, len, (data)->caddr, &l);
+                   if (e)
+                       goto fail;
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   len = caddr_oldlen - caddr_datalen;
+               }
+           }
+           {
+               size_t authorization_data_datalen, authorization_data_oldlen;
+               Der_type authorization_data_type;
+               e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT,
+                                            &authorization_data_type, 10,
+                                            &authorization_data_datalen, &l);
+               if (e == 0 && authorization_data_type != CONS) {
+                   e = ASN1_BAD_ID;
+               }
+               if (e) {
+                   (data)->authorization_data = NULL;
+               } else {
+                   (data)->authorization_data =
+                       calloc(1, sizeof(*(data)->authorization_data));
+                   if ((data)->authorization_data == NULL) {
+                       e = ENOMEM;
+                       goto fail;
+                   }
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   authorization_data_oldlen = len;
+                   if (authorization_data_datalen > len) {
+                       e = ASN1_OVERRUN;
+                       goto fail;
+                   }
+                   len = authorization_data_datalen;
+                   e = decode_AuthorizationData(p, len,
+                                                (data)->authorization_data,
+                                                &l);
+                   if (e)
+                       goto fail;
+                   p += l;
+                   len -= l;
+                   ret += l;
+                   len =
+                       authorization_data_oldlen -
+                       authorization_data_datalen;
+               }
+           }
+           len = Top_Tag_oldlen - Top_Tag_datalen;
+       }
+       len = Top_oldlen - Top_datalen;
+    }
+    if (size)
+       *size = ret;
+    return 0;
+  fail:
+    free_EncTicketPart(data);
     return e;
 }
 
-void
-free_ENCTYPE(ENCTYPE * data)
+void ASN1CALL
+free_EncTicketPart(EncTicketPart * data)
 {
+    free_TicketFlags(&(data)->flags);
+    free_EncryptionKey(&(data)->key);
+    free_Realm(&(data)->crealm);
+    free_PrincipalName(&(data)->cname);
+    free_TransitedEncoding(&(data)->transited);
+    free_KerberosTime(&(data)->authtime);
+    if ((data)->starttime) {
+       free_KerberosTime((data)->starttime);
+       free((data)->starttime);
+       (data)->starttime = NULL;
+    }
+    free_KerberosTime(&(data)->endtime);
+    if ((data)->renew_till) {
+       free_KerberosTime((data)->renew_till);
+       free((data)->renew_till);
+       (data)->renew_till = NULL;
+    }
+    if ((data)->caddr) {
+       free_HostAddresses((data)->caddr);
+       free((data)->caddr);
+       (data)->caddr = NULL;
+    }
+    if ((data)->authorization_data) {
+       free_AuthorizationData((data)->authorization_data);
+       free((data)->authorization_data);
+       (data)->authorization_data = NULL;
+    }
 }
 
-size_t
-length_ENCTYPE(const ENCTYPE * data)
+size_t ASN1CALL
+length_EncTicketPart(const EncTicketPart * data)
 {
     size_t ret = 0;
     {
-       int enumint = *data;
-       ret += der_length_integer(&enumint);
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_TicketFlags(&(data)->flags);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
     }
-    ret += 1 + der_length_len(ret);
-    return ret;
-}
-
-int
-copy_ENCTYPE(const ENCTYPE * from, ENCTYPE * to)
-{
-    memset(to, 0, sizeof(*to));
-    *(to) = *(from);
-    return 0;
-}
-
-
-
-/* Generated from ./krb5.asn1 */
-/* Do not edit */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <asn1_err.h>
-
-int
-encode_NAME_TYPE(unsigned char *p, size_t len, const NAME_TYPE * data, size_t * size)
-{
-    size_t ret = 0;
-    size_t l;
-    int i AFS_UNUSED, e;
-
-    i = 0;
     {
-       int enumint = (int) *data;
-       e = der_put_integer(p, len, &enumint, &l);
-       if (e)
-           return e;
-       p -= l;
-       len -= l;
-       ret += l;
-
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_EncryptionKey(&(data)->key);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
     }
-    ;
-    e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
-    if (e)
-       return e;
-    p -= l;
-    len -= l;
-    ret += l;
-
-    *size = ret;
-    return 0;
-}
-
-int
-decode_NAME_TYPE(const unsigned char *p, size_t len, NAME_TYPE * data, size_t * size)
-{
-    size_t ret = 0;
-    size_t l;
-    int e;
-
-    memset(data, 0, sizeof(*data));
     {
-       size_t Top_datalen, Top_oldlen;
-       Der_type Top_type;
-       e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
-       if (e == 0 && Top_type != PRIM) {
-           e = ASN1_BAD_ID;
-       }
-       if (e)
-           goto fail;
-       p += l;
-       len -= l;
-       ret += l;
-       Top_oldlen = len;
-       if (Top_datalen > len) {
-           e = ASN1_OVERRUN;
-           goto fail;
-       }
-       len = Top_datalen;
-       {
-           int enumint;
-           e = der_get_integer(p, len, &enumint, &l);
-           if (e)
-               goto fail;
-           p += l;
-           len -= l;
-           ret += l;
-           *data = enumint;
-       }
-       len = Top_oldlen - Top_datalen;
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_Realm(&(data)->crealm);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
     }
-    if (size)
-       *size = ret;
-    return 0;
-fail:
-    free_NAME_TYPE(data);
-    return e;
-}
-
-void
-free_NAME_TYPE(NAME_TYPE * data)
-{
-}
-
-size_t
-length_NAME_TYPE(const NAME_TYPE * data)
-{
-    size_t ret = 0;
     {
-       int enumint = *data;
-       ret += der_length_integer(&enumint);
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_PrincipalName(&(data)->cname);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_TransitedEncoding(&(data)->transited);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_KerberosTime(&(data)->authtime);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    if ((data)->starttime) {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_KerberosTime((data)->starttime);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_KerberosTime(&(data)->endtime);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    if ((data)->renew_till) {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_KerberosTime((data)->renew_till);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    if ((data)->caddr) {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_HostAddresses((data)->caddr);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
+    }
+    if ((data)->authorization_data) {
+       size_t Top_tag_tag_oldret = ret;
+       ret = 0;
+       ret += length_AuthorizationData((data)->authorization_data);
+       ret += 1 + der_length_len(ret);
+       ret += Top_tag_tag_oldret;
     }
     ret += 1 + der_length_len(ret);
+    ret += 1 + der_length_len(ret);
     return ret;
 }
 
-int
-copy_NAME_TYPE(const NAME_TYPE * from, NAME_TYPE * to)
+int ASN1CALL
+copy_EncTicketPart(const EncTicketPart * from, EncTicketPart * to)
 {
     memset(to, 0, sizeof(*to));
-    *(to) = *(from);
+    if (copy_TicketFlags(&(from)->flags, &(to)->flags))
+       goto fail;
+    if (copy_EncryptionKey(&(from)->key, &(to)->key))
+       goto fail;
+    if (copy_Realm(&(from)->crealm, &(to)->crealm))
+       goto fail;
+    if (copy_PrincipalName(&(from)->cname, &(to)->cname))
+       goto fail;
+    if (copy_TransitedEncoding(&(from)->transited, &(to)->transited))
+       goto fail;
+    if (copy_KerberosTime(&(from)->authtime, &(to)->authtime))
+       goto fail;
+    if ((from)->starttime) {
+       (to)->starttime = malloc(sizeof(*(to)->starttime));
+       if ((to)->starttime == NULL)
+           goto fail;
+       if (copy_KerberosTime((from)->starttime, (to)->starttime))
+           goto fail;
+    } else
+       (to)->starttime = NULL;
+    if (copy_KerberosTime(&(from)->endtime, &(to)->endtime))
+       goto fail;
+    if ((from)->renew_till) {
+       (to)->renew_till = malloc(sizeof(*(to)->renew_till));
+       if ((to)->renew_till == NULL)
+           goto fail;
+       if (copy_KerberosTime((from)->renew_till, (to)->renew_till))
+           goto fail;
+    } else
+       (to)->renew_till = NULL;
+    if ((from)->caddr) {
+       (to)->caddr = malloc(sizeof(*(to)->caddr));
+       if ((to)->caddr == NULL)
+           goto fail;
+       if (copy_HostAddresses((from)->caddr, (to)->caddr))
+           goto fail;
+    } else
+       (to)->caddr = NULL;
+    if ((from)->authorization_data) {
+       (to)->authorization_data = malloc(sizeof(*(to)->authorization_data));
+       if ((to)->authorization_data == NULL)
+           goto fail;
+       if (copy_AuthorizationData
+           ((from)->authorization_data, (to)->authorization_data))
+           goto fail;
+    } else
+       (to)->authorization_data = NULL;
     return 0;
+  fail:
+    free_EncTicketPart(to);
+    return ENOMEM;
 }
index 5ca4f97..e0ec33e 100644 (file)
 #ifndef __asn1_common_definitions__
 #define __asn1_common_definitions__
 
+#ifndef __HEIM_BASE_DATA__
+#define __HEIM_BASE_DATA__ 1
+struct heim_base_data {
+    size_t length;
+    void *data;
+};
+typedef struct heim_base_data heim_octet_string;
+#endif
+
 typedef struct heim_integer {
   size_t length;
   void *data;
   int negative;
 } heim_integer;
 
-typedef struct heim_octet_string {
-  size_t length;
-  void *data;
-} heim_octet_string;
-
 typedef char *heim_general_string;
 
 typedef char *heim_utf8_string;
 
-typedef char *heim_printable_string;
+typedef struct heim_base_data heim_printable_string;
 
-typedef char *heim_ia5_string;
+typedef struct heim_base_data heim_ia5_string;
 
 typedef struct heim_bmp_string {
   size_t length;
@@ -51,8 +55,8 @@ typedef struct heim_bit_string {
   void *data;
 } heim_bit_string;
 
-typedef struct heim_octet_string heim_any;
-typedef struct heim_octet_string heim_any_set;
+typedef struct heim_base_data heim_any;
+typedef struct heim_base_data heim_any_set;
 
 #define ASN1_MALLOC_ENCODE(T, B, BL, S, L, R)                  \
   do {                                                         \
@@ -70,6 +74,17 @@ typedef struct heim_octet_string heim_any_set;
     }                                                          \
   } while (0)
 
+#ifdef _WIN32
+#ifndef ASN1_LIB
+#define ASN1EXP  __declspec(dllimport)
+#else
+#define ASN1EXP
+#endif
+#define ASN1CALL __stdcall
+#else
+#define ASN1EXP
+#define ASN1CALL
+#endif
 
 #endif
 
@@ -85,10 +100,15 @@ NAME-TYPE ::= INTEGER {
   KRB5_NT_SMTP_NAME(7),
   KRB5_NT_ENTERPRISE_PRINCIPAL(10),
   KRB5_NT_WELLKNOWN(11),
+  KRB5_NT_SRV_HST_DOMAIN(12),
   KRB5_NT_ENT_PRINCIPAL_AND_ID(-130),
   KRB5_NT_MS_PRINCIPAL(-128),
   KRB5_NT_MS_PRINCIPAL_AND_ID(-129),
-  KRB5_NT_NTLM(-1200)
+  KRB5_NT_NTLM(-1200),
+  KRB5_NT_X509_GENERAL_NAME(-1201),
+  KRB5_NT_GSS_HOSTBASED_SERVICE(-1202),
+  KRB5_NT_CACHE_UUID(-1203),
+  KRB5_NT_SRV_HST_NEEDS_CANON(-195894762)
 }
 */
 
@@ -103,17 +123,22 @@ typedef enum NAME_TYPE {
   KRB5_NT_SMTP_NAME = 7,
   KRB5_NT_ENTERPRISE_PRINCIPAL = 10,
   KRB5_NT_WELLKNOWN = 11,
+  KRB5_NT_SRV_HST_DOMAIN = 12,
   KRB5_NT_ENT_PRINCIPAL_AND_ID = -130,
   KRB5_NT_MS_PRINCIPAL = -128,
   KRB5_NT_MS_PRINCIPAL_AND_ID = -129,
-  KRB5_NT_NTLM = -1200
+  KRB5_NT_NTLM = -1200,
+  KRB5_NT_X509_GENERAL_NAME = -1201,
+  KRB5_NT_GSS_HOSTBASED_SERVICE = -1202,
+  KRB5_NT_CACHE_UUID = -1203,
+  KRB5_NT_SRV_HST_NEEDS_CANON = -195894762
 } NAME_TYPE;
 
-int    decode_NAME_TYPE(const unsigned char *, size_t, NAME_TYPE *, size_t *);
-int    encode_NAME_TYPE(unsigned char *, size_t, const NAME_TYPE *, size_t *);
-size_t length_NAME_TYPE(const NAME_TYPE *);
-int    copy_NAME_TYPE  (const NAME_TYPE *, NAME_TYPE *);
-void   free_NAME_TYPE  (NAME_TYPE *);
+ASN1EXP int    ASN1CALL decode_NAME_TYPE(const unsigned char *, size_t, NAME_TYPE *, size_t *);
+ASN1EXP int    ASN1CALL encode_NAME_TYPE(unsigned char *, size_t, const NAME_TYPE *, size_t *);
+ASN1EXP size_t ASN1CALL length_NAME_TYPE(const NAME_TYPE *);
+ASN1EXP int    ASN1CALL copy_NAME_TYPE  (const NAME_TYPE *, NAME_TYPE *);
+ASN1EXP void   ASN1CALL free_NAME_TYPE  (NAME_TYPE *);
 
 
 /*
@@ -144,13 +169,6 @@ typedef enum MESSAGE_TYPE {
   krb_error = 30
 } MESSAGE_TYPE;
 
-int    decode_MESSAGE_TYPE(const unsigned char *, size_t, MESSAGE_TYPE *, size_t *);
-int    encode_MESSAGE_TYPE(unsigned char *, size_t, const MESSAGE_TYPE *, size_t *);
-size_t length_MESSAGE_TYPE(const MESSAGE_TYPE *);
-int    copy_MESSAGE_TYPE  (const MESSAGE_TYPE *, MESSAGE_TYPE *);
-void   free_MESSAGE_TYPE  (MESSAGE_TYPE *);
-
-
 /*
 PADATA-TYPE ::= INTEGER {
   KRB5_PADATA_NONE(0),
@@ -184,6 +202,7 @@ PADATA-TYPE ::= INTEGER {
   KRB5_PADATA_SAM_CHALLENGE2(30),
   KRB5_PADATA_SAM_RESPONSE2(31),
   KRB5_PA_EXTRA_TGT(41),
+  KRB5_PADATA_FX_FAST_ARMOR(71),
   KRB5_PADATA_TD_KRB_PRINCIPAL(102),
   KRB5_PADATA_PK_TD_TRUSTED_CERTIFIERS(104),
   KRB5_PADATA_PK_TD_CERTIFICATE_INDEX(105),
@@ -196,7 +215,6 @@ PADATA-TYPE ::= INTEGER {
   KRB5_PADATA_FOR_CHECK_DUPS(131),
   KRB5_PADATA_AS_CHECKSUM(132),
   KRB5_PADATA_PK_AS_09_BINDING(132),
-  KRB5_PADATA_CLIENT_CANONICALIZED(133),
   KRB5_PADATA_FX_COOKIE(133),
   KRB5_PADATA_AUTHENTICATION_SET(134),
   KRB5_PADATA_AUTH_SET_SELECTED(135),
@@ -211,6 +229,7 @@ PADATA-TYPE ::= INTEGER {
   KRB5_PADATA_EPAK_AS_REP(146),
   KRB5_PADATA_PKINIT_KX(147),
   KRB5_PADATA_PKU2U_NAME(148),
+  KRB5_PADATA_REQ_ENC_PA_REP(149),
   KRB5_PADATA_SUPPORTED_ETYPES(165)
 }
 */
@@ -247,6 +266,7 @@ typedef enum PADATA_TYPE {
   KRB5_PADATA_SAM_CHALLENGE2 = 30,
   KRB5_PADATA_SAM_RESPONSE2 = 31,
   KRB5_PA_EXTRA_TGT = 41,
+  KRB5_PADATA_FX_FAST_ARMOR = 71,
   KRB5_PADATA_TD_KRB_PRINCIPAL = 102,
   KRB5_PADATA_PK_TD_TRUSTED_CERTIFIERS = 104,
   KRB5_PADATA_PK_TD_CERTIFICATE_INDEX = 105,
@@ -259,7 +279,6 @@ typedef enum PADATA_TYPE {
   KRB5_PADATA_FOR_CHECK_DUPS = 131,
   KRB5_PADATA_AS_CHECKSUM = 132,
   KRB5_PADATA_PK_AS_09_BINDING = 132,
-  KRB5_PADATA_CLIENT_CANONICALIZED = 133,
   KRB5_PADATA_FX_COOKIE = 133,
   KRB5_PADATA_AUTHENTICATION_SET = 134,
   KRB5_PADATA_AUTH_SET_SELECTED = 135,
@@ -274,14 +293,15 @@ typedef enum PADATA_TYPE {
   KRB5_PADATA_EPAK_AS_REP = 146,
   KRB5_PADATA_PKINIT_KX = 147,
   KRB5_PADATA_PKU2U_NAME = 148,
+  KRB5_PADATA_REQ_ENC_PA_REP = 149,
   KRB5_PADATA_SUPPORTED_ETYPES = 165
 } PADATA_TYPE;
 
-int    decode_PADATA_TYPE(const unsigned char *, size_t, PADATA_TYPE *, size_t *);
-int    encode_PADATA_TYPE(unsigned char *, size_t, const PADATA_TYPE *, size_t *);
-size_t length_PADATA_TYPE(const PADATA_TYPE *);
-int    copy_PADATA_TYPE  (const PADATA_TYPE *, PADATA_TYPE *);
-void   free_PADATA_TYPE  (PADATA_TYPE *);
+ASN1EXP int    ASN1CALL decode_PADATA_TYPE(const unsigned char *, size_t, PADATA_TYPE *, size_t *);
+ASN1EXP int    ASN1CALL encode_PADATA_TYPE(unsigned char *, size_t, const PADATA_TYPE *, size_t *);
+ASN1EXP size_t ASN1CALL length_PADATA_TYPE(const PADATA_TYPE *);
+ASN1EXP int    ASN1CALL copy_PADATA_TYPE  (const PADATA_TYPE *, PADATA_TYPE *);
+ASN1EXP void   ASN1CALL free_PADATA_TYPE  (PADATA_TYPE *);
 
 
 /*
@@ -326,11 +346,11 @@ typedef enum AUTHDATA_TYPE {
   KRB5_AUTHDATA_SIGNTICKET = 512
 } AUTHDATA_TYPE;
 
-int    decode_AUTHDATA_TYPE(const unsigned char *, size_t, AUTHDATA_TYPE *, size_t *);
-int    encode_AUTHDATA_TYPE(unsigned char *, size_t, const AUTHDATA_TYPE *, size_t *);
-size_t length_AUTHDATA_TYPE(const AUTHDATA_TYPE *);
-int    copy_AUTHDATA_TYPE  (const AUTHDATA_TYPE *, AUTHDATA_TYPE *);
-void   free_AUTHDATA_TYPE  (AUTHDATA_TYPE *);
+ASN1EXP int    ASN1CALL decode_AUTHDATA_TYPE(const unsigned char *, size_t, AUTHDATA_TYPE *, size_t *);
+ASN1EXP int    ASN1CALL encode_AUTHDATA_TYPE(unsigned char *, size_t, const AUTHDATA_TYPE *, size_t *);
+ASN1EXP size_t ASN1CALL length_AUTHDATA_TYPE(const AUTHDATA_TYPE *);
+ASN1EXP int    ASN1CALL copy_AUTHDATA_TYPE  (const AUTHDATA_TYPE *, AUTHDATA_TYPE *);
+ASN1EXP void   ASN1CALL free_AUTHDATA_TYPE  (AUTHDATA_TYPE *);
 
 
 /*
@@ -350,6 +370,8 @@ CKSUMTYPE ::= INTEGER {
   CKSUMTYPE_SHA1(14),
   CKSUMTYPE_HMAC_SHA1_96_AES_128(15),
   CKSUMTYPE_HMAC_SHA1_96_AES_256(16),
+  CKSUMTYPE_HMAC_SHA256_128_AES128(19),
+  CKSUMTYPE_HMAC_SHA384_192_AES256(20),
   CKSUMTYPE_GSSAPI(32771),
   CKSUMTYPE_HMAC_MD5(-138),
   CKSUMTYPE_HMAC_MD5_ENC(-1138)
@@ -372,118 +394,110 @@ typedef enum CKSUMTYPE {
   CKSUMTYPE_SHA1 = 14,
   CKSUMTYPE_HMAC_SHA1_96_AES_128 = 15,
   CKSUMTYPE_HMAC_SHA1_96_AES_256 = 16,
+  CKSUMTYPE_HMAC_SHA256_128_AES128 = 19,
+  CKSUMTYPE_HMAC_SHA384_192_AES256 = 20,
   CKSUMTYPE_GSSAPI = 32771,
   CKSUMTYPE_HMAC_MD5 = -138,
   CKSUMTYPE_HMAC_MD5_ENC = -1138
 } CKSUMTYPE;
 
-int    decode_CKSUMTYPE(const unsigned char *, size_t, CKSUMTYPE *, size_t *);
-int    encode_CKSUMTYPE(unsigned char *, size_t, const CKSUMTYPE *, size_t *);
-size_t length_CKSUMTYPE(const CKSUMTYPE *);
-int    copy_CKSUMTYPE  (const CKSUMTYPE *, CKSUMTYPE *);
-void   free_CKSUMTYPE  (CKSUMTYPE *);
+ASN1EXP int    ASN1CALL decode_CKSUMTYPE(const unsigned char *, size_t, CKSUMTYPE *, size_t *);
+ASN1EXP int    ASN1CALL encode_CKSUMTYPE(unsigned char *, size_t, const CKSUMTYPE *, size_t *);
+ASN1EXP size_t ASN1CALL length_CKSUMTYPE(const CKSUMTYPE *);
+ASN1EXP int    ASN1CALL copy_CKSUMTYPE  (const CKSUMTYPE *, CKSUMTYPE *);
+ASN1EXP void   ASN1CALL free_CKSUMTYPE  (CKSUMTYPE *);
 
 
 /*
 ENCTYPE ::= INTEGER {
-  ETYPE_NULL(0),
-  ETYPE_DES_CBC_CRC(1),
-  ETYPE_DES_CBC_MD4(2),
-  ETYPE_DES_CBC_MD5(3),
-  ETYPE_DES3_CBC_MD5(5),
-  ETYPE_OLD_DES3_CBC_SHA1(7),
-  ETYPE_SIGN_DSA_GENERATE(8),
-  ETYPE_ENCRYPT_RSA_PRIV(9),
-  ETYPE_ENCRYPT_RSA_PUB(10),
-  ETYPE_DES3_CBC_SHA1(16),
-  ETYPE_AES128_CTS_HMAC_SHA1_96(17),
-  ETYPE_AES256_CTS_HMAC_SHA1_96(18),
-  ETYPE_ARCFOUR_HMAC_MD5(23),
-  ETYPE_ARCFOUR_HMAC_MD5_56(24),
-  ETYPE_ENCTYPE_PK_CROSS(48),
-  ETYPE_ARCFOUR_MD4(-128),
-  ETYPE_ARCFOUR_HMAC_OLD(-133),
-  ETYPE_ARCFOUR_HMAC_OLD_EXP(-135),
-  ETYPE_DES_CBC_NONE(-4096),
-  ETYPE_DES3_CBC_NONE(-4097),
-  ETYPE_DES_CFB64_NONE(-4098),
-  ETYPE_DES_PCBC_NONE(-4099),
-  ETYPE_DIGEST_MD5_NONE(-4100),
-  ETYPE_CRAM_MD5_NONE(-4101)
+  KRB5_ENCTYPE_NULL(0),
+  KRB5_ENCTYPE_DES_CBC_CRC(1),
+  KRB5_ENCTYPE_DES_CBC_MD4(2),
+  KRB5_ENCTYPE_DES_CBC_MD5(3),
+  KRB5_ENCTYPE_DES3_CBC_MD5(5),
+  KRB5_ENCTYPE_OLD_DES3_CBC_SHA1(7),
+  KRB5_ENCTYPE_SIGN_DSA_GENERATE(8),
+  KRB5_ENCTYPE_ENCRYPT_RSA_PRIV(9),
+  KRB5_ENCTYPE_ENCRYPT_RSA_PUB(10),
+  KRB5_ENCTYPE_DES3_CBC_SHA1(16),
+  KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96(17),
+  KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96(18),
+  KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128(19),
+  KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192(20),
+  KRB5_ENCTYPE_ARCFOUR_HMAC_MD5(23),
+  KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56(24),
+  KRB5_ENCTYPE_ENCTYPE_PK_CROSS(48),
+  KRB5_ENCTYPE_ARCFOUR_MD4(-128),
+  KRB5_ENCTYPE_ARCFOUR_HMAC_OLD(-133),
+  KRB5_ENCTYPE_ARCFOUR_HMAC_OLD_EXP(-135),
+  KRB5_ENCTYPE_DES_CBC_NONE(-4096),
+  KRB5_ENCTYPE_DES3_CBC_NONE(-4097),
+  KRB5_ENCTYPE_DES_CFB64_NONE(-4098),
+  KRB5_ENCTYPE_DES_PCBC_NONE(-4099),
+  KRB5_ENCTYPE_DIGEST_MD5_NONE(-4100),
+  KRB5_ENCTYPE_CRAM_MD5_NONE(-4101)
 }
 */
 
 typedef enum ENCTYPE {
-  ETYPE_NULL = 0,
-  ETYPE_DES_CBC_CRC = 1,
-  ETYPE_DES_CBC_MD4 = 2,
-  ETYPE_DES_CBC_MD5 = 3,
-  ETYPE_DES3_CBC_MD5 = 5,
-  ETYPE_OLD_DES3_CBC_SHA1 = 7,
-  ETYPE_SIGN_DSA_GENERATE = 8,
-  ETYPE_ENCRYPT_RSA_PRIV = 9,
-  ETYPE_ENCRYPT_RSA_PUB = 10,
-  ETYPE_DES3_CBC_SHA1 = 16,
-  ETYPE_AES128_CTS_HMAC_SHA1_96 = 17,
-  ETYPE_AES256_CTS_HMAC_SHA1_96 = 18,
-  ETYPE_ARCFOUR_HMAC_MD5 = 23,
-  ETYPE_ARCFOUR_HMAC_MD5_56 = 24,
-  ETYPE_ENCTYPE_PK_CROSS = 48,
-  ETYPE_ARCFOUR_MD4 = -128,
-  ETYPE_ARCFOUR_HMAC_OLD = -133,
-  ETYPE_ARCFOUR_HMAC_OLD_EXP = -135,
-  ETYPE_DES_CBC_NONE = -4096,
-  ETYPE_DES3_CBC_NONE = -4097,
-  ETYPE_DES_CFB64_NONE = -4098,
-  ETYPE_DES_PCBC_NONE = -4099,
-  ETYPE_DIGEST_MD5_NONE = -4100,
-  ETYPE_CRAM_MD5_NONE = -4101
+  KRB5_ENCTYPE_NULL = 0,
+  KRB5_ENCTYPE_DES_CBC_CRC = 1,
+  KRB5_ENCTYPE_DES_CBC_MD4 = 2,
+  KRB5_ENCTYPE_DES_CBC_MD5 = 3,
+  KRB5_ENCTYPE_DES3_CBC_MD5 = 5,
+  KRB5_ENCTYPE_OLD_DES3_CBC_SHA1 = 7,
+  KRB5_ENCTYPE_SIGN_DSA_GENERATE = 8,
+  KRB5_ENCTYPE_ENCRYPT_RSA_PRIV = 9,
+  KRB5_ENCTYPE_ENCRYPT_RSA_PUB = 10,
+  KRB5_ENCTYPE_DES3_CBC_SHA1 = 16,
+  KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96 = 17,
+  KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96 = 18,
+  KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128 = 19,
+  KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192 = 20,
+  KRB5_ENCTYPE_ARCFOUR_HMAC_MD5 = 23,
+  KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56 = 24,
+  KRB5_ENCTYPE_ENCTYPE_PK_CROSS = 48,
+  KRB5_ENCTYPE_ARCFOUR_MD4 = -128,
+  KRB5_ENCTYPE_ARCFOUR_HMAC_OLD = -133,
+  KRB5_ENCTYPE_ARCFOUR_HMAC_OLD_EXP = -135,
+  KRB5_ENCTYPE_DES_CBC_NONE = -4096,
+  KRB5_ENCTYPE_DES3_CBC_NONE = -4097,
+  KRB5_ENCTYPE_DES_CFB64_NONE = -4098,
+  KRB5_ENCTYPE_DES_PCBC_NONE = -4099,
+  KRB5_ENCTYPE_DIGEST_MD5_NONE = -4100,
+  KRB5_ENCTYPE_CRAM_MD5_NONE = -4101
 } ENCTYPE;
 
-int    decode_ENCTYPE(const unsigned char *, size_t, ENCTYPE *, size_t *);
-int    encode_ENCTYPE(unsigned char *, size_t, const ENCTYPE *, size_t *);
-size_t length_ENCTYPE(const ENCTYPE *);
-int    copy_ENCTYPE  (const ENCTYPE *, ENCTYPE *);
-void   free_ENCTYPE  (ENCTYPE *);
+ASN1EXP int    ASN1CALL decode_ENCTYPE(const unsigned char *, size_t, ENCTYPE *, size_t *);
+ASN1EXP int    ASN1CALL encode_ENCTYPE(unsigned char *, size_t, const ENCTYPE *, size_t *);
+ASN1EXP size_t ASN1CALL length_ENCTYPE(const ENCTYPE *);
+ASN1EXP int    ASN1CALL copy_ENCTYPE  (const ENCTYPE *, ENCTYPE *);
+ASN1EXP void   ASN1CALL free_ENCTYPE  (ENCTYPE *);
 
 
 /*
-krb5uint32 ::= INTEGER (0..-1)
+krb5uint32 ::= INTEGER (0..4294967295)
 */
 
 typedef unsigned int krb5uint32;
 
-int    decode_krb5uint32(const unsigned char *, size_t, krb5uint32 *, size_t *);
-int    encode_krb5uint32(unsigned char *, size_t, const krb5uint32 *, size_t *);
-size_t length_krb5uint32(const krb5uint32 *);
-int    copy_krb5uint32  (const krb5uint32 *, krb5uint32 *);
-void   free_krb5uint32  (krb5uint32 *);
-
-
 /*
 krb5int32 ::= INTEGER (-2147483648..2147483647)
 */
 
 typedef int krb5int32;
 
-int    decode_krb5int32(const unsigned char *, size_t, krb5int32 *, size_t *);
-int    encode_krb5int32(unsigned char *, size_t, const krb5int32 *, size_t *);
-size_t length_krb5int32(const krb5int32 *);
-int    copy_krb5int32  (const krb5int32 *, krb5int32 *);
-void   free_krb5int32  (krb5int32 *);
-
-
 /*
 KerberosString ::= GeneralString
 */
 
 typedef heim_general_string KerberosString;
 
-int    decode_KerberosString(const unsigned char *, size_t, KerberosString *, size_t *);
-int    encode_KerberosString(unsigned char *, size_t, const KerberosString *, size_t *);
-size_t length_KerberosString(const KerberosString *);
-int    copy_KerberosString  (const KerberosString *, KerberosString *);
-void   free_KerberosString  (KerberosString *);
+ASN1EXP int    ASN1CALL decode_KerberosString(const unsigned char *, size_t, KerberosString *, size_t *);
+ASN1EXP int    ASN1CALL encode_KerberosString(unsigned char *, size_t, const KerberosString *, size_t *);
+ASN1EXP size_t ASN1CALL length_KerberosString(const KerberosString *);
+ASN1EXP int    ASN1CALL copy_KerberosString  (const KerberosString *, KerberosString *);
+ASN1EXP void   ASN1CALL free_KerberosString  (KerberosString *);
 
 
 /*
@@ -492,11 +506,11 @@ Realm ::= GeneralString
 
 typedef heim_general_string Realm;
 
-int    decode_Realm(const unsigned char *, size_t, Realm *, size_t *);
-int    encode_Realm(unsigned char *, size_t, const Realm *, size_t *);
-size_t length_Realm(const Realm *);
-int    copy_Realm  (const Realm *, Realm *);
-void   free_Realm  (Realm *);
+ASN1EXP int    ASN1CALL decode_Realm(const unsigned char *, size_t, Realm *, size_t *);
+ASN1EXP int    ASN1CALL encode_Realm(unsigned char *, size_t, const Realm *, size_t *);
+ASN1EXP size_t ASN1CALL length_Realm(const Realm *);
+ASN1EXP int    ASN1CALL copy_Realm  (const Realm *, Realm *);
+ASN1EXP void   ASN1CALL free_Realm  (Realm *);
 
 
 /*
@@ -514,11 +528,11 @@ typedef struct PrincipalName {
   } name_string;
 } PrincipalName;
 
-int    decode_PrincipalName(const unsigned char *, size_t, PrincipalName *, size_t *);
-int    encode_PrincipalName(unsigned char *, size_t, const PrincipalName *, size_t *);
-size_t length_PrincipalName(const PrincipalName *);
-int    copy_PrincipalName  (const PrincipalName *, PrincipalName *);
-void   free_PrincipalName  (PrincipalName *);
+ASN1EXP int    ASN1CALL decode_PrincipalName(const unsigned char *, size_t, PrincipalName *, size_t *);
+ASN1EXP int    ASN1CALL encode_PrincipalName(unsigned char *, size_t, const PrincipalName *, size_t *);
+ASN1EXP size_t ASN1CALL length_PrincipalName(const PrincipalName *);
+ASN1EXP int    ASN1CALL copy_PrincipalName  (const PrincipalName *, PrincipalName *);
+ASN1EXP void   ASN1CALL free_PrincipalName  (PrincipalName *);
 
 
 /*
@@ -533,11 +547,11 @@ typedef struct Principal {
   Realm realm;
 } Principal;
 
-int    decode_Principal(const unsigned char *, size_t, Principal *, size_t *);
-int    encode_Principal(unsigned char *, size_t, const Principal *, size_t *);
-size_t length_Principal(const Principal *);
-int    copy_Principal  (const Principal *, Principal *);
-void   free_Principal  (Principal *);
+ASN1EXP int    ASN1CALL decode_Principal(const unsigned char *, size_t, Principal *, size_t *);
+ASN1EXP int    ASN1CALL encode_Principal(unsigned char *, size_t, const Principal *, size_t *);
+ASN1EXP size_t ASN1CALL length_Principal(const Principal *);
+ASN1EXP int    ASN1CALL copy_Principal  (const Principal *, Principal *);
+ASN1EXP void   ASN1CALL free_Principal  (Principal *);
 
 
 /*
@@ -549,13 +563,13 @@ typedef struct Principals {
   Principal *val;
 } Principals;
 
-int   add_Principals  (Principals *, const Principal *);
-int   remove_Principals  (Principals *, unsigned int);
-int    decode_Principals(const unsigned char *, size_t, Principals *, size_t *);
-int    encode_Principals(unsigned char *, size_t, const Principals *, size_t *);
-size_t length_Principals(const Principals *);
-int    copy_Principals  (const Principals *, Principals *);
-void   free_Principals  (Principals *);
+ASN1EXP int   ASN1CALL add_Principals  (Principals *, const Principal *);
+ASN1EXP int   ASN1CALL remove_Principals  (Principals *, unsigned int);
+ASN1EXP int    ASN1CALL decode_Principals(const unsigned char *, size_t, Principals *, size_t *);
+ASN1EXP int    ASN1CALL encode_Principals(unsigned char *, size_t, const Principals *, size_t *);
+ASN1EXP size_t ASN1CALL length_Principals(const Principals *);
+ASN1EXP int    ASN1CALL copy_Principals  (const Principals *, Principals *);
+ASN1EXP void   ASN1CALL free_Principals  (Principals *);
 
 
 /*
@@ -570,11 +584,11 @@ typedef struct HostAddress {
   heim_octet_string address;
 } HostAddress;
 
-int    decode_HostAddress(const unsigned char *, size_t, HostAddress *, size_t *);
-int    encode_HostAddress(unsigned char *, size_t, const HostAddress *, size_t *);
-size_t length_HostAddress(const HostAddress *);
-int    copy_HostAddress  (const HostAddress *, HostAddress *);
-void   free_HostAddress  (HostAddress *);
+ASN1EXP int    ASN1CALL decode_HostAddress(const unsigned char *, size_t, HostAddress *, size_t *);
+ASN1EXP int    ASN1CALL encode_HostAddress(unsigned char *, size_t, const HostAddress *, size_t *);
+ASN1EXP size_t ASN1CALL length_HostAddress(const HostAddress *);
+ASN1EXP int    ASN1CALL copy_HostAddress  (const HostAddress *, HostAddress *);
+ASN1EXP void   ASN1CALL free_HostAddress  (HostAddress *);
 
 
 /*
@@ -586,11 +600,11 @@ typedef struct HostAddresses {
   HostAddress *val;
 } HostAddresses;
 
-int    decode_HostAddresses(const unsigned char *, size_t, HostAddresses *, size_t *);
-int    encode_HostAddresses(unsigned char *, size_t, const HostAddresses *, size_t *);
-size_t length_HostAddresses(const HostAddresses *);
-int    copy_HostAddresses  (const HostAddresses *, HostAddresses *);
-void   free_HostAddresses  (HostAddresses *);
+ASN1EXP int    ASN1CALL decode_HostAddresses(const unsigned char *, size_t, HostAddresses *, size_t *);
+ASN1EXP int    ASN1CALL encode_HostAddresses(unsigned char *, size_t, const HostAddresses *, size_t *);
+ASN1EXP size_t ASN1CALL length_HostAddresses(const HostAddresses *);
+ASN1EXP int    ASN1CALL copy_HostAddresses  (const HostAddresses *, HostAddresses *);
+ASN1EXP void   ASN1CALL free_HostAddresses  (HostAddresses *);
 
 
 /*
@@ -599,11 +613,11 @@ KerberosTime ::= GeneralizedTime
 
 typedef time_t KerberosTime;
 
-int    decode_KerberosTime(const unsigned char *, size_t, KerberosTime *, size_t *);
-int    encode_KerberosTime(unsigned char *, size_t, const KerberosTime *, size_t *);
-size_t length_KerberosTime(const KerberosTime *);
-int    copy_KerberosTime  (const KerberosTime *, KerberosTime *);
-void   free_KerberosTime  (KerberosTime *);
+ASN1EXP int    ASN1CALL decode_KerberosTime(const unsigned char *, size_t, KerberosTime *, size_t *);
+ASN1EXP int    ASN1CALL encode_KerberosTime(unsigned char *, size_t, const KerberosTime *, size_t *);
+ASN1EXP size_t ASN1CALL length_KerberosTime(const KerberosTime *);
+ASN1EXP int    ASN1CALL copy_KerberosTime  (const KerberosTime *, KerberosTime *);
+ASN1EXP void   ASN1CALL free_KerberosTime  (KerberosTime *);
 
 
 /*
@@ -618,11 +632,11 @@ typedef struct AuthorizationDataElement {
   heim_octet_string ad_data;
 } AuthorizationDataElement;
 
-int    decode_AuthorizationDataElement(const unsigned char *, size_t, AuthorizationDataElement *, size_t *);
-int    encode_AuthorizationDataElement(unsigned char *, size_t, const AuthorizationDataElement *, size_t *);
-size_t length_AuthorizationDataElement(const AuthorizationDataElement *);
-int    copy_AuthorizationDataElement  (const AuthorizationDataElement *, AuthorizationDataElement *);
-void   free_AuthorizationDataElement  (AuthorizationDataElement *);
+ASN1EXP int    ASN1CALL decode_AuthorizationDataElement(const unsigned char *, size_t, AuthorizationDataElement *, size_t *);
+ASN1EXP int    ASN1CALL encode_AuthorizationDataElement(unsigned char *, size_t, const AuthorizationDataElement *, size_t *);
+ASN1EXP size_t ASN1CALL length_AuthorizationDataElement(const AuthorizationDataElement *);
+ASN1EXP int    ASN1CALL copy_AuthorizationDataElement  (const AuthorizationDataElement *, AuthorizationDataElement *);
+ASN1EXP void   ASN1CALL free_AuthorizationDataElement  (AuthorizationDataElement *);
 
 
 /*
@@ -634,13 +648,13 @@ typedef struct AuthorizationData {
   AuthorizationDataElement *val;
 } AuthorizationData;
 
-int   add_AuthorizationData  (AuthorizationData *, const AuthorizationDataElement *);
-int   remove_AuthorizationData  (AuthorizationData *, unsigned int);
-int    decode_AuthorizationData(const unsigned char *, size_t, AuthorizationData *, size_t *);
-int    encode_AuthorizationData(unsigned char *, size_t, const AuthorizationData *, size_t *);
-size_t length_AuthorizationData(const AuthorizationData *);
-int    copy_AuthorizationData  (const AuthorizationData *, AuthorizationData *);
-void   free_AuthorizationData  (AuthorizationData *);
+ASN1EXP int   ASN1CALL add_AuthorizationData  (AuthorizationData *, const AuthorizationDataElement *);
+ASN1EXP int   ASN1CALL remove_AuthorizationData  (AuthorizationData *, unsigned int);
+ASN1EXP int    ASN1CALL decode_AuthorizationData(const unsigned char *, size_t, AuthorizationData *, size_t *);
+ASN1EXP int    ASN1CALL encode_AuthorizationData(unsigned char *, size_t, const AuthorizationData *, size_t *);
+ASN1EXP size_t ASN1CALL length_AuthorizationData(const AuthorizationData *);
+ASN1EXP int    ASN1CALL copy_AuthorizationData  (const AuthorizationData *, AuthorizationData *);
+ASN1EXP void   ASN1CALL free_AuthorizationData  (AuthorizationData *);
 
 
 /*
@@ -689,13 +703,6 @@ typedef struct APOptions {
 
 unsigned APOptions2int(APOptions);
 APOptions int2APOptions(unsigned);
-int    decode_APOptions(const unsigned char *, size_t, APOptions *, size_t *);
-int    encode_APOptions(unsigned char *, size_t, const APOptions *, size_t *);
-size_t length_APOptions(const APOptions *);
-int    copy_APOptions  (const APOptions *, APOptions *);
-void   free_APOptions  (APOptions *);
-
-
 /*
 TicketFlags ::= BIT STRING {
   reserved(0),
@@ -712,7 +719,8 @@ TicketFlags ::= BIT STRING {
   hw-authent(11),
   transited-policy-checked(12),
   ok-as-delegate(13),
-  anonymous(14)
+  enc-pa-rep(15),
+  anonymous(16)
 }
 */
 
@@ -731,9 +739,9 @@ typedef struct TicketFlags {
   unsigned int hw_authent:1;
   unsigned int transited_policy_checked:1;
   unsigned int ok_as_delegate:1;
+  unsigned int _unused14:1;
+  unsigned int enc_pa_rep:1;
   unsigned int anonymous:1;
-  unsigned int _unused15:1;
-  unsigned int _unused16:1;
   unsigned int _unused17:1;
   unsigned int _unused18:1;
   unsigned int _unused19:1;
@@ -754,11 +762,11 @@ typedef struct TicketFlags {
 
 unsigned TicketFlags2int(TicketFlags);
 TicketFlags int2TicketFlags(unsigned);
-int    decode_TicketFlags(const unsigned char *, size_t, TicketFlags *, size_t *);
-int    encode_TicketFlags(unsigned char *, size_t, const TicketFlags *, size_t *);
-size_t length_TicketFlags(const TicketFlags *);
-int    copy_TicketFlags  (const TicketFlags *, TicketFlags *);
-void   free_TicketFlags  (TicketFlags *);
+ASN1EXP int    ASN1CALL decode_TicketFlags(const unsigned char *, size_t, TicketFlags *, size_t *);
+ASN1EXP int    ASN1CALL encode_TicketFlags(unsigned char *, size_t, const TicketFlags *, size_t *);
+ASN1EXP size_t ASN1CALL length_TicketFlags(const TicketFlags *);
+ASN1EXP int    ASN1CALL copy_TicketFlags  (const TicketFlags *, TicketFlags *);
+ASN1EXP void   ASN1CALL free_TicketFlags  (TicketFlags *);
 
 
 /*
@@ -771,9 +779,9 @@ KDCOptions ::= BIT STRING {
   allow-postdate(5),
   postdated(6),
   renewable(8),
-  request-anonymous(14),
+  cname-in-addl-tkt(14),
   canonicalize(15),
-  constrained-delegation(16),
+  request-anonymous(16),
   disable-transited-check(26),
   renewable-ok(27),
   enc-tkt-in-skey(28),
@@ -797,9 +805,9 @@ typedef struct KDCOptions {
   unsigned int _unused11:1;
   unsigned int _unused12:1;
   unsigned int _unused13:1;
-  unsigned int request_anonymous:1;
+  unsigned int cname_in_addl_tkt:1;
   unsigned int canonicalize:1;
-  unsigned int constrained_delegation:1;
+  unsigned int request_anonymous:1;
   unsigned int _unused17:1;
   unsigned int _unused18:1;
   unsigned int _unused19:1;
@@ -820,11 +828,11 @@ typedef struct KDCOptions {
 
 unsigned KDCOptions2int(KDCOptions);
 KDCOptions int2KDCOptions(unsigned);
-int    decode_KDCOptions(const unsigned char *, size_t, KDCOptions *, size_t *);
-int    encode_KDCOptions(unsigned char *, size_t, const KDCOptions *, size_t *);
-size_t length_KDCOptions(const KDCOptions *);
-int    copy_KDCOptions  (const KDCOptions *, KDCOptions *);
-void   free_KDCOptions  (KDCOptions *);
+ASN1EXP int    ASN1CALL decode_KDCOptions(const unsigned char *, size_t, KDCOptions *, size_t *);
+ASN1EXP int    ASN1CALL encode_KDCOptions(unsigned char *, size_t, const KDCOptions *, size_t *);
+ASN1EXP size_t ASN1CALL length_KDCOptions(const KDCOptions *);
+ASN1EXP int    ASN1CALL copy_KDCOptions  (const KDCOptions *, KDCOptions *);
+ASN1EXP void   ASN1CALL free_KDCOptions  (KDCOptions *);
 
 
 /*
@@ -851,11 +859,11 @@ typedef enum LR_TYPE {
   LR_ACCT_EXPTIME = 7
 } LR_TYPE;
 
-int    decode_LR_TYPE(const unsigned char *, size_t, LR_TYPE *, size_t *);
-int    encode_LR_TYPE(unsigned char *, size_t, const LR_TYPE *, size_t *);
-size_t length_LR_TYPE(const LR_TYPE *);
-int    copy_LR_TYPE  (const LR_TYPE *, LR_TYPE *);
-void   free_LR_TYPE  (LR_TYPE *);
+ASN1EXP int    ASN1CALL decode_LR_TYPE(const unsigned char *, size_t, LR_TYPE *, size_t *);
+ASN1EXP int    ASN1CALL encode_LR_TYPE(unsigned char *, size_t, const LR_TYPE *, size_t *);
+ASN1EXP size_t ASN1CALL length_LR_TYPE(const LR_TYPE *);
+ASN1EXP int    ASN1CALL copy_LR_TYPE  (const LR_TYPE *, LR_TYPE *);
+ASN1EXP void   ASN1CALL free_LR_TYPE  (LR_TYPE *);
 
 
 /*
@@ -873,11 +881,11 @@ typedef struct LastReq {
   } *val;
 } LastReq;
 
-int    decode_LastReq(const unsigned char *, size_t, LastReq *, size_t *);
-int    encode_LastReq(unsigned char *, size_t, const LastReq *, size_t *);
-size_t length_LastReq(const LastReq *);
-int    copy_LastReq  (const LastReq *, LastReq *);
-void   free_LastReq  (LastReq *);
+ASN1EXP int    ASN1CALL decode_LastReq(const unsigned char *, size_t, LastReq *, size_t *);
+ASN1EXP int    ASN1CALL encode_LastReq(unsigned char *, size_t, const LastReq *, size_t *);
+ASN1EXP size_t ASN1CALL length_LastReq(const LastReq *);
+ASN1EXP int    ASN1CALL copy_LastReq  (const LastReq *, LastReq *);
+ASN1EXP void   ASN1CALL free_LastReq  (LastReq *);
 
 
 /*
@@ -894,11 +902,11 @@ typedef struct EncryptedData {
   heim_octet_string cipher;
 } EncryptedData;
 
-int    decode_EncryptedData(const unsigned char *, size_t, EncryptedData *, size_t *);
-int    encode_EncryptedData(unsigned char *, size_t, const EncryptedData *, size_t *);
-size_t length_EncryptedData(const EncryptedData *);
-int    copy_EncryptedData  (const EncryptedData *, EncryptedData *);
-void   free_EncryptedData  (EncryptedData *);
+ASN1EXP int    ASN1CALL decode_EncryptedData(const unsigned char *, size_t, EncryptedData *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncryptedData(unsigned char *, size_t, const EncryptedData *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncryptedData(const EncryptedData *);
+ASN1EXP int    ASN1CALL copy_EncryptedData  (const EncryptedData *, EncryptedData *);
+ASN1EXP void   ASN1CALL free_EncryptedData  (EncryptedData *);
 
 
 /*
@@ -913,11 +921,11 @@ typedef struct EncryptionKey {
   heim_octet_string keyvalue;
 } EncryptionKey;
 
-int    decode_EncryptionKey(const unsigned char *, size_t, EncryptionKey *, size_t *);
-int    encode_EncryptionKey(unsigned char *, size_t, const EncryptionKey *, size_t *);
-size_t length_EncryptionKey(const EncryptionKey *);
-int    copy_EncryptionKey  (const EncryptionKey *, EncryptionKey *);
-void   free_EncryptionKey  (EncryptionKey *);
+ASN1EXP int    ASN1CALL decode_EncryptionKey(const unsigned char *, size_t, EncryptionKey *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncryptionKey(unsigned char *, size_t, const EncryptionKey *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncryptionKey(const EncryptionKey *);
+ASN1EXP int    ASN1CALL copy_EncryptionKey  (const EncryptionKey *, EncryptionKey *);
+ASN1EXP void   ASN1CALL free_EncryptionKey  (EncryptionKey *);
 
 
 /*
@@ -932,11 +940,11 @@ typedef struct TransitedEncoding {
   heim_octet_string contents;
 } TransitedEncoding;
 
-int    decode_TransitedEncoding(const unsigned char *, size_t, TransitedEncoding *, size_t *);
-int    encode_TransitedEncoding(unsigned char *, size_t, const TransitedEncoding *, size_t *);
-size_t length_TransitedEncoding(const TransitedEncoding *);
-int    copy_TransitedEncoding  (const TransitedEncoding *, TransitedEncoding *);
-void   free_TransitedEncoding  (TransitedEncoding *);
+ASN1EXP int    ASN1CALL decode_TransitedEncoding(const unsigned char *, size_t, TransitedEncoding *, size_t *);
+ASN1EXP int    ASN1CALL encode_TransitedEncoding(unsigned char *, size_t, const TransitedEncoding *, size_t *);
+ASN1EXP size_t ASN1CALL length_TransitedEncoding(const TransitedEncoding *);
+ASN1EXP int    ASN1CALL copy_TransitedEncoding  (const TransitedEncoding *, TransitedEncoding *);
+ASN1EXP void   ASN1CALL free_TransitedEncoding  (TransitedEncoding *);
 
 
 /*
@@ -955,11 +963,11 @@ typedef struct Ticket {
   EncryptedData enc_part;
 } Ticket;
 
-int    decode_Ticket(const unsigned char *, size_t, Ticket *, size_t *);
-int    encode_Ticket(unsigned char *, size_t, const Ticket *, size_t *);
-size_t length_Ticket(const Ticket *);
-int    copy_Ticket  (const Ticket *, Ticket *);
-void   free_Ticket  (Ticket *);
+ASN1EXP int    ASN1CALL decode_Ticket(const unsigned char *, size_t, Ticket *, size_t *);
+ASN1EXP int    ASN1CALL encode_Ticket(unsigned char *, size_t, const Ticket *, size_t *);
+ASN1EXP size_t ASN1CALL length_Ticket(const Ticket *);
+ASN1EXP int    ASN1CALL copy_Ticket  (const Ticket *, Ticket *);
+ASN1EXP void   ASN1CALL free_Ticket  (Ticket *);
 
 
 /*
@@ -992,11 +1000,11 @@ typedef struct EncTicketPart {
   AuthorizationData *authorization_data;
 } EncTicketPart;
 
-int    decode_EncTicketPart(const unsigned char *, size_t, EncTicketPart *, size_t *);
-int    encode_EncTicketPart(unsigned char *, size_t, const EncTicketPart *, size_t *);
-size_t length_EncTicketPart(const EncTicketPart *);
-int    copy_EncTicketPart  (const EncTicketPart *, EncTicketPart *);
-void   free_EncTicketPart  (EncTicketPart *);
+ASN1EXP int    ASN1CALL decode_EncTicketPart(const unsigned char *, size_t, EncTicketPart *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncTicketPart(unsigned char *, size_t, const EncTicketPart *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncTicketPart(const EncTicketPart *);
+ASN1EXP int    ASN1CALL copy_EncTicketPart  (const EncTicketPart *, EncTicketPart *);
+ASN1EXP void   ASN1CALL free_EncTicketPart  (EncTicketPart *);
 
 
 /*
@@ -1011,11 +1019,11 @@ typedef struct Checksum {
   heim_octet_string checksum;
 } Checksum;
 
-int    decode_Checksum(const unsigned char *, size_t, Checksum *, size_t *);
-int    encode_Checksum(unsigned char *, size_t, const Checksum *, size_t *);
-size_t length_Checksum(const Checksum *);
-int    copy_Checksum  (const Checksum *, Checksum *);
-void   free_Checksum  (Checksum *);
+ASN1EXP int    ASN1CALL decode_Checksum(const unsigned char *, size_t, Checksum *, size_t *);
+ASN1EXP int    ASN1CALL encode_Checksum(unsigned char *, size_t, const Checksum *, size_t *);
+ASN1EXP size_t ASN1CALL length_Checksum(const Checksum *);
+ASN1EXP int    ASN1CALL copy_Checksum  (const Checksum *, Checksum *);
+ASN1EXP void   ASN1CALL free_Checksum  (Checksum *);
 
 
 /*
@@ -1044,11 +1052,11 @@ typedef struct Authenticator {
   AuthorizationData *authorization_data;
 } Authenticator;
 
-int    decode_Authenticator(const unsigned char *, size_t, Authenticator *, size_t *);
-int    encode_Authenticator(unsigned char *, size_t, const Authenticator *, size_t *);
-size_t length_Authenticator(const Authenticator *);
-int    copy_Authenticator  (const Authenticator *, Authenticator *);
-void   free_Authenticator  (Authenticator *);
+ASN1EXP int    ASN1CALL decode_Authenticator(const unsigned char *, size_t, Authenticator *, size_t *);
+ASN1EXP int    ASN1CALL encode_Authenticator(unsigned char *, size_t, const Authenticator *, size_t *);
+ASN1EXP size_t ASN1CALL length_Authenticator(const Authenticator *);
+ASN1EXP int    ASN1CALL copy_Authenticator  (const Authenticator *, Authenticator *);
+ASN1EXP void   ASN1CALL free_Authenticator  (Authenticator *);
 
 
 /*
@@ -1063,11 +1071,11 @@ typedef struct PA_DATA {
   heim_octet_string padata_value;
 } PA_DATA;
 
-int    decode_PA_DATA(const unsigned char *, size_t, PA_DATA *, size_t *);
-int    encode_PA_DATA(unsigned char *, size_t, const PA_DATA *, size_t *);
-size_t length_PA_DATA(const PA_DATA *);
-int    copy_PA_DATA  (const PA_DATA *, PA_DATA *);
-void   free_PA_DATA  (PA_DATA *);
+ASN1EXP int    ASN1CALL decode_PA_DATA(const unsigned char *, size_t, PA_DATA *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_DATA(unsigned char *, size_t, const PA_DATA *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_DATA(const PA_DATA *);
+ASN1EXP int    ASN1CALL copy_PA_DATA  (const PA_DATA *, PA_DATA *);
+ASN1EXP void   ASN1CALL free_PA_DATA  (PA_DATA *);
 
 
 /*
@@ -1084,11 +1092,11 @@ typedef struct ETYPE_INFO_ENTRY {
   krb5int32 *salttype;
 } ETYPE_INFO_ENTRY;
 
-int    decode_ETYPE_INFO_ENTRY(const unsigned char *, size_t, ETYPE_INFO_ENTRY *, size_t *);
-int    encode_ETYPE_INFO_ENTRY(unsigned char *, size_t, const ETYPE_INFO_ENTRY *, size_t *);
-size_t length_ETYPE_INFO_ENTRY(const ETYPE_INFO_ENTRY *);
-int    copy_ETYPE_INFO_ENTRY  (const ETYPE_INFO_ENTRY *, ETYPE_INFO_ENTRY *);
-void   free_ETYPE_INFO_ENTRY  (ETYPE_INFO_ENTRY *);
+ASN1EXP int    ASN1CALL decode_ETYPE_INFO_ENTRY(const unsigned char *, size_t, ETYPE_INFO_ENTRY *, size_t *);
+ASN1EXP int    ASN1CALL encode_ETYPE_INFO_ENTRY(unsigned char *, size_t, const ETYPE_INFO_ENTRY *, size_t *);
+ASN1EXP size_t ASN1CALL length_ETYPE_INFO_ENTRY(const ETYPE_INFO_ENTRY *);
+ASN1EXP int    ASN1CALL copy_ETYPE_INFO_ENTRY  (const ETYPE_INFO_ENTRY *, ETYPE_INFO_ENTRY *);
+ASN1EXP void   ASN1CALL free_ETYPE_INFO_ENTRY  (ETYPE_INFO_ENTRY *);
 
 
 /*
@@ -1100,13 +1108,13 @@ typedef struct ETYPE_INFO {
   ETYPE_INFO_ENTRY *val;
 } ETYPE_INFO;
 
-int   add_ETYPE_INFO  (ETYPE_INFO *, const ETYPE_INFO_ENTRY *);
-int   remove_ETYPE_INFO  (ETYPE_INFO *, unsigned int);
-int    decode_ETYPE_INFO(const unsigned char *, size_t, ETYPE_INFO *, size_t *);
-int    encode_ETYPE_INFO(unsigned char *, size_t, const ETYPE_INFO *, size_t *);
-size_t length_ETYPE_INFO(const ETYPE_INFO *);
-int    copy_ETYPE_INFO  (const ETYPE_INFO *, ETYPE_INFO *);
-void   free_ETYPE_INFO  (ETYPE_INFO *);
+ASN1EXP int   ASN1CALL add_ETYPE_INFO  (ETYPE_INFO *, const ETYPE_INFO_ENTRY *);
+ASN1EXP int   ASN1CALL remove_ETYPE_INFO  (ETYPE_INFO *, unsigned int);
+ASN1EXP int    ASN1CALL decode_ETYPE_INFO(const unsigned char *, size_t, ETYPE_INFO *, size_t *);
+ASN1EXP int    ASN1CALL encode_ETYPE_INFO(unsigned char *, size_t, const ETYPE_INFO *, size_t *);
+ASN1EXP size_t ASN1CALL length_ETYPE_INFO(const ETYPE_INFO *);
+ASN1EXP int    ASN1CALL copy_ETYPE_INFO  (const ETYPE_INFO *, ETYPE_INFO *);
+ASN1EXP void   ASN1CALL free_ETYPE_INFO  (ETYPE_INFO *);
 
 
 /*
@@ -1123,11 +1131,11 @@ typedef struct ETYPE_INFO2_ENTRY {
   heim_octet_string *s2kparams;
 } ETYPE_INFO2_ENTRY;
 
-int    decode_ETYPE_INFO2_ENTRY(const unsigned char *, size_t, ETYPE_INFO2_ENTRY *, size_t *);
-int    encode_ETYPE_INFO2_ENTRY(unsigned char *, size_t, const ETYPE_INFO2_ENTRY *, size_t *);
-size_t length_ETYPE_INFO2_ENTRY(const ETYPE_INFO2_ENTRY *);
-int    copy_ETYPE_INFO2_ENTRY  (const ETYPE_INFO2_ENTRY *, ETYPE_INFO2_ENTRY *);
-void   free_ETYPE_INFO2_ENTRY  (ETYPE_INFO2_ENTRY *);
+ASN1EXP int    ASN1CALL decode_ETYPE_INFO2_ENTRY(const unsigned char *, size_t, ETYPE_INFO2_ENTRY *, size_t *);
+ASN1EXP int    ASN1CALL encode_ETYPE_INFO2_ENTRY(unsigned char *, size_t, const ETYPE_INFO2_ENTRY *, size_t *);
+ASN1EXP size_t ASN1CALL length_ETYPE_INFO2_ENTRY(const ETYPE_INFO2_ENTRY *);
+ASN1EXP int    ASN1CALL copy_ETYPE_INFO2_ENTRY  (const ETYPE_INFO2_ENTRY *, ETYPE_INFO2_ENTRY *);
+ASN1EXP void   ASN1CALL free_ETYPE_INFO2_ENTRY  (ETYPE_INFO2_ENTRY *);
 
 
 /*
@@ -1139,13 +1147,13 @@ typedef struct ETYPE_INFO2 {
   ETYPE_INFO2_ENTRY *val;
 } ETYPE_INFO2;
 
-int   add_ETYPE_INFO2  (ETYPE_INFO2 *, const ETYPE_INFO2_ENTRY *);
-int   remove_ETYPE_INFO2  (ETYPE_INFO2 *, unsigned int);
-int    decode_ETYPE_INFO2(const unsigned char *, size_t, ETYPE_INFO2 *, size_t *);
-int    encode_ETYPE_INFO2(unsigned char *, size_t, const ETYPE_INFO2 *, size_t *);
-size_t length_ETYPE_INFO2(const ETYPE_INFO2 *);
-int    copy_ETYPE_INFO2  (const ETYPE_INFO2 *, ETYPE_INFO2 *);
-void   free_ETYPE_INFO2  (ETYPE_INFO2 *);
+ASN1EXP int   ASN1CALL add_ETYPE_INFO2  (ETYPE_INFO2 *, const ETYPE_INFO2_ENTRY *);
+ASN1EXP int   ASN1CALL remove_ETYPE_INFO2  (ETYPE_INFO2 *, unsigned int);
+ASN1EXP int    ASN1CALL decode_ETYPE_INFO2(const unsigned char *, size_t, ETYPE_INFO2 *, size_t *);
+ASN1EXP int    ASN1CALL encode_ETYPE_INFO2(unsigned char *, size_t, const ETYPE_INFO2 *, size_t *);
+ASN1EXP size_t ASN1CALL length_ETYPE_INFO2(const ETYPE_INFO2 *);
+ASN1EXP int    ASN1CALL copy_ETYPE_INFO2  (const ETYPE_INFO2 *, ETYPE_INFO2 *);
+ASN1EXP void   ASN1CALL free_ETYPE_INFO2  (ETYPE_INFO2 *);
 
 
 /*
@@ -1157,13 +1165,13 @@ typedef struct METHOD_DATA {
   PA_DATA *val;
 } METHOD_DATA;
 
-int   add_METHOD_DATA  (METHOD_DATA *, const PA_DATA *);
-int   remove_METHOD_DATA  (METHOD_DATA *, unsigned int);
-int    decode_METHOD_DATA(const unsigned char *, size_t, METHOD_DATA *, size_t *);
-int    encode_METHOD_DATA(unsigned char *, size_t, const METHOD_DATA *, size_t *);
-size_t length_METHOD_DATA(const METHOD_DATA *);
-int    copy_METHOD_DATA  (const METHOD_DATA *, METHOD_DATA *);
-void   free_METHOD_DATA  (METHOD_DATA *);
+ASN1EXP int   ASN1CALL add_METHOD_DATA  (METHOD_DATA *, const PA_DATA *);
+ASN1EXP int   ASN1CALL remove_METHOD_DATA  (METHOD_DATA *, unsigned int);
+ASN1EXP int    ASN1CALL decode_METHOD_DATA(const unsigned char *, size_t, METHOD_DATA *, size_t *);
+ASN1EXP int    ASN1CALL encode_METHOD_DATA(unsigned char *, size_t, const METHOD_DATA *, size_t *);
+ASN1EXP size_t ASN1CALL length_METHOD_DATA(const METHOD_DATA *);
+ASN1EXP int    ASN1CALL copy_METHOD_DATA  (const METHOD_DATA *, METHOD_DATA *);
+ASN1EXP void   ASN1CALL free_METHOD_DATA  (METHOD_DATA *);
 
 
 /*
@@ -1178,11 +1186,11 @@ typedef struct TypedData {
   heim_octet_string *data_value;
 } TypedData;
 
-int    decode_TypedData(const unsigned char *, size_t, TypedData *, size_t *);
-int    encode_TypedData(unsigned char *, size_t, const TypedData *, size_t *);
-size_t length_TypedData(const TypedData *);
-int    copy_TypedData  (const TypedData *, TypedData *);
-void   free_TypedData  (TypedData *);
+ASN1EXP int    ASN1CALL decode_TypedData(const unsigned char *, size_t, TypedData *, size_t *);
+ASN1EXP int    ASN1CALL encode_TypedData(unsigned char *, size_t, const TypedData *, size_t *);
+ASN1EXP size_t ASN1CALL length_TypedData(const TypedData *);
+ASN1EXP int    ASN1CALL copy_TypedData  (const TypedData *, TypedData *);
+ASN1EXP void   ASN1CALL free_TypedData  (TypedData *);
 
 
 /*
@@ -1194,13 +1202,6 @@ typedef struct TYPED_DATA {
   TypedData *val;
 } TYPED_DATA;
 
-int    decode_TYPED_DATA(const unsigned char *, size_t, TYPED_DATA *, size_t *);
-int    encode_TYPED_DATA(unsigned char *, size_t, const TYPED_DATA *, size_t *);
-size_t length_TYPED_DATA(const TYPED_DATA *);
-int    copy_TYPED_DATA  (const TYPED_DATA *, TYPED_DATA *);
-void   free_TYPED_DATA  (TYPED_DATA *);
-
-
 /*
 KDC-REQ-BODY ::= SEQUENCE {
   kdc-options              [0] KDCOptions,
@@ -1239,11 +1240,11 @@ typedef struct KDC_REQ_BODY {
   } *additional_tickets;
 } KDC_REQ_BODY;
 
-int    decode_KDC_REQ_BODY(const unsigned char *, size_t, KDC_REQ_BODY *, size_t *);
-int    encode_KDC_REQ_BODY(unsigned char *, size_t, const KDC_REQ_BODY *, size_t *);
-size_t length_KDC_REQ_BODY(const KDC_REQ_BODY *);
-int    copy_KDC_REQ_BODY  (const KDC_REQ_BODY *, KDC_REQ_BODY *);
-void   free_KDC_REQ_BODY  (KDC_REQ_BODY *);
+ASN1EXP int    ASN1CALL decode_KDC_REQ_BODY(const unsigned char *, size_t, KDC_REQ_BODY *, size_t *);
+ASN1EXP int    ASN1CALL encode_KDC_REQ_BODY(unsigned char *, size_t, const KDC_REQ_BODY *, size_t *);
+ASN1EXP size_t ASN1CALL length_KDC_REQ_BODY(const KDC_REQ_BODY *);
+ASN1EXP int    ASN1CALL copy_KDC_REQ_BODY  (const KDC_REQ_BODY *, KDC_REQ_BODY *);
+ASN1EXP void   ASN1CALL free_KDC_REQ_BODY  (KDC_REQ_BODY *);
 
 
 /*
@@ -1262,24 +1263,17 @@ typedef struct KDC_REQ {
   KDC_REQ_BODY req_body;
 } KDC_REQ;
 
-int    decode_KDC_REQ(const unsigned char *, size_t, KDC_REQ *, size_t *);
-int    encode_KDC_REQ(unsigned char *, size_t, const KDC_REQ *, size_t *);
-size_t length_KDC_REQ(const KDC_REQ *);
-int    copy_KDC_REQ  (const KDC_REQ *, KDC_REQ *);
-void   free_KDC_REQ  (KDC_REQ *);
-
-
 /*
 AS-REQ ::= [APPLICATION 10] KDC-REQ
 */
 
 typedef KDC_REQ AS_REQ;
 
-int    decode_AS_REQ(const unsigned char *, size_t, AS_REQ *, size_t *);
-int    encode_AS_REQ(unsigned char *, size_t, const AS_REQ *, size_t *);
-size_t length_AS_REQ(const AS_REQ *);
-int    copy_AS_REQ  (const AS_REQ *, AS_REQ *);
-void   free_AS_REQ  (AS_REQ *);
+ASN1EXP int    ASN1CALL decode_AS_REQ(const unsigned char *, size_t, AS_REQ *, size_t *);
+ASN1EXP int    ASN1CALL encode_AS_REQ(unsigned char *, size_t, const AS_REQ *, size_t *);
+ASN1EXP size_t ASN1CALL length_AS_REQ(const AS_REQ *);
+ASN1EXP int    ASN1CALL copy_AS_REQ  (const AS_REQ *, AS_REQ *);
+ASN1EXP void   ASN1CALL free_AS_REQ  (AS_REQ *);
 
 
 /*
@@ -1288,11 +1282,11 @@ TGS-REQ ::= [APPLICATION 12] KDC-REQ
 
 typedef KDC_REQ TGS_REQ;
 
-int    decode_TGS_REQ(const unsigned char *, size_t, TGS_REQ *, size_t *);
-int    encode_TGS_REQ(unsigned char *, size_t, const TGS_REQ *, size_t *);
-size_t length_TGS_REQ(const TGS_REQ *);
-int    copy_TGS_REQ  (const TGS_REQ *, TGS_REQ *);
-void   free_TGS_REQ  (TGS_REQ *);
+ASN1EXP int    ASN1CALL decode_TGS_REQ(const unsigned char *, size_t, TGS_REQ *, size_t *);
+ASN1EXP int    ASN1CALL encode_TGS_REQ(unsigned char *, size_t, const TGS_REQ *, size_t *);
+ASN1EXP size_t ASN1CALL length_TGS_REQ(const TGS_REQ *);
+ASN1EXP int    ASN1CALL copy_TGS_REQ  (const TGS_REQ *, TGS_REQ *);
+ASN1EXP void   ASN1CALL free_TGS_REQ  (TGS_REQ *);
 
 
 /*
@@ -1307,11 +1301,11 @@ typedef struct PA_ENC_TS_ENC {
   krb5int32 *pausec;
 } PA_ENC_TS_ENC;
 
-int    decode_PA_ENC_TS_ENC(const unsigned char *, size_t, PA_ENC_TS_ENC *, size_t *);
-int    encode_PA_ENC_TS_ENC(unsigned char *, size_t, const PA_ENC_TS_ENC *, size_t *);
-size_t length_PA_ENC_TS_ENC(const PA_ENC_TS_ENC *);
-int    copy_PA_ENC_TS_ENC  (const PA_ENC_TS_ENC *, PA_ENC_TS_ENC *);
-void   free_PA_ENC_TS_ENC  (PA_ENC_TS_ENC *);
+ASN1EXP int    ASN1CALL decode_PA_ENC_TS_ENC(const unsigned char *, size_t, PA_ENC_TS_ENC *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_ENC_TS_ENC(unsigned char *, size_t, const PA_ENC_TS_ENC *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_ENC_TS_ENC(const PA_ENC_TS_ENC *);
+ASN1EXP int    ASN1CALL copy_PA_ENC_TS_ENC  (const PA_ENC_TS_ENC *, PA_ENC_TS_ENC *);
+ASN1EXP void   ASN1CALL free_PA_ENC_TS_ENC  (PA_ENC_TS_ENC *);
 
 
 /*
@@ -1324,11 +1318,11 @@ typedef struct PA_PAC_REQUEST {
   int include_pac;
 } PA_PAC_REQUEST;
 
-int    decode_PA_PAC_REQUEST(const unsigned char *, size_t, PA_PAC_REQUEST *, size_t *);
-int    encode_PA_PAC_REQUEST(unsigned char *, size_t, const PA_PAC_REQUEST *, size_t *);
-size_t length_PA_PAC_REQUEST(const PA_PAC_REQUEST *);
-int    copy_PA_PAC_REQUEST  (const PA_PAC_REQUEST *, PA_PAC_REQUEST *);
-void   free_PA_PAC_REQUEST  (PA_PAC_REQUEST *);
+ASN1EXP int    ASN1CALL decode_PA_PAC_REQUEST(const unsigned char *, size_t, PA_PAC_REQUEST *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_PAC_REQUEST(unsigned char *, size_t, const PA_PAC_REQUEST *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_PAC_REQUEST(const PA_PAC_REQUEST *);
+ASN1EXP int    ASN1CALL copy_PA_PAC_REQUEST  (const PA_PAC_REQUEST *, PA_PAC_REQUEST *);
+ASN1EXP void   ASN1CALL free_PA_PAC_REQUEST  (PA_PAC_REQUEST *);
 
 
 /*
@@ -1337,13 +1331,6 @@ PROV-SRV-LOCATION ::= GeneralString
 
 typedef heim_general_string PROV_SRV_LOCATION;
 
-int    decode_PROV_SRV_LOCATION(const unsigned char *, size_t, PROV_SRV_LOCATION *, size_t *);
-int    encode_PROV_SRV_LOCATION(unsigned char *, size_t, const PROV_SRV_LOCATION *, size_t *);
-size_t length_PROV_SRV_LOCATION(const PROV_SRV_LOCATION *);
-int    copy_PROV_SRV_LOCATION  (const PROV_SRV_LOCATION *, PROV_SRV_LOCATION *);
-void   free_PROV_SRV_LOCATION  (PROV_SRV_LOCATION *);
-
-
 /*
 KDC-REP ::= SEQUENCE {
   pvno            [0] krb5int32,
@@ -1366,11 +1353,11 @@ typedef struct KDC_REP {
   EncryptedData enc_part;
 } KDC_REP;
 
-int    decode_KDC_REP(const unsigned char *, size_t, KDC_REP *, size_t *);
-int    encode_KDC_REP(unsigned char *, size_t, const KDC_REP *, size_t *);
-size_t length_KDC_REP(const KDC_REP *);
-int    copy_KDC_REP  (const KDC_REP *, KDC_REP *);
-void   free_KDC_REP  (KDC_REP *);
+ASN1EXP int    ASN1CALL decode_KDC_REP(const unsigned char *, size_t, KDC_REP *, size_t *);
+ASN1EXP int    ASN1CALL encode_KDC_REP(unsigned char *, size_t, const KDC_REP *, size_t *);
+ASN1EXP size_t ASN1CALL length_KDC_REP(const KDC_REP *);
+ASN1EXP int    ASN1CALL copy_KDC_REP  (const KDC_REP *, KDC_REP *);
+ASN1EXP void   ASN1CALL free_KDC_REP  (KDC_REP *);
 
 
 /*
@@ -1379,11 +1366,11 @@ AS-REP ::= [APPLICATION 11] KDC-REP
 
 typedef KDC_REP AS_REP;
 
-int    decode_AS_REP(const unsigned char *, size_t, AS_REP *, size_t *);
-int    encode_AS_REP(unsigned char *, size_t, const AS_REP *, size_t *);
-size_t length_AS_REP(const AS_REP *);
-int    copy_AS_REP  (const AS_REP *, AS_REP *);
-void   free_AS_REP  (AS_REP *);
+ASN1EXP int    ASN1CALL decode_AS_REP(const unsigned char *, size_t, AS_REP *, size_t *);
+ASN1EXP int    ASN1CALL encode_AS_REP(unsigned char *, size_t, const AS_REP *, size_t *);
+ASN1EXP size_t ASN1CALL length_AS_REP(const AS_REP *);
+ASN1EXP int    ASN1CALL copy_AS_REP  (const AS_REP *, AS_REP *);
+ASN1EXP void   ASN1CALL free_AS_REP  (AS_REP *);
 
 
 /*
@@ -1392,11 +1379,11 @@ TGS-REP ::= [APPLICATION 13] KDC-REP
 
 typedef KDC_REP TGS_REP;
 
-int    decode_TGS_REP(const unsigned char *, size_t, TGS_REP *, size_t *);
-int    encode_TGS_REP(unsigned char *, size_t, const TGS_REP *, size_t *);
-size_t length_TGS_REP(const TGS_REP *);
-int    copy_TGS_REP  (const TGS_REP *, TGS_REP *);
-void   free_TGS_REP  (TGS_REP *);
+ASN1EXP int    ASN1CALL decode_TGS_REP(const unsigned char *, size_t, TGS_REP *, size_t *);
+ASN1EXP int    ASN1CALL encode_TGS_REP(unsigned char *, size_t, const TGS_REP *, size_t *);
+ASN1EXP size_t ASN1CALL length_TGS_REP(const TGS_REP *);
+ASN1EXP int    ASN1CALL copy_TGS_REP  (const TGS_REP *, TGS_REP *);
+ASN1EXP void   ASN1CALL free_TGS_REP  (TGS_REP *);
 
 
 /*
@@ -1433,11 +1420,11 @@ typedef struct EncKDCRepPart {
   METHOD_DATA *encrypted_pa_data;
 } EncKDCRepPart;
 
-int    decode_EncKDCRepPart(const unsigned char *, size_t, EncKDCRepPart *, size_t *);
-int    encode_EncKDCRepPart(unsigned char *, size_t, const EncKDCRepPart *, size_t *);
-size_t length_EncKDCRepPart(const EncKDCRepPart *);
-int    copy_EncKDCRepPart  (const EncKDCRepPart *, EncKDCRepPart *);
-void   free_EncKDCRepPart  (EncKDCRepPart *);
+ASN1EXP int    ASN1CALL decode_EncKDCRepPart(const unsigned char *, size_t, EncKDCRepPart *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncKDCRepPart(unsigned char *, size_t, const EncKDCRepPart *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncKDCRepPart(const EncKDCRepPart *);
+ASN1EXP int    ASN1CALL copy_EncKDCRepPart  (const EncKDCRepPart *, EncKDCRepPart *);
+ASN1EXP void   ASN1CALL free_EncKDCRepPart  (EncKDCRepPart *);
 
 
 /*
@@ -1446,11 +1433,11 @@ EncASRepPart ::= [APPLICATION 25] EncKDCRepPart
 
 typedef EncKDCRepPart EncASRepPart;
 
-int    decode_EncASRepPart(const unsigned char *, size_t, EncASRepPart *, size_t *);
-int    encode_EncASRepPart(unsigned char *, size_t, const EncASRepPart *, size_t *);
-size_t length_EncASRepPart(const EncASRepPart *);
-int    copy_EncASRepPart  (const EncASRepPart *, EncASRepPart *);
-void   free_EncASRepPart  (EncASRepPart *);
+ASN1EXP int    ASN1CALL decode_EncASRepPart(const unsigned char *, size_t, EncASRepPart *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncASRepPart(unsigned char *, size_t, const EncASRepPart *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncASRepPart(const EncASRepPart *);
+ASN1EXP int    ASN1CALL copy_EncASRepPart  (const EncASRepPart *, EncASRepPart *);
+ASN1EXP void   ASN1CALL free_EncASRepPart  (EncASRepPart *);
 
 
 /*
@@ -1459,11 +1446,11 @@ EncTGSRepPart ::= [APPLICATION 26] EncKDCRepPart
 
 typedef EncKDCRepPart EncTGSRepPart;
 
-int    decode_EncTGSRepPart(const unsigned char *, size_t, EncTGSRepPart *, size_t *);
-int    encode_EncTGSRepPart(unsigned char *, size_t, const EncTGSRepPart *, size_t *);
-size_t length_EncTGSRepPart(const EncTGSRepPart *);
-int    copy_EncTGSRepPart  (const EncTGSRepPart *, EncTGSRepPart *);
-void   free_EncTGSRepPart  (EncTGSRepPart *);
+ASN1EXP int    ASN1CALL decode_EncTGSRepPart(const unsigned char *, size_t, EncTGSRepPart *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncTGSRepPart(unsigned char *, size_t, const EncTGSRepPart *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncTGSRepPart(const EncTGSRepPart *);
+ASN1EXP int    ASN1CALL copy_EncTGSRepPart  (const EncTGSRepPart *, EncTGSRepPart *);
+ASN1EXP void   ASN1CALL free_EncTGSRepPart  (EncTGSRepPart *);
 
 
 /*
@@ -1484,11 +1471,11 @@ typedef struct AP_REQ {
   EncryptedData authenticator;
 } AP_REQ;
 
-int    decode_AP_REQ(const unsigned char *, size_t, AP_REQ *, size_t *);
-int    encode_AP_REQ(unsigned char *, size_t, const AP_REQ *, size_t *);
-size_t length_AP_REQ(const AP_REQ *);
-int    copy_AP_REQ  (const AP_REQ *, AP_REQ *);
-void   free_AP_REQ  (AP_REQ *);
+ASN1EXP int    ASN1CALL decode_AP_REQ(const unsigned char *, size_t, AP_REQ *, size_t *);
+ASN1EXP int    ASN1CALL encode_AP_REQ(unsigned char *, size_t, const AP_REQ *, size_t *);
+ASN1EXP size_t ASN1CALL length_AP_REQ(const AP_REQ *);
+ASN1EXP int    ASN1CALL copy_AP_REQ  (const AP_REQ *, AP_REQ *);
+ASN1EXP void   ASN1CALL free_AP_REQ  (AP_REQ *);
 
 
 /*
@@ -1505,11 +1492,11 @@ typedef struct AP_REP {
   EncryptedData enc_part;
 } AP_REP;
 
-int    decode_AP_REP(const unsigned char *, size_t, AP_REP *, size_t *);
-int    encode_AP_REP(unsigned char *, size_t, const AP_REP *, size_t *);
-size_t length_AP_REP(const AP_REP *);
-int    copy_AP_REP  (const AP_REP *, AP_REP *);
-void   free_AP_REP  (AP_REP *);
+ASN1EXP int    ASN1CALL decode_AP_REP(const unsigned char *, size_t, AP_REP *, size_t *);
+ASN1EXP int    ASN1CALL encode_AP_REP(unsigned char *, size_t, const AP_REP *, size_t *);
+ASN1EXP size_t ASN1CALL length_AP_REP(const AP_REP *);
+ASN1EXP int    ASN1CALL copy_AP_REP  (const AP_REP *, AP_REP *);
+ASN1EXP void   ASN1CALL free_AP_REP  (AP_REP *);
 
 
 /*
@@ -1528,11 +1515,11 @@ typedef struct EncAPRepPart {
   krb5uint32 *seq_number;
 } EncAPRepPart;
 
-int    decode_EncAPRepPart(const unsigned char *, size_t, EncAPRepPart *, size_t *);
-int    encode_EncAPRepPart(unsigned char *, size_t, const EncAPRepPart *, size_t *);
-size_t length_EncAPRepPart(const EncAPRepPart *);
-int    copy_EncAPRepPart  (const EncAPRepPart *, EncAPRepPart *);
-void   free_EncAPRepPart  (EncAPRepPart *);
+ASN1EXP int    ASN1CALL decode_EncAPRepPart(const unsigned char *, size_t, EncAPRepPart *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncAPRepPart(unsigned char *, size_t, const EncAPRepPart *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncAPRepPart(const EncAPRepPart *);
+ASN1EXP int    ASN1CALL copy_EncAPRepPart  (const EncAPRepPart *, EncAPRepPart *);
+ASN1EXP void   ASN1CALL free_EncAPRepPart  (EncAPRepPart *);
 
 
 /*
@@ -1555,11 +1542,11 @@ typedef struct KRB_SAFE_BODY {
   HostAddress *r_address;
 } KRB_SAFE_BODY;
 
-int    decode_KRB_SAFE_BODY(const unsigned char *, size_t, KRB_SAFE_BODY *, size_t *);
-int    encode_KRB_SAFE_BODY(unsigned char *, size_t, const KRB_SAFE_BODY *, size_t *);
-size_t length_KRB_SAFE_BODY(const KRB_SAFE_BODY *);
-int    copy_KRB_SAFE_BODY  (const KRB_SAFE_BODY *, KRB_SAFE_BODY *);
-void   free_KRB_SAFE_BODY  (KRB_SAFE_BODY *);
+ASN1EXP int    ASN1CALL decode_KRB_SAFE_BODY(const unsigned char *, size_t, KRB_SAFE_BODY *, size_t *);
+ASN1EXP int    ASN1CALL encode_KRB_SAFE_BODY(unsigned char *, size_t, const KRB_SAFE_BODY *, size_t *);
+ASN1EXP size_t ASN1CALL length_KRB_SAFE_BODY(const KRB_SAFE_BODY *);
+ASN1EXP int    ASN1CALL copy_KRB_SAFE_BODY  (const KRB_SAFE_BODY *, KRB_SAFE_BODY *);
+ASN1EXP void   ASN1CALL free_KRB_SAFE_BODY  (KRB_SAFE_BODY *);
 
 
 /*
@@ -1578,11 +1565,11 @@ typedef struct KRB_SAFE {
   Checksum cksum;
 } KRB_SAFE;
 
-int    decode_KRB_SAFE(const unsigned char *, size_t, KRB_SAFE *, size_t *);
-int    encode_KRB_SAFE(unsigned char *, size_t, const KRB_SAFE *, size_t *);
-size_t length_KRB_SAFE(const KRB_SAFE *);
-int    copy_KRB_SAFE  (const KRB_SAFE *, KRB_SAFE *);
-void   free_KRB_SAFE  (KRB_SAFE *);
+ASN1EXP int    ASN1CALL decode_KRB_SAFE(const unsigned char *, size_t, KRB_SAFE *, size_t *);
+ASN1EXP int    ASN1CALL encode_KRB_SAFE(unsigned char *, size_t, const KRB_SAFE *, size_t *);
+ASN1EXP size_t ASN1CALL length_KRB_SAFE(const KRB_SAFE *);
+ASN1EXP int    ASN1CALL copy_KRB_SAFE  (const KRB_SAFE *, KRB_SAFE *);
+ASN1EXP void   ASN1CALL free_KRB_SAFE  (KRB_SAFE *);
 
 
 /*
@@ -1599,11 +1586,11 @@ typedef struct KRB_PRIV {
   EncryptedData enc_part;
 } KRB_PRIV;
 
-int    decode_KRB_PRIV(const unsigned char *, size_t, KRB_PRIV *, size_t *);
-int    encode_KRB_PRIV(unsigned char *, size_t, const KRB_PRIV *, size_t *);
-size_t length_KRB_PRIV(const KRB_PRIV *);
-int    copy_KRB_PRIV  (const KRB_PRIV *, KRB_PRIV *);
-void   free_KRB_PRIV  (KRB_PRIV *);
+ASN1EXP int    ASN1CALL decode_KRB_PRIV(const unsigned char *, size_t, KRB_PRIV *, size_t *);
+ASN1EXP int    ASN1CALL encode_KRB_PRIV(unsigned char *, size_t, const KRB_PRIV *, size_t *);
+ASN1EXP size_t ASN1CALL length_KRB_PRIV(const KRB_PRIV *);
+ASN1EXP int    ASN1CALL copy_KRB_PRIV  (const KRB_PRIV *, KRB_PRIV *);
+ASN1EXP void   ASN1CALL free_KRB_PRIV  (KRB_PRIV *);
 
 
 /*
@@ -1626,11 +1613,11 @@ typedef struct EncKrbPrivPart {
   HostAddress *r_address;
 } EncKrbPrivPart;
 
-int    decode_EncKrbPrivPart(const unsigned char *, size_t, EncKrbPrivPart *, size_t *);
-int    encode_EncKrbPrivPart(unsigned char *, size_t, const EncKrbPrivPart *, size_t *);
-size_t length_EncKrbPrivPart(const EncKrbPrivPart *);
-int    copy_EncKrbPrivPart  (const EncKrbPrivPart *, EncKrbPrivPart *);
-void   free_EncKrbPrivPart  (EncKrbPrivPart *);
+ASN1EXP int    ASN1CALL decode_EncKrbPrivPart(const unsigned char *, size_t, EncKrbPrivPart *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncKrbPrivPart(unsigned char *, size_t, const EncKrbPrivPart *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncKrbPrivPart(const EncKrbPrivPart *);
+ASN1EXP int    ASN1CALL copy_EncKrbPrivPart  (const EncKrbPrivPart *, EncKrbPrivPart *);
+ASN1EXP void   ASN1CALL free_EncKrbPrivPart  (EncKrbPrivPart *);
 
 
 /*
@@ -1652,11 +1639,11 @@ typedef struct KRB_CRED {
   EncryptedData enc_part;
 } KRB_CRED;
 
-int    decode_KRB_CRED(const unsigned char *, size_t, KRB_CRED *, size_t *);
-int    encode_KRB_CRED(unsigned char *, size_t, const KRB_CRED *, size_t *);
-size_t length_KRB_CRED(const KRB_CRED *);
-int    copy_KRB_CRED  (const KRB_CRED *, KRB_CRED *);
-void   free_KRB_CRED  (KRB_CRED *);
+ASN1EXP int    ASN1CALL decode_KRB_CRED(const unsigned char *, size_t, KRB_CRED *, size_t *);
+ASN1EXP int    ASN1CALL encode_KRB_CRED(unsigned char *, size_t, const KRB_CRED *, size_t *);
+ASN1EXP size_t ASN1CALL length_KRB_CRED(const KRB_CRED *);
+ASN1EXP int    ASN1CALL copy_KRB_CRED  (const KRB_CRED *, KRB_CRED *);
+ASN1EXP void   ASN1CALL free_KRB_CRED  (KRB_CRED *);
 
 
 /*
@@ -1689,11 +1676,11 @@ typedef struct KrbCredInfo {
   HostAddresses *caddr;
 } KrbCredInfo;
 
-int    decode_KrbCredInfo(const unsigned char *, size_t, KrbCredInfo *, size_t *);
-int    encode_KrbCredInfo(unsigned char *, size_t, const KrbCredInfo *, size_t *);
-size_t length_KrbCredInfo(const KrbCredInfo *);
-int    copy_KrbCredInfo  (const KrbCredInfo *, KrbCredInfo *);
-void   free_KrbCredInfo  (KrbCredInfo *);
+ASN1EXP int    ASN1CALL decode_KrbCredInfo(const unsigned char *, size_t, KrbCredInfo *, size_t *);
+ASN1EXP int    ASN1CALL encode_KrbCredInfo(unsigned char *, size_t, const KrbCredInfo *, size_t *);
+ASN1EXP size_t ASN1CALL length_KrbCredInfo(const KrbCredInfo *);
+ASN1EXP int    ASN1CALL copy_KrbCredInfo  (const KrbCredInfo *, KrbCredInfo *);
+ASN1EXP void   ASN1CALL free_KrbCredInfo  (KrbCredInfo *);
 
 
 /*
@@ -1719,11 +1706,11 @@ typedef struct EncKrbCredPart {
   HostAddress *r_address;
 } EncKrbCredPart;
 
-int    decode_EncKrbCredPart(const unsigned char *, size_t, EncKrbCredPart *, size_t *);
-int    encode_EncKrbCredPart(unsigned char *, size_t, const EncKrbCredPart *, size_t *);
-size_t length_EncKrbCredPart(const EncKrbCredPart *);
-int    copy_EncKrbCredPart  (const EncKrbCredPart *, EncKrbCredPart *);
-void   free_EncKrbCredPart  (EncKrbCredPart *);
+ASN1EXP int    ASN1CALL decode_EncKrbCredPart(const unsigned char *, size_t, EncKrbCredPart *, size_t *);
+ASN1EXP int    ASN1CALL encode_EncKrbCredPart(unsigned char *, size_t, const EncKrbCredPart *, size_t *);
+ASN1EXP size_t ASN1CALL length_EncKrbCredPart(const EncKrbCredPart *);
+ASN1EXP int    ASN1CALL copy_EncKrbCredPart  (const EncKrbCredPart *, EncKrbCredPart *);
+ASN1EXP void   ASN1CALL free_EncKrbCredPart  (EncKrbCredPart *);
 
 
 /*
@@ -1760,11 +1747,11 @@ typedef struct KRB_ERROR {
   heim_octet_string *e_data;
 } KRB_ERROR;
 
-int    decode_KRB_ERROR(const unsigned char *, size_t, KRB_ERROR *, size_t *);
-int    encode_KRB_ERROR(unsigned char *, size_t, const KRB_ERROR *, size_t *);
-size_t length_KRB_ERROR(const KRB_ERROR *);
-int    copy_KRB_ERROR  (const KRB_ERROR *, KRB_ERROR *);
-void   free_KRB_ERROR  (KRB_ERROR *);
+ASN1EXP int    ASN1CALL decode_KRB_ERROR(const unsigned char *, size_t, KRB_ERROR *, size_t *);
+ASN1EXP int    ASN1CALL encode_KRB_ERROR(unsigned char *, size_t, const KRB_ERROR *, size_t *);
+ASN1EXP size_t ASN1CALL length_KRB_ERROR(const KRB_ERROR *);
+ASN1EXP int    ASN1CALL copy_KRB_ERROR  (const KRB_ERROR *, KRB_ERROR *);
+ASN1EXP void   ASN1CALL free_KRB_ERROR  (KRB_ERROR *);
 
 
 /*
@@ -1781,27 +1768,27 @@ typedef struct ChangePasswdDataMS {
   Realm *targrealm;
 } ChangePasswdDataMS;
 
-int    decode_ChangePasswdDataMS(const unsigned char *, size_t, ChangePasswdDataMS *, size_t *);
-int    encode_ChangePasswdDataMS(unsigned char *, size_t, const ChangePasswdDataMS *, size_t *);
-size_t length_ChangePasswdDataMS(const ChangePasswdDataMS *);
-int    copy_ChangePasswdDataMS  (const ChangePasswdDataMS *, ChangePasswdDataMS *);
-void   free_ChangePasswdDataMS  (ChangePasswdDataMS *);
+ASN1EXP int    ASN1CALL decode_ChangePasswdDataMS(const unsigned char *, size_t, ChangePasswdDataMS *, size_t *);
+ASN1EXP int    ASN1CALL encode_ChangePasswdDataMS(unsigned char *, size_t, const ChangePasswdDataMS *, size_t *);
+ASN1EXP size_t ASN1CALL length_ChangePasswdDataMS(const ChangePasswdDataMS *);
+ASN1EXP int    ASN1CALL copy_ChangePasswdDataMS  (const ChangePasswdDataMS *, ChangePasswdDataMS *);
+ASN1EXP void   ASN1CALL free_ChangePasswdDataMS  (ChangePasswdDataMS *);
 
 
 /*
-EtypeList ::= SEQUENCE OF krb5int32
+EtypeList ::= SEQUENCE OF ENCTYPE
 */
 
 typedef struct EtypeList {
   unsigned int len;
-  krb5int32 *val;
+  ENCTYPE *val;
 } EtypeList;
 
-int    decode_EtypeList(const unsigned char *, size_t, EtypeList *, size_t *);
-int    encode_EtypeList(unsigned char *, size_t, const EtypeList *, size_t *);
-size_t length_EtypeList(const EtypeList *);
-int    copy_EtypeList  (const EtypeList *, EtypeList *);
-void   free_EtypeList  (EtypeList *);
+ASN1EXP int    ASN1CALL decode_EtypeList(const unsigned char *, size_t, EtypeList *, size_t *);
+ASN1EXP int    ASN1CALL encode_EtypeList(unsigned char *, size_t, const EtypeList *, size_t *);
+ASN1EXP size_t ASN1CALL length_EtypeList(const EtypeList *);
+ASN1EXP int    ASN1CALL copy_EtypeList  (const EtypeList *, EtypeList *);
+ASN1EXP void   ASN1CALL free_EtypeList  (EtypeList *);
 
 
 enum { krb5_pvno = 5 };
@@ -1814,11 +1801,11 @@ AD-IF-RELEVANT ::= AuthorizationData
 
 typedef AuthorizationData AD_IF_RELEVANT;
 
-int    decode_AD_IF_RELEVANT(const unsigned char *, size_t, AD_IF_RELEVANT *, size_t *);
-int    encode_AD_IF_RELEVANT(unsigned char *, size_t, const AD_IF_RELEVANT *, size_t *);
-size_t length_AD_IF_RELEVANT(const AD_IF_RELEVANT *);
-int    copy_AD_IF_RELEVANT  (const AD_IF_RELEVANT *, AD_IF_RELEVANT *);
-void   free_AD_IF_RELEVANT  (AD_IF_RELEVANT *);
+ASN1EXP int    ASN1CALL decode_AD_IF_RELEVANT(const unsigned char *, size_t, AD_IF_RELEVANT *, size_t *);
+ASN1EXP int    ASN1CALL encode_AD_IF_RELEVANT(unsigned char *, size_t, const AD_IF_RELEVANT *, size_t *);
+ASN1EXP size_t ASN1CALL length_AD_IF_RELEVANT(const AD_IF_RELEVANT *);
+ASN1EXP int    ASN1CALL copy_AD_IF_RELEVANT  (const AD_IF_RELEVANT *, AD_IF_RELEVANT *);
+ASN1EXP void   ASN1CALL free_AD_IF_RELEVANT  (AD_IF_RELEVANT *);
 
 
 /*
@@ -1837,11 +1824,11 @@ typedef struct AD_KDCIssued {
   AuthorizationData elements;
 } AD_KDCIssued;
 
-int    decode_AD_KDCIssued(const unsigned char *, size_t, AD_KDCIssued *, size_t *);
-int    encode_AD_KDCIssued(unsigned char *, size_t, const AD_KDCIssued *, size_t *);
-size_t length_AD_KDCIssued(const AD_KDCIssued *);
-int    copy_AD_KDCIssued  (const AD_KDCIssued *, AD_KDCIssued *);
-void   free_AD_KDCIssued  (AD_KDCIssued *);
+ASN1EXP int    ASN1CALL decode_AD_KDCIssued(const unsigned char *, size_t, AD_KDCIssued *, size_t *);
+ASN1EXP int    ASN1CALL encode_AD_KDCIssued(unsigned char *, size_t, const AD_KDCIssued *, size_t *);
+ASN1EXP size_t ASN1CALL length_AD_KDCIssued(const AD_KDCIssued *);
+ASN1EXP int    ASN1CALL copy_AD_KDCIssued  (const AD_KDCIssued *, AD_KDCIssued *);
+ASN1EXP void   ASN1CALL free_AD_KDCIssued  (AD_KDCIssued *);
 
 
 /*
@@ -1856,11 +1843,11 @@ typedef struct AD_AND_OR {
   AuthorizationData elements;
 } AD_AND_OR;
 
-int    decode_AD_AND_OR(const unsigned char *, size_t, AD_AND_OR *, size_t *);
-int    encode_AD_AND_OR(unsigned char *, size_t, const AD_AND_OR *, size_t *);
-size_t length_AD_AND_OR(const AD_AND_OR *);
-int    copy_AD_AND_OR  (const AD_AND_OR *, AD_AND_OR *);
-void   free_AD_AND_OR  (AD_AND_OR *);
+ASN1EXP int    ASN1CALL decode_AD_AND_OR(const unsigned char *, size_t, AD_AND_OR *, size_t *);
+ASN1EXP int    ASN1CALL encode_AD_AND_OR(unsigned char *, size_t, const AD_AND_OR *, size_t *);
+ASN1EXP size_t ASN1CALL length_AD_AND_OR(const AD_AND_OR *);
+ASN1EXP int    ASN1CALL copy_AD_AND_OR  (const AD_AND_OR *, AD_AND_OR *);
+ASN1EXP void   ASN1CALL free_AD_AND_OR  (AD_AND_OR *);
 
 
 /*
@@ -1869,13 +1856,6 @@ AD-MANDATORY-FOR-KDC ::= AuthorizationData
 
 typedef AuthorizationData AD_MANDATORY_FOR_KDC;
 
-int    decode_AD_MANDATORY_FOR_KDC(const unsigned char *, size_t, AD_MANDATORY_FOR_KDC *, size_t *);
-int    encode_AD_MANDATORY_FOR_KDC(unsigned char *, size_t, const AD_MANDATORY_FOR_KDC *, size_t *);
-size_t length_AD_MANDATORY_FOR_KDC(const AD_MANDATORY_FOR_KDC *);
-int    copy_AD_MANDATORY_FOR_KDC  (const AD_MANDATORY_FOR_KDC *, AD_MANDATORY_FOR_KDC *);
-void   free_AD_MANDATORY_FOR_KDC  (AD_MANDATORY_FOR_KDC *);
-
-
 /*
 PA-SAM-TYPE ::= INTEGER {
   PA_SAM_TYPE_ENIGMA(1),
@@ -1896,26 +1876,12 @@ typedef enum PA_SAM_TYPE {
   PA_SAM_TYPE_CRYPTOCARD = 6
 } PA_SAM_TYPE;
 
-int    decode_PA_SAM_TYPE(const unsigned char *, size_t, PA_SAM_TYPE *, size_t *);
-int    encode_PA_SAM_TYPE(unsigned char *, size_t, const PA_SAM_TYPE *, size_t *);
-size_t length_PA_SAM_TYPE(const PA_SAM_TYPE *);
-int    copy_PA_SAM_TYPE  (const PA_SAM_TYPE *, PA_SAM_TYPE *);
-void   free_PA_SAM_TYPE  (PA_SAM_TYPE *);
-
-
 /*
 PA-SAM-REDIRECT ::= HostAddresses
 */
 
 typedef HostAddresses PA_SAM_REDIRECT;
 
-int    decode_PA_SAM_REDIRECT(const unsigned char *, size_t, PA_SAM_REDIRECT *, size_t *);
-int    encode_PA_SAM_REDIRECT(unsigned char *, size_t, const PA_SAM_REDIRECT *, size_t *);
-size_t length_PA_SAM_REDIRECT(const PA_SAM_REDIRECT *);
-int    copy_PA_SAM_REDIRECT  (const PA_SAM_REDIRECT *, PA_SAM_REDIRECT *);
-void   free_PA_SAM_REDIRECT  (PA_SAM_REDIRECT *);
-
-
 /*
 SAMFlags ::= BIT STRING {
   use-sad-as-key(0),
@@ -1962,13 +1928,6 @@ typedef struct SAMFlags {
 
 unsigned SAMFlags2int(SAMFlags);
 SAMFlags int2SAMFlags(unsigned);
-int    decode_SAMFlags(const unsigned char *, size_t, SAMFlags *, size_t *);
-int    encode_SAMFlags(unsigned char *, size_t, const SAMFlags *, size_t *);
-size_t length_SAMFlags(const SAMFlags *);
-int    copy_SAMFlags  (const SAMFlags *, SAMFlags *);
-void   free_SAMFlags  (SAMFlags *);
-
-
 /*
 PA-SAM-CHALLENGE-2-BODY ::= SEQUENCE {
   sam-type              [0] krb5int32,
@@ -1998,13 +1957,6 @@ typedef struct PA_SAM_CHALLENGE_2_BODY {
   krb5int32 sam_etype;
 } PA_SAM_CHALLENGE_2_BODY;
 
-int    decode_PA_SAM_CHALLENGE_2_BODY(const unsigned char *, size_t, PA_SAM_CHALLENGE_2_BODY *, size_t *);
-int    encode_PA_SAM_CHALLENGE_2_BODY(unsigned char *, size_t, const PA_SAM_CHALLENGE_2_BODY *, size_t *);
-size_t length_PA_SAM_CHALLENGE_2_BODY(const PA_SAM_CHALLENGE_2_BODY *);
-int    copy_PA_SAM_CHALLENGE_2_BODY  (const PA_SAM_CHALLENGE_2_BODY *, PA_SAM_CHALLENGE_2_BODY *);
-void   free_PA_SAM_CHALLENGE_2_BODY  (PA_SAM_CHALLENGE_2_BODY *);
-
-
 /*
 PA-SAM-CHALLENGE-2 ::= SEQUENCE {
   sam-body        [0] PA-SAM-CHALLENGE-2-BODY,
@@ -2021,13 +1973,6 @@ typedef struct PA_SAM_CHALLENGE_2 {
   } sam_cksum;
 } PA_SAM_CHALLENGE_2;
 
-int    decode_PA_SAM_CHALLENGE_2(const unsigned char *, size_t, PA_SAM_CHALLENGE_2 *, size_t *);
-int    encode_PA_SAM_CHALLENGE_2(unsigned char *, size_t, const PA_SAM_CHALLENGE_2 *, size_t *);
-size_t length_PA_SAM_CHALLENGE_2(const PA_SAM_CHALLENGE_2 *);
-int    copy_PA_SAM_CHALLENGE_2  (const PA_SAM_CHALLENGE_2 *, PA_SAM_CHALLENGE_2 *);
-void   free_PA_SAM_CHALLENGE_2  (PA_SAM_CHALLENGE_2 *);
-
-
 /*
 PA-SAM-RESPONSE-2 ::= SEQUENCE {
   sam-type               [0] krb5int32,
@@ -2047,13 +1992,6 @@ typedef struct PA_SAM_RESPONSE_2 {
   krb5int32 sam_nonce;
 } PA_SAM_RESPONSE_2;
 
-int    decode_PA_SAM_RESPONSE_2(const unsigned char *, size_t, PA_SAM_RESPONSE_2 *, size_t *);
-int    encode_PA_SAM_RESPONSE_2(unsigned char *, size_t, const PA_SAM_RESPONSE_2 *, size_t *);
-size_t length_PA_SAM_RESPONSE_2(const PA_SAM_RESPONSE_2 *);
-int    copy_PA_SAM_RESPONSE_2  (const PA_SAM_RESPONSE_2 *, PA_SAM_RESPONSE_2 *);
-void   free_PA_SAM_RESPONSE_2  (PA_SAM_RESPONSE_2 *);
-
-
 /*
 PA-ENC-SAM-RESPONSE-ENC ::= SEQUENCE {
   sam-nonce       [0] krb5int32,
@@ -2067,13 +2005,6 @@ typedef struct PA_ENC_SAM_RESPONSE_ENC {
   heim_general_string *sam_sad;
 } PA_ENC_SAM_RESPONSE_ENC;
 
-int    decode_PA_ENC_SAM_RESPONSE_ENC(const unsigned char *, size_t, PA_ENC_SAM_RESPONSE_ENC *, size_t *);
-int    encode_PA_ENC_SAM_RESPONSE_ENC(unsigned char *, size_t, const PA_ENC_SAM_RESPONSE_ENC *, size_t *);
-size_t length_PA_ENC_SAM_RESPONSE_ENC(const PA_ENC_SAM_RESPONSE_ENC *);
-int    copy_PA_ENC_SAM_RESPONSE_ENC  (const PA_ENC_SAM_RESPONSE_ENC *, PA_ENC_SAM_RESPONSE_ENC *);
-void   free_PA_ENC_SAM_RESPONSE_ENC  (PA_ENC_SAM_RESPONSE_ENC *);
-
-
 /*
 PA-S4U2Self ::= SEQUENCE {
   name            [0] PrincipalName,
@@ -2090,11 +2021,11 @@ typedef struct PA_S4U2Self {
   heim_general_string auth;
 } PA_S4U2Self;
 
-int    decode_PA_S4U2Self(const unsigned char *, size_t, PA_S4U2Self *, size_t *);
-int    encode_PA_S4U2Self(unsigned char *, size_t, const PA_S4U2Self *, size_t *);
-size_t length_PA_S4U2Self(const PA_S4U2Self *);
-int    copy_PA_S4U2Self  (const PA_S4U2Self *, PA_S4U2Self *);
-void   free_PA_S4U2Self  (PA_S4U2Self *);
+ASN1EXP int    ASN1CALL decode_PA_S4U2Self(const unsigned char *, size_t, PA_S4U2Self *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_S4U2Self(unsigned char *, size_t, const PA_S4U2Self *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_S4U2Self(const PA_S4U2Self *);
+ASN1EXP int    ASN1CALL copy_PA_S4U2Self  (const PA_S4U2Self *, PA_S4U2Self *);
+ASN1EXP void   ASN1CALL free_PA_S4U2Self  (PA_S4U2Self *);
 
 
 /*
@@ -2113,11 +2044,11 @@ typedef struct KRB5SignedPathData {
   METHOD_DATA *method_data;
 } KRB5SignedPathData;
 
-int    decode_KRB5SignedPathData(const unsigned char *, size_t, KRB5SignedPathData *, size_t *);
-int    encode_KRB5SignedPathData(unsigned char *, size_t, const KRB5SignedPathData *, size_t *);
-size_t length_KRB5SignedPathData(const KRB5SignedPathData *);
-int    copy_KRB5SignedPathData  (const KRB5SignedPathData *, KRB5SignedPathData *);
-void   free_KRB5SignedPathData  (KRB5SignedPathData *);
+ASN1EXP int    ASN1CALL decode_KRB5SignedPathData(const unsigned char *, size_t, KRB5SignedPathData *, size_t *);
+ASN1EXP int    ASN1CALL encode_KRB5SignedPathData(unsigned char *, size_t, const KRB5SignedPathData *, size_t *);
+ASN1EXP size_t ASN1CALL length_KRB5SignedPathData(const KRB5SignedPathData *);
+ASN1EXP int    ASN1CALL copy_KRB5SignedPathData  (const KRB5SignedPathData *, KRB5SignedPathData *);
+ASN1EXP void   ASN1CALL free_KRB5SignedPathData  (KRB5SignedPathData *);
 
 
 /*
@@ -2136,49 +2067,11 @@ typedef struct KRB5SignedPath {
   METHOD_DATA *method_data;
 } KRB5SignedPath;
 
-int    decode_KRB5SignedPath(const unsigned char *, size_t, KRB5SignedPath *, size_t *);
-int    encode_KRB5SignedPath(unsigned char *, size_t, const KRB5SignedPath *, size_t *);
-size_t length_KRB5SignedPath(const KRB5SignedPath *);
-int    copy_KRB5SignedPath  (const KRB5SignedPath *, KRB5SignedPath *);
-void   free_KRB5SignedPath  (KRB5SignedPath *);
-
-
-/*
-PA-ClientCanonicalizedNames ::= SEQUENCE {
-  requested-name   [0] PrincipalName,
-  mapped-name      [1] PrincipalName,
-}
-*/
-
-typedef struct PA_ClientCanonicalizedNames {
-  PrincipalName requested_name;
-  PrincipalName mapped_name;
-} PA_ClientCanonicalizedNames;
-
-int    decode_PA_ClientCanonicalizedNames(const unsigned char *, size_t, PA_ClientCanonicalizedNames *, size_t *);
-int    encode_PA_ClientCanonicalizedNames(unsigned char *, size_t, const PA_ClientCanonicalizedNames *, size_t *);
-size_t length_PA_ClientCanonicalizedNames(const PA_ClientCanonicalizedNames *);
-int    copy_PA_ClientCanonicalizedNames  (const PA_ClientCanonicalizedNames *, PA_ClientCanonicalizedNames *);
-void   free_PA_ClientCanonicalizedNames  (PA_ClientCanonicalizedNames *);
-
-
-/*
-PA-ClientCanonicalized ::= SEQUENCE {
-  names            [0] PA-ClientCanonicalizedNames,
-  canon-checksum   [1] Checksum,
-}
-*/
-
-typedef struct PA_ClientCanonicalized {
-  PA_ClientCanonicalizedNames names;
-  Checksum canon_checksum;
-} PA_ClientCanonicalized;
-
-int    decode_PA_ClientCanonicalized(const unsigned char *, size_t, PA_ClientCanonicalized *, size_t *);
-int    encode_PA_ClientCanonicalized(unsigned char *, size_t, const PA_ClientCanonicalized *, size_t *);
-size_t length_PA_ClientCanonicalized(const PA_ClientCanonicalized *);
-int    copy_PA_ClientCanonicalized  (const PA_ClientCanonicalized *, PA_ClientCanonicalized *);
-void   free_PA_ClientCanonicalized  (PA_ClientCanonicalized *);
+ASN1EXP int    ASN1CALL decode_KRB5SignedPath(const unsigned char *, size_t, KRB5SignedPath *, size_t *);
+ASN1EXP int    ASN1CALL encode_KRB5SignedPath(unsigned char *, size_t, const KRB5SignedPath *, size_t *);
+ASN1EXP size_t ASN1CALL length_KRB5SignedPath(const KRB5SignedPath *);
+ASN1EXP int    ASN1CALL copy_KRB5SignedPath  (const KRB5SignedPath *, KRB5SignedPath *);
+ASN1EXP void   ASN1CALL free_KRB5SignedPath  (KRB5SignedPath *);
 
 
 /*
@@ -2193,11 +2086,11 @@ typedef struct AD_LoginAlias {
   Checksum checksum;
 } AD_LoginAlias;
 
-int    decode_AD_LoginAlias(const unsigned char *, size_t, AD_LoginAlias *, size_t *);
-int    encode_AD_LoginAlias(unsigned char *, size_t, const AD_LoginAlias *, size_t *);
-size_t length_AD_LoginAlias(const AD_LoginAlias *);
-int    copy_AD_LoginAlias  (const AD_LoginAlias *, AD_LoginAlias *);
-void   free_AD_LoginAlias  (AD_LoginAlias *);
+ASN1EXP int    ASN1CALL decode_AD_LoginAlias(const unsigned char *, size_t, AD_LoginAlias *, size_t *);
+ASN1EXP int    ASN1CALL encode_AD_LoginAlias(unsigned char *, size_t, const AD_LoginAlias *, size_t *);
+ASN1EXP size_t ASN1CALL length_AD_LoginAlias(const AD_LoginAlias *);
+ASN1EXP int    ASN1CALL copy_AD_LoginAlias  (const AD_LoginAlias *, AD_LoginAlias *);
+ASN1EXP void   ASN1CALL free_AD_LoginAlias  (AD_LoginAlias *);
 
 
 /*
@@ -2212,11 +2105,11 @@ typedef struct PA_SvrReferralData {
   Realm referred_realm;
 } PA_SvrReferralData;
 
-int    decode_PA_SvrReferralData(const unsigned char *, size_t, PA_SvrReferralData *, size_t *);
-int    encode_PA_SvrReferralData(unsigned char *, size_t, const PA_SvrReferralData *, size_t *);
-size_t length_PA_SvrReferralData(const PA_SvrReferralData *);
-int    copy_PA_SvrReferralData  (const PA_SvrReferralData *, PA_SvrReferralData *);
-void   free_PA_SvrReferralData  (PA_SvrReferralData *);
+ASN1EXP int    ASN1CALL decode_PA_SvrReferralData(const unsigned char *, size_t, PA_SvrReferralData *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_SvrReferralData(unsigned char *, size_t, const PA_SvrReferralData *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_SvrReferralData(const PA_SvrReferralData *);
+ASN1EXP int    ASN1CALL copy_PA_SvrReferralData  (const PA_SvrReferralData *, PA_SvrReferralData *);
+ASN1EXP void   ASN1CALL free_PA_SvrReferralData  (PA_SvrReferralData *);
 
 
 /*
@@ -2225,11 +2118,11 @@ PA-SERVER-REFERRAL-DATA ::= EncryptedData
 
 typedef EncryptedData PA_SERVER_REFERRAL_DATA;
 
-int    decode_PA_SERVER_REFERRAL_DATA(const unsigned char *, size_t, PA_SERVER_REFERRAL_DATA *, size_t *);
-int    encode_PA_SERVER_REFERRAL_DATA(unsigned char *, size_t, const PA_SERVER_REFERRAL_DATA *, size_t *);
-size_t length_PA_SERVER_REFERRAL_DATA(const PA_SERVER_REFERRAL_DATA *);
-int    copy_PA_SERVER_REFERRAL_DATA  (const PA_SERVER_REFERRAL_DATA *, PA_SERVER_REFERRAL_DATA *);
-void   free_PA_SERVER_REFERRAL_DATA  (PA_SERVER_REFERRAL_DATA *);
+ASN1EXP int    ASN1CALL decode_PA_SERVER_REFERRAL_DATA(const unsigned char *, size_t, PA_SERVER_REFERRAL_DATA *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_SERVER_REFERRAL_DATA(unsigned char *, size_t, const PA_SERVER_REFERRAL_DATA *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_SERVER_REFERRAL_DATA(const PA_SERVER_REFERRAL_DATA *);
+ASN1EXP int    ASN1CALL copy_PA_SERVER_REFERRAL_DATA  (const PA_SERVER_REFERRAL_DATA *, PA_SERVER_REFERRAL_DATA *);
+ASN1EXP void   ASN1CALL free_PA_SERVER_REFERRAL_DATA  (PA_SERVER_REFERRAL_DATA *);
 
 
 /*
@@ -2249,18 +2142,18 @@ typedef struct PA_ServerReferralData {
   KerberosTime *referral_valid_until;
 } PA_ServerReferralData;
 
-int    decode_PA_ServerReferralData(const unsigned char *, size_t, PA_ServerReferralData *, size_t *);
-int    encode_PA_ServerReferralData(unsigned char *, size_t, const PA_ServerReferralData *, size_t *);
-size_t length_PA_ServerReferralData(const PA_ServerReferralData *);
-int    copy_PA_ServerReferralData  (const PA_ServerReferralData *, PA_ServerReferralData *);
-void   free_PA_ServerReferralData  (PA_ServerReferralData *);
+ASN1EXP int    ASN1CALL decode_PA_ServerReferralData(const unsigned char *, size_t, PA_ServerReferralData *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_ServerReferralData(unsigned char *, size_t, const PA_ServerReferralData *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_ServerReferralData(const PA_ServerReferralData *);
+ASN1EXP int    ASN1CALL copy_PA_ServerReferralData  (const PA_ServerReferralData *, PA_ServerReferralData *);
+ASN1EXP void   ASN1CALL free_PA_ServerReferralData  (PA_ServerReferralData *);
 
 
 /*
 FastOptions ::= BIT STRING {
   reserved(0),
   hide-client-names(1),
-  kdc-follow--referrals(16)
+  kdc-follow-referrals(16)
 }
 */
 
@@ -2281,7 +2174,7 @@ typedef struct FastOptions {
   unsigned int _unused13:1;
   unsigned int _unused14:1;
   unsigned int _unused15:1;
-  unsigned int kdc_follow__referrals:1;
+  unsigned int kdc_follow_referrals:1;
   unsigned int _unused17:1;
   unsigned int _unused18:1;
   unsigned int _unused19:1;
@@ -2302,17 +2195,10 @@ typedef struct FastOptions {
 
 unsigned FastOptions2int(FastOptions);
 FastOptions int2FastOptions(unsigned);
-int    decode_FastOptions(const unsigned char *, size_t, FastOptions *, size_t *);
-int    encode_FastOptions(unsigned char *, size_t, const FastOptions *, size_t *);
-size_t length_FastOptions(const FastOptions *);
-int    copy_FastOptions  (const FastOptions *, FastOptions *);
-void   free_FastOptions  (FastOptions *);
-
-
 /*
 KrbFastReq ::= SEQUENCE {
   fast-options    [0] FastOptions,
-  padata          [1] SEQUENCE OF PA-DATA,
+  padata          [1] METHOD-DATA,
   req-body        [2] KDC-REQ-BODY,
   ...,
 }
@@ -2320,18 +2206,15 @@ KrbFastReq ::= SEQUENCE {
 
 typedef struct KrbFastReq {
   FastOptions fast_options;
-  struct KrbFastReq_padata {
-    unsigned int len;
-    PA_DATA *val;
-  } padata;
+  METHOD_DATA padata;
   KDC_REQ_BODY req_body;
 } KrbFastReq;
 
-int    decode_KrbFastReq(const unsigned char *, size_t, KrbFastReq *, size_t *);
-int    encode_KrbFastReq(unsigned char *, size_t, const KrbFastReq *, size_t *);
-size_t length_KrbFastReq(const KrbFastReq *);
-int    copy_KrbFastReq  (const KrbFastReq *, KrbFastReq *);
-void   free_KrbFastReq  (KrbFastReq *);
+ASN1EXP int    ASN1CALL decode_KrbFastReq(const unsigned char *, size_t, KrbFastReq *, size_t *);
+ASN1EXP int    ASN1CALL encode_KrbFastReq(unsigned char *, size_t, const KrbFastReq *, size_t *);
+ASN1EXP size_t ASN1CALL length_KrbFastReq(const KrbFastReq *);
+ASN1EXP int    ASN1CALL copy_KrbFastReq  (const KrbFastReq *, KrbFastReq *);
+ASN1EXP void   ASN1CALL free_KrbFastReq  (KrbFastReq *);
 
 
 /*
@@ -2347,11 +2230,11 @@ typedef struct KrbFastArmor {
   heim_octet_string armor_value;
 } KrbFastArmor;
 
-int    decode_KrbFastArmor(const unsigned char *, size_t, KrbFastArmor *, size_t *);
-int    encode_KrbFastArmor(unsigned char *, size_t, const KrbFastArmor *, size_t *);
-size_t length_KrbFastArmor(const KrbFastArmor *);
-int    copy_KrbFastArmor  (const KrbFastArmor *, KrbFastArmor *);
-void   free_KrbFastArmor  (KrbFastArmor *);
+ASN1EXP int    ASN1CALL decode_KrbFastArmor(const unsigned char *, size_t, KrbFastArmor *, size_t *);
+ASN1EXP int    ASN1CALL encode_KrbFastArmor(unsigned char *, size_t, const KrbFastArmor *, size_t *);
+ASN1EXP size_t ASN1CALL length_KrbFastArmor(const KrbFastArmor *);
+ASN1EXP int    ASN1CALL copy_KrbFastArmor  (const KrbFastArmor *, KrbFastArmor *);
+ASN1EXP void   ASN1CALL free_KrbFastArmor  (KrbFastArmor *);
 
 
 /*
@@ -2368,13 +2251,6 @@ typedef struct KrbFastArmoredReq {
   EncryptedData enc_fast_req;
 } KrbFastArmoredReq;
 
-int    decode_KrbFastArmoredReq(const unsigned char *, size_t, KrbFastArmoredReq *, size_t *);
-int    encode_KrbFastArmoredReq(unsigned char *, size_t, const KrbFastArmoredReq *, size_t *);
-size_t length_KrbFastArmoredReq(const KrbFastArmoredReq *);
-int    copy_KrbFastArmoredReq  (const KrbFastArmoredReq *, KrbFastArmoredReq *);
-void   free_KrbFastArmoredReq  (KrbFastArmoredReq *);
-
-
 /*
 PA-FX-FAST-REQUEST ::= CHOICE {
   armored-data    [0] KrbFastArmoredReq,
@@ -2383,7 +2259,7 @@ PA-FX-FAST-REQUEST ::= CHOICE {
 */
 
 typedef struct PA_FX_FAST_REQUEST {
-  enum {
+  enum PA_FX_FAST_REQUEST_enum {
     choice_PA_FX_FAST_REQUEST_asn1_ellipsis = 0,
     choice_PA_FX_FAST_REQUEST_armored_data
     /* ... */
@@ -2394,11 +2270,11 @@ typedef struct PA_FX_FAST_REQUEST {
   } u;
 } PA_FX_FAST_REQUEST;
 
-int    decode_PA_FX_FAST_REQUEST(const unsigned char *, size_t, PA_FX_FAST_REQUEST *, size_t *);
-int    encode_PA_FX_FAST_REQUEST(unsigned char *, size_t, const PA_FX_FAST_REQUEST *, size_t *);
-size_t length_PA_FX_FAST_REQUEST(const PA_FX_FAST_REQUEST *);
-int    copy_PA_FX_FAST_REQUEST  (const PA_FX_FAST_REQUEST *, PA_FX_FAST_REQUEST *);
-void   free_PA_FX_FAST_REQUEST  (PA_FX_FAST_REQUEST *);
+ASN1EXP int    ASN1CALL decode_PA_FX_FAST_REQUEST(const unsigned char *, size_t, PA_FX_FAST_REQUEST *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_FX_FAST_REQUEST(unsigned char *, size_t, const PA_FX_FAST_REQUEST *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_FX_FAST_REQUEST(const PA_FX_FAST_REQUEST *);
+ASN1EXP int    ASN1CALL copy_PA_FX_FAST_REQUEST  (const PA_FX_FAST_REQUEST *, PA_FX_FAST_REQUEST *);
+ASN1EXP void   ASN1CALL free_PA_FX_FAST_REQUEST  (PA_FX_FAST_REQUEST *);
 
 
 /*
@@ -2407,8 +2283,7 @@ KrbFastFinished ::= SEQUENCE {
   usec              [1] krb5int32,
   crealm            [2] Realm,
   cname             [3] PrincipalName,
-  checksum          [4] Checksum,
-  ticket-checksum   [5] Checksum,
+  ticket-checksum   [4] Checksum,
   ...,
 }
 */
@@ -2418,40 +2293,38 @@ typedef struct KrbFastFinished {
   krb5int32 usec;
   Realm crealm;
   PrincipalName cname;
-  Checksum checksum;
   Checksum ticket_checksum;
 } KrbFastFinished;
 
-int    decode_KrbFastFinished(const unsigned char *, size_t, KrbFastFinished *, size_t *);
-int    encode_KrbFastFinished(unsigned char *, size_t, const KrbFastFinished *, size_t *);
-size_t length_KrbFastFinished(const KrbFastFinished *);
-int    copy_KrbFastFinished  (const KrbFastFinished *, KrbFastFinished *);
-void   free_KrbFastFinished  (KrbFastFinished *);
+ASN1EXP int    ASN1CALL decode_KrbFastFinished(const unsigned char *, size_t, KrbFastFinished *, size_t *);
+ASN1EXP int    ASN1CALL encode_KrbFastFinished(unsigned char *, size_t, const KrbFastFinished *, size_t *);
+ASN1EXP size_t ASN1CALL length_KrbFastFinished(const KrbFastFinished *);
+ASN1EXP int    ASN1CALL copy_KrbFastFinished  (const KrbFastFinished *, KrbFastFinished *);
+ASN1EXP void   ASN1CALL free_KrbFastFinished  (KrbFastFinished *);
 
 
 /*
 KrbFastResponse ::= SEQUENCE {
-  padata          [0] SEQUENCE OF PA-DATA,
-  rep-key         [1] EncryptionKey OPTIONAL,
-  finished        [2] KrbFastFinished OPTIONAL,
+  padata           [0] METHOD-DATA,
+  strengthen-key   [1] EncryptionKey OPTIONAL,
+  finished         [2] KrbFastFinished OPTIONAL,
+  nonce            [3] krb5uint32,
   ...,
 }
 */
 
 typedef struct KrbFastResponse {
-  struct KrbFastResponse_padata {
-    unsigned int len;
-    PA_DATA *val;
-  } padata;
-  EncryptionKey *rep_key;
+  METHOD_DATA padata;
+  EncryptionKey *strengthen_key;
   KrbFastFinished *finished;
+  krb5uint32 nonce;
 } KrbFastResponse;
 
-int    decode_KrbFastResponse(const unsigned char *, size_t, KrbFastResponse *, size_t *);
-int    encode_KrbFastResponse(unsigned char *, size_t, const KrbFastResponse *, size_t *);
-size_t length_KrbFastResponse(const KrbFastResponse *);
-int    copy_KrbFastResponse  (const KrbFastResponse *, KrbFastResponse *);
-void   free_KrbFastResponse  (KrbFastResponse *);
+ASN1EXP int    ASN1CALL decode_KrbFastResponse(const unsigned char *, size_t, KrbFastResponse *, size_t *);
+ASN1EXP int    ASN1CALL encode_KrbFastResponse(unsigned char *, size_t, const KrbFastResponse *, size_t *);
+ASN1EXP size_t ASN1CALL length_KrbFastResponse(const KrbFastResponse *);
+ASN1EXP int    ASN1CALL copy_KrbFastResponse  (const KrbFastResponse *, KrbFastResponse *);
+ASN1EXP void   ASN1CALL free_KrbFastResponse  (KrbFastResponse *);
 
 
 /*
@@ -2465,13 +2338,6 @@ typedef struct KrbFastArmoredRep {
   EncryptedData enc_fast_rep;
 } KrbFastArmoredRep;
 
-int    decode_KrbFastArmoredRep(const unsigned char *, size_t, KrbFastArmoredRep *, size_t *);
-int    encode_KrbFastArmoredRep(unsigned char *, size_t, const KrbFastArmoredRep *, size_t *);
-size_t length_KrbFastArmoredRep(const KrbFastArmoredRep *);
-int    copy_KrbFastArmoredRep  (const KrbFastArmoredRep *, KrbFastArmoredRep *);
-void   free_KrbFastArmoredRep  (KrbFastArmoredRep *);
-
-
 /*
 PA-FX-FAST-REPLY ::= CHOICE {
   armored-data    [0] KrbFastArmoredRep,
@@ -2480,7 +2346,7 @@ PA-FX-FAST-REPLY ::= CHOICE {
 */
 
 typedef struct PA_FX_FAST_REPLY {
-  enum {
+  enum PA_FX_FAST_REPLY_enum {
     choice_PA_FX_FAST_REPLY_asn1_ellipsis = 0,
     choice_PA_FX_FAST_REPLY_armored_data
     /* ... */
@@ -2491,11 +2357,277 @@ typedef struct PA_FX_FAST_REPLY {
   } u;
 } PA_FX_FAST_REPLY;
 
-int    decode_PA_FX_FAST_REPLY(const unsigned char *, size_t, PA_FX_FAST_REPLY *, size_t *);
-int    encode_PA_FX_FAST_REPLY(unsigned char *, size_t, const PA_FX_FAST_REPLY *, size_t *);
-size_t length_PA_FX_FAST_REPLY(const PA_FX_FAST_REPLY *);
-int    copy_PA_FX_FAST_REPLY  (const PA_FX_FAST_REPLY *, PA_FX_FAST_REPLY *);
-void   free_PA_FX_FAST_REPLY  (PA_FX_FAST_REPLY *);
+ASN1EXP int    ASN1CALL decode_PA_FX_FAST_REPLY(const unsigned char *, size_t, PA_FX_FAST_REPLY *, size_t *);
+ASN1EXP int    ASN1CALL encode_PA_FX_FAST_REPLY(unsigned char *, size_t, const PA_FX_FAST_REPLY *, size_t *);
+ASN1EXP size_t ASN1CALL length_PA_FX_FAST_REPLY(const PA_FX_FAST_REPLY *);
+ASN1EXP int    ASN1CALL copy_PA_FX_FAST_REPLY  (const PA_FX_FAST_REPLY *, PA_FX_FAST_REPLY *);
+ASN1EXP void   ASN1CALL free_PA_FX_FAST_REPLY  (PA_FX_FAST_REPLY *);
+
+
+/*
+KDCFastFlags ::= BIT STRING {
+  use_reply_key(0),
+  reply_key_used(1),
+  reply_key_replaced(2),
+  kdc_verfied(3)
+}
+*/
+
+typedef struct KDCFastFlags {
+  unsigned int use_reply_key:1;
+  unsigned int reply_key_used:1;
+  unsigned int reply_key_replaced:1;
+  unsigned int kdc_verfied:1;
+  unsigned int _unused4:1;
+  unsigned int _unused5:1;
+  unsigned int _unused6:1;
+  unsigned int _unused7:1;
+  unsigned int _unused8:1;
+  unsigned int _unused9:1;
+  unsigned int _unused10:1;
+  unsigned int _unused11:1;
+  unsigned int _unused12:1;
+  unsigned int _unused13:1;
+  unsigned int _unused14:1;
+  unsigned int _unused15:1;
+  unsigned int _unused16:1;
+  unsigned int _unused17:1;
+  unsigned int _unused18:1;
+  unsigned int _unused19:1;
+  unsigned int _unused20:1;
+  unsigned int _unused21:1;
+  unsigned int _unused22:1;
+  unsigned int _unused23:1;
+  unsigned int _unused24:1;
+  unsigned int _unused25:1;
+  unsigned int _unused26:1;
+  unsigned int _unused27:1;
+  unsigned int _unused28:1;
+  unsigned int _unused29:1;
+  unsigned int _unused30:1;
+  unsigned int _unused31:1;
+} KDCFastFlags;
+
+
+unsigned KDCFastFlags2int(KDCFastFlags);
+KDCFastFlags int2KDCFastFlags(unsigned);
+/*
+KDCFastState ::= SEQUENCE {
+  flags               [0] KDCFastFlags,
+  expiration          [1] GeneralizedTime,
+  fast-state          [2] METHOD-DATA,
+  expected-pa-types   [3] SEQUENCE OF PADATA-TYPE OPTIONAL,
+}
+*/
+
+typedef struct KDCFastState {
+  KDCFastFlags flags;
+  time_t expiration;
+  METHOD_DATA fast_state;
+  struct KDCFastState_expected_pa_types {
+    unsigned int len;
+    PADATA_TYPE *val;
+  } *expected_pa_types;
+} KDCFastState;
+
+ASN1EXP int    ASN1CALL decode_KDCFastState(const unsigned char *, size_t, KDCFastState *, size_t *);
+ASN1EXP int    ASN1CALL encode_KDCFastState(unsigned char *, size_t, const KDCFastState *, size_t *);
+ASN1EXP size_t ASN1CALL length_KDCFastState(const KDCFastState *);
+ASN1EXP int    ASN1CALL copy_KDCFastState  (const KDCFastState *, KDCFastState *);
+ASN1EXP void   ASN1CALL free_KDCFastState  (KDCFastState *);
+
+
+/*
+KDCFastCookie ::= SEQUENCE {
+  version         [0]   UTF8String,
+  cookie          [1] EncryptedData,
+}
+*/
+
+typedef struct KDCFastCookie {
+  heim_utf8_string version;
+  EncryptedData cookie;
+} KDCFastCookie;
+
+ASN1EXP int    ASN1CALL decode_KDCFastCookie(const unsigned char *, size_t, KDCFastCookie *, size_t *);
+ASN1EXP int    ASN1CALL encode_KDCFastCookie(unsigned char *, size_t, const KDCFastCookie *, size_t *);
+ASN1EXP size_t ASN1CALL length_KDCFastCookie(const KDCFastCookie *);
+ASN1EXP int    ASN1CALL copy_KDCFastCookie  (const KDCFastCookie *, KDCFastCookie *);
+ASN1EXP void   ASN1CALL free_KDCFastCookie  (KDCFastCookie *);
+
+
+/*
+KDC-PROXY-MESSAGE ::= SEQUENCE {
+  kerb-message     [0] OCTET STRING,
+  target-domain    [1] Realm OPTIONAL,
+  dclocator-hint   [2] INTEGER OPTIONAL,
+}
+*/
+
+typedef struct KDC_PROXY_MESSAGE {
+  heim_octet_string kerb_message;
+  Realm *target_domain;
+  heim_integer *dclocator_hint;
+} KDC_PROXY_MESSAGE;
+
+ASN1EXP int    ASN1CALL decode_KDC_PROXY_MESSAGE(const unsigned char *, size_t, KDC_PROXY_MESSAGE *, size_t *);
+ASN1EXP int    ASN1CALL encode_KDC_PROXY_MESSAGE(unsigned char *, size_t, const KDC_PROXY_MESSAGE *, size_t *);
+ASN1EXP size_t ASN1CALL length_KDC_PROXY_MESSAGE(const KDC_PROXY_MESSAGE *);
+ASN1EXP int    ASN1CALL copy_KDC_PROXY_MESSAGE  (const KDC_PROXY_MESSAGE *, KDC_PROXY_MESSAGE *);
+ASN1EXP void   ASN1CALL free_KDC_PROXY_MESSAGE  (KDC_PROXY_MESSAGE *);
+
+
+/*
+KERB-TIMES ::= SEQUENCE {
+  authtime        [0] KerberosTime,
+  starttime       [1] KerberosTime,
+  endtime         [2] KerberosTime,
+  renew_till      [3] KerberosTime,
+}
+*/
+
+typedef struct KERB_TIMES {
+  KerberosTime authtime;
+  KerberosTime starttime;
+  KerberosTime endtime;
+  KerberosTime renew_till;
+} KERB_TIMES;
+
+ASN1EXP int    ASN1CALL decode_KERB_TIMES(const unsigned char *, size_t, KERB_TIMES *, size_t *);
+ASN1EXP int    ASN1CALL encode_KERB_TIMES(unsigned char *, size_t, const KERB_TIMES *, size_t *);
+ASN1EXP size_t ASN1CALL length_KERB_TIMES(const KERB_TIMES *);
+ASN1EXP int    ASN1CALL copy_KERB_TIMES  (const KERB_TIMES *, KERB_TIMES *);
+ASN1EXP void   ASN1CALL free_KERB_TIMES  (KERB_TIMES *);
+
+
+/*
+KERB-CRED ::= SEQUENCE {
+  client          [0] Principal,
+  server          [1] Principal,
+  keyblock        [2] EncryptionKey,
+  times           [3] KERB-TIMES,
+  ticket          [4] OCTET STRING,
+  authdata        [5] OCTET STRING,
+  addresses       [6] HostAddresses,
+  flags           [7] TicketFlags,
+}
+*/
+
+typedef struct KERB_CRED {
+  Principal client;
+  Principal server;
+  EncryptionKey keyblock;
+  KERB_TIMES times;
+  heim_octet_string ticket;
+  heim_octet_string authdata;
+  HostAddresses addresses;
+  TicketFlags flags;
+} KERB_CRED;
+
+ASN1EXP int    ASN1CALL decode_KERB_CRED(const unsigned char *, size_t, KERB_CRED *, size_t *);
+ASN1EXP int    ASN1CALL encode_KERB_CRED(unsigned char *, size_t, const KERB_CRED *, size_t *);
+ASN1EXP size_t ASN1CALL length_KERB_CRED(const KERB_CRED *);
+ASN1EXP int    ASN1CALL copy_KERB_CRED  (const KERB_CRED *, KERB_CRED *);
+ASN1EXP void   ASN1CALL free_KERB_CRED  (KERB_CRED *);
+
+
+/*
+KERB-TGS-REQ-IN ::= SEQUENCE {
+  cache           [0] OCTET STRING,
+  addrs           [1] HostAddresses,
+  flags           [2] krb5uint32,
+  imp             [3] Principal OPTIONAL,
+  ticket          [4] OCTET STRING OPTIONAL,
+  in_cred         [5] KERB-CRED,
+  krbtgt          [6] KERB-CRED,
+  padata          [7] METHOD-DATA,
+}
+*/
+
+typedef struct KERB_TGS_REQ_IN {
+  heim_octet_string cache;
+  HostAddresses addrs;
+  krb5uint32 flags;
+  Principal *imp;
+  heim_octet_string *ticket;
+  KERB_CRED in_cred;
+  KERB_CRED krbtgt;
+  METHOD_DATA padata;
+} KERB_TGS_REQ_IN;
+
+ASN1EXP int    ASN1CALL decode_KERB_TGS_REQ_IN(const unsigned char *, size_t, KERB_TGS_REQ_IN *, size_t *);
+ASN1EXP int    ASN1CALL encode_KERB_TGS_REQ_IN(unsigned char *, size_t, const KERB_TGS_REQ_IN *, size_t *);
+ASN1EXP size_t ASN1CALL length_KERB_TGS_REQ_IN(const KERB_TGS_REQ_IN *);
+ASN1EXP int    ASN1CALL copy_KERB_TGS_REQ_IN  (const KERB_TGS_REQ_IN *, KERB_TGS_REQ_IN *);
+ASN1EXP void   ASN1CALL free_KERB_TGS_REQ_IN  (KERB_TGS_REQ_IN *);
+
+
+/*
+KERB-TGS-REQ-OUT ::= SEQUENCE {
+  subkey          [0] EncryptionKey OPTIONAL,
+  t               [1] TGS-REQ,
+}
+*/
+
+typedef struct KERB_TGS_REQ_OUT {
+  EncryptionKey *subkey;
+  TGS_REQ t;
+} KERB_TGS_REQ_OUT;
+
+ASN1EXP int    ASN1CALL decode_KERB_TGS_REQ_OUT(const unsigned char *, size_t, KERB_TGS_REQ_OUT *, size_t *);
+ASN1EXP int    ASN1CALL encode_KERB_TGS_REQ_OUT(unsigned char *, size_t, const KERB_TGS_REQ_OUT *, size_t *);
+ASN1EXP size_t ASN1CALL length_KERB_TGS_REQ_OUT(const KERB_TGS_REQ_OUT *);
+ASN1EXP int    ASN1CALL copy_KERB_TGS_REQ_OUT  (const KERB_TGS_REQ_OUT *, KERB_TGS_REQ_OUT *);
+ASN1EXP void   ASN1CALL free_KERB_TGS_REQ_OUT  (KERB_TGS_REQ_OUT *);
+
+
+/*
+KERB-TGS-REP-IN ::= SEQUENCE {
+  cache           [0] OCTET STRING,
+  subkey          [1] EncryptionKey OPTIONAL,
+  in_cred         [2] KERB-CRED,
+  t               [3] TGS-REP,
+}
+*/
+
+typedef struct KERB_TGS_REP_IN {
+  heim_octet_string cache;
+  EncryptionKey *subkey;
+  KERB_CRED in_cred;
+  TGS_REP t;
+} KERB_TGS_REP_IN;
+
+/*
+KERB-TGS-REP-OUT ::= SEQUENCE {
+  cache           [0] OCTET STRING,
+  cred            [1] KERB-CRED,
+  subkey          [2] EncryptionKey,
+}
+*/
+
+typedef struct KERB_TGS_REP_OUT {
+  heim_octet_string cache;
+  KERB_CRED cred;
+  EncryptionKey subkey;
+} KERB_TGS_REP_OUT;
+
+/*
+KERB-ARMOR-SERVICE-REPLY ::= SEQUENCE {
+  armor           [0] KrbFastArmor,
+  armor-key       [1] EncryptionKey,
+}
+*/
+
+typedef struct KERB_ARMOR_SERVICE_REPLY {
+  KrbFastArmor armor;
+  EncryptionKey armor_key;
+} KERB_ARMOR_SERVICE_REPLY;
+
+ASN1EXP int    ASN1CALL decode_KERB_ARMOR_SERVICE_REPLY(const unsigned char *, size_t, KERB_ARMOR_SERVICE_REPLY *, size_t *);
+ASN1EXP int    ASN1CALL encode_KERB_ARMOR_SERVICE_REPLY(unsigned char *, size_t, const KERB_ARMOR_SERVICE_REPLY *, size_t *);
+ASN1EXP size_t ASN1CALL length_KERB_ARMOR_SERVICE_REPLY(const KERB_ARMOR_SERVICE_REPLY *);
+ASN1EXP int    ASN1CALL copy_KERB_ARMOR_SERVICE_REPLY  (const KERB_ARMOR_SERVICE_REPLY *, KERB_ARMOR_SERVICE_REPLY *);
+ASN1EXP void   ASN1CALL free_KERB_ARMOR_SERVICE_REPLY  (KERB_ARMOR_SERVICE_REPLY *);
 
 
 #endif /* __krb5_asn1_h__ */