blob: dd506a16e80ceef5bdb789fed77c06da2b6854ea [file] [log] [blame]
Breno Lima30e39ac2021-03-25 17:30:02 +08001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright 2016 Freescale Semiconductor, Inc.
4 * Copyright 2017 NXP
5 *
6 * These commands enable the use of the CAAM MPPubK-generation and MPSign
7 * functions in supported i.MX devices.
8 */
9
10#include <asm/byteorder.h>
11#include <asm/arch/clock.h>
12#include <linux/compiler.h>
13#include <command.h>
14#include <common.h>
15#include <environment.h>
16#include <fsl_sec.h>
17#include <mapmem.h>
18#include <memalign.h>
19
20DECLARE_GLOBAL_DATA_PTR;
21
22/**
23 * do_mfgprot() - Handle the "mfgprot" command-line command
24 * @cmdtp: Command data struct pointer
25 * @flag: Command flag
26 * @argc: Command-line argument count
27 * @argv: Array of command-line arguments
28 *
29 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
30 * on error.
31 */
32static int do_mfgprot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
33{
34 u8 *m_ptr, *dgst_ptr, *c_ptr, *d_ptr, *dst_ptr;
35 char *pubk, *sign, *sel;
36 int m_size, i, ret;
37 u32 m_addr;
38
39 pubk = "pubk";
40 sign = "sign";
41 sel = argv[1];
42
43 /* Enable HAB clock */
44 u32 jr_size = 4;
Breno Lima6d7b2702021-03-25 17:30:04 +080045
46 hab_caam_clock_enable(1);
47
Breno Lima8c497e12021-03-25 17:30:03 +080048 u32 out_jr_size = sec_in32(CONFIG_SYS_FSL_JR0_ADDR +
49 FSL_CAAM_ORSR_JRa_OFFSET);
Breno Lima30e39ac2021-03-25 17:30:02 +080050
Breno Lima6d7b2702021-03-25 17:30:04 +080051 if (out_jr_size != jr_size)
Breno Lima30e39ac2021-03-25 17:30:02 +080052 sec_init();
Breno Lima30e39ac2021-03-25 17:30:02 +080053
54 if (strcmp(sel, pubk) == 0) {
55 dst_ptr = malloc_cache_aligned(FSL_CAAM_MP_PUBK_BYTES);
56 if (!dst_ptr)
57 return -ENOMEM;
58
59 ret = gen_mppubk(dst_ptr);
60 if (ret) {
61 free(dst_ptr);
62 return ret;
63 }
64
65 /* Output results */
66 puts("Public key:\n");
67 for (i = 0; i < FSL_CAAM_MP_PUBK_BYTES; i++)
68 printf("%02X", (dst_ptr)[i]);
69 puts("\n");
70 free(dst_ptr);
71
72 } else if (strcmp(sel, sign) == 0) {
73 if (argc != 4)
74 return CMD_RET_USAGE;
75
76 m_addr = simple_strtoul(argv[2], NULL, 16);
77 m_size = simple_strtoul(argv[3], NULL, 10);
78 m_ptr = map_physmem(m_addr, m_size, MAP_NOCACHE);
79 if (!m_ptr)
80 return -ENOMEM;
81
82 dgst_ptr = malloc_cache_aligned(FSL_CAAM_MP_MES_DGST_BYTES);
83 if (!dgst_ptr) {
84 ret = -ENOMEM;
85 goto free_m;
86 }
87
88 c_ptr = malloc_cache_aligned(FSL_CAAM_MP_PRVK_BYTES);
89 if (!c_ptr) {
90 ret = -ENOMEM;
91 goto free_dgst;
92 }
93
94 d_ptr = malloc_cache_aligned(FSL_CAAM_MP_PRVK_BYTES);
95 if (!d_ptr) {
96 ret = -ENOMEM;
97 goto free_c;
98 }
99
100 ret = sign_mppubk(m_ptr, m_size, dgst_ptr, c_ptr, d_ptr);
101 if (ret)
102 goto free_d;
103
104 /* Output results */
105 puts("Message: ");
106 for (i = 0; i < m_size; i++)
107 printf("%02X ", (m_ptr)[i]);
108 puts("\n");
109
110 puts("Message Representative Digest(SHA-256):\n");
111 for (i = 0; i < FSL_CAAM_MP_MES_DGST_BYTES; i++)
112 printf("%02X", (dgst_ptr)[i]);
113 puts("\n");
114
115 puts("Signature:\n");
116 puts("C:\n");
117 for (i = 0; i < FSL_CAAM_MP_PRVK_BYTES; i++)
118 printf("%02X", (c_ptr)[i]);
119 puts("\n");
120
121 puts("d:\n");
122 for (i = 0; i < FSL_CAAM_MP_PRVK_BYTES; i++)
123 printf("%02X", (d_ptr)[i]);
124 puts("\n");
125free_d:
126 free(d_ptr);
127free_c:
128 free(c_ptr);
129free_dgst:
130 free(dgst_ptr);
131free_m:
132 unmap_sysmem(m_ptr);
133
134 } else {
135 return CMD_RET_USAGE;
136 }
137 return ret;
138}
139
140/***************************************************/
141static char mfgprot_help_text[] =
142 "Usage:\n"
143 "Print the public key for Manufacturing Protection\n"
144 "\tmfgprot pubk\n"
145 "Generates a Manufacturing Protection signature\n"
146 "\tmfgprot sign <data_addr> <size>";
147
148U_BOOT_CMD(
149 mfgprot, 4, 1, do_mfgprot,
150 "Manufacturing Protection\n",
151 mfgprot_help_text
152);