18eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
28eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * @file   tlTeeKeymaster_Api.h
38eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * @brief  Contains TCI command definitions and data structures
48eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *
58eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Copyright Giesecke & Devrient GmbH 2012
68eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *
78eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Redistribution and use in source and binary forms, with or without
88eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * modification, are permitted provided that the following conditions
98eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * are met:
108eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * 1. Redistributions of source code must retain the above copyright
118eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *    notice, this list of conditions and the following disclaimer.
128eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * 2. Redistributions in binary form must reproduce the above copyright
138eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *    notice, this list of conditions and the following disclaimer in the
148eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *    documentation and/or other materials provided with the distribution.
158eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * 3. The name of the author may not be used to endorse or promote
168eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *    products derived from this software without specific prior
178eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *    written permission.
188eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *
198eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
208eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
218eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
228eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
238eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
248eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
258eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
268eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
278eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
288eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
298eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
308eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
318eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
328eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#ifndef __TLTEEKEYMASTERAPI_H__
338eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define __TLTEEKEYMASTERAPI_H__
348eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
358eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#include "tci.h"
368eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
378eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
388eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
398eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
408eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Command ID's
418eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
428eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define CMD_ID_TEE_RSA_GEN_KEY_PAIR   1
438eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define CMD_ID_TEE_RSA_SIGN           2
448eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define CMD_ID_TEE_RSA_VERIFY         3
458eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define CMD_ID_TEE_HMAC_GEN_KEY       4
468eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define CMD_ID_TEE_HMAC_SIGN          5
478eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define CMD_ID_TEE_HMAC_VERIFY        6
488eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define CMD_ID_TEE_KEY_IMPORT         7
498eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define CMD_ID_TEE_GET_PUB_KEY        8
508eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/*... add more command ids when needed */
518eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
528eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
538eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
548eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Command message.
558eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *
568eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * @param len Length of the data to process.
578eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * @param data Data to be processed
588eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
598eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
608eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    tciCommandHeader_t  header;     /**< Command header */
618eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t            len;        /**< Length of data to process */
628eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} command_t;
638eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
648eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
658eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
668eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Response structure
678eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
688eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
698eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    tciResponseHeader_t header;     /**< Response header */
708eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t            len;
718eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} response_t;
728eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
738eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
748eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
758eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Generate key data
768eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Response data contains generated RSA key pair data is
778eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * wrapped as below:
788eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *
798eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * |-- Key metadata --|-- Public key (plaintext) --|-- Private key (encrypted) --|
808eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
818eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
828eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t type;           /**< Key pair type. RSA or RSACRT */
838eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keysize;        /**< Key size in bits, e.g. 1024, 2048,.. */
848eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t exponent;       /**< Exponent number */
858eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydata;        /**< Key data buffer passed by TLC  */
868eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydatalen;     /**< Length of key data buffer */
878eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t solen;          /**< Secure object length  (of key data) (provided by the trustlet)  */
888eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} rsagenkey_t;
898eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
908eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
918eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
928eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *  RSA sign data structure
938eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
948eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
958eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydata;           /**< Key data buffer */
968eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydatalen;        /**< Length of key data buffer */
978eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t plaindata;         /**< Plaintext data buffer */
988eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t plaindatalen;      /**< Length of plaintext data buffer */
998eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t signaturedata;     /**< Signature data buffer */
1008eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t signaturedatalen;  /**< Length of signature data buffer */
1018eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t algorithm;         /**< Signing algorithm */
1028eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} rsasign_t;
1038eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1048eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1058eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
1068eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *  RSA signature verify data structure
1078eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
1088eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
1098eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydata;           /**< Key data buffer */
1108eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydatalen;        /**< Length of key data buffer */
1118eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t plaindata;         /**< Plaintext data buffer */
1128eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t plaindatalen;      /**< Length of plaintext data buffer */
1138eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t signaturedata;     /**< Signature data buffer */
1148eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t signaturedatalen;  /**< Length of signature data buffer */
1158eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t algorithm;         /**< Signing algorithm */
1168eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    bool     validity;          /**< Signature validity */
1178eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} rsaverify_t;
1188eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1198eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1208eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
1218eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Generate HMAC key data
1228eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Response data contains generated HMAC key data that is
1238eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * wrapped as below:
1248eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *
1258eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * |-- HMAC key (encrypted) --|
1268eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
1278eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
1288eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydata;        /**< Key data buffer passed by TLC  */
1298eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydatalen;     /**< Length of key data buffer */
1308eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t solen;          /**< Secure object length  (of key data) (provided by the trustlet)  */
1318eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} hmacgenkey_t;
1328eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1338eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1348eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
1358eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *  HMAC sign data structure
1368eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
1378eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
1388eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydata;           /**< Key data buffer */
1398eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydatalen;        /**< Length of key data buffer */
1408eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t plaindata;         /**< Plaintext data buffer */
1418eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t plaindatalen;      /**< Length of plaintext data buffer */
1428eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t signaturedata;     /**< Signature data buffer */
1438eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t signaturedatalen;  /**< Length of signature data buffer */
1448eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t digest;            /**< Digest algorithm */
1458eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} hmacsign_t;
1468eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1478eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1488eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
1498eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *  HMAC signature verify data structure
1508eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
1518eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
1528eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydata;           /**< Key data buffer */
1538eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydatalen;        /**< Length of key data buffer */
1548eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t plaindata;         /**< Plaintext data buffer */
1558eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t plaindatalen;      /**< Length of plaintext data buffer */
1568eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t signaturedata;     /**< Signature data buffer */
1578eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t signaturedatalen;  /**< Length of signature data buffer */
1588eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t digest;            /**< Digest algorithm */
1598eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    bool     validity;          /**< Signature validity */
1608eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} hmacverify_t;
1618eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1628eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
1638eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * RSA private key metadata
1648eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
1658eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
1668eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     lenpriexp;     /**< Private key exponent length */
1678eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} rsaprivkeymeta_t;
1688eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1698eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1708eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
1718eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * RSA CRT private key metadata
1728eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
1738eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
1748eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     lenp;          /**< Prime p length */
1758eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     lenq;          /**< Prime q length */
1768eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     lendp;         /**< DP length */
1778eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     lendq;         /**< DQ length */
1788eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     lenqinv;       /**< QP length */
1798eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} rsacrtprivkeymeta_t;
1808eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1818eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1828eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
1838eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Key metadata (key size, modulus/exponent lengths, etc..)
1848eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
1858eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
1868eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     keytype;          /**< RSA key pair type. RSA or RSA CRT */
1878eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     keysize;          /**< RSA key size */
1888eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     lenpubmod;        /**< Public key modulus length */
1898eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     lenpubexp;        /**< Public key exponent length */
1908eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    union {
1918eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        rsaprivkeymeta_t    rsapriv;    /**< RSA private key */
1928eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        rsacrtprivkeymeta_t rsacrtpriv; /**< RSA CRT private key */
1938eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    };
1948eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     rfu;          /**< Reserved for future use */
1958eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     rfulen;       /**< Reserved for future use */
1968eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} rsakeymeta_t;
1978eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
1988eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
1998eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *  Key import data structure
2008eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
2018eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
2028eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     keydata;           /**< Key data buffer */
2038eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     keydatalen;        /**< Length of key data buffer */
2048eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     sodata;            /**< Wrapped buffer */
2058eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t     sodatalen;         /**< Length of wrapped data buffer */
2068eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} keyimport_t;
2078eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2088eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2098eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
2108eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park *  Get public key data structure
2118eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
2128eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
2138eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t type;              /**< Key type */
2148eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydata;           /**< Key data buffer */
2158eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t keydatalen;        /**< Length of key data buffer */
2168eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t modulus;           /**< Modulus */
2178eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t moduluslen;        /**< Modulus length */
2188eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t exponent;          /**< Exponent */
2198eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    uint32_t exponentlen;       /**< Exponent length */
2208eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} getpubkey_t;
2218eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2228eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2238eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
2248eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * TCI message data.
2258eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
2268eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
2278eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    union {
2288eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        command_t     command;
2298eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        response_t    response;
2308eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    };
2318eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2328eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    union {
2338eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        rsagenkey_t  rsagenkey;
2348eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        rsasign_t    rsasign;
2358eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        rsaverify_t  rsaverify;
2368eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        hmacgenkey_t hmacgenkey;
2378eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        hmacsign_t   hmacsign;
2388eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        hmacverify_t hmacverify;
2398eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        keyimport_t  keyimport;
2408eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park        getpubkey_t  getpubkey;
2418eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    };
2428eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2438eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} tciMessage_t, *tciMessage_ptr;
2448eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2458eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2468eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
2478eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Overall TCI structure.
2488eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
2498eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Parktypedef struct {
2508eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park    tciMessage_t message;   /**< TCI message */
2518eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park} tci_t;
2528eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2538eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2548eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park/**
2558eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park * Trustlet UUID
2568eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park */
2578eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#define TEE_KEYMASTER_TL_UUID { { 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
2588eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2598eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park
2608eff0eb0768d4f98b3b1c63ff7c41c333ff1ddfcDongJin Park#endif // __TLTEEKEYMASTERAPI_H__
261