// 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_
