]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/Common/drivers/Atmel/at91lib/peripherals/tdes/tdes.c
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / Common / drivers / Atmel / at91lib / peripherals / tdes / tdes.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 "tdes.h"\r
39 #include <board.h>\r
40 #include <utility/assert.h>\r
41 #include <utility/trace.h>\r
42 \r
43 //------------------------------------------------------------------------------\r
44 //         Global functions\r
45 //------------------------------------------------------------------------------\r
46 \r
47 //------------------------------------------------------------------------------\r
48 /// Configures the triple-DES peripheral to cipher/decipher, use single-DES or\r
49 /// triple-DES, use two or three keys (when in triple-DES mode), start manually,\r
50 /// automatically or via the PDC and use the given operating mode (ECB, CBC,\r
51 /// CFB or OFB).\r
52 /// \param cipher  Encrypts if 1, decrypts if 0.\r
53 /// \param tdesmod  Single- or triple-DES mode.\r
54 /// \param keymod  Use two or three keys (must be 0 in single-DES mode).\r
55 /// \param smod  Start mode.\r
56 /// \param opmod  Encryption/decryption mode.\r
57 //------------------------------------------------------------------------------\r
58 void TDES_Configure(\r
59     unsigned char cipher,\r
60     unsigned int tdesmod,\r
61     unsigned int keymod,\r
62     unsigned int smod,\r
63     unsigned int opmod)\r
64 {\r
65     trace_LOG(trace_DEBUG, "-D- TDES_Configure()\n\r");\r
66     SANITY_CHECK((cipher & 0xFFFFFFFE) == 0);\r
67     SANITY_CHECK((tdesmod & 0xFFFFFFFD) == 0);\r
68     SANITY_CHECK((keymod & 0xFFFFFFEF) == 0);\r
69     SANITY_CHECK((smod & 0xFFFFFCFF) == 0);\r
70     SANITY_CHECK((opmod & 0xFFFFCFFF) == 0);\r
71 \r
72     // Reset peripheral\r
73     AT91C_BASE_TDES->TDES_CR = AT91C_TDES_SWRST;\r
74 \r
75     // Configure mode register\r
76     AT91C_BASE_TDES->TDES_MR = cipher | tdesmod | keymod | smod | opmod;\r
77 }\r
78 \r
79 //------------------------------------------------------------------------------\r
80 /// Starts the encryption or decryption process if the TDES peripheral is\r
81 /// configured in manual or PDC mode.\r
82 //------------------------------------------------------------------------------\r
83 void TDES_Start(void)\r
84 {\r
85     trace_LOG(trace_DEBUG, "-D- TDES_Start()\n\r");\r
86     SANITY_CHECK(((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_SMOD) == AT91C_TDES_SMOD_MANUAL)\r
87                  || ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_SMOD) == AT91C_TDES_SMOD_PDC));\r
88 \r
89     // Manual mode\r
90     if ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_SMOD) == AT91C_TDES_SMOD_MANUAL) {\r
91 \r
92         AT91C_BASE_TDES->TDES_CR = AT91C_TDES_START;\r
93     }\r
94     // PDC mode\r
95     else {\r
96 \r
97         AT91C_BASE_TDES->TDES_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN;\r
98     }\r
99 }\r
100 \r
101 //------------------------------------------------------------------------------\r
102 /// Returns the current status register value of the TDES peripheral.\r
103 //------------------------------------------------------------------------------\r
104 unsigned int TDES_GetStatus(void)\r
105 {\r
106     trace_LOG(trace_DEBUG, "-D- TDES_GetStatus()\n\r");\r
107 \r
108     return AT91C_BASE_TDES->TDES_ISR;\r
109 }\r
110 \r
111 //------------------------------------------------------------------------------\r
112 /// Sets the 64-bits keys (one, two or three depending on the configuration)\r
113 /// that shall be used by the TDES algorithm.\r
114 /// \param pKey1  Pointer to key #1.\r
115 /// \param pKey2  Pointer to key #2 (shall be 0 in single-DES mode).\r
116 /// \param pKey3  Pointer to key #3 (shall be 0 when using two keys).\r
117 //------------------------------------------------------------------------------\r
118 void TDES_SetKeys(\r
119     const unsigned int *pKey1,\r
120     const unsigned int *pKey2,\r
121     const unsigned int *pKey3)\r
122 {\r
123     trace_LOG(trace_DEBUG, "-D- TDES_SetKeys()\n\r");\r
124     SANITY_CHECK(pKey1);\r
125     SANITY_CHECK((pKey2 && ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_TDESMOD) == AT91C_TDES_TDESMOD))\r
126                  || (!pKey2 && ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_TDESMOD) == 0)));\r
127     SANITY_CHECK((pKey3\r
128                   && ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_TDESMOD) == AT91C_TDES_TDESMOD)\r
129                   && ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_KEYMOD) == 0))\r
130                  ||\r
131                  (!pKey3\r
132                   && ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_TDESMOD) == AT91C_TDES_TDESMOD)\r
133                   && ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_KEYMOD) == AT91C_TDES_KEYMOD))\r
134                  ||\r
135                  (!pKey3\r
136                   && ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_TDESMOD) == 0)\r
137                   && ((AT91C_BASE_TDES->TDES_MR & AT91C_TDES_KEYMOD) == 0)));\r
138 \r
139     // Write key #1\r
140     if (pKey1) {\r
141 \r
142         AT91C_BASE_TDES->TDES_KEY1WxR[0] = pKey1[0];\r
143         AT91C_BASE_TDES->TDES_KEY1WxR[1] = pKey1[1];\r
144     }\r
145 \r
146     // Write key #2\r
147     if (pKey1) {\r
148 \r
149         AT91C_BASE_TDES->TDES_KEY2WxR[0] = pKey2[0];\r
150         AT91C_BASE_TDES->TDES_KEY2WxR[1] = pKey2[1];\r
151     }\r
152 \r
153     // Write key #2\r
154     if (pKey1) {\r
155 \r
156         AT91C_BASE_TDES->TDES_KEY3WxR[0] = pKey3[0];\r
157         AT91C_BASE_TDES->TDES_KEY3WxR[1] = pKey3[1];\r
158     }\r
159 }\r
160 \r
161 //------------------------------------------------------------------------------\r
162 /// Sets the input data to encrypt/decrypt using TDES.\r
163 /// \param pInput  Pointer to the 64-bits input data.\r
164 //------------------------------------------------------------------------------\r
165 void TDES_SetInputData(const unsigned int *pInput)\r
166 {\r
167     trace_LOG(trace_DEBUG, "-D- TDES_SetInputData()\n\r");\r
168     SANITY_CHECK(pInput);\r
169 \r
170     AT91C_BASE_TDES->TDES_IDATAxR[0] = pInput[0];\r
171     AT91C_BASE_TDES->TDES_IDATAxR[1] = pInput[1];\r
172 }\r
173 \r
174 //------------------------------------------------------------------------------\r
175 /// Sets the input data buffer to encrypt/decrypt when in PDC mode.\r
176 /// \param pInput  Pointer to the input data.\r
177 /// \param size  Size of buffer in bytes.\r
178 //------------------------------------------------------------------------------\r
179 void TDES_SetInputBuffer(const unsigned int *pInput, unsigned int size)\r
180 {\r
181     trace_LOG(trace_DEBUG, "-D- TDES_SetInputBuffer()\n\r");\r
182     SANITY_CHECK(pInput);\r
183     SANITY_CHECK((size > 0) && ((size % 8) == 0));\r
184 \r
185     AT91C_BASE_TDES->TDES_TPR = (unsigned int) pInput;\r
186     AT91C_BASE_TDES->TDES_TCR = size / 4;\r
187 }\r
188 \r
189 //------------------------------------------------------------------------------\r
190 /// Stores the output data from the last TDES operation into the given 64-bits\r
191 /// buffers.\r
192 /// \param pOutput  Pointer to a 64-bits output buffer.\r
193 //------------------------------------------------------------------------------\r
194 void TDES_GetOutputData(unsigned int *pOutput)\r
195 {\r
196     trace_LOG(trace_DEBUG, "-D- TDES_GetOutputData()\n\r");\r
197     SANITY_CHECK(pOutput);\r
198 \r
199     pOutput[0] = AT91C_BASE_TDES->TDES_ODATAxR[0];\r
200     pOutput[1] = AT91C_BASE_TDES->TDES_ODATAxR[1];\r
201 }\r
202 \r
203 //------------------------------------------------------------------------------\r
204 /// Sets the output buffer which will receive the encrypted/decrypted data when\r
205 /// using the PDC.\r
206 /// \param pOutput  Pointer to the output data.\r
207 /// \param size  Size of buffer in bytes.\r
208 //------------------------------------------------------------------------------\r
209 void TDES_SetOutputBuffer(unsigned int *pOutput, unsigned int size)\r
210 {\r
211     trace_LOG(trace_DEBUG, "-D- TDES_SetOutputBuffer()\n\r");\r
212     SANITY_CHECK(pOutput);\r
213     SANITY_CHECK((size > 0) && ((size % 8) == 0));\r
214 \r
215     AT91C_BASE_TDES->TDES_RPR = (unsigned int) pOutput;\r
216     AT91C_BASE_TDES->TDES_RCR = size / 4;\r
217 }\r
218 \r
219 //------------------------------------------------------------------------------\r
220 /// Sets the initialization vector to use when the TDES algorithm is configured\r
221 /// in a chained block mode (CBC, CFB or OFB).\r
222 /// \param pVector  Pointer to the 64-bits vector.\r
223 //------------------------------------------------------------------------------\r
224 void TDES_SetVector(const unsigned int *pVector)\r
225 {\r
226     trace_LOG(trace_DEBUG, "-D- TDES_SetVector()\n\r");\r
227     SANITY_CHECK(pVector);\r
228 \r
229     AT91C_BASE_TDES->TDES_IVxR[0] = pVector[0];\r
230     AT91C_BASE_TDES->TDES_IVxR[1] = pVector[1];\r
231 }\r
232 \r