1 /**
2  * @file
3  * @brief   Trust Protection Unit driver.
4  */
5 
6 /******************************************************************************
7  *
8  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
9  * Analog Devices, Inc.),
10  * Copyright (C) 2023-2024 Analog Devices, Inc.
11  *
12  * Licensed under the Apache License, Version 2.0 (the "License");
13  * you may not use this file except in compliance with the License.
14  * You may obtain a copy of the License at
15  *
16  *     http://www.apache.org/licenses/LICENSE-2.0
17  *
18  * Unless required by applicable law or agreed to in writing, software
19  * distributed under the License is distributed on an "AS IS" BASIS,
20  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  * See the License for the specific language governing permissions and
22  * limitations under the License.
23  *
24  ******************************************************************************/
25 
26 #include "mxc_device.h"
27 #include "mxc_errors.h"
28 #include "mxc_assert.h"
29 #include "mxc_sys.h"
30 #include "aes_revb.h"
31 #include "trng.h"
32 #include "trng_revb.h"
33 
34 /* ************************************************************************* */
35 /* Global Control/Configuration functions                                    */
36 /* ************************************************************************* */
37 
MXC_AES_Init(void)38 int MXC_AES_Init(void)
39 {
40 #ifndef MSDK_NO_GPIO_CLK_INIT
41     MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_AES);
42     MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_TRNG);
43 #endif
44 
45     MXC_AES->ctrl = 0x00;
46     // Start with a randomly generated key.
47     MXC_AES_GenerateKey();
48 
49     MXC_AES_RevB_Init((mxc_aes_revb_regs_t *)MXC_AES);
50 
51     return E_NO_ERROR;
52 }
53 
MXC_AES_EnableInt(uint32_t interrupt)54 void MXC_AES_EnableInt(uint32_t interrupt)
55 {
56     MXC_AES_RevB_EnableInt((mxc_aes_revb_regs_t *)MXC_AES, interrupt);
57 }
58 
MXC_AES_DisableInt(uint32_t interrupt)59 void MXC_AES_DisableInt(uint32_t interrupt)
60 {
61     MXC_AES_RevB_DisableInt((mxc_aes_revb_regs_t *)MXC_AES, interrupt);
62 }
63 
MXC_AES_IsBusy(void)64 int MXC_AES_IsBusy(void)
65 {
66     return MXC_AES_RevB_IsBusy((mxc_aes_revb_regs_t *)MXC_AES);
67 }
68 
MXC_AES_Shutdown(void)69 int MXC_AES_Shutdown(void)
70 {
71     int error = MXC_AES_RevB_Shutdown((mxc_aes_revb_regs_t *)MXC_AES);
72 
73     MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_AES);
74 
75     return error;
76 }
77 
MXC_AES_DMACallback(int ch,int error)78 void MXC_AES_DMACallback(int ch, int error)
79 {
80     MXC_AES_RevB_DMACallback(ch, error);
81 }
82 
MXC_AES_GenerateKey(void)83 void MXC_AES_GenerateKey(void)
84 {
85     // Generating a random key is part of the TRNG block
86     MXC_TRNG_GenerateKey();
87 }
88 
MXC_AES_SetKeySize(mxc_aes_keys_t key)89 void MXC_AES_SetKeySize(mxc_aes_keys_t key)
90 {
91     MXC_AES_RevB_SetKeySize((mxc_aes_revb_regs_t *)MXC_AES, (mxc_aes_revb_keys_t)key);
92 }
93 
MXC_AES_GetKeySize(void)94 mxc_aes_keys_t MXC_AES_GetKeySize(void)
95 {
96     return MXC_AES_RevB_GetKeySize((mxc_aes_revb_regs_t *)MXC_AES);
97 }
98 
MXC_AES_FlushInputFIFO(void)99 void MXC_AES_FlushInputFIFO(void)
100 {
101     MXC_AES_RevB_FlushInputFIFO((mxc_aes_revb_regs_t *)MXC_AES);
102 }
103 
MXC_AES_FlushOutputFIFO(void)104 void MXC_AES_FlushOutputFIFO(void)
105 {
106     MXC_AES_RevB_FlushOutputFIFO((mxc_aes_revb_regs_t *)MXC_AES);
107 }
108 
MXC_AES_Start(void)109 void MXC_AES_Start(void)
110 {
111     MXC_AES_RevB_Start((mxc_aes_revb_regs_t *)MXC_AES);
112 }
113 
MXC_AES_GetFlags(void)114 uint32_t MXC_AES_GetFlags(void)
115 {
116     return MXC_AES_RevB_GetFlags((mxc_aes_revb_regs_t *)MXC_AES);
117 }
118 
MXC_AES_ClearFlags(uint32_t flags)119 void MXC_AES_ClearFlags(uint32_t flags)
120 {
121     MXC_AES_RevB_ClearFlags((mxc_aes_revb_regs_t *)MXC_AES, flags);
122 }
123 
MXC_AES_Generic(mxc_aes_req_t * req)124 int MXC_AES_Generic(mxc_aes_req_t *req)
125 {
126     return MXC_AES_RevB_Generic((mxc_aes_revb_regs_t *)MXC_AES, (mxc_aes_revb_req_t *)req);
127 }
128 
MXC_AES_Encrypt(mxc_aes_req_t * req)129 int MXC_AES_Encrypt(mxc_aes_req_t *req)
130 {
131     return MXC_AES_RevB_Encrypt((mxc_aes_revb_regs_t *)MXC_AES, (mxc_aes_revb_req_t *)req);
132 }
133 
MXC_AES_Decrypt(mxc_aes_req_t * req)134 int MXC_AES_Decrypt(mxc_aes_req_t *req)
135 {
136     return MXC_AES_RevB_Decrypt((mxc_aes_revb_regs_t *)MXC_AES, (mxc_aes_revb_req_t *)req);
137 }
138 
MXC_AES_TXDMAConfig(void * src_addr,int len)139 int MXC_AES_TXDMAConfig(void *src_addr, int len)
140 {
141     return MXC_AES_RevB_TXDMAConfig(src_addr, len);
142 }
143 
MXC_AES_RXDMAConfig(void * dest_addr,int len)144 int MXC_AES_RXDMAConfig(void *dest_addr, int len)
145 {
146     return MXC_AES_RevB_RXDMAConfig(dest_addr, len);
147 }
148 
MXC_AES_GenericAsync(mxc_aes_req_t * req,uint8_t enc)149 int MXC_AES_GenericAsync(mxc_aes_req_t *req, uint8_t enc)
150 {
151     return MXC_AES_RevB_GenericAsync((mxc_aes_revb_regs_t *)MXC_AES, (mxc_aes_revb_req_t *)req,
152                                      enc);
153 }
154 
MXC_AES_EncryptAsync(mxc_aes_req_t * req)155 int MXC_AES_EncryptAsync(mxc_aes_req_t *req)
156 {
157     return MXC_AES_RevB_EncryptAsync((mxc_aes_revb_regs_t *)MXC_AES, (mxc_aes_revb_req_t *)req);
158 }
159 
MXC_AES_DecryptAsync(mxc_aes_req_t * req)160 int MXC_AES_DecryptAsync(mxc_aes_req_t *req)
161 {
162     return MXC_AES_RevB_DecryptAsync((mxc_aes_revb_regs_t *)MXC_AES, (mxc_aes_revb_req_t *)req);
163 }
164 
MXC_AES_SetExtKey(const void * key,mxc_aes_keys_t len)165 void MXC_AES_SetExtKey(const void *key, mxc_aes_keys_t len)
166 {
167     MXC_AES_RevB_SetExtKey((mxc_aeskeys_revb_regs_t *)MXC_AESKEYS, key, len);
168 }
169