xref: /rk3399_ARM-atf/drivers/nxp/crypto/caam/src/hw_key_blob.c (revision 0f39b7e668631a5d0c849033b45d7d953ca2254b)
1a0edacb8SPankaj Gupta /*
2a0edacb8SPankaj Gupta  * Copyright 2021 NXP
3a0edacb8SPankaj Gupta  *
4a0edacb8SPankaj Gupta  * SPDX-License-Identifier: BSD-3-Clause
5a0edacb8SPankaj Gupta  *
6a0edacb8SPankaj Gupta  */
7a0edacb8SPankaj Gupta 
8a0edacb8SPankaj Gupta #include <errno.h>
9a0edacb8SPankaj Gupta #include <stdbool.h>
10a0edacb8SPankaj Gupta #include <stdint.h>
11a0edacb8SPankaj Gupta #include <stdio.h>
12a0edacb8SPankaj Gupta #include <stdlib.h>
13a0edacb8SPankaj Gupta #include <string.h>
14a0edacb8SPankaj Gupta 
15a0edacb8SPankaj Gupta #include "caam.h"
16a0edacb8SPankaj Gupta #include <common/debug.h>
17a0edacb8SPankaj Gupta #include "jobdesc.h"
18a0edacb8SPankaj Gupta #include "sec_hw_specific.h"
19a0edacb8SPankaj Gupta 
20a0edacb8SPankaj Gupta 
211b491eeaSElyes Haouas /* Callback function after Instantiation descriptor is submitted to SEC
22a0edacb8SPankaj Gupta  */
blob_done(uint32_t * desc,uint32_t status,void * arg,void * job_ring)23a0edacb8SPankaj Gupta static void blob_done(uint32_t *desc, uint32_t status, void *arg,
24a0edacb8SPankaj Gupta 		      void *job_ring)
25a0edacb8SPankaj Gupta {
26a0edacb8SPankaj Gupta 	INFO("Blob Desc SUCCESS with status %x\n", status);
27a0edacb8SPankaj Gupta }
28a0edacb8SPankaj Gupta 
29a0edacb8SPankaj Gupta /* @brief Submit descriptor to create blob
30a0edacb8SPankaj Gupta  * @retval 0 on success
31a0edacb8SPankaj Gupta  * @retval -1 on error
32a0edacb8SPankaj Gupta  */
get_hw_unq_key_blob_hw(uint8_t * hw_key,int size)33a0edacb8SPankaj Gupta int get_hw_unq_key_blob_hw(uint8_t *hw_key, int size)
34a0edacb8SPankaj Gupta {
35a0edacb8SPankaj Gupta 	int ret = 0;
36a0edacb8SPankaj Gupta 	int i = 0;
37a0edacb8SPankaj Gupta 
38a0edacb8SPankaj Gupta 	uint32_t key_sz = KEY_IDNFR_SZ_BYTES;
39a0edacb8SPankaj Gupta 	uint8_t key_data[KEY_IDNFR_SZ_BYTES];
40a0edacb8SPankaj Gupta 	uint8_t in_data[16];
41a0edacb8SPankaj Gupta 	uint8_t out_data[16 + KEY_BLOB_SIZE + MAC_SIZE];
42a0edacb8SPankaj Gupta 	struct job_descriptor desc __aligned(CACHE_WRITEBACK_GRANULE);
43a0edacb8SPankaj Gupta 	struct job_descriptor *jobdesc = &desc;
44a0edacb8SPankaj Gupta 	uint32_t in_sz = 16U;
45a0edacb8SPankaj Gupta 
46*76a95609SPankaj Gupta 	if (size <= 0 ||  size > 16) {
47*76a95609SPankaj Gupta 		ERROR("Error: Requested invalid length of HUK.\n");
48*76a95609SPankaj Gupta 		return -1;
49*76a95609SPankaj Gupta 	}
50a0edacb8SPankaj Gupta 	/* Output blob will have 32 bytes key blob in beginning and
51a0edacb8SPankaj Gupta 	 * 16 byte HMAC identifier at end of data blob
52a0edacb8SPankaj Gupta 	 */
53a0edacb8SPankaj Gupta 	uint32_t out_sz = in_sz + KEY_BLOB_SIZE + MAC_SIZE;
54a0edacb8SPankaj Gupta 
55a0edacb8SPankaj Gupta 	uint32_t operation = CMD_OPERATION | OP_TYPE_ENCAP_PROTOCOL |
56a0edacb8SPankaj Gupta 	    OP_PCLID_BLOB | BLOB_PROTO_INFO;
57a0edacb8SPankaj Gupta 
58a0edacb8SPankaj Gupta 	memset(key_data, 0xff, KEY_IDNFR_SZ_BYTES);
59a0edacb8SPankaj Gupta 	memset(in_data, 0x00, in_sz);
60a0edacb8SPankaj Gupta 	memset(out_data, 0x00, in_sz);
61a0edacb8SPankaj Gupta 
62a0edacb8SPankaj Gupta 	jobdesc->arg = NULL;
63a0edacb8SPankaj Gupta 	jobdesc->callback = blob_done;
64a0edacb8SPankaj Gupta 
65a0edacb8SPankaj Gupta 	INFO("\nGenerating Master Key Verification Blob.\n");
66a0edacb8SPankaj Gupta 
67a0edacb8SPankaj Gupta 	/* Create the hw_rng descriptor */
68a0edacb8SPankaj Gupta 	ret = cnstr_hw_encap_blob_jobdesc(jobdesc->desc, key_data, key_sz,
69a0edacb8SPankaj Gupta 					  CLASS_2, in_data, in_sz, out_data,
70a0edacb8SPankaj Gupta 					  out_sz, operation);
71a0edacb8SPankaj Gupta 
72a0edacb8SPankaj Gupta 	/* Finally, generate the blob. */
73a0edacb8SPankaj Gupta 	ret = run_descriptor_jr(jobdesc);
74a0edacb8SPankaj Gupta 	if (ret != 0) {
75a0edacb8SPankaj Gupta 		ERROR("Error in running hw unq key blob descriptor\n");
76a0edacb8SPankaj Gupta 		return -1;
77a0edacb8SPankaj Gupta 	}
78a0edacb8SPankaj Gupta 	/* Copying alternate bytes of the Master Key Verification Blob.
79a0edacb8SPankaj Gupta 	 */
80a0edacb8SPankaj Gupta 	for (i = 0; i < size; i++) {
81a0edacb8SPankaj Gupta 		hw_key[i] = out_data[2 * i];
82a0edacb8SPankaj Gupta 	}
83a0edacb8SPankaj Gupta 
84a0edacb8SPankaj Gupta 	return ret;
85a0edacb8SPankaj Gupta }
86