xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/aes256.c (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald  * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald  * All rights reserved.
4*5fd0122aSMatthias Ringwald  *
5*5fd0122aSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald  * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald  * are met:
8*5fd0122aSMatthias Ringwald  *
9*5fd0122aSMatthias Ringwald  * *  Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald  *
12*5fd0122aSMatthias Ringwald  * *  Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald  *
16*5fd0122aSMatthias Ringwald  * *  Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald  *    its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald  *    from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald  *
20*5fd0122aSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald  * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/aes256.h>
33*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
34*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
35*5fd0122aSMatthias Ringwald 
AES256_setCipherKey(uint32_t moduleInstance,const uint8_t * cipherKey,uint_fast16_t keyLength)36*5fd0122aSMatthias Ringwald bool AES256_setCipherKey(uint32_t moduleInstance, const uint8_t * cipherKey,
37*5fd0122aSMatthias Ringwald         uint_fast16_t keyLength)
38*5fd0122aSMatthias Ringwald {
39*5fd0122aSMatthias Ringwald     uint_fast8_t i;
40*5fd0122aSMatthias Ringwald     uint16_t sCipherKey;
41*5fd0122aSMatthias Ringwald 
42*5fd0122aSMatthias Ringwald     AES256_CMSIS(moduleInstance)->CTL0 |= 0;
43*5fd0122aSMatthias Ringwald 
44*5fd0122aSMatthias Ringwald     switch (keyLength)
45*5fd0122aSMatthias Ringwald     {
46*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_128BIT:
47*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__128BIT;
48*5fd0122aSMatthias Ringwald         break;
49*5fd0122aSMatthias Ringwald 
50*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_192BIT:
51*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__192BIT;
52*5fd0122aSMatthias Ringwald         break;
53*5fd0122aSMatthias Ringwald 
54*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_256BIT:
55*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__256BIT;
56*5fd0122aSMatthias Ringwald         break;
57*5fd0122aSMatthias Ringwald     default:
58*5fd0122aSMatthias Ringwald         return false;
59*5fd0122aSMatthias Ringwald     }
60*5fd0122aSMatthias Ringwald 
61*5fd0122aSMatthias Ringwald     keyLength = keyLength / 8;
62*5fd0122aSMatthias Ringwald 
63*5fd0122aSMatthias Ringwald     for (i = 0; i < keyLength; i = i + 2)
64*5fd0122aSMatthias Ringwald     {
65*5fd0122aSMatthias Ringwald         sCipherKey = (uint16_t) (cipherKey[i]);
66*5fd0122aSMatthias Ringwald         sCipherKey = sCipherKey | ((uint16_t) (cipherKey[i + 1]) << 8);
67*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->KEY = sCipherKey;
68*5fd0122aSMatthias Ringwald     }
69*5fd0122aSMatthias Ringwald 
70*5fd0122aSMatthias Ringwald     // Wait until key is written
71*5fd0122aSMatthias Ringwald     while (!BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_KEYWR_OFS))
72*5fd0122aSMatthias Ringwald         ;
73*5fd0122aSMatthias Ringwald 
74*5fd0122aSMatthias Ringwald     return true;
75*5fd0122aSMatthias Ringwald }
76*5fd0122aSMatthias Ringwald 
AES256_encryptData(uint32_t moduleInstance,const uint8_t * data,uint8_t * encryptedData)77*5fd0122aSMatthias Ringwald void AES256_encryptData(uint32_t moduleInstance, const uint8_t * data,
78*5fd0122aSMatthias Ringwald         uint8_t * encryptedData)
79*5fd0122aSMatthias Ringwald {
80*5fd0122aSMatthias Ringwald     uint_fast8_t i;
81*5fd0122aSMatthias Ringwald     uint16_t tempData = 0;
82*5fd0122aSMatthias Ringwald     uint16_t tempVariable = 0;
83*5fd0122aSMatthias Ringwald 
84*5fd0122aSMatthias Ringwald     // Set module to encrypt mode
85*5fd0122aSMatthias Ringwald     AES256_CMSIS(moduleInstance)->CTL0 &= ~AES256_CTL0_OP_MASK;
86*5fd0122aSMatthias Ringwald 
87*5fd0122aSMatthias Ringwald     // Write data to encrypt to module
88*5fd0122aSMatthias Ringwald     for (i = 0; i < 16; i = i + 2)
89*5fd0122aSMatthias Ringwald     {
90*5fd0122aSMatthias Ringwald         tempVariable = (uint16_t) (data[i]);
91*5fd0122aSMatthias Ringwald         tempVariable = tempVariable | ((uint16_t) (data[i + 1]) << 8);
92*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->DIN = tempVariable;
93*5fd0122aSMatthias Ringwald     }
94*5fd0122aSMatthias Ringwald 
95*5fd0122aSMatthias Ringwald     // Key that is already written shall be used
96*5fd0122aSMatthias Ringwald     // Encryption is initialized by setting AES256_STAT_KEYWR to 1
97*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_KEYWR_OFS) = 1;
98*5fd0122aSMatthias Ringwald 
99*5fd0122aSMatthias Ringwald     // Wait unit finished ~167 MCLK
100*5fd0122aSMatthias Ringwald     while (BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_BUSY_OFS))
101*5fd0122aSMatthias Ringwald         ;
102*5fd0122aSMatthias Ringwald 
103*5fd0122aSMatthias Ringwald     // Write encrypted data back to variable
104*5fd0122aSMatthias Ringwald     for (i = 0; i < 16; i = i + 2)
105*5fd0122aSMatthias Ringwald     {
106*5fd0122aSMatthias Ringwald         tempData = AES256_CMSIS(moduleInstance)->DOUT;
107*5fd0122aSMatthias Ringwald         *(encryptedData + i) = (uint8_t) tempData;
108*5fd0122aSMatthias Ringwald         *(encryptedData + i + 1) = (uint8_t) (tempData >> 8);
109*5fd0122aSMatthias Ringwald     }
110*5fd0122aSMatthias Ringwald }
111*5fd0122aSMatthias Ringwald 
AES256_decryptData(uint32_t moduleInstance,const uint8_t * data,uint8_t * decryptedData)112*5fd0122aSMatthias Ringwald void AES256_decryptData(uint32_t moduleInstance, const uint8_t * data,
113*5fd0122aSMatthias Ringwald         uint8_t * decryptedData)
114*5fd0122aSMatthias Ringwald {
115*5fd0122aSMatthias Ringwald     uint_fast8_t i;
116*5fd0122aSMatthias Ringwald     uint16_t tempData = 0;
117*5fd0122aSMatthias Ringwald     uint16_t tempVariable = 0;
118*5fd0122aSMatthias Ringwald 
119*5fd0122aSMatthias Ringwald     // Set module to decrypt mode
120*5fd0122aSMatthias Ringwald     AES256_CMSIS(moduleInstance)->CTL0 |= (AES256_CTL0_OP_3);
121*5fd0122aSMatthias Ringwald 
122*5fd0122aSMatthias Ringwald     // Write data to decrypt to module
123*5fd0122aSMatthias Ringwald     for (i = 0; i < 16; i = i + 2)
124*5fd0122aSMatthias Ringwald     {
125*5fd0122aSMatthias Ringwald         tempVariable = (uint16_t) (data[i + 1] << 8);
126*5fd0122aSMatthias Ringwald         tempVariable = tempVariable | ((uint16_t) (data[i]));
127*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->DIN = tempVariable;
128*5fd0122aSMatthias Ringwald     }
129*5fd0122aSMatthias Ringwald 
130*5fd0122aSMatthias Ringwald     // Key that is already written shall be used
131*5fd0122aSMatthias Ringwald     // Now decryption starts
132*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_KEYWR_OFS) = 1;
133*5fd0122aSMatthias Ringwald 
134*5fd0122aSMatthias Ringwald     // Wait unit finished ~167 MCLK
135*5fd0122aSMatthias Ringwald     while (BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_BUSY_OFS))
136*5fd0122aSMatthias Ringwald         ;
137*5fd0122aSMatthias Ringwald 
138*5fd0122aSMatthias Ringwald     // Write encrypted data back to variable
139*5fd0122aSMatthias Ringwald     for (i = 0; i < 16; i = i + 2)
140*5fd0122aSMatthias Ringwald     {
141*5fd0122aSMatthias Ringwald         tempData = AES256_CMSIS(moduleInstance)->DOUT;
142*5fd0122aSMatthias Ringwald         *(decryptedData + i) = (uint8_t) tempData;
143*5fd0122aSMatthias Ringwald         *(decryptedData + i + 1) = (uint8_t) (tempData >> 8);
144*5fd0122aSMatthias Ringwald     }
145*5fd0122aSMatthias Ringwald }
146*5fd0122aSMatthias Ringwald 
AES256_setDecipherKey(uint32_t moduleInstance,const uint8_t * cipherKey,uint_fast16_t keyLength)147*5fd0122aSMatthias Ringwald bool AES256_setDecipherKey(uint32_t moduleInstance, const uint8_t * cipherKey,
148*5fd0122aSMatthias Ringwald         uint_fast16_t keyLength)
149*5fd0122aSMatthias Ringwald {
150*5fd0122aSMatthias Ringwald     uint8_t i;
151*5fd0122aSMatthias Ringwald     uint16_t tempVariable = 0;
152*5fd0122aSMatthias Ringwald 
153*5fd0122aSMatthias Ringwald     // Set module to decrypt mode
154*5fd0122aSMatthias Ringwald     AES256_CMSIS(moduleInstance)->CTL0 =
155*5fd0122aSMatthias Ringwald             (AES256_CMSIS(moduleInstance)->CTL0 & ~AES256_CTL0_OP_MASK) | AES256_CTL0_OP1;
156*5fd0122aSMatthias Ringwald 
157*5fd0122aSMatthias Ringwald     switch (keyLength)
158*5fd0122aSMatthias Ringwald     {
159*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_128BIT:
160*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__128BIT;
161*5fd0122aSMatthias Ringwald         break;
162*5fd0122aSMatthias Ringwald 
163*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_192BIT:
164*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__192BIT;
165*5fd0122aSMatthias Ringwald         break;
166*5fd0122aSMatthias Ringwald 
167*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_256BIT:
168*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__256BIT;
169*5fd0122aSMatthias Ringwald         break;
170*5fd0122aSMatthias Ringwald 
171*5fd0122aSMatthias Ringwald     default:
172*5fd0122aSMatthias Ringwald         return false;
173*5fd0122aSMatthias Ringwald     }
174*5fd0122aSMatthias Ringwald 
175*5fd0122aSMatthias Ringwald     keyLength = keyLength / 8;
176*5fd0122aSMatthias Ringwald 
177*5fd0122aSMatthias Ringwald     // Write cipher key to key register
178*5fd0122aSMatthias Ringwald     for (i = 0; i < keyLength; i = i + 2)
179*5fd0122aSMatthias Ringwald     {
180*5fd0122aSMatthias Ringwald         tempVariable = (uint16_t) (cipherKey[i]);
181*5fd0122aSMatthias Ringwald         tempVariable = tempVariable | ((uint16_t) (cipherKey[i + 1]) << 8);
182*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->KEY = tempVariable;
183*5fd0122aSMatthias Ringwald     }
184*5fd0122aSMatthias Ringwald 
185*5fd0122aSMatthias Ringwald     // Wait until key is processed ~52 MCLK
186*5fd0122aSMatthias Ringwald     while (BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_BUSY_OFS))
187*5fd0122aSMatthias Ringwald         ;
188*5fd0122aSMatthias Ringwald 
189*5fd0122aSMatthias Ringwald     return true;
190*5fd0122aSMatthias Ringwald }
191*5fd0122aSMatthias Ringwald 
AES256_clearInterruptFlag(uint32_t moduleInstance)192*5fd0122aSMatthias Ringwald void AES256_clearInterruptFlag(uint32_t moduleInstance)
193*5fd0122aSMatthias Ringwald {
194*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->CTL0,AES256_CTL0_RDYIFG_OFS) = 0;
195*5fd0122aSMatthias Ringwald }
196*5fd0122aSMatthias Ringwald 
AES256_getInterruptFlagStatus(uint32_t moduleInstance)197*5fd0122aSMatthias Ringwald uint32_t AES256_getInterruptFlagStatus(uint32_t moduleInstance)
198*5fd0122aSMatthias Ringwald {
199*5fd0122aSMatthias Ringwald     return BITBAND_PERI(AES256_CMSIS(moduleInstance)->CTL0, AES256_CTL0_RDYIFG_OFS);
200*5fd0122aSMatthias Ringwald }
201*5fd0122aSMatthias Ringwald 
AES256_enableInterrupt(uint32_t moduleInstance)202*5fd0122aSMatthias Ringwald void AES256_enableInterrupt(uint32_t moduleInstance)
203*5fd0122aSMatthias Ringwald {
204*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->CTL0,AES256_CTL0_RDYIE_OFS) = 1;
205*5fd0122aSMatthias Ringwald }
206*5fd0122aSMatthias Ringwald 
AES256_disableInterrupt(uint32_t moduleInstance)207*5fd0122aSMatthias Ringwald void AES256_disableInterrupt(uint32_t moduleInstance)
208*5fd0122aSMatthias Ringwald {
209*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->CTL0,AES256_CTL0_RDYIE_OFS) = 0;
210*5fd0122aSMatthias Ringwald }
211*5fd0122aSMatthias Ringwald 
AES256_reset(uint32_t moduleInstance)212*5fd0122aSMatthias Ringwald void AES256_reset(uint32_t moduleInstance)
213*5fd0122aSMatthias Ringwald {
214*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->CTL0,AES256_CTL0_SWRST_OFS) = 1;
215*5fd0122aSMatthias Ringwald }
216*5fd0122aSMatthias Ringwald 
AES256_startEncryptData(uint32_t moduleInstance,const uint8_t * data)217*5fd0122aSMatthias Ringwald void AES256_startEncryptData(uint32_t moduleInstance, const uint8_t * data)
218*5fd0122aSMatthias Ringwald {
219*5fd0122aSMatthias Ringwald     uint8_t i;
220*5fd0122aSMatthias Ringwald     uint16_t tempVariable = 0;
221*5fd0122aSMatthias Ringwald 
222*5fd0122aSMatthias Ringwald     // Set module to encrypt mode
223*5fd0122aSMatthias Ringwald     AES256_CMSIS(moduleInstance)->CTL0 &= ~AES256_CTL0_OP_MASK;
224*5fd0122aSMatthias Ringwald 
225*5fd0122aSMatthias Ringwald     // Write data to encrypt to module
226*5fd0122aSMatthias Ringwald     for (i = 0; i < 16; i = i + 2)
227*5fd0122aSMatthias Ringwald     {
228*5fd0122aSMatthias Ringwald         tempVariable = (uint16_t) (data[i]);
229*5fd0122aSMatthias Ringwald         tempVariable = tempVariable | ((uint16_t) (data[i + 1]) << 8);
230*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->DIN = tempVariable;
231*5fd0122aSMatthias Ringwald     }
232*5fd0122aSMatthias Ringwald 
233*5fd0122aSMatthias Ringwald     // Key that is already written shall be used
234*5fd0122aSMatthias Ringwald     // Encryption is initialized by setting AES256_STAT_KEYWR to 1
235*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_KEYWR_OFS) = 1;
236*5fd0122aSMatthias Ringwald }
237*5fd0122aSMatthias Ringwald 
AES256_startDecryptData(uint32_t moduleInstance,const uint8_t * data)238*5fd0122aSMatthias Ringwald void AES256_startDecryptData(uint32_t moduleInstance, const uint8_t * data)
239*5fd0122aSMatthias Ringwald {
240*5fd0122aSMatthias Ringwald     uint_fast8_t i;
241*5fd0122aSMatthias Ringwald     uint16_t tempVariable = 0;
242*5fd0122aSMatthias Ringwald 
243*5fd0122aSMatthias Ringwald     // Set module to decrypt mode
244*5fd0122aSMatthias Ringwald     AES256_CMSIS(moduleInstance)->CTL0 |= (AES256_CTL0_OP_3);
245*5fd0122aSMatthias Ringwald 
246*5fd0122aSMatthias Ringwald     // Write data to decrypt to module
247*5fd0122aSMatthias Ringwald     for (i = 0; i < 16; i = i + 2)
248*5fd0122aSMatthias Ringwald     {
249*5fd0122aSMatthias Ringwald         tempVariable = (uint16_t) (data[i + 1] << 8);
250*5fd0122aSMatthias Ringwald         tempVariable = tempVariable | ((uint16_t) (data[i]));
251*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->DIN = tempVariable;
252*5fd0122aSMatthias Ringwald     }
253*5fd0122aSMatthias Ringwald 
254*5fd0122aSMatthias Ringwald     // Key that is already written shall be used
255*5fd0122aSMatthias Ringwald     // Now decryption starts
256*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_KEYWR_OFS) = 1;
257*5fd0122aSMatthias Ringwald }
258*5fd0122aSMatthias Ringwald 
AES256_startSetDecipherKey(uint32_t moduleInstance,const uint8_t * cipherKey,uint_fast16_t keyLength)259*5fd0122aSMatthias Ringwald bool AES256_startSetDecipherKey(uint32_t moduleInstance,
260*5fd0122aSMatthias Ringwald         const uint8_t * cipherKey, uint_fast16_t keyLength)
261*5fd0122aSMatthias Ringwald {
262*5fd0122aSMatthias Ringwald     uint_fast8_t i;
263*5fd0122aSMatthias Ringwald     uint16_t tempVariable = 0;
264*5fd0122aSMatthias Ringwald 
265*5fd0122aSMatthias Ringwald     AES256_CMSIS(moduleInstance)->CTL0 =
266*5fd0122aSMatthias Ringwald             (AES256_CMSIS(moduleInstance)->CTL0 & ~AES256_CTL0_OP_MASK) | AES256_CTL0_OP1;
267*5fd0122aSMatthias Ringwald 
268*5fd0122aSMatthias Ringwald     switch (keyLength)
269*5fd0122aSMatthias Ringwald     {
270*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_128BIT:
271*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__128BIT;
272*5fd0122aSMatthias Ringwald         break;
273*5fd0122aSMatthias Ringwald 
274*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_192BIT:
275*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__192BIT;
276*5fd0122aSMatthias Ringwald         break;
277*5fd0122aSMatthias Ringwald 
278*5fd0122aSMatthias Ringwald     case AES256_KEYLENGTH_256BIT:
279*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->CTL0 |= AES256_CTL0_KL__256BIT;
280*5fd0122aSMatthias Ringwald         break;
281*5fd0122aSMatthias Ringwald 
282*5fd0122aSMatthias Ringwald     default:
283*5fd0122aSMatthias Ringwald         return false;
284*5fd0122aSMatthias Ringwald     }
285*5fd0122aSMatthias Ringwald 
286*5fd0122aSMatthias Ringwald     keyLength = keyLength / 8;
287*5fd0122aSMatthias Ringwald 
288*5fd0122aSMatthias Ringwald     // Write cipher key to key register
289*5fd0122aSMatthias Ringwald     for (i = 0; i < keyLength; i = i + 2)
290*5fd0122aSMatthias Ringwald     {
291*5fd0122aSMatthias Ringwald         tempVariable = (uint16_t) (cipherKey[i]);
292*5fd0122aSMatthias Ringwald         tempVariable = tempVariable | ((uint16_t) (cipherKey[i + 1]) << 8);
293*5fd0122aSMatthias Ringwald         AES256_CMSIS(moduleInstance)->KEY = tempVariable;
294*5fd0122aSMatthias Ringwald     }
295*5fd0122aSMatthias Ringwald 
296*5fd0122aSMatthias Ringwald     return true;
297*5fd0122aSMatthias Ringwald }
298*5fd0122aSMatthias Ringwald 
AES256_getDataOut(uint32_t moduleInstance,uint8_t * outputData)299*5fd0122aSMatthias Ringwald bool AES256_getDataOut(uint32_t moduleInstance, uint8_t *outputData)
300*5fd0122aSMatthias Ringwald {
301*5fd0122aSMatthias Ringwald     uint8_t i;
302*5fd0122aSMatthias Ringwald     uint16_t tempData = 0;
303*5fd0122aSMatthias Ringwald 
304*5fd0122aSMatthias Ringwald     // If module is busy, exit and return failure
305*5fd0122aSMatthias Ringwald     if (BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_BUSY_OFS))
306*5fd0122aSMatthias Ringwald         return false;
307*5fd0122aSMatthias Ringwald 
308*5fd0122aSMatthias Ringwald     // Write encrypted data back to variable
309*5fd0122aSMatthias Ringwald     for (i = 0; i < 16; i = i + 2)
310*5fd0122aSMatthias Ringwald     {
311*5fd0122aSMatthias Ringwald         tempData = AES256_CMSIS(moduleInstance)->DOUT;
312*5fd0122aSMatthias Ringwald         *(outputData + i) = (uint8_t) tempData;
313*5fd0122aSMatthias Ringwald         *(outputData + i + 1) = (uint8_t) (tempData >> 8);
314*5fd0122aSMatthias Ringwald     }
315*5fd0122aSMatthias Ringwald 
316*5fd0122aSMatthias Ringwald     return true;
317*5fd0122aSMatthias Ringwald }
318*5fd0122aSMatthias Ringwald 
AES256_isBusy(uint32_t moduleInstance)319*5fd0122aSMatthias Ringwald bool AES256_isBusy(uint32_t moduleInstance)
320*5fd0122aSMatthias Ringwald {
321*5fd0122aSMatthias Ringwald     return BITBAND_PERI(AES256_CMSIS(moduleInstance)->STAT, AES256_STAT_BUSY_OFS);
322*5fd0122aSMatthias Ringwald }
323*5fd0122aSMatthias Ringwald 
AES256_clearErrorFlag(uint32_t moduleInstance)324*5fd0122aSMatthias Ringwald void AES256_clearErrorFlag(uint32_t moduleInstance)
325*5fd0122aSMatthias Ringwald {
326*5fd0122aSMatthias Ringwald     BITBAND_PERI(AES256_CMSIS(moduleInstance)->CTL0, AES256_CTL0_ERRFG_OFS) = 0;
327*5fd0122aSMatthias Ringwald }
328*5fd0122aSMatthias Ringwald 
AES256_getErrorFlagStatus(uint32_t moduleInstance)329*5fd0122aSMatthias Ringwald uint32_t AES256_getErrorFlagStatus(uint32_t moduleInstance)
330*5fd0122aSMatthias Ringwald {
331*5fd0122aSMatthias Ringwald     return BITBAND_PERI(AES256_CMSIS(moduleInstance)->CTL0, AES256_CTL0_ERRFG_OFS);
332*5fd0122aSMatthias Ringwald }
333*5fd0122aSMatthias Ringwald 
AES256_registerInterrupt(uint32_t moduleInstance,void (* intHandler)(void))334*5fd0122aSMatthias Ringwald void AES256_registerInterrupt(uint32_t moduleInstance, void (*intHandler)(void))
335*5fd0122aSMatthias Ringwald {
336*5fd0122aSMatthias Ringwald     Interrupt_registerInterrupt(INT_AES256, intHandler);
337*5fd0122aSMatthias Ringwald     Interrupt_enableInterrupt(INT_AES256);
338*5fd0122aSMatthias Ringwald }
339*5fd0122aSMatthias Ringwald 
AES256_unregisterInterrupt(uint32_t moduleInstance)340*5fd0122aSMatthias Ringwald void AES256_unregisterInterrupt(uint32_t moduleInstance)
341*5fd0122aSMatthias Ringwald {
342*5fd0122aSMatthias Ringwald     Interrupt_disableInterrupt(INT_AES256);
343*5fd0122aSMatthias Ringwald     Interrupt_unregisterInterrupt(INT_AES256);
344*5fd0122aSMatthias Ringwald }
345*5fd0122aSMatthias Ringwald 
AES256_getInterruptStatus(uint32_t moduleInstance)346*5fd0122aSMatthias Ringwald uint32_t AES256_getInterruptStatus(uint32_t moduleInstance)
347*5fd0122aSMatthias Ringwald {
348*5fd0122aSMatthias Ringwald     return AES256_getInterruptFlagStatus(moduleInstance);
349*5fd0122aSMatthias Ringwald }
350*5fd0122aSMatthias Ringwald 
351