blob: 8b1c5e662bdcd12c4be9d263f6abeed2629ba864 [file] [log] [blame]
// Copyright 2021 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.
#ifndef TRUNKS_CSME_PINWEAVER_CSME_TYPES_H_
#define TRUNKS_CSME_PINWEAVER_CSME_TYPES_H_
#include <stdint.h>
// == definitions (defined in CSE...)
#ifndef BITS_TO_BYTES
#define BITS_TO_BYTES(_bits) (((_bits)+7)>>3)
#endif
#ifndef MAX
#define MAX(A,B) (((A) > (B)) ? (A) : (B))
#endif
#define PW_MAX_HECI_BUF_SIZE 4096 /* size of allocated buffer per client. */
#define PW_MAX_HECI_HEADER_SIZE \
MAX(sizeof(struct pw_heci_header_req), sizeof(struct pw_heci_header_res))
#define PW_SHA_256_DIGEST_SIZE BITS_TO_BYTES(256)
#define PW_MAX_DIGEST_SIZE PW_SHA_256_DIGEST_SIZE
#define PW_MAX_HECI_PAYLOAD_SIZE \
(PW_MAX_HECI_BUF_SIZE - PW_MAX_HECI_HEADER_SIZE)
#pragma pack(push, 1)
// == common enums
enum pcr_alg_t {
PW_PCR_ALG_SHA_256 = 0xb, // TPM_ALG_SHA256
} ;
#define PW_MAX_HECI_BUFFER_PROV_CLIENT 100 /* currently largest command/response is pw_prov_salting_key_hash_get_response */
/*
4 clients:
1. fixed coreboot client
HECI1 Id6 FIXED client
supporting pcr_extend and pcr_read
2. dynamic tpm provisioning client
<Guid("168DBC9C-F757-4EED-A2D8-94A3B70F26C2")>
suppoting salting_key_hash_set, salting_key_get, salting_key_commit and initialize_owner
3. dynamic tpm tunnel client
<Guid("A6103662-23A6-4315-A53B-749D91CAEE17")>
*sends to host* tpm_command
4. dynamic core pinweaver client
<Guid("989E0B6F-DA76-45D7-9299-A4079D7E22B1")>
supports core_pinweaver_command
*/
// Commands supported by tpm prov client
enum pw_tpm_prov_cmd_t{
PW_SALTING_KEY_HASH_SET = 0,
PW_SALTING_KEY_HASH_GET = 1,
PW_SALTING_KEY_HASH_COMMIT = 2,
PW_PROV_INITIALIZE_OWNER = 3,
} ;
// Commands supported by core pinweaver clients
// (fixed that serves coreboot or dynamic that serves crypthome)
enum pw_core_pinweaver_cmd_t{
PW_PCR_EXTEND = 0,
PW_PCR_READ = 1,
PW_CORE_PINWEAVER_CMD = 2, // supported after tpm_tunnel connected
} ;
// Commands supported by tpm tunnel client
enum pw_tpm_tunnel_cmd_t{
PW_TPM_TUNNEL_CMD = 0,
} ;
// == common header
struct pw_heci_header_req {
uint8_t pw_heci_cmd; // one of pw_tpm_tunnel_cmd_t / pw_dyn_core_cmd_t / pw_dyn_core_cmd_t / pw_tpm_prov_cmd_t
uint8_t pw_heci_seq; // sequencial counter to be copied from command to response by the processing entity
uint16_t total_length; // total length of following message not including header
} ;
struct pw_heci_header_res {
uint8_t pw_heci_cmd; // one of pw_tpm_tunnel_cmd_t / pw_dyn_core_cmd_t / pw_dyn_core_cmd_t / pw_tpm_prov_cmd_t
uint8_t pw_heci_seq; // sequencial counter to be copied from command to response by the processing entity
uint16_t total_length; // total length of following message not including header
uint32_t pw_heci_rc; // protocol / operation response code
} ;
// == HECI command and response structs
// dynamic tpm provisioning client
// PW_PROV_SALTING_KEY_HASH_SET
struct pw_prov_salting_key_hash_set_request{
struct pw_heci_header_req header;
uint8_t buffer[PW_SHA_256_DIGEST_SIZE];
} ;
static_assert(sizeof(struct pw_prov_salting_key_hash_set_request) <= PW_MAX_HECI_BUFFER_PROV_CLIENT);
struct pw_prov_salting_key_hash_set_response{
struct pw_heci_header_res header;
} ;
static_assert(sizeof(struct pw_prov_salting_key_hash_set_response) <= PW_MAX_HECI_BUFFER_PROV_CLIENT);
// dynamic tpm provisioning client
// PW_PROV_SALTING_KEY_HASH_GET
struct pw_prov_salting_key_hash_get_request{
struct pw_heci_header_req header;
} ;
static_assert(sizeof(struct pw_prov_salting_key_hash_get_request) <= PW_MAX_HECI_BUFFER_PROV_CLIENT);
struct pw_prov_salting_key_hash_get_response{
struct pw_heci_header_res header;
uint8_t committed;
uint8_t buffer[PW_SHA_256_DIGEST_SIZE];
} ;
static_assert(sizeof(struct pw_prov_salting_key_hash_get_response) <= PW_MAX_HECI_BUFFER_PROV_CLIENT);
// dynamic tpm provisioning client
// PW_PROV_PW_SALTING_KEY_HASH_COMMIT
struct pw_prov_salting_key_hash_commit_request{
struct pw_heci_header_req header;
} ;
static_assert(sizeof(struct pw_prov_salting_key_hash_commit_request) <= PW_MAX_HECI_BUFFER_PROV_CLIENT);
struct pw_prov_salting_key_hash_commit_response{
struct pw_heci_header_res header;
} ;
static_assert(sizeof(struct pw_prov_salting_key_hash_commit_response) <= PW_MAX_HECI_BUFFER_PROV_CLIENT);
// dynamic tpm provisioning client
// PW_PROV_INITIALIZE_OWNER
struct pw_prov_initialize_owner_request{
struct pw_heci_header_req header;
} ;
static_assert(sizeof(struct pw_prov_initialize_owner_request) <= PW_MAX_HECI_BUFFER_PROV_CLIENT);
struct pw_prov_initialize_owner_response{
struct pw_heci_header_res header;
} ;
static_assert(sizeof(struct pw_prov_initialize_owner_response) <= PW_MAX_HECI_BUFFER_PROV_CLIENT);
// Fixed Coreboot client AND
// dynamic core pinweaver client
// PW_PCR_EXTEND
struct pw_pcr_extend_request{
struct pw_heci_header_req header;
uint32_t pcr_index; // 0 to 23
uint32_t hash_alg; // support only 0xb == TPM_ALG_SHA256
uint8_t buffer[PW_MAX_DIGEST_SIZE];
} ;
struct pw_pcr_extend_response{
struct pw_heci_header_res header;
} ;
// Fixed Coreboot client AND
// dynamic core pinweaver client
// PW_PCR_READ
struct pw_pcr_read_request {
struct pw_heci_header_req header;
uint32_t pcr_index; // 0 to 23
uint32_t hash_alg; // support only 0xb == TPM_ALG_SHA256
} ;
struct pw_pcr_read_response{
struct pw_heci_header_res header;
uint32_t pcr_index;
uint32_t hash_alg; // support only 0xb == TPM_ALG_SHA256
uint8_t digest[PW_MAX_DIGEST_SIZE];
} ;
// dynamic core pinweaver client
// PW_CORE_PINWEAVER_CMD
struct pw_core_pinweaver_command_request{
struct pw_heci_header_req header;
uint8_t pinweaver_request_blob[PW_MAX_HECI_PAYLOAD_SIZE];
} ;
struct pw_core_pinweaver_command_response{
struct pw_heci_header_res header;
uint8_t pinweaver_response_blob[PW_MAX_HECI_PAYLOAD_SIZE];
} ;
// dynamic TPM_Tunnel client
// PW_TPM_TUNNEL
struct pw_tpm_command_request{
struct pw_heci_header_req header;
uint8_t tpm_request_blob[PW_MAX_HECI_PAYLOAD_SIZE];
} ;
struct pw_tpm_command_response{
struct pw_heci_header_res header;
uint8_t tpm_response_blob[PW_MAX_HECI_PAYLOAD_SIZE];
} ;
#pragma pack(pop)
#endif // _PINWEAVER_CSME_TYPES_H_