krb5: implement draft-ietf-kitten-aes-cts-hmac-sha2-07
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997 - 2011 Kungliga Tekniska Högskolan
|
||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||
@@ -34,6 +33,21 @@
|
||||
|
||||
#include "hdb_locl.h"
|
||||
|
||||
struct hx509_certs_data;
|
||||
struct krb5_pk_identity;
|
||||
struct krb5_pk_cert;
|
||||
struct ContentInfo;
|
||||
struct AlgorithmIdentifier;
|
||||
struct _krb5_krb_auth_data;
|
||||
typedef struct krb5_pk_init_ctx_data *krb5_pk_init_ctx;
|
||||
struct krb5_dh_moduli;
|
||||
struct _krb5_key_data;
|
||||
struct _krb5_encryption_type;
|
||||
struct _krb5_key_type;
|
||||
#include <pkinit_asn1.h>
|
||||
#include <krb5-private.h>
|
||||
#include <base64.h>
|
||||
|
||||
/*
|
||||
* free all the memory used by (len, keys)
|
||||
*/
|
||||
@@ -168,9 +182,11 @@ parse_key_set(krb5_context context, const char *key,
|
||||
|
||||
/* if no salt was specified make up default salt */
|
||||
if(salt->saltvalue.data == NULL) {
|
||||
if(salt->salttype == KRB5_PW_SALT)
|
||||
if(salt->salttype == KRB5_PW_SALT) {
|
||||
ret = krb5_get_pw_salt(context, principal, salt);
|
||||
else if(salt->salttype == KRB5_AFS3_SALT) {
|
||||
if (ret)
|
||||
return ret;
|
||||
} else if(salt->salttype == KRB5_AFS3_SALT) {
|
||||
krb5_const_realm realm = krb5_principal_get_realm(context, principal);
|
||||
salt->saltvalue.data = strdup(realm);
|
||||
if(salt->saltvalue.data == NULL) {
|
||||
@@ -571,6 +587,41 @@ glob_rules_keys(krb5_context context, krb5_const_principal principal)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* NIST guidance in Section 5.1 of [SP800-132] requires that a portion
|
||||
* of the salt of at least 128 bits shall be randomly generated.
|
||||
*/
|
||||
static krb5_error_code
|
||||
add_random_to_salt(krb5_context context, krb5_salt *in, krb5_salt *out)
|
||||
{
|
||||
krb5_error_code ret;
|
||||
char *p;
|
||||
unsigned char random[16];
|
||||
char *s;
|
||||
int slen;
|
||||
|
||||
krb5_generate_random_block(random, sizeof(random));
|
||||
|
||||
slen = rk_base64_encode(random, sizeof(random), &s);
|
||||
if (slen < 0)
|
||||
return ENOMEM;
|
||||
|
||||
ret = krb5_data_alloc(&out->saltvalue, slen + in->saltvalue.length);
|
||||
if (ret) {
|
||||
free(s);
|
||||
return ret;
|
||||
}
|
||||
|
||||
p = out->saltvalue.data;
|
||||
memcpy(p, s, slen);
|
||||
memcpy(&p[slen], in->saltvalue.data, in->saltvalue.length);
|
||||
|
||||
out->salttype = in->salttype;
|
||||
free(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate the `key_set' from the [kadmin]default_keys statement. If
|
||||
* `no_salt' is set, salt is not important (and will not be set) since
|
||||
@@ -642,6 +693,9 @@ hdb_generate_key_set(krb5_context context, krb5_principal principal,
|
||||
}
|
||||
|
||||
for (i = 0; i < num_enctypes; i++) {
|
||||
krb5_salt *saltp = no_salt ? NULL : &salt;
|
||||
krb5_salt rsalt;
|
||||
|
||||
/* find duplicates */
|
||||
for (j = 0; j < *nkeyset; j++) {
|
||||
|
||||
@@ -660,14 +714,27 @@ hdb_generate_key_set(krb5_context context, krb5_principal principal,
|
||||
}
|
||||
}
|
||||
/* not a duplicate, lets add it */
|
||||
if (j == *nkeyset) {
|
||||
if (j < *nkeyset)
|
||||
continue;
|
||||
|
||||
memset(&rsalt, 0, sizeof(rsalt));
|
||||
|
||||
/* prepend salt with randomness if required */
|
||||
if (!no_salt &&
|
||||
_krb5_enctype_requires_random_salt(context, enctypes[i])) {
|
||||
saltp = &rsalt;
|
||||
ret = add_random_to_salt(context, &salt, &rsalt);
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
ret = add_enctype_to_key_set(&key_set, nkeyset, enctypes[i],
|
||||
no_salt ? NULL : &salt);
|
||||
if (ret) {
|
||||
free(enctypes);
|
||||
krb5_free_salt(context, salt);
|
||||
goto out;
|
||||
}
|
||||
saltp);
|
||||
krb5_free_salt(context, rsalt);
|
||||
|
||||
if (ret) {
|
||||
free(enctypes);
|
||||
krb5_free_salt(context, salt);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
free(enctypes);
|
||||
@@ -718,17 +785,17 @@ hdb_generate_key_set_password(krb5_context context,
|
||||
|
||||
for (i = 0; i < (*num_keys); i++) {
|
||||
krb5_salt salt;
|
||||
Key *key = &(*keys)[i];
|
||||
|
||||
salt.salttype = (*keys)[i].salt->type;
|
||||
salt.saltvalue.length = (*keys)[i].salt->salt.length;
|
||||
salt.saltvalue.data = (*keys)[i].salt->salt.data;
|
||||
salt.salttype = key->salt->type;
|
||||
salt.saltvalue.length = key->salt->salt.length;
|
||||
salt.saltvalue.data = key->salt->salt.data;
|
||||
|
||||
ret = krb5_string_to_key_salt (context,
|
||||
(*keys)[i].key.keytype,
|
||||
key->key.keytype,
|
||||
password,
|
||||
salt,
|
||||
&(*keys)[i].key);
|
||||
|
||||
&key->key);
|
||||
if(ret)
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user