]> git.sur5r.net Git - freertos/blob - Demo/Common/drivers/Atmel/at91lib/peripherals/aes/aes.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / Common / drivers / Atmel / at91lib / peripherals / aes / aes.c
1 /* ----------------------------------------------------------------------------\r
2  *         ATMEL Microcontroller Software Support \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2008, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 #ifndef trace_LEVEL\r
31     #define trace_LEVEL     1\r
32 #endif\r
33 \r
34 //------------------------------------------------------------------------------\r
35 //         Headers\r
36 //------------------------------------------------------------------------------\r
37 \r
38 #include "aes.h"\r
39 #include <board.h>\r
40 #include <utility/trace.h>\r
41 #include <utility/assert.h>\r
42 \r
43 //------------------------------------------------------------------------------\r
44 //         Global functions\r
45 //------------------------------------------------------------------------------\r
46 \r
47 //------------------------------------------------------------------------------\r
48 /// Configures the AES peripheral to encrypt/decrypt, start mode (manual, auto,\r
49 /// PDC) and operating mode (ECB, CBC, OFB, CFB, CTR).\r
50 /// \param cipher  Indicates if the peripheral should encrypt or decrypt data.\r
51 /// \param smode  Start mode.\r
52 /// \param opmode  Operating mode.\r
53 //------------------------------------------------------------------------------\r
54 void AES_Configure(\r
55     unsigned char cipher,\r
56     unsigned int smode,\r
57     unsigned int opmode)\r
58 {\r
59     trace_LOG(trace_DEBUG, "-D- AES_Configure()\n\r");\r
60     SANITY_CHECK((cipher & 0xFFFFFFFE) == 0);\r
61     SANITY_CHECK((smode & 0xFFFFFCFF) == 0);\r
62     SANITY_CHECK((opmode & 0xFFFF8FFF) == 0);\r
63 \r
64     // Reset the peripheral first\r
65     AT91C_BASE_AES->AES_CR = AT91C_AES_SWRST;\r
66 \r
67     // Configure mode register\r
68     AT91C_BASE_AES->AES_MR = cipher | smode | opmode;\r
69 }\r
70 \r
71 //------------------------------------------------------------------------------\r
72 /// Sets the key used by the AES algorithm to cipher the plain text or\r
73 /// decipher the encrypted text.\r
74 /// \param pKey  Pointer to a 16-bytes cipher key.\r
75 //------------------------------------------------------------------------------\r
76 void AES_SetKey(const unsigned int *pKey)\r
77 {\r
78     trace_LOG(trace_DEBUG, "-D- AES_SetKey()\n\r");\r
79     SANITY_CHECK(pKey);\r
80 \r
81     AT91C_BASE_AES->AES_KEYWxR[0] = pKey[0];\r
82     AT91C_BASE_AES->AES_KEYWxR[1] = pKey[1];\r
83     AT91C_BASE_AES->AES_KEYWxR[2] = pKey[2];\r
84     AT91C_BASE_AES->AES_KEYWxR[3] = pKey[3];\r
85 }\r
86 \r
87 //------------------------------------------------------------------------------\r
88 /// Sets the initialization vector that is used to encrypt the plain text or\r
89 /// decrypt the cipher text in chained block modes (CBC, CFB, OFB & CTR).\r
90 /// \param pVector  Pointer to a 16-bytes initialization vector.\r
91 //------------------------------------------------------------------------------\r
92 void AES_SetVector(const unsigned int *pVector)\r
93 {\r
94     trace_LOG(trace_DEBUG, "-D- AES_SetVector()\n\r");\r
95     SANITY_CHECK(pVector);\r
96 \r
97     AT91C_BASE_AES->AES_IVxR[0] = pVector[0];\r
98     AT91C_BASE_AES->AES_IVxR[1] = pVector[1];\r
99     AT91C_BASE_AES->AES_IVxR[2] = pVector[2];\r
100     AT91C_BASE_AES->AES_IVxR[3] = pVector[3];\r
101 }\r
102 \r
103 //------------------------------------------------------------------------------\r
104 /// Sets the input data of the AES algorithm (i.e. plain text in cipher mode,\r
105 /// ciphered text in decipher mode). If auto mode is active, the encryption is\r
106 /// started automatically after writing the last word.\r
107 /// \param pData  Pointer to the 16-bytes data to cipher/decipher.\r
108 //------------------------------------------------------------------------------\r
109 void AES_SetInputData(const unsigned int *pData)\r
110 {\r
111     trace_LOG(trace_DEBUG, "-D- AES_SetInputData()\n\r");\r
112     SANITY_CHECK(pData);\r
113 \r
114     AT91C_BASE_AES->AES_IDATAxR[0] = pData[0];\r
115     AT91C_BASE_AES->AES_IDATAxR[1] = pData[1];\r
116     AT91C_BASE_AES->AES_IDATAxR[2] = pData[2];\r
117     AT91C_BASE_AES->AES_IDATAxR[3] = pData[3];\r
118 }\r
119 \r
120 //------------------------------------------------------------------------------\r
121 /// Stores the result of the last AES operation (encrypt/decrypt) in the\r
122 /// provided buffer.\r
123 /// \param pData  Pointer to a 16-bytes buffer.\r
124 //------------------------------------------------------------------------------\r
125 void AES_GetOutputData(unsigned int *pData)\r
126 {\r
127     trace_LOG(trace_DEBUG, "-D- AES_GetOutputData()\n\r");\r
128     SANITY_CHECK(pData);\r
129 \r
130     pData[0] = AT91C_BASE_AES->AES_ODATAxR[0];\r
131     pData[1] = AT91C_BASE_AES->AES_ODATAxR[1];\r
132     pData[2] = AT91C_BASE_AES->AES_ODATAxR[2];\r
133     pData[3] = AT91C_BASE_AES->AES_ODATAxR[3];\r
134 }\r
135 \r
136 //------------------------------------------------------------------------------\r
137 /// Sets the input buffer to use when in PDC mode.\r
138 /// \param pInput  Pointer to the input buffer.\r
139 //------------------------------------------------------------------------------\r
140 void AES_SetInputBuffer(const unsigned int *pInput)\r
141 {\r
142     trace_LOG(trace_DEBUG, "-D- AES_SetInputBuffer()\n\r");\r
143     SANITY_CHECK(pInput);\r
144 \r
145     AT91C_BASE_AES->AES_TPR = (unsigned int) pInput;\r
146     AT91C_BASE_AES->AES_TCR = 4;\r
147 }\r
148 \r
149 //------------------------------------------------------------------------------\r
150 /// Sets the output buffer to use when in PDC mode.\r
151 /// \param pOutput  Pointer to the output buffer.\r
152 //------------------------------------------------------------------------------\r
153 void AES_SetOutputBuffer(unsigned int *pOutput)\r
154 {\r
155     trace_LOG(trace_DEBUG, "-D- AES_SetOutputBuffer()\n\r");\r
156     SANITY_CHECK(pOutput);\r
157 \r
158     AT91C_BASE_AES->AES_RPR = (unsigned int) pOutput;\r
159     AT91C_BASE_AES->AES_RCR = 4;\r
160 }\r
161 \r
162 //------------------------------------------------------------------------------\r
163 /// Starts the encryption/decryption process when in manual or PDC mode. In\r
164 /// manual mode, the key and input data must have been entered using\r
165 /// AES_SetKey() and AES_SetInputData(). In PDC mode, the key, input & output\r
166 /// buffer must have been set using AES_SetKey(), AES_SetInputBuffer() and\r
167 /// AES_SetOutputBuffer().\r
168 //------------------------------------------------------------------------------\r
169 void AES_Start(void)\r
170 {\r
171     trace_LOG(trace_DEBUG, "AES_Start()\n\r");\r
172     SANITY_CHECK(((AT91C_BASE_AES->AES_MR & AT91C_AES_SMOD) == AT91C_AES_SMOD_MANUAL)\r
173                  || ((AT91C_BASE_AES->AES_MR & AT91C_AES_SMOD) == AT91C_AES_SMOD_PDC));\r
174 \r
175     // Manual mode\r
176     if ((AT91C_BASE_AES->AES_MR & AT91C_AES_SMOD) == AT91C_AES_SMOD_MANUAL) {\r
177 \r
178         AT91C_BASE_AES->AES_CR = AT91C_AES_START;\r
179     }\r
180     // PDC\r
181     else {\r
182 \r
183         AT91C_BASE_AES->AES_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN;\r
184     }\r
185 }\r
186 \r
187 //------------------------------------------------------------------------------\r
188 /// Returns the current value of the AES interrupt status register.\r
189 //------------------------------------------------------------------------------\r
190 unsigned int AES_GetStatus(void)\r
191 {\r
192     trace_LOG(trace_DEBUG, "-D- AES_GetStatus()\n\r");\r
193 \r
194     return AT91C_BASE_AES->AES_ISR;\r
195 }\r
196 \r