coreboot-libre-fam15h-rdimm/3rdparty/chromeec/board/cr50/tpm2/hkdf.c

94 lines
1.8 KiB
C
Raw Normal View History

2024-03-04 11:14:53 +01:00
/* Copyright 2016 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "dcrypto.h"
#ifdef CRYPTO_TEST_SETUP
#include "extension.h"
enum {
TEST_RFC = 0,
};
#define MAX_OKM_BYTES 1024
static void hkdf_command_handler(void *cmd_body,
size_t cmd_size,
size_t *response_size)
{
uint8_t *cmd;
uint8_t *out;
uint8_t op;
size_t salt_len;
const uint8_t *salt;
size_t IKM_len;
const uint8_t *IKM;
size_t info_len;
const uint8_t *info;
size_t OKM_len;
uint8_t OKM[MAX_OKM_BYTES];
/* Command format.
*
* WIDTH FIELD
* 1 OP
* 1 MSB SALT LEN
* 1 LSB SALT LEN
* SALT_LEN SALT
* 1 MSB IKM LEN
* 1 LSB IKM LEN
* IKM_LEN IKM
* 1 MSB INFO LEN
* 1 LSB INFO LEN
* INFO_LEN INFO
* 1 MSB OKM LEN
* 1 LSB OKM LEN
*/
cmd = (uint8_t *) cmd_body;
out = (uint8_t *) cmd_body;
op = *cmd++;
salt_len = ((uint16_t) (cmd[0] << 8)) | cmd[1];
cmd += 2;
salt = cmd;
cmd += salt_len;
IKM_len = ((uint16_t) (cmd[0] << 8)) | cmd[1];
cmd += 2;
IKM = cmd;
cmd += IKM_len;
info_len = ((uint16_t) (cmd[0] << 8)) | cmd[1];
cmd += 2;
info = cmd;
cmd += info_len;
OKM_len = ((uint16_t) (cmd[0] << 8)) | cmd[1];
if (OKM_len > MAX_OKM_BYTES) {
*response_size = 0;
return;
}
switch (op) {
case TEST_RFC:
if (DCRYPTO_hkdf(OKM, OKM_len, salt, salt_len,
IKM, IKM_len, info, info_len)) {
memcpy(out, OKM, OKM_len);
*response_size = OKM_len;
} else {
*response_size = 0;
}
break;
default:
*response_size = 0;
}
}
DECLARE_EXTENSION_COMMAND(EXTENSION_HKDF, hkdf_command_handler);
#endif /* CRYPTO_TEST_SETUP */