1 /*
2  * Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef  _CC_PROD_ASSET_H
8 #define  _CC_PROD_ASSET_H
9 
10 /*!
11 @file
12 @brief This file contains the functions and definitions for the OEM Asset provisioning.
13 */
14 
15 #ifdef __cplusplus
16 extern "C"
17 {
18 #endif
19 #include "cc_bitops.h"
20 #include "cc_prod.h"
21 
22 #define PROD_ASSET_PROV_TOKEN   0x50726F64UL   // "Prov"
23 #define PROD_ASSET_PROV_VERSION     0x10000UL
24 
25 // parameters for generating the temporary key
26 #define PROD_KEY_RTL_KEY_SIZE       16
27 #define PROD_KEY_TMP_KEY_SIZE       16
28 #define PROD_KEY_TMP_LABEL_SIZE     7
29 #define PROD_ICV_KEY_TMP_LABEL      "KEY ICV"
30 #define PROD_OEM_KEY_TMP_LABEL       "KEY OEM"
31 #define PROD_KEY_TMP_CONTEXT_SIZE   16
32 #define PROD_KEY_TMP_CONTEXT_WORD_SIZE  (PROD_KEY_TMP_CONTEXT_SIZE/CC_32BIT_WORD_SIZE)
33 
34 // parameters for generating the provisioning key
35 #define PROD_KPROV_KEY_SIZE     16
36 #define PROD_KPROV_LABEL_SIZE       1
37 #define PROD_LABEL  "P"
38 #define PROD_KPROV_CONTEXT_SIZE     4
39 #define PROD_ICV_ENC_CONTEXT    "EICV"
40 #define PROD_ICV_PROV_CONTEXT  "PICV"
41 #define PROD_OEM_ENC_CONTEXT    "Kce "
42 #define PROD_OEM_PROV_CONTEXT  "Kcp "
43 
44 // production asset patameters
45 #define PROD_ASSET_NONCE_SIZE   12
46 #define PROD_ASSET_TAG_SIZE     16
47 #define PROD_ASSET_RESERVED1_VAL    0x52657631UL  // Rev1
48 #define PROD_ASSET_RESERVED2_VAL    0x52657632UL  // Rev2
49 #define PROD_ASSET_RESERVED_WORD_SIZE   2
50 #define PROD_ASSET_RESERVED_SIZE    (PROD_ASSET_RESERVED_WORD_SIZE*CC_32BIT_WORD_SIZE)
51 #define PROD_ASSET_ADATA_SIZE   (3*CC_32BIT_WORD_SIZE+PROD_ASSET_RESERVED_SIZE)  // token||version||size||reserved
52 
53 typedef enum {
54     PROD_ASSET_ENTITY_TYPE_ICV  = 1,
55     PROD_ASSET_ENTITY_TYPE_OEM  = 2,
56     PROD_ASSET_ENTITY_TYPE_RESERVED     = 0x7FFFFFFF,
57 }CCProductionEntityType_t;
58 
59 typedef enum {
60     PROD_ASSET_TYPE_KCE     = 1,
61     PROD_ASSET_TYPE_KCP     = 2,
62     PROD_ASSET_TYPE_KEY_RESERVED    = 0x7FFFFFFF,
63 }CCProductionAssetKeyType_t;
64 
65 
66 typedef struct {
67         uint32_t  token;
68         uint32_t  version;
69         uint32_t  assetSize;
70         uint32_t  reserved[PROD_ASSET_RESERVED_WORD_SIZE];
71         uint8_t   nonce[PROD_ASSET_NONCE_SIZE];
72         uint8_t   encAsset[PROD_ASSET_SIZE+PROD_ASSET_TAG_SIZE];
73 }CCProdAssetPkg_t;  // Total size must be PROD_ASSET_PKG_SIZE
74 
75 #ifdef __cplusplus
76 }
77 #endif
78 
79 #endif /*_CC_PROD_ASSET_H */
80