/* Copyright (c) 2015 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.
 *
 * Boot descriptor block structures
 */

#ifndef VBOOT_REFERENCE_BDB_STRUCT_H_
#define VBOOT_REFERENCE_BDB_STRUCT_H_

#include <stdint.h>

/* Size of SHA256 digest in bytes */
#define BDB_SHA256_DIGEST_SIZE 32

/* Size of RSA4096 key data in bytes */
#define BDB_RSA4096_KEY_DATA_SIZE 1032

/* Size of RSA4096 signature in bytes */
#define BDB_RSA4096_SIG_SIZE 512

/* Size of ECDSA521 key data in bytes = ceil(521/8) * 2 */
#define BDB_ECDSA521_KEY_DATA_SIZE 132

/* Size of ECDSA521 signature in bytes = ceil(521/8) * 2 */
#define BDB_ECDSA521_SIG_SIZE 132

/* Size of RSA3072B key data in bytes */
#define BDB_RSA3072B_KEY_DATA_SIZE 776

/* Size of RSA3072B signature in bytes */
#define BDB_RSA3072B_SIG_SIZE 384

/*****************************************************************************/
/* Header for BDB */

/* Magic number for bdb_header.struct_magic */
#define BDB_HEADER_MAGIC 0x30426442

/* Current version of bdb_header struct */
#define BDB_HEADER_VERSION_MAJOR 1
#define BDB_HEADER_VERSION_MINOR 0

/* Expected size of bdb_header struct in bytes */
#define BDB_HEADER_EXPECTED_SIZE 32

struct bdb_header {
	/* Magic number to identify struct = BDB_HEADER_MAGIC. */
	uint32_t struct_magic;

	/* Structure version = BDB_HEADER_VERSION{MAJOR,MINOR} */
	uint8_t struct_major_version;
	uint8_t struct_minor_version;

	/* Size of structure in bytes */
	uint16_t struct_size;

	/* Recommended address in SP SRAM to load BDB.  Set to -1 to use
	 * default address. */
	uint64_t bdb_load_address;

	/* Size of the entire BDB in bytes */
	uint32_t bdb_size;

	/* Number of bytes following the BDB key which are signed by the BDB
	 * header signature. */
	uint32_t signed_size;

	/* Size of OEM area 0 in bytes, or 0 if not present */
	uint32_t oem_area_0_size;

	/* Reserved; set 0 */
	uint8_t reserved0[8];
} __attribute__((packed));

/*****************************************************************************/
/* Public key structure for BDB */

/* Magic number for bdb_key.struct_magic */
#define BDB_KEY_MAGIC 0x73334256

/* Current version of bdb_key struct */
#define BDB_KEY_VERSION_MAJOR 1
#define BDB_KEY_VERSION_MINOR 0

/* Supported hash algorithms */
enum bdb_hash_alg {
	BDB_HASH_ALG_INVALID = 0,       /* Not used; invalid */
	BDB_HASH_ALG_SHA256 = 2,	/* SHA-256 */
};

/* Supported signature algorithms */
enum bdb_sig_alg {
	BDB_SIG_ALG_INVALID = 0,        /* Not used; invalid */
	BDB_SIG_ALG_RSA4096 = 3,	/* RSA-4096, exponent 65537 */
	BDB_SIG_ALG_ECSDSA521 = 5,	/* ECDSA-521 */
	BDB_SIG_ALG_RSA3072B = 7,	/* RSA_3072, exponent 3 */
};

/*
 * Expected size of bdb_key struct in bytes, not counting variable-length key
 * data at end.
 */
#define BDB_KEY_EXPECTED_SIZE 80

struct bdb_key {
	/* Magic number to identify struct = BDB_KEY_MAGIC. */
	uint32_t struct_magic;

	/* Structure version = BDB_KEY_VERSION{MAJOR,MINOR} */
	uint8_t struct_major_version;
	uint8_t struct_minor_version;

	/* Size of structure in bytes, including variable-length key data */
	uint16_t struct_size;

	/* Hash algorithm (enum bdb_hash_alg) */
	uint8_t hash_alg;

	/* Signature algorithm (enum bdb_sig_alg) */
	uint8_t sig_alg;

	/* Reserved; set 0 */
	uint8_t reserved0[2];

	/* Key version */
	uint32_t key_version;

	/* Description; null-terminated ASCII */
	char description[128];

	/*
	 * Key data.  Variable-length; size is struct_size -
	 * offset_of(bdb_key, key_data).
	 */
	uint8_t key_data[0];
} __attribute__((packed));

/*****************************************************************************/
/* Signature structure for BDB */

/* Magic number for bdb_sig.struct_magic */
#define BDB_SIG_MAGIC 0x6b334256

/* Current version of bdb_sig struct */
#define BDB_SIG_VERSION_MAJOR 1
#define BDB_SIG_VERSION_MINOR 0

struct bdb_sig {
	/* Magic number to identify struct = BDB_SIG_MAGIC. */
	uint32_t struct_magic;

	/* Structure version = BDB_SIG_VERSION{MAJOR,MINOR} */
	uint8_t struct_major_version;
	uint8_t struct_minor_version;

	/* Size of structure in bytes, including variable-length signature
	 * data. */
	uint16_t struct_size;

	/* Hash algorithm used for this signature (enum bdb_hash_alg) */
	uint8_t hash_alg;

	/* Signature algorithm (enum bdb_sig_alg) */
	uint8_t sig_alg;

	/* Reserved; set 0 */
	uint8_t reserved0[2];

	/* Number of bytes of data signed by this signature */
	uint32_t signed_size;

	/* Description; null-terminated ASCII */
	char description[128];

	/* Signature data.  Variable-length; size is struct_size -
	 * offset_of(bdb_sig, sig_data). */
	uint8_t sig_data[0];
} __attribute__((packed));

/*****************************************************************************/
/* Data structure for BDB */

/* Magic number for bdb_data.struct_magic */
#define BDB_DATA_MAGIC 0x31426442

/* Current version of bdb_sig struct */
#define BDB_DATA_VERSION_MAJOR 1
#define BDB_DATA_VERSION_MINOR 0

struct bdb_data {
	/* Magic number to identify struct = BDB_DATA_MAGIC. */
	uint32_t struct_magic;

	/* Structure version = BDB_DATA_VERSION{MAJOR,MINOR} */
	uint8_t struct_major_version;
	uint8_t struct_minor_version;

	/* Size of structure in bytes, NOT including hashes which follow. */
	uint16_t struct_size;

	/* Version of data (RW firmware) contained */
	uint32_t data_version;

	/* Size of OEM area 1 in bytes, or 0 if not present */
	uint32_t oem_area_1_size;

	/* Number of hashes which follow */
	uint8_t num_hashes;

	/* Size of each hash entry in bytes */
	uint8_t hash_entry_size;

	/* Reserved; set 0 */
	uint8_t reserved0[2];

	/* Number of bytes of data signed by the subkey, including this
	 * header */
	uint32_t signed_size;

	/* Reserved; set 0 */
	uint8_t reserved1[8];

	/* Description; null-terminated ASCII */
	char description[128];
} __attribute__((packed));

/* Type of data for bdb_hash.type */
enum bdb_data_type {
	/* Types of data for boot descriptor blocks */
	BDB_DATA_SP_RW = 1,		/* SP-RW firmware */
	BDB_DATA_AP_RW = 2,		/* AP-RW firmware */
	BDB_DATA_MCU = 3,		/* MCU firmware */

	/* Types of data for kernel descriptor blocks */
	BDB_DATA_KERNEL = 128,		/* Kernel */
	BDB_DATA_CMD_LINE = 129,	/* Command line */
	BDB_DATA_HEADER16 = 130,	/* 16-bit vmlinuz header */
};

/* Hash entries which follow the structure */
struct bdb_hash {
	/* Offset of data from start of partition */
	uint64_t offset;

	/* Size of data in bytes */
	uint32_t size;

	/* Partition number containing data */
	uint8_t partition;

	/* Type of data; enum bdb_data_type */
	uint8_t type;

	/* Reserved; set 0 */
	uint8_t reserved0[2];

	/* Address in RAM to load data.  -1 means use default. */
	uint64_t load_address;

	/* SHA-256 hash digest */
	uint8_t digest[BDB_SHA256_DIGEST_SIZE];
} __attribute__((packed));

/*****************************************************************************/

#endif /* VBOOT_REFERENCE_BDB_STRUCT_H_ */

