From 0fac70e6c9c25cfca7770f92ca365b304e21a384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Wed, 3 Jan 2007 15:28:00 +0000 Subject: [PATCH] Support all keyed checksum types. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@19624 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/krb5/pac.c | 54 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/lib/krb5/pac.c b/lib/krb5/pac.c index 56d6f6986..96b6a25a6 100644 --- a/lib/krb5/pac.c +++ b/lib/krb5/pac.c @@ -797,6 +797,39 @@ fill_zeros(krb5_context context, krb5_storage *sp, size_t len) return 0; } +static krb5_error_code +pac_checksum(krb5_context context, + const krb5_keyblock *key, + uint32_t *cksumtype, + size_t *cksumsize) +{ + krb5_cksumtype cktype; + krb5_error_code ret; + krb5_crypto crypto = NULL; + + ret = krb5_crypto_init(context, key, 0, &crypto); + if (ret) + return ret; + + ret = krb5_crypto_get_checksum_type(context, crypto, &cktype); + ret = krb5_crypto_destroy(context, crypto); + if (ret) + return ret; + + if (krb5_checksum_is_keyed(context, cktype) == FALSE) { + krb5_set_error_string(context, "PAC checksum type is not keyed"); + return EINVAL; + } + + ret = krb5_checksumsize(context, cktype, cksumsize); + if (ret) + return ret; + + *cksumtype = (uint32_t)cktype; + + return 0; +} + krb5_error_code _krb5_pac_sign(krb5_context context, struct krb5_pac *p, @@ -858,21 +891,12 @@ _krb5_pac_sign(krb5_context context, /* Set lengths for checksum */ - /* XXX */ -#if 0 - ret = krb5_checksumsize(context, server_key->keytype, &server_size); - ret = krb5_checksumsize(context, priv_key->keytype, &priv_size); -#else - if (server_key->keytype != ETYPE_ARCFOUR_HMAC_MD5 || priv_key->keytype != ETYPE_ARCFOUR_HMAC_MD5) - { - krb5_set_error_string(context, "only support arcfour for now"); - return EINVAL; - } - server_size = 16; - server_cksumtype = -138; - priv_size = 16; - priv_cksumtype = -138; -#endif + ret = pac_checksum(context, server_key, &server_cksumtype, &server_size); + if (ret) + goto out; + ret = pac_checksum(context, priv_key, &priv_cksumtype, &priv_size); + if (ret) + goto out; /* Encode PAC */ sp = krb5_storage_emem();