add support for sha256 and sha512 for the nist kdf
This commit is contained in:
@@ -192,6 +192,8 @@ encode_otherinfo(krb5_context context,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
krb5_error_code
|
||||
_krb5_pk_kdf(krb5_context context,
|
||||
const struct AlgorithmIdentifier *ai,
|
||||
@@ -211,10 +213,17 @@ _krb5_pk_kdf(krb5_context context,
|
||||
size_t keylen, offset;
|
||||
uint32_t counter;
|
||||
unsigned char *keydata;
|
||||
unsigned char shaoutput[SHA_DIGEST_LENGTH];
|
||||
unsigned char shaoutput[SHA512_DIGEST_LENGTH];
|
||||
const EVP_MD *md;
|
||||
EVP_MD_CTX *m;
|
||||
|
||||
if (der_heim_oid_cmp(&asn1_oid_id_pkinit_kdf_ah_sha1, &ai->algorithm) != 0) {
|
||||
if (der_heim_oid_cmp(&asn1_oid_id_pkinit_kdf_ah_sha1, &ai->algorithm) == 0) {
|
||||
md = EVP_sha1();
|
||||
} else if (der_heim_oid_cmp(&asn1_oid_id_pkinit_kdf_ah_sha256, &ai->algorithm) == 0) {
|
||||
md = EVP_sha256();
|
||||
} else if (der_heim_oid_cmp(&asn1_oid_id_pkinit_kdf_ah_sha512, &ai->algorithm) == 0) {
|
||||
md = EVP_sha512();
|
||||
} else {
|
||||
krb5_set_error_message(context, KRB5_PROG_ETYPE_NOSUPP,
|
||||
N_("KDF not supported", ""));
|
||||
return KRB5_PROG_ETYPE_NOSUPP;
|
||||
@@ -264,7 +273,7 @@ _krb5_pk_kdf(krb5_context context,
|
||||
do {
|
||||
unsigned char cdata[4];
|
||||
|
||||
EVP_DigestInit_ex(m, EVP_sha1(), NULL);
|
||||
EVP_DigestInit_ex(m, md, NULL);
|
||||
_krb5_put_int(cdata, counter, 4);
|
||||
EVP_DigestUpdate(m, cdata, 4);
|
||||
EVP_DigestUpdate(m, dhdata, dhsize);
|
||||
@@ -274,9 +283,9 @@ _krb5_pk_kdf(krb5_context context,
|
||||
|
||||
memcpy((unsigned char *)keydata + offset,
|
||||
shaoutput,
|
||||
min(keylen - offset, sizeof(shaoutput)));
|
||||
min(keylen - offset, EVP_MD_CTX_size(m)));
|
||||
|
||||
offset += sizeof(shaoutput);
|
||||
offset += EVP_MD_CTX_size(m);
|
||||
counter++;
|
||||
} while(offset < keylen);
|
||||
memset(shaoutput, 0, sizeof(shaoutput));
|
||||
|
@@ -53,10 +53,6 @@ struct testcase {
|
||||
/* 0 */
|
||||
{
|
||||
NULL, /* AlgorithmIdentifier */
|
||||
/* == &asn1_oid_id_pkinit_kdf_ah_sha1. Addresses of exported
|
||||
* symbols are not considered constant on all platforms
|
||||
* (Windows). So we set it in main() below. */
|
||||
|
||||
{ /* Z */
|
||||
256,
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
@@ -99,6 +95,98 @@ struct testcase {
|
||||
"\xc7\x62\x89\xec\x4b\x28\xa6\x91\xff\xce\x80\xbb\xb7\xec\x82\x41"
|
||||
"\x52\x3f\x99\xb1\x90\xcf\x2d\x34\x8f\x54\xa8\x65\x81\x2c\x32\x73"
|
||||
}
|
||||
},
|
||||
/* 1 */
|
||||
{
|
||||
NULL, /* AlgorithmIdentifier */
|
||||
{ /* Z */
|
||||
256,
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
},
|
||||
"lha@SU.SE", /* client, partyUInfo */
|
||||
"krbtgt/SU.SE@SU.SE", /* server, partyVInfo */
|
||||
ETYPE_AES256_CTS_HMAC_SHA1_96, /* enctype */
|
||||
{ /* as_req */
|
||||
10,
|
||||
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
|
||||
},
|
||||
{ /* pk_as_rep */
|
||||
9,
|
||||
"\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB"
|
||||
},
|
||||
{ /* ticket */
|
||||
55,
|
||||
"\x61\x35\x30\x33\xa0\x03\x02\x01\x05\xa1\x07\x1b\x05\x53\x55\x2e"
|
||||
"\x53\x45\xa2\x10\x30\x0e\xa0\x03\x02\x01\x01\xa1\x07\x30\x05\x1b"
|
||||
"\x03\x6c\x68\x61\xa3\x11\x30\x0f\xa0\x03\x02\x01\x12\xa2\x08\x04"
|
||||
"\x06\x68\x65\x6a\x68\x65\x6a"
|
||||
},
|
||||
{ /* key */
|
||||
32,
|
||||
"\x59\xf3\xca\x77\x5b\x20\x17\xe9\xad\x36\x3f\x47\xca\xbd\x43\xb8"
|
||||
"\x8c\xb8\x90\x35\x8d\xc6\x0d\x52\x0d\x11\x9f\xb0\xdc\x24\x0b\x61"
|
||||
}
|
||||
},
|
||||
/* 2 */
|
||||
{
|
||||
NULL, /* AlgorithmIdentifier */
|
||||
{ /* Z */
|
||||
256,
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
},
|
||||
"lha@SU.SE", /* client, partyUInfo */
|
||||
"krbtgt/SU.SE@SU.SE", /* server, partyVInfo */
|
||||
ETYPE_AES256_CTS_HMAC_SHA1_96, /* enctype */
|
||||
{ /* as_req */
|
||||
10,
|
||||
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
|
||||
},
|
||||
{ /* pk_as_rep */
|
||||
9,
|
||||
"\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB"
|
||||
},
|
||||
{ /* ticket */
|
||||
55,
|
||||
"\x61\x35\x30\x33\xa0\x03\x02\x01\x05\xa1\x07\x1b\x05\x53\x55\x2e"
|
||||
"\x53\x45\xa2\x10\x30\x0e\xa0\x03\x02\x01\x01\xa1\x07\x30\x05\x1b"
|
||||
"\x03\x6c\x68\x61\xa3\x11\x30\x0f\xa0\x03\x02\x01\x12\xa2\x08\x04"
|
||||
"\x06\x68\x65\x6a\x68\x65\x6a"
|
||||
},
|
||||
{ /* key */
|
||||
32,
|
||||
"\x8a\x9a\xc5\x5f\x45\xda\x1a\x73\xd9\x1e\xe9\x88\x1f\xa9\x48\x81"
|
||||
"\xce\xac\x66\x2d\xb1\xd3\xb9\x0a\x9d\x0e\x52\x83\xdf\xe1\x84\x3d"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -265,6 +353,8 @@ main(int argc, char **argv)
|
||||
errx (1, "krb5_init_context failed: %d", ret);
|
||||
|
||||
tests[0].oid = &asn1_oid_id_pkinit_kdf_ah_sha1;
|
||||
tests[1].oid = &asn1_oid_id_pkinit_kdf_ah_sha256;
|
||||
tests[2].oid = &asn1_oid_id_pkinit_kdf_ah_sha512;
|
||||
|
||||
for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
|
||||
test_dh2key(context, i, &tests[i]);
|
||||
|
Reference in New Issue
Block a user