1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6 
7 #include "hw_sce_ra_private.h"
8 
HW_SCE_Aes128OutputKeyForDotfSub(uint32_t InData_KeyIndex[],uint32_t InData_DOTFSEED[])9 fsp_err_t HW_SCE_Aes128OutputKeyForDotfSub (uint32_t InData_KeyIndex[], uint32_t InData_DOTFSEED[])
10 {
11     if (RD1_MASK(REG_14BCH, 0x0000001fU) != 0)
12     {
13         return FSP_ERR_CRYPTO_SCE_RESOURCE_CONFLICT;
14     }
15     else
16     {
17         ;
18     }
19     WR1_PROG(REG_1B00H, 0x002c0001U);
20     WR1_PROG(REG_144CH, 0x00000000U);
21 
22     WR1_PROG(REG_1444H, 0x000000c7U);
23     WR1_PROG(REG_1608H, 0x80010000U);
24     WAIT_STS(REG_1444H, 31, 1);
25     WR1_PROG(REG_1420H, 0);
26     WR1_PROG(REG_1458H, 0x00000000U);
27 
28     WR1_PROG(REG_1600H, 0x38000c00U);
29     WR1_PROG(REG_1608H, 0x00000080U);
30     WR1_PROG(REG_143CH, 0x00260000U);
31 
32     HW_SCE_p_func100(0xe42bd53eU,0x1421a36cU,0x4c4e49bdU,0xd9a52febU);
33     WR1_PROG(REG_143CH, 0x00400000U);
34 
35     if (CHCK_STS(REG_143CH, 22, 1))
36     {
37         WR1_PROG(REG_1444H, 0x000000c7U);
38         WR1_PROG(REG_1608H, 0x800100e0U);
39         WAIT_STS(REG_1444H, 31, 1);
40         WR1_PROG(REG_1420H, InData_KeyIndex[0]);
41         WR1_PROG(REG_1458H, 0x00000000U);
42 
43         WR1_PROG(REG_1444H, 0x000000a7U);
44         WR1_PROG(REG_1608H, 0x800103a0U);
45         WAIT_STS(REG_1444H, 31, 1);
46         WR1_PROG(REG_1420H, change_endian_long(0x0000002cU));
47         WR1_PROG(REG_1458H, 0x00000000U);
48 
49         HW_SCE_p_func101(0x13c0cc14U,0xe754066aU,0xd88a17acU,0x1becdcc0U);
50         HW_SCE_p_func043_r1();
51 
52         WR1_PROG(REG_1600H, 0x0000b4e0U);
53         WR1_PROG(REG_1600H, 0x00000005U);
54 
55         WR1_PROG(REG_1444H, 0x000000a7U);
56         WR1_PROG(REG_1608H, 0x800103a0U);
57         WAIT_STS(REG_1444H, 31, 1);
58         WR1_PROG(REG_1420H, change_endian_long(0x0000002cU));
59         WR1_PROG(REG_1458H, 0x00000000U);
60 
61         HW_SCE_p_func101(0xaf22781bU,0xc21f64d4U,0xc5b0d898U,0x8d8e6470U);
62         HW_SCE_p_func044_r1();
63 
64         WR1_PROG(REG_1444H, 0x000003c2U);
65         WR1_PROG(REG_1A2CH, 0x40000000U);
66         WR1_PROG(REG_1A24H, 0xf7009d05U);
67         WAIT_STS(REG_1444H, 31, 1);
68         WR1_PROG(REG_1420H, InData_KeyIndex[1]);
69         WR1_PROG(REG_1420H, InData_KeyIndex[2]);
70         WR1_PROG(REG_1420H, InData_KeyIndex[3]);
71         WR1_PROG(REG_1420H, InData_KeyIndex[4]);
72 
73         WR1_PROG(REG_1600H, 0x00000821U);
74         WR1_PROG(REG_1608H, 0x80840001U);
75         WR1_PROG(REG_1400H, 0x03420011U);
76         WAIT_STS(REG_1404H, 30, 0);
77         WR1_PROG(REG_143CH, 0x00001800U);
78 
79         WR1_PROG(REG_1444H, 0x000003c2U);
80         WR1_PROG(REG_1A2CH, 0x40000000U);
81         WR1_PROG(REG_1A24H, 0x07008d05U);
82         WAIT_STS(REG_1444H, 31, 1);
83         WR1_PROG(REG_1420H, InData_KeyIndex[5]);
84         WR1_PROG(REG_1420H, InData_KeyIndex[6]);
85         WR1_PROG(REG_1420H, InData_KeyIndex[7]);
86         WR1_PROG(REG_1420H, InData_KeyIndex[8]);
87 
88         WR1_PROG(REG_1A24H, 0x9c100005U);
89         WR1_PROG(REG_1400H, 0x00820011U);
90         WAIT_STS(REG_1404H, 30, 0);
91         WR1_PROG(REG_143CH, 0x00001800U);
92 
93         HW_SCE_p_func101(0x4cbb9da3U,0xfae37b17U,0x76c82b01U,0x5fe05613U);
94 
95     }
96 
97     HW_SCE_p_func100(0x3eec56f6U,0x73af9b55U,0xb707e77aU,0x57a1f5adU);
98     WR1_PROG(REG_143CH, 0x00400000U);
99 
100 
101     if (CHCK_STS(REG_143CH, 22, 1))
102     {
103         HW_SCE_p_func102(0xeaa8ba85U, 0x9f93941cU, 0x7f98a0a6U, 0xd2c7e95dU);
104         WR1_PROG(REG_14BCH, 0x00000040U);
105         WAIT_STS(REG_142CH, 12, 0);
106 
107         return FSP_ERR_CRYPTO_SCE_KEY_SET_FAIL;
108     }
109     else
110     {
111         HW_SCE_p_func100(0x0c3cb29cU, 0x3e89adceU, 0x31c085c1U, 0x357d9174U);
112         WR1_PROG(REG_1438H, 0x40000100U);
113 
114         WR1_PROG(REG_1600H, 0x0000b400U);
115         WR1_PROG(REG_1600H, 0x00000000U);
116 
117         WR1_PROG(REG_1608H, 0x81010000U);
118         WR1_PROG(REG_1400H, 0x02090005U);
119         WAIT_STS(REG_1404H, 30, 0);
120         WR1_PROG(REG_143CH, 0x00001800U);
121 
122         HW_SCE_p_func100(0x8a7e38feU, 0x0594cbcdU, 0xd70c024bU, 0x690f5926U);
123         WR1_PROG(REG_1438H, 0x40000110U);
124 
125         WR1_PROG(REG_1400H, 0x02000011U);
126         WAIT_STS(REG_1404H, 30, 0);
127         WR1_PROG(REG_143CH, 0x00001800U);
128 
129         HW_SCE_p_func100(0x95f66b95U, 0x2283efd3U, 0xa3b3e11fU, 0x8e42210eU);
130         WR1_PROG(REG_1600H, 0x00000821U);
131         WR1_PROG(REG_1608H, 0x81840001U);
132         WR1_PROG(REG_1400H, 0x02090011U);
133         WAIT_STS(REG_1404H, 30, 0);
134         WR1_PROG(REG_143CH, 0x00001800U);
135 
136 
137         WR1_PROG(REG_1444H, 0x000001c7U);
138         WR1_PROG(REG_1608H, 0x80020000U);
139         WAIT_STS(REG_1444H, 31, 1);
140         WR1_PROG(REG_1420H, InData_DOTFSEED[0]);
141         WAIT_STS(REG_1444H, 31, 1);
142         WR1_PROG(REG_1420H, InData_DOTFSEED[1]);
143         WR1_PROG(REG_1458H, 0x00000000U);
144 
145         HW_SCE_p_func100(0x214cee8fU, 0x3a443c76U, 0x708c8475U, 0x8d211a2cU);
146         WR1_PROG(REG_1438H, 0x40000140U);
147 
148         WR1_PROG(REG_1608H, 0x81020000U);
149         WR1_PROG(REG_1400H, 0x02090009U);
150         WAIT_STS(REG_1404H, 30, 0);
151         WR1_PROG(REG_143CH, 0x00001800U);
152 
153         HW_SCE_p_func102(0x6eb18b59U, 0x649d1056U, 0x0dfbb75bU, 0x32dfd757U);
154         WR1_PROG(REG_14BCH, 0x00000040U);
155         WAIT_STS(REG_142CH, 12, 0);
156 
157         return FSP_SUCCESS;
158     }
159 }
160