core/crypto/kat/kdf_kat.c (166 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
#include "kdf_kat.h"
#include "common/buffer_util.h"
#include "crypto/kat/kdf_kat_vectors.h"
/**
* Run known answer test (KAT) for the NIST800-108 KDF algorithm using SHA-1 HMAC.
*
* @param hash The hash engine to use for the self test.
*
* @return 0 if the test passed successfully or an error code.
*/
int kdf_kat_run_self_test_nist800_108_counter_mode_sha1 (const struct hash_engine *hash)
{
uint8_t ko[KDF_KAT_VECTORS_NIST800_108_CTR_SHA1_KO_LEN] = {0};
int status;
if (hash == NULL) {
return KDF_INVALID_ARGUMENT;
}
status = kdf_nist800_108_counter_mode (hash, HMAC_SHA1, KDF_KAT_VECTORS_NIST800_108_CTR_SHA1_KI,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA1_KI_LEN, KDF_KAT_VECTORS_NIST800_108_CTR_SHA1_LABEL,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA1_LABEL_LEN,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA1_CONTEXT,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA1_CONTEXT_LEN, ko, sizeof (ko));
if (status != 0) {
return status;
}
status = buffer_compare (ko, KDF_KAT_VECTORS_NIST800_108_CTR_SHA1_KO, sizeof (ko));
if (status != 0) {
return KDF_NIST800_108_SHA1_KAT_FAILED;
}
return 0;
}
/**
* Run known answer test (KAT) for the NIST800-108 KDF algorithm using SHA-256 HMAC.
*
* @param hash The hash engine to use for the self test.
*
* @return 0 if the test passed successfully or an error code.
*/
int kdf_kat_run_self_test_nist800_108_counter_mode_sha256 (const struct hash_engine *hash)
{
uint8_t ko[KDF_KAT_VECTORS_NIST800_108_CTR_SHA256_KO_LEN] = {0};
int status;
if (hash == NULL) {
return KDF_INVALID_ARGUMENT;
}
status = kdf_nist800_108_counter_mode (hash, HMAC_SHA256,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA256_KI, KDF_KAT_VECTORS_NIST800_108_CTR_SHA256_KI_LEN,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA256_LABEL,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA256_LABEL_LEN,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA256_CONTEXT,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA256_CONTEXT_LEN, ko, sizeof (ko));
if (status != 0) {
return status;
}
status = buffer_compare (ko, KDF_KAT_VECTORS_NIST800_108_CTR_SHA256_KO, sizeof (ko));
if (status != 0) {
return KDF_NIST800_108_SHA256_KAT_FAILED;
}
return 0;
}
/**
* Run known answer test (KAT) for the NIST800-108 KDF algorithm using SHA-384 HMAC.
*
* @param hash The hash engine to use for the self test.
*
* @return 0 if the test passed successfully or an error code.
*/
int kdf_kat_run_self_test_nist800_108_counter_mode_sha384 (const struct hash_engine *hash)
{
uint8_t ko[KDF_KAT_VECTORS_NIST800_108_CTR_SHA384_KO_LEN] = {0};
int status;
if (hash == NULL) {
return KDF_INVALID_ARGUMENT;
}
status = kdf_nist800_108_counter_mode (hash, HMAC_SHA384,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA384_KI, KDF_KAT_VECTORS_NIST800_108_CTR_SHA384_KI_LEN,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA384_LABEL,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA384_LABEL_LEN,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA384_CONTEXT,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA384_CONTEXT_LEN, ko, sizeof (ko));
if (status != 0) {
return status;
}
status = buffer_compare (ko, KDF_KAT_VECTORS_NIST800_108_CTR_SHA384_KO, sizeof (ko));
if (status != 0) {
return KDF_NIST800_108_SHA384_KAT_FAILED;
}
return 0;
}
/**
* Run known answer test (KAT) for the NIST800-108 KDF algorithm using SHA-512 HMAC.
*
* @param hash The hash engine to use for the self test.
*
* @return 0 if the test passed successfully or an error code.
*/
int kdf_kat_run_self_test_nist800_108_counter_mode_sha512 (const struct hash_engine *hash)
{
uint8_t ko[KDF_KAT_VECTORS_NIST800_108_CTR_SHA512_KO_LEN] = {0};
int status;
if (hash == NULL) {
return KDF_INVALID_ARGUMENT;
}
status = kdf_nist800_108_counter_mode (hash, HMAC_SHA512,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA512_KI, KDF_KAT_VECTORS_NIST800_108_CTR_SHA512_KI_LEN,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA512_LABEL,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA512_LABEL_LEN,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA512_CONTEXT,
KDF_KAT_VECTORS_NIST800_108_CTR_SHA512_CONTEXT_LEN, ko, sizeof (ko));
if (status != 0) {
return status;
}
status = buffer_compare (ko, KDF_KAT_VECTORS_NIST800_108_CTR_SHA512_KO, sizeof (ko));
if (status != 0) {
return KDF_NIST800_108_SHA512_KAT_FAILED;
}
return 0;
}
/**
* Run known answer test (KAT) for the HKDF-Expand KDF algorithm using SHA-1 HMAC.
*
* @param hash The hash engine to use for the self test.
*
* @return 0 if the test passed successfully or an error code.
*/
int kdf_kat_run_self_test_hkdf_expand_sha1 (const struct hash_engine *hash)
{
uint8_t okm[KDF_KAT_VECTORS_HKDF_EXPAND_SHA1_OKM_LEN] = {0};
int status;
if (hash == NULL) {
return KDF_INVALID_ARGUMENT;
}
status = kdf_hkdf_expand (hash, HMAC_SHA1, KDF_KAT_VECTORS_HKDF_EXPAND_SHA1_PRK,
KDF_KAT_VECTORS_HKDF_EXPAND_SHA1_PRK_LEN, KDF_KAT_VECTORS_HKDF_EXPAND_INFO,
KDF_KAT_VECTORS_HKDF_EXPAND_INFO_LEN, okm, sizeof (okm));
if (status != 0) {
return status;
}
status = buffer_compare (okm, KDF_KAT_VECTORS_HKDF_EXPAND_SHA1_OKM, sizeof (okm));
if (status != 0) {
return KDF_HKDF_EXPAND_SHA1_KAT_FAILED;
}
return 0;
}
/**
* Run known answer test (KAT) for the HKDF-Expand KDF algorithm using SHA-256 HMAC.
*
* @param hash The hash engine to use for the self test.
*
* @return 0 if the test passed successfully or an error code.
*/
int kdf_kat_run_self_test_hkdf_expand_sha256 (const struct hash_engine *hash)
{
uint8_t okm[KDF_KAT_VECTORS_HKDF_EXPAND_SHA256_OKM_LEN] = {0};
int status;
if (hash == NULL) {
return KDF_INVALID_ARGUMENT;
}
status = kdf_hkdf_expand (hash, HMAC_SHA256, KDF_KAT_VECTORS_HKDF_EXPAND_SHA256_PRK,
KDF_KAT_VECTORS_HKDF_EXPAND_SHA256_PRK_LEN, KDF_KAT_VECTORS_HKDF_EXPAND_INFO,
KDF_KAT_VECTORS_HKDF_EXPAND_INFO_LEN, okm, sizeof (okm));
if (status != 0) {
return status;
}
status = buffer_compare (okm, KDF_KAT_VECTORS_HKDF_EXPAND_SHA256_OKM, sizeof (okm));
if (status != 0) {
return KDF_HKDF_EXPAND_SHA256_KAT_FAILED;
}
return 0;
}
/**
* Run known answer test (KAT) for the HKDF-Expand KDF algorithm using SHA-384 HMAC.
*
* @param hash The hash engine to use for the self test.
*
* @return 0 if the test passed successfully or an error code.
*/
int kdf_kat_run_self_test_hkdf_expand_sha384 (const struct hash_engine *hash)
{
uint8_t okm[KDF_KAT_VECTORS_HKDF_EXPAND_SHA384_OKM_LEN] = {0};
int status;
if (hash == NULL) {
return KDF_INVALID_ARGUMENT;
}
status = kdf_hkdf_expand (hash, HMAC_SHA384, KDF_KAT_VECTORS_HKDF_EXPAND_SHA384_PRK,
KDF_KAT_VECTORS_HKDF_EXPAND_SHA384_PRK_LEN, KDF_KAT_VECTORS_HKDF_EXPAND_INFO,
KDF_KAT_VECTORS_HKDF_EXPAND_INFO_LEN, okm, sizeof (okm));
if (status != 0) {
return status;
}
status = buffer_compare (okm, KDF_KAT_VECTORS_HKDF_EXPAND_SHA384_OKM, sizeof (okm));
if (status != 0) {
return KDF_HKDF_EXPAND_SHA384_KAT_FAILED;
}
return 0;
}
/**
* Run known answer test (KAT) for the HKDF-Expand KDF algorithm using SHA-512 HMAC.
*
* @param hash The hash engine to use for the self test.
*
* @return 0 if the test passed successfully or an error code.
*/
int kdf_kat_run_self_test_hkdf_expand_sha512 (const struct hash_engine *hash)
{
uint8_t okm[KDF_KAT_VECTORS_HKDF_EXPAND_SHA512_OKM_LEN] = {0};
int status;
if (hash == NULL) {
return KDF_INVALID_ARGUMENT;
}
status = kdf_hkdf_expand (hash, HMAC_SHA512, KDF_KAT_VECTORS_HKDF_EXPAND_SHA512_PRK,
KDF_KAT_VECTORS_HKDF_EXPAND_SHA512_PRK_LEN, KDF_KAT_VECTORS_HKDF_EXPAND_INFO,
KDF_KAT_VECTORS_HKDF_EXPAND_INFO_LEN, okm, sizeof (okm));
if (status != 0) {
return status;
}
status = buffer_compare (okm, KDF_KAT_VECTORS_HKDF_EXPAND_SHA512_OKM, sizeof (okm));
if (status != 0) {
return KDF_HKDF_EXPAND_SHA512_KAT_FAILED;
}
return 0;
}