aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2019-12-03 15:32:29 -0500
committerGreg Hudson <ghudson@mit.edu>2019-12-06 10:28:53 -0500
commit81e47875e3de0e52fbb11d61ef30a9406497af73 (patch)
tree98dbcb5982bfbe05a5640870f09c7cc84586440a /src/include
parentab5c4259bdbe51dd3f4b5c5aff22628188d04322 (diff)
downloadkrb5-81e47875e3de0e52fbb11d61ef30a9406497af73.zip
krb5-81e47875e3de0e52fbb11d61ef30a9406497af73.tar.gz
krb5-81e47875e3de0e52fbb11d61ef30a9406497af73.tar.bz2
Improve type safety of serialization code
Remove the serialization table from krb5_context, the functions to find and register serializers, and the polymorphic serialization functions. Instead, directly call per-type serialization functions for the type of object we need to serialize. Remove the krb5_context parameter from most serialization functions as the interfaces are not public and the context is not needed. Remove the ccache, keytab, and rcache serialization handlers as they were not used. In t_ser.c, repeat the externalize-internalize-reexternalize logic for each type, but simplify the code by aborting on failure and removing the verbose flag. The krb5_context and krb5_keyblock sizing functions both reported an extra four bytes. The new test program does not tolerate that inconsistency, so fix them.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/k5-int.h145
1 files changed, 93 insertions, 52 deletions
diff --git a/src/include/k5-int.h b/src/include/k5-int.h
index da71466..1d78c02 100644
--- a/src/include/k5-int.h
+++ b/src/include/k5-int.h
@@ -1212,8 +1212,6 @@ struct _krb5_context {
char *default_realm;
profile_t profile;
kdb5_dal_handle *dal_handle;
- int ser_ctx_count;
- void *ser_ctx;
/* allowable clock skew */
krb5_deltat clockskew;
krb5_flags kdc_default_options;
@@ -1780,64 +1778,110 @@ krb5_error_code
k5_parse_host_string(const char *address, int default_port, char **host_out,
int *port_out);
-/*
- * [De]Serialization Handle and operations.
- */
-struct __krb5_serializer {
- krb5_magic odtype;
- krb5_error_code (*sizer) (krb5_context,
- krb5_pointer,
- size_t *);
- krb5_error_code (*externalizer) (krb5_context,
- krb5_pointer,
- krb5_octet **,
- size_t *);
- krb5_error_code (*internalizer) (krb5_context,
- krb5_pointer *,
- krb5_octet **,
- size_t *);
-};
-typedef const struct __krb5_serializer * krb5_ser_handle;
-typedef struct __krb5_serializer krb5_ser_entry;
+krb5_error_code
+k5_size_authdata_context(krb5_context kcontext, krb5_authdata_context context,
+ size_t *sizep);
-krb5_ser_handle krb5_find_serializer(krb5_context, krb5_magic);
-krb5_error_code krb5_register_serializer(krb5_context, const krb5_ser_entry *);
+krb5_error_code
+k5_externalize_authdata_context(krb5_context kcontext,
+ krb5_authdata_context context,
+ krb5_octet **buffer, size_t *lenremain);
-/* Determine the external size of a particular opaque structure */
-krb5_error_code KRB5_CALLCONV
-krb5_size_opaque(krb5_context, krb5_magic, krb5_pointer, size_t *);
+krb5_error_code
+k5_internalize_authdata_context(krb5_context kcontext,
+ krb5_authdata_context *ptr,
+ krb5_octet **buffer, size_t *lenremain);
-/* Serialize the structure into a buffer */
-krb5_error_code KRB5_CALLCONV
-krb5_externalize_opaque(krb5_context, krb5_magic, krb5_pointer, krb5_octet **,
- size_t *);
+krb5_error_code
+k5_size_auth_context(krb5_auth_context auth_context, size_t *sizep);
-/* Deserialize the structure from a buffer */
-krb5_error_code KRB5_CALLCONV
-krb5_internalize_opaque(krb5_context, krb5_magic, krb5_pointer *,
- krb5_octet **, size_t *);
+krb5_error_code
+k5_externalize_auth_context(krb5_auth_context auth_context,
+ krb5_octet **buffer, size_t *lenremain);
+krb5_error_code
+k5_internalize_auth_context(krb5_auth_context *argp,
+ krb5_octet **buffer, size_t *lenremain);
-/* Serialize data into a buffer */
krb5_error_code
-krb5_externalize_data(krb5_context, krb5_pointer, krb5_octet **, size_t *);
-/*
- * Initialization routines.
- */
+k5_size_authdata(krb5_authdata *authdata, size_t *sizep);
+
+krb5_error_code
+k5_externalize_authdata(krb5_authdata *authdata,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_internalize_authdata(krb5_authdata **authdata,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_size_address(krb5_address *address, size_t *sizep);
+
+krb5_error_code
+k5_externalize_address(krb5_address *address,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_internalize_address(krb5_address **argp,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_size_authenticator(krb5_authenticator *authenticator, size_t *sizep);
-/* Initialize serialization for krb5_[os_]context */
-krb5_error_code KRB5_CALLCONV krb5_ser_context_init(krb5_context);
+krb5_error_code
+k5_externalize_authenticator(krb5_authenticator *authenticator,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_internalize_authenticator(krb5_authenticator **argp,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_size_checksum(krb5_checksum *checksum, size_t *sizep);
+
+krb5_error_code
+k5_externalize_checksum(krb5_checksum *checksum,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_internalize_checksum(krb5_checksum **argp,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_size_context(krb5_context context, size_t *sizep);
+
+krb5_error_code
+k5_externalize_context(krb5_context context,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_internalize_context(krb5_context *argp,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_size_keyblock(krb5_keyblock *keyblock, size_t *sizep);
+
+krb5_error_code
+k5_externalize_keyblock(krb5_keyblock *keyblock,
+ krb5_octet **buffer, size_t *lenremain);
+
+krb5_error_code
+k5_internalize_keyblock(krb5_keyblock **argp,
+ krb5_octet **buffer, size_t *lenremain);
-/* Initialize serialization for krb5_auth_context */
-krb5_error_code KRB5_CALLCONV krb5_ser_auth_context_init(krb5_context);
+krb5_error_code
+k5_size_principal(krb5_principal principal, size_t *sizep);
-/* Initialize serialization for krb5_keytab */
-krb5_error_code KRB5_CALLCONV krb5_ser_keytab_init(krb5_context);
+krb5_error_code
+k5_externalize_principal(krb5_principal principal,
+ krb5_octet **buffer, size_t *lenremain);
-/* Initialize serialization for krb5_ccache */
-krb5_error_code KRB5_CALLCONV krb5_ser_ccache_init(krb5_context);
+krb5_error_code
+k5_internalize_principal(krb5_principal *argp,
+ krb5_octet **buffer, size_t *lenremain);
-/* Initialize serialization for krb5_rcache */
-krb5_error_code KRB5_CALLCONV krb5_ser_rcache_init(krb5_context);
+/*
+ * Initialization routines.
+ */
/* [De]serialize 4-byte integer */
krb5_error_code KRB5_CALLCONV
@@ -2017,9 +2061,6 @@ typedef struct _krb5_kt_ops {
krb5_keytab_entry *);
krb5_error_code (KRB5_CALLCONV *remove)(krb5_context, krb5_keytab,
krb5_keytab_entry *);
-
- /* Handle for serializer */
- const krb5_ser_entry *serializer;
} krb5_kt_ops;
/* Not sure it's ready for exposure just yet. */