Index: krb5-1.5/src/lib/crypto/keyed_checksum_types.c =================================================================== --- krb5-1.5/src/lib/crypto/keyed_checksum_types.c (revision 24455) +++ krb5-1.5/src/lib/crypto/keyed_checksum_types.c (working copy) @@ -51,6 +51,15 @@ { unsigned int i, c; + if (enctype == ENCTYPE_ARCFOUR_HMAC || + enctype == ENCTYPE_ARCFOUR_HMAC_EXP) { + *count = 1; + if ((*cksumtypes = malloc(sizeof(krb5_cksumtype))) == NULL) + return(ENOMEM); + (*cksumtypes)[0] = CKSUMTYPE_HMAC_MD5_ARCFOUR; + return(0); + } + c = 0; for (i=0; ikeybytes; keylength = enc->keylength; + if (blocksize == 1) + return(KRB5_BAD_ENCTYPE); if ((inkey->length != keylength) || (outkey->length != keylength)) return(KRB5_CRYPTO_INTERNAL); Index: krb5-1.5/src/lib/krb5/krb/preauth2.c =================================================================== --- krb5-1.5/src/lib/krb5/krb/preauth2.c (revision 24455) +++ krb5-1.5/src/lib/krb5/krb/preauth2.c (working copy) @@ -665,7 +665,9 @@ cksum = sc2->sam_cksum; - while (*cksum) { + for (; *cksum; cksum++) { + if (!krb5_c_is_keyed_cksum((*cksum)->checksum_type)) + continue; /* Check this cksum */ retval = krb5_c_verify_checksum(context, as_key, KRB5_KEYUSAGE_PA_SAM_CHALLENGE_CKSUM, @@ -679,7 +681,6 @@ } if (valid_cksum) break; - cksum++; } if (!valid_cksum) { Index: krb5-1.5/src/lib/krb5/krb/mk_safe.c =================================================================== --- krb5-1.5/src/lib/krb5/krb/mk_safe.c (revision 24455) +++ krb5-1.5/src/lib/krb5/krb/mk_safe.c (working copy) @@ -212,10 +212,29 @@ for (i = 0; i < nsumtypes; i++) if (auth_context->safe_cksumtype == sumtypes[i]) break; - if (i == nsumtypes) - i = 0; - sumtype = sumtypes[i]; krb5_free_cksumtypes (context, sumtypes); + if (i < nsumtypes) + sumtype = auth_context->safe_cksumtype; + else { + switch (keyblock->enctype) { + case ENCTYPE_DES_CBC_MD4: + sumtype = CKSUMTYPE_RSA_MD4_DES; + break; + case ENCTYPE_DES_CBC_MD5: + case ENCTYPE_DES_CBC_CRC: + sumtype = CKSUMTYPE_RSA_MD5_DES; + break; + default: + retval = krb5int_c_mandatory_cksumtype(context, + keyblock->enctype, + &sumtype); + if (retval) { + CLEANUP_DONE(); + goto error; + } + break; + } + } } if ((retval = krb5_mk_safe_basic(context, userdata, keyblock, &replaydata, plocal_fulladdr, premote_fulladdr,