mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
179:b0033dcd6934
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 50:a417edff4437 1 /***************************************************************************//**
mbed_official 50:a417edff4437 2 * @file em_crypto.c
mbed_official 50:a417edff4437 3 * @brief Cryptography accelerator peripheral API
AnnaBridge 179:b0033dcd6934 4 * @version 5.3.3
mbed_official 50:a417edff4437 5 *******************************************************************************
AnnaBridge 179:b0033dcd6934 6 * # License
<> 150:02e0a0aed4ec 7 * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b>
mbed_official 50:a417edff4437 8 *******************************************************************************
mbed_official 50:a417edff4437 9 *
mbed_official 50:a417edff4437 10 * Permission is granted to anyone to use this software for any purpose,
mbed_official 50:a417edff4437 11 * including commercial applications, and to alter it and redistribute it
mbed_official 50:a417edff4437 12 * freely, subject to the following restrictions:
mbed_official 50:a417edff4437 13 *
mbed_official 50:a417edff4437 14 * 1. The origin of this software must not be misrepresented; you must not
mbed_official 50:a417edff4437 15 * claim that you wrote the original software.@n
mbed_official 50:a417edff4437 16 * 2. Altered source versions must be plainly marked as such, and must not be
mbed_official 50:a417edff4437 17 * misrepresented as being the original software.@n
mbed_official 50:a417edff4437 18 * 3. This notice may not be removed or altered from any source distribution.
mbed_official 50:a417edff4437 19 *
mbed_official 50:a417edff4437 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
mbed_official 50:a417edff4437 21 * obligation to support this Software. Silicon Labs is providing the
mbed_official 50:a417edff4437 22 * Software "AS IS", with no express or implied warranties of any kind,
mbed_official 50:a417edff4437 23 * including, but not limited to, any implied warranties of merchantability
mbed_official 50:a417edff4437 24 * or fitness for any particular purpose or warranties against infringement
mbed_official 50:a417edff4437 25 * of any proprietary rights of a third party.
mbed_official 50:a417edff4437 26 *
mbed_official 50:a417edff4437 27 * Silicon Labs will not be liable for any consequential, incidental, or
mbed_official 50:a417edff4437 28 * special damages, or any other relief, or for any claim by any third party,
mbed_official 50:a417edff4437 29 * arising from your use of this Software.
mbed_official 50:a417edff4437 30 *
mbed_official 50:a417edff4437 31 ******************************************************************************/
mbed_official 50:a417edff4437 32 #include "em_device.h"
mbed_official 50:a417edff4437 33
mbed_official 50:a417edff4437 34 #if defined(CRYPTO_COUNT) && (CRYPTO_COUNT > 0)
mbed_official 50:a417edff4437 35
mbed_official 50:a417edff4437 36 #include "em_crypto.h"
mbed_official 50:a417edff4437 37 #include "em_assert.h"
mbed_official 50:a417edff4437 38
mbed_official 50:a417edff4437 39 /***************************************************************************//**
<> 150:02e0a0aed4ec 40 * @addtogroup emlib
mbed_official 50:a417edff4437 41 * @{
mbed_official 50:a417edff4437 42 ******************************************************************************/
mbed_official 50:a417edff4437 43
mbed_official 50:a417edff4437 44 /***************************************************************************//**
mbed_official 50:a417edff4437 45 * @addtogroup CRYPTO
mbed_official 50:a417edff4437 46 * @{
mbed_official 50:a417edff4437 47 ******************************************************************************/
mbed_official 50:a417edff4437 48
mbed_official 50:a417edff4437 49 /*******************************************************************************
mbed_official 50:a417edff4437 50 ******************************* DEFINES ***********************************
mbed_official 50:a417edff4437 51 ******************************************************************************/
mbed_official 50:a417edff4437 52
mbed_official 50:a417edff4437 53 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
mbed_official 50:a417edff4437 54
mbed_official 50:a417edff4437 55 #define CRYPTO_INSTRUCTIONS_PER_REG (4)
mbed_official 50:a417edff4437 56 #define CRYPTO_INSTRUCTIONS_MAX (12)
AnnaBridge 179:b0033dcd6934 57 #define CRYPTO_INSTRUCTION_REGS (CRYPTO_INSTRUCTIONS_MAX / CRYPTO_INSTRUCTIONS_PER_REG)
mbed_official 50:a417edff4437 58
mbed_official 50:a417edff4437 59 #define CRYPTO_SHA1_BLOCK_SIZE_IN_BITS (512)
AnnaBridge 179:b0033dcd6934 60 #define CRYPTO_SHA1_BLOCK_SIZE_IN_BYTES (CRYPTO_SHA1_BLOCK_SIZE_IN_BITS / 8)
AnnaBridge 179:b0033dcd6934 61 #define CRYPTO_SHA1_BLOCK_SIZE_IN_32BIT_WORDS (CRYPTO_SHA1_BLOCK_SIZE_IN_BYTES / sizeof(uint32_t))
AnnaBridge 179:b0033dcd6934 62 #define CRYPTO_SHA1_DIGEST_SIZE_IN_32BIT_WORDS (CRYPTO_SHA1_DIGEST_SIZE_IN_BYTES / sizeof(uint32_t))
mbed_official 50:a417edff4437 63
mbed_official 50:a417edff4437 64 #define CRYPTO_SHA256_BLOCK_SIZE_IN_BITS (512)
AnnaBridge 179:b0033dcd6934 65 #define CRYPTO_SHA256_BLOCK_SIZE_IN_BYTES (CRYPTO_SHA256_BLOCK_SIZE_IN_BITS / 8)
AnnaBridge 179:b0033dcd6934 66 #define CRYPTO_SHA256_BLOCK_SIZE_IN_32BIT_WORDS (CRYPTO_SHA256_BLOCK_SIZE_IN_BYTES / sizeof(uint32_t))
mbed_official 50:a417edff4437 67
AnnaBridge 179:b0033dcd6934 68 #define CRYPTO_SHA256_DIGEST_SIZE_IN_32BIT_WORDS (CRYPTO_SHA256_DIGEST_SIZE_IN_BYTES / sizeof(uint32_t))
mbed_official 50:a417edff4437 69
mbed_official 50:a417edff4437 70 #define PARTIAL_OPERAND_WIDTH_LOG2 (7) /* 2^7 = 128 */
AnnaBridge 179:b0033dcd6934 71 #define PARTIAL_OPERAND_WIDTH (1 << PARTIAL_OPERAND_WIDTH_LOG2)
AnnaBridge 179:b0033dcd6934 72 #define PARTIAL_OPERAND_WIDTH_MASK (PARTIAL_OPERAND_WIDTH - 1)
AnnaBridge 179:b0033dcd6934 73 #define PARTIAL_OPERAND_WIDTH_IN_BYTES (PARTIAL_OPERAND_WIDTH / 8)
AnnaBridge 179:b0033dcd6934 74 #define PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS (PARTIAL_OPERAND_WIDTH_IN_BYTES / sizeof(uint32_t))
mbed_official 50:a417edff4437 75
mbed_official 50:a417edff4437 76 #define SWAP32(x) (__REV(x))
mbed_official 50:a417edff4437 77
mbed_official 50:a417edff4437 78 #define CRYPTO_AES_BLOCKSIZE (16)
mbed_official 50:a417edff4437 79
mbed_official 50:a417edff4437 80 /*******************************************************************************
mbed_official 50:a417edff4437 81 *********************** STATIC FUNCTIONS **********************************
mbed_official 50:a417edff4437 82 ******************************************************************************/
mbed_official 50:a417edff4437 83
<> 150:02e0a0aed4ec 84 static inline void CRYPTO_AES_ProcessLoop(CRYPTO_TypeDef *crypto,
<> 150:02e0a0aed4ec 85 uint32_t len,
mbed_official 50:a417edff4437 86 CRYPTO_DataReg_TypeDef inReg,
mbed_official 50:a417edff4437 87 uint32_t * in,
mbed_official 50:a417edff4437 88 CRYPTO_DataReg_TypeDef outReg,
mbed_official 50:a417edff4437 89 uint32_t * out);
mbed_official 50:a417edff4437 90
<> 150:02e0a0aed4ec 91 static void CRYPTO_AES_CBCx(CRYPTO_TypeDef *crypto,
<> 150:02e0a0aed4ec 92 uint8_t * out,
mbed_official 50:a417edff4437 93 const uint8_t * in,
mbed_official 50:a417edff4437 94 unsigned int len,
mbed_official 50:a417edff4437 95 const uint8_t * key,
mbed_official 50:a417edff4437 96 const uint8_t * iv,
mbed_official 50:a417edff4437 97 bool encrypt,
mbed_official 50:a417edff4437 98 CRYPTO_KeyWidth_TypeDef keyWidth);
mbed_official 50:a417edff4437 99
<> 150:02e0a0aed4ec 100 static void CRYPTO_AES_CFBx(CRYPTO_TypeDef *crypto,
<> 150:02e0a0aed4ec 101 uint8_t * out,
mbed_official 50:a417edff4437 102 const uint8_t * in,
mbed_official 50:a417edff4437 103 unsigned int len,
mbed_official 50:a417edff4437 104 const uint8_t * key,
mbed_official 50:a417edff4437 105 const uint8_t * iv,
mbed_official 50:a417edff4437 106 bool encrypt,
mbed_official 50:a417edff4437 107 CRYPTO_KeyWidth_TypeDef keyWidth);
mbed_official 50:a417edff4437 108
<> 150:02e0a0aed4ec 109 static void CRYPTO_AES_CTRx(CRYPTO_TypeDef *crypto,
<> 150:02e0a0aed4ec 110 uint8_t * out,
mbed_official 50:a417edff4437 111 const uint8_t * in,
mbed_official 50:a417edff4437 112 unsigned int len,
mbed_official 50:a417edff4437 113 const uint8_t * key,
mbed_official 50:a417edff4437 114 uint8_t * ctr,
mbed_official 50:a417edff4437 115 CRYPTO_AES_CtrFuncPtr_TypeDef ctrFunc,
mbed_official 50:a417edff4437 116 CRYPTO_KeyWidth_TypeDef keyWidth);
mbed_official 50:a417edff4437 117
<> 150:02e0a0aed4ec 118 static void CRYPTO_AES_ECBx(CRYPTO_TypeDef *crypto,
<> 150:02e0a0aed4ec 119 uint8_t * out,
mbed_official 50:a417edff4437 120 const uint8_t * in,
mbed_official 50:a417edff4437 121 unsigned int len,
mbed_official 50:a417edff4437 122 const uint8_t * key,
mbed_official 50:a417edff4437 123 bool encrypt,
mbed_official 50:a417edff4437 124 CRYPTO_KeyWidth_TypeDef keyWidth);
mbed_official 50:a417edff4437 125
<> 150:02e0a0aed4ec 126 static void CRYPTO_AES_OFBx(CRYPTO_TypeDef *crypto,
<> 150:02e0a0aed4ec 127 uint8_t * out,
mbed_official 50:a417edff4437 128 const uint8_t * in,
mbed_official 50:a417edff4437 129 unsigned int len,
mbed_official 50:a417edff4437 130 const uint8_t * key,
mbed_official 50:a417edff4437 131 const uint8_t * iv,
mbed_official 50:a417edff4437 132 CRYPTO_KeyWidth_TypeDef keyWidth);
mbed_official 50:a417edff4437 133
mbed_official 50:a417edff4437 134 #ifdef USE_VARIABLE_SIZED_DATA_LOADS
mbed_official 50:a417edff4437 135 /***************************************************************************//**
mbed_official 50:a417edff4437 136 * @brief
mbed_official 50:a417edff4437 137 * Write variable sized 32 bit data array (max 128 bits) to a DATAX register
mbed_official 50:a417edff4437 138 *
mbed_official 50:a417edff4437 139 * @details
mbed_official 50:a417edff4437 140 * Write variable sized 32 bit array (max 128 bits / 4 words) to a DATAX
mbed_official 50:a417edff4437 141 * register in the CRYPTO module.
mbed_official 50:a417edff4437 142 *
mbed_official 50:a417edff4437 143 * @param[in] dataReg The 128 bits DATA register.
mbed_official 50:a417edff4437 144 * @param[in] val Value of the data to write to the DATA register.
mbed_official 50:a417edff4437 145 * @param[in] valSize Size of @ref val in number of 32bit words.
mbed_official 50:a417edff4437 146 ******************************************************************************/
mbed_official 50:a417edff4437 147 __STATIC_INLINE
mbed_official 50:a417edff4437 148 void CRYPTO_DataWriteVariableSize(CRYPTO_DataReg_TypeDef dataReg,
mbed_official 50:a417edff4437 149 const CRYPTO_Data_TypeDef val,
mbed_official 50:a417edff4437 150 int valSize)
mbed_official 50:a417edff4437 151 {
mbed_official 50:a417edff4437 152 int i;
mbed_official 50:a417edff4437 153 volatile uint32_t * reg = (volatile uint32_t *) dataReg;
<> 150:02e0a0aed4ec 154
AnnaBridge 179:b0033dcd6934 155 if (valSize < 4) {
mbed_official 50:a417edff4437 156 /* Non optimal write of data. */
AnnaBridge 179:b0033dcd6934 157 for (i = 0; i < valSize; i++) {
mbed_official 50:a417edff4437 158 *reg = *val++;
AnnaBridge 179:b0033dcd6934 159 }
AnnaBridge 179:b0033dcd6934 160 for (; i < 4; i++) {
mbed_official 50:a417edff4437 161 *reg = 0;
AnnaBridge 179:b0033dcd6934 162 }
AnnaBridge 179:b0033dcd6934 163 } else {
mbed_official 50:a417edff4437 164 CRYPTO_BurstToCrypto(reg, &val[0]);
mbed_official 50:a417edff4437 165 }
mbed_official 50:a417edff4437 166 }
mbed_official 50:a417edff4437 167 #endif
mbed_official 50:a417edff4437 168
mbed_official 50:a417edff4437 169 /** @endcond */
mbed_official 50:a417edff4437 170
mbed_official 50:a417edff4437 171 /*******************************************************************************
mbed_official 50:a417edff4437 172 ************************** GLOBAL FUNCTIONS *******************************
mbed_official 50:a417edff4437 173 ******************************************************************************/
mbed_official 50:a417edff4437 174
mbed_official 50:a417edff4437 175 /***************************************************************************//**
mbed_official 50:a417edff4437 176 * @brief
<> 150:02e0a0aed4ec 177 * Set the modulus used for wide modular operations.
mbed_official 50:a417edff4437 178 *
mbed_official 50:a417edff4437 179 * @details
<> 150:02e0a0aed4ec 180 * This function sets the modulus to be used by the modular instructions
mbed_official 50:a417edff4437 181 * of the CRYPTO module.
mbed_official 50:a417edff4437 182 *
<> 150:02e0a0aed4ec 183 * @param[in] crypto
<> 150:02e0a0aed4ec 184 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 185 *
<> 150:02e0a0aed4ec 186 * @param[in] modulusId
<> 150:02e0a0aed4ec 187 * Modulus identifier.
mbed_official 50:a417edff4437 188 ******************************************************************************/
<> 150:02e0a0aed4ec 189 void CRYPTO_ModulusSet(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 190 CRYPTO_ModulusId_TypeDef modulusId)
mbed_official 50:a417edff4437 191 {
<> 150:02e0a0aed4ec 192 uint32_t temp = crypto->WAC & (~(_CRYPTO_WAC_MODULUS_MASK | _CRYPTO_WAC_MODOP_MASK));
mbed_official 50:a417edff4437 193
AnnaBridge 179:b0033dcd6934 194 switch (modulusId) {
mbed_official 50:a417edff4437 195 case cryptoModulusBin256:
mbed_official 50:a417edff4437 196 case cryptoModulusBin128:
mbed_official 50:a417edff4437 197 case cryptoModulusGcmBin128:
mbed_official 50:a417edff4437 198 case cryptoModulusEccB233:
mbed_official 50:a417edff4437 199 case cryptoModulusEccB163:
mbed_official 50:a417edff4437 200 #ifdef _CRYPTO_WAC_MODULUS_ECCBIN233N
mbed_official 50:a417edff4437 201 case cryptoModulusEccB233Order:
mbed_official 50:a417edff4437 202 case cryptoModulusEccB233KOrder:
mbed_official 50:a417edff4437 203 case cryptoModulusEccB163Order:
mbed_official 50:a417edff4437 204 case cryptoModulusEccB163KOrder:
mbed_official 50:a417edff4437 205 #endif
<> 150:02e0a0aed4ec 206 crypto->WAC = temp | modulusId | CRYPTO_WAC_MODOP_BINARY;
mbed_official 50:a417edff4437 207 break;
mbed_official 50:a417edff4437 208
mbed_official 50:a417edff4437 209 case cryptoModulusEccP256:
mbed_official 50:a417edff4437 210 case cryptoModulusEccP224:
mbed_official 50:a417edff4437 211 case cryptoModulusEccP192:
mbed_official 50:a417edff4437 212 #ifdef _CRYPTO_WAC_MODULUS_ECCPRIME256P
mbed_official 50:a417edff4437 213 case cryptoModulusEccP256Order:
mbed_official 50:a417edff4437 214 case cryptoModulusEccP224Order:
mbed_official 50:a417edff4437 215 case cryptoModulusEccP192Order:
mbed_official 50:a417edff4437 216 #endif
<> 150:02e0a0aed4ec 217 crypto->WAC = temp | modulusId | CRYPTO_WAC_MODOP_REGULAR;
mbed_official 50:a417edff4437 218 break;
mbed_official 50:a417edff4437 219
mbed_official 50:a417edff4437 220 default:
<> 150:02e0a0aed4ec 221 /* Unknown modulus identifier. */
mbed_official 50:a417edff4437 222 EFM_ASSERT(0);
mbed_official 50:a417edff4437 223 }
mbed_official 50:a417edff4437 224 }
mbed_official 50:a417edff4437 225
mbed_official 50:a417edff4437 226 /***************************************************************************//**
mbed_official 50:a417edff4437 227 * @brief
mbed_official 50:a417edff4437 228 * Read the key value currently used by the CRYPTO module.
mbed_official 50:a417edff4437 229 *
mbed_official 50:a417edff4437 230 * @details
mbed_official 50:a417edff4437 231 * Read 128 bits or 256 bits from KEY register in the CRYPTO module.
mbed_official 50:a417edff4437 232 *
<> 150:02e0a0aed4ec 233 * @param[in] crypto
<> 150:02e0a0aed4ec 234 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 235 *
<> 150:02e0a0aed4ec 236 * @param[in] val
<> 150:02e0a0aed4ec 237 * Value of the data to write to the KEYBUF register.
<> 150:02e0a0aed4ec 238 *
<> 150:02e0a0aed4ec 239 * @param[in] keyWidth
<> 150:02e0a0aed4ec 240 * Key width - 128 or 256 bits
mbed_official 50:a417edff4437 241 ******************************************************************************/
<> 150:02e0a0aed4ec 242 void CRYPTO_KeyRead(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 243 CRYPTO_KeyBuf_TypeDef val,
mbed_official 50:a417edff4437 244 CRYPTO_KeyWidth_TypeDef keyWidth)
mbed_official 50:a417edff4437 245 {
mbed_official 50:a417edff4437 246 EFM_ASSERT(val);
mbed_official 50:a417edff4437 247
<> 150:02e0a0aed4ec 248 CRYPTO_BurstFromCrypto(&crypto->KEY, &val[0]);
AnnaBridge 179:b0033dcd6934 249 if (keyWidth == cryptoKey256Bits) {
<> 150:02e0a0aed4ec 250 CRYPTO_BurstFromCrypto(&crypto->KEY, &val[4]);
mbed_official 50:a417edff4437 251 }
mbed_official 50:a417edff4437 252 }
mbed_official 50:a417edff4437 253
mbed_official 50:a417edff4437 254 /***************************************************************************//**
mbed_official 50:a417edff4437 255 * @brief
mbed_official 50:a417edff4437 256 * Perform a SHA-1 hash operation on a message.
mbed_official 50:a417edff4437 257 *
mbed_official 50:a417edff4437 258 * @details
mbed_official 50:a417edff4437 259 * This function performs a SHA-1 hash operation on the message specified by
mbed_official 50:a417edff4437 260 * msg with length msgLen, and returns the message digest in msgDigest.
mbed_official 50:a417edff4437 261 *
<> 150:02e0a0aed4ec 262 * @param[in] crypto
<> 150:02e0a0aed4ec 263 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 264 *
<> 150:02e0a0aed4ec 265 * @param[in] msg
<> 150:02e0a0aed4ec 266 * Message to hash.
<> 150:02e0a0aed4ec 267 *
<> 150:02e0a0aed4ec 268 * @param[in] msgLen
<> 150:02e0a0aed4ec 269 * Length of message in bytes.
<> 150:02e0a0aed4ec 270 *
<> 150:02e0a0aed4ec 271 * @param[out] msgDigest
<> 150:02e0a0aed4ec 272 * Message digest.
mbed_official 50:a417edff4437 273 ******************************************************************************/
<> 150:02e0a0aed4ec 274 void CRYPTO_SHA_1(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 275 const uint8_t * msg,
mbed_official 50:a417edff4437 276 uint64_t msgLen,
mbed_official 50:a417edff4437 277 CRYPTO_SHA1_Digest_TypeDef msgDigest)
mbed_official 50:a417edff4437 278 {
mbed_official 50:a417edff4437 279 uint32_t temp;
<> 150:02e0a0aed4ec 280 uint32_t len;
mbed_official 50:a417edff4437 281 int blockLen;
AnnaBridge 179:b0033dcd6934 282 uint32_t shaBlock[CRYPTO_SHA1_BLOCK_SIZE_IN_32BIT_WORDS] =
mbed_official 50:a417edff4437 283 {
mbed_official 50:a417edff4437 284 /* Initial value */
mbed_official 50:a417edff4437 285 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
mbed_official 50:a417edff4437 286 };
mbed_official 50:a417edff4437 287 uint8_t * p8ShaBlock = (uint8_t *) shaBlock;
mbed_official 50:a417edff4437 288
mbed_official 50:a417edff4437 289 /* Initialize crypto module to do SHA-1. */
<> 150:02e0a0aed4ec 290 crypto->CTRL = CRYPTO_CTRL_SHA_SHA1;
<> 150:02e0a0aed4ec 291 crypto->SEQCTRL = 0;
<> 150:02e0a0aed4ec 292 crypto->SEQCTRLB = 0;
mbed_official 50:a417edff4437 293
mbed_official 50:a417edff4437 294 /* Set result width of MADD32 operation. */
<> 150:02e0a0aed4ec 295 CRYPTO_ResultWidthSet(crypto, cryptoResult256Bits);
<> 150:02e0a0aed4ec 296
mbed_official 50:a417edff4437 297 /* Write init value to DDATA1. */
<> 150:02e0a0aed4ec 298 CRYPTO_DDataWrite(&crypto->DDATA1, shaBlock);
mbed_official 50:a417edff4437 299
mbed_official 50:a417edff4437 300 /* Copy data to DDATA0 and select DDATA0 and DDATA1 for SHA operation. */
<> 150:02e0a0aed4ec 301 CRYPTO_EXECUTE_2(crypto,
<> 150:02e0a0aed4ec 302 CRYPTO_CMD_INSTR_DDATA1TODDATA0,
mbed_official 50:a417edff4437 303 CRYPTO_CMD_INSTR_SELDDATA0DDATA1);
mbed_official 50:a417edff4437 304
mbed_official 50:a417edff4437 305 len = msgLen;
mbed_official 50:a417edff4437 306
AnnaBridge 179:b0033dcd6934 307 while (len >= CRYPTO_SHA1_BLOCK_SIZE_IN_BYTES) {
mbed_official 50:a417edff4437 308 /* Write block to QDATA1. */
<> 150:02e0a0aed4ec 309 CRYPTO_QDataWrite(&crypto->QDATA1BIG, (uint32_t *) msg);
mbed_official 50:a417edff4437 310
mbed_official 50:a417edff4437 311 /* Execute SHA */
<> 150:02e0a0aed4ec 312 CRYPTO_EXECUTE_3(crypto,
<> 150:02e0a0aed4ec 313 CRYPTO_CMD_INSTR_SHA,
mbed_official 50:a417edff4437 314 CRYPTO_CMD_INSTR_MADD32,
mbed_official 50:a417edff4437 315 CRYPTO_CMD_INSTR_DDATA0TODDATA1);
mbed_official 50:a417edff4437 316
mbed_official 50:a417edff4437 317 len -= CRYPTO_SHA1_BLOCK_SIZE_IN_BYTES;
mbed_official 50:a417edff4437 318 msg += CRYPTO_SHA1_BLOCK_SIZE_IN_BYTES;
mbed_official 50:a417edff4437 319 }
mbed_official 50:a417edff4437 320
mbed_official 50:a417edff4437 321 blockLen = 0;
mbed_official 50:a417edff4437 322
mbed_official 50:a417edff4437 323 /* Build the last (or second to last) block */
AnnaBridge 179:b0033dcd6934 324 for (; len; len--) {
mbed_official 50:a417edff4437 325 p8ShaBlock[blockLen++] = *msg++;
AnnaBridge 179:b0033dcd6934 326 }
mbed_official 50:a417edff4437 327
mbed_official 50:a417edff4437 328 /* append the '1' bit */
mbed_official 50:a417edff4437 329 p8ShaBlock[blockLen++] = 0x80;
mbed_official 50:a417edff4437 330
mbed_official 50:a417edff4437 331 /* if the length is currently above 56 bytes we append zeros
mbed_official 50:a417edff4437 332 * then compress. Then we can fall back to padding zeros and length
mbed_official 50:a417edff4437 333 * encoding like normal.
mbed_official 50:a417edff4437 334 */
AnnaBridge 179:b0033dcd6934 335 if (blockLen > 56) {
mbed_official 50:a417edff4437 336 while (blockLen < 64)
mbed_official 50:a417edff4437 337 p8ShaBlock[blockLen++] = 0;
mbed_official 50:a417edff4437 338
mbed_official 50:a417edff4437 339 /* Write block to QDATA1BIG. */
<> 150:02e0a0aed4ec 340 CRYPTO_QDataWrite(&crypto->QDATA1BIG, shaBlock);
mbed_official 50:a417edff4437 341
mbed_official 50:a417edff4437 342 /* Execute SHA */
<> 150:02e0a0aed4ec 343 CRYPTO_EXECUTE_3(crypto,
<> 150:02e0a0aed4ec 344 CRYPTO_CMD_INSTR_SHA,
mbed_official 50:a417edff4437 345 CRYPTO_CMD_INSTR_MADD32,
mbed_official 50:a417edff4437 346 CRYPTO_CMD_INSTR_DDATA0TODDATA1);
mbed_official 50:a417edff4437 347 blockLen = 0;
mbed_official 50:a417edff4437 348 }
mbed_official 50:a417edff4437 349
mbed_official 50:a417edff4437 350 /* pad upto 56 bytes of zeroes */
mbed_official 50:a417edff4437 351 while (blockLen < 56)
mbed_official 50:a417edff4437 352 p8ShaBlock[blockLen++] = 0;
mbed_official 50:a417edff4437 353
mbed_official 50:a417edff4437 354 /* And finally, encode the message length. */
mbed_official 50:a417edff4437 355 {
mbed_official 50:a417edff4437 356 uint64_t msgLenInBits = msgLen << 3;
mbed_official 50:a417edff4437 357 temp = msgLenInBits >> 32;
mbed_official 50:a417edff4437 358 *(uint32_t*)&p8ShaBlock[56] = SWAP32(temp);
mbed_official 50:a417edff4437 359 temp = msgLenInBits & 0xFFFFFFFF;
mbed_official 50:a417edff4437 360 *(uint32_t*)&p8ShaBlock[60] = SWAP32(temp);
mbed_official 50:a417edff4437 361 }
mbed_official 50:a417edff4437 362
mbed_official 50:a417edff4437 363 /* Write block to QDATA1BIG. */
<> 150:02e0a0aed4ec 364 CRYPTO_QDataWrite(&crypto->QDATA1BIG, shaBlock);
mbed_official 50:a417edff4437 365
mbed_official 50:a417edff4437 366 /* Execute SHA */
<> 150:02e0a0aed4ec 367 CRYPTO_EXECUTE_3(crypto,
<> 150:02e0a0aed4ec 368 CRYPTO_CMD_INSTR_SHA,
mbed_official 50:a417edff4437 369 CRYPTO_CMD_INSTR_MADD32,
mbed_official 50:a417edff4437 370 CRYPTO_CMD_INSTR_DDATA0TODDATA1);
mbed_official 50:a417edff4437 371
mbed_official 50:a417edff4437 372 /* Read resulting message digest from DDATA0BIG. */
<> 150:02e0a0aed4ec 373 ((uint32_t*)msgDigest)[0] = crypto->DDATA0BIG;
<> 150:02e0a0aed4ec 374 ((uint32_t*)msgDigest)[1] = crypto->DDATA0BIG;
<> 150:02e0a0aed4ec 375 ((uint32_t*)msgDigest)[2] = crypto->DDATA0BIG;
<> 150:02e0a0aed4ec 376 ((uint32_t*)msgDigest)[3] = crypto->DDATA0BIG;
<> 150:02e0a0aed4ec 377 ((uint32_t*)msgDigest)[4] = crypto->DDATA0BIG;
<> 150:02e0a0aed4ec 378 temp = crypto->DDATA0BIG;
<> 150:02e0a0aed4ec 379 temp = crypto->DDATA0BIG;
<> 150:02e0a0aed4ec 380 temp = crypto->DDATA0BIG;
mbed_official 50:a417edff4437 381 }
mbed_official 50:a417edff4437 382
mbed_official 50:a417edff4437 383 /***************************************************************************//**
mbed_official 50:a417edff4437 384 * @brief
mbed_official 50:a417edff4437 385 * Perform a SHA-256 hash operation on a message.
mbed_official 50:a417edff4437 386 *
mbed_official 50:a417edff4437 387 * @details
mbed_official 50:a417edff4437 388 * This function performs a SHA-256 hash operation on the message specified
mbed_official 50:a417edff4437 389 * by msg with length msgLen, and returns the message digest in msgDigest.
mbed_official 50:a417edff4437 390 *
<> 150:02e0a0aed4ec 391 * @param[in] crypto
<> 150:02e0a0aed4ec 392 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 393 *
<> 150:02e0a0aed4ec 394 * @param[in] msg
<> 150:02e0a0aed4ec 395 * Message to hash.
<> 150:02e0a0aed4ec 396 *
<> 150:02e0a0aed4ec 397 * @param[in] msgLen
<> 150:02e0a0aed4ec 398 * Length of message in bytes.
<> 150:02e0a0aed4ec 399 *
<> 150:02e0a0aed4ec 400 * @param[out] msgDigest
<> 150:02e0a0aed4ec 401 * Message digest.
mbed_official 50:a417edff4437 402 ******************************************************************************/
<> 150:02e0a0aed4ec 403 void CRYPTO_SHA_256(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 404 const uint8_t * msg,
mbed_official 50:a417edff4437 405 uint64_t msgLen,
mbed_official 50:a417edff4437 406 CRYPTO_SHA256_Digest_TypeDef msgDigest)
mbed_official 50:a417edff4437 407 {
mbed_official 50:a417edff4437 408 uint32_t temp;
<> 150:02e0a0aed4ec 409 uint32_t len;
mbed_official 50:a417edff4437 410 int blockLen;
AnnaBridge 179:b0033dcd6934 411 uint32_t shaBlock[CRYPTO_SHA256_BLOCK_SIZE_IN_32BIT_WORDS] =
mbed_official 50:a417edff4437 412 {
mbed_official 50:a417edff4437 413 /* Initial value */
mbed_official 50:a417edff4437 414 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
mbed_official 50:a417edff4437 415 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
mbed_official 50:a417edff4437 416 };
mbed_official 50:a417edff4437 417 uint8_t * p8ShaBlock = (uint8_t *) shaBlock;
mbed_official 50:a417edff4437 418
mbed_official 50:a417edff4437 419 /* Initialize crypyo module to do SHA-256 (SHA-2). */
<> 150:02e0a0aed4ec 420 crypto->CTRL = CRYPTO_CTRL_SHA_SHA2;
<> 150:02e0a0aed4ec 421 crypto->SEQCTRL = 0;
<> 150:02e0a0aed4ec 422 crypto->SEQCTRLB = 0;
mbed_official 50:a417edff4437 423
mbed_official 50:a417edff4437 424 /* Set result width of MADD32 operation. */
<> 150:02e0a0aed4ec 425 CRYPTO_ResultWidthSet(crypto, cryptoResult256Bits);
mbed_official 50:a417edff4437 426
mbed_official 50:a417edff4437 427 /* Write init value to DDATA1. */
<> 150:02e0a0aed4ec 428 CRYPTO_DDataWrite(&crypto->DDATA1, shaBlock);
mbed_official 50:a417edff4437 429
mbed_official 50:a417edff4437 430 /* Copy data ot DDATA0 and select DDATA0 and DDATA1 for SHA operation. */
<> 150:02e0a0aed4ec 431 CRYPTO_EXECUTE_2(crypto,
<> 150:02e0a0aed4ec 432 CRYPTO_CMD_INSTR_DDATA1TODDATA0,
mbed_official 50:a417edff4437 433 CRYPTO_CMD_INSTR_SELDDATA0DDATA1);
mbed_official 50:a417edff4437 434 len = msgLen;
mbed_official 50:a417edff4437 435
AnnaBridge 179:b0033dcd6934 436 while (len >= CRYPTO_SHA256_BLOCK_SIZE_IN_BYTES) {
mbed_official 50:a417edff4437 437 /* Write block to QDATA1BIG. */
<> 150:02e0a0aed4ec 438 CRYPTO_QDataWrite(&crypto->QDATA1BIG, (uint32_t *) msg);
mbed_official 50:a417edff4437 439
mbed_official 50:a417edff4437 440 /* Execute SHA */
<> 150:02e0a0aed4ec 441 CRYPTO_EXECUTE_3(crypto,
<> 150:02e0a0aed4ec 442 CRYPTO_CMD_INSTR_SHA,
mbed_official 50:a417edff4437 443 CRYPTO_CMD_INSTR_MADD32,
mbed_official 50:a417edff4437 444 CRYPTO_CMD_INSTR_DDATA0TODDATA1);
mbed_official 50:a417edff4437 445
mbed_official 50:a417edff4437 446 len -= CRYPTO_SHA256_BLOCK_SIZE_IN_BYTES;
mbed_official 50:a417edff4437 447 msg += CRYPTO_SHA256_BLOCK_SIZE_IN_BYTES;
mbed_official 50:a417edff4437 448 }
mbed_official 50:a417edff4437 449
mbed_official 50:a417edff4437 450 blockLen = 0;
mbed_official 50:a417edff4437 451
mbed_official 50:a417edff4437 452 /* Build the last (or second to last) block */
AnnaBridge 179:b0033dcd6934 453 for (; len; len--) {
mbed_official 50:a417edff4437 454 p8ShaBlock[blockLen++] = *msg++;
AnnaBridge 179:b0033dcd6934 455 }
mbed_official 50:a417edff4437 456
mbed_official 50:a417edff4437 457 /* append the '1' bit */
mbed_official 50:a417edff4437 458 p8ShaBlock[blockLen++] = 0x80;
mbed_official 50:a417edff4437 459
mbed_official 50:a417edff4437 460 /* if the length is currently above 56 bytes we append zeros
mbed_official 50:a417edff4437 461 * then compress. Then we can fall back to padding zeros and length
mbed_official 50:a417edff4437 462 * encoding like normal.
mbed_official 50:a417edff4437 463 */
AnnaBridge 179:b0033dcd6934 464 if (blockLen > 56) {
mbed_official 50:a417edff4437 465 while (blockLen < 64)
mbed_official 50:a417edff4437 466 p8ShaBlock[blockLen++] = 0;
mbed_official 50:a417edff4437 467
mbed_official 50:a417edff4437 468 /* Write block to QDATA1BIG. */
<> 150:02e0a0aed4ec 469 CRYPTO_QDataWrite(&crypto->QDATA1BIG, shaBlock);
mbed_official 50:a417edff4437 470
mbed_official 50:a417edff4437 471 /* Execute SHA */
<> 150:02e0a0aed4ec 472 CRYPTO_EXECUTE_3(crypto,
<> 150:02e0a0aed4ec 473 CRYPTO_CMD_INSTR_SHA,
mbed_official 50:a417edff4437 474 CRYPTO_CMD_INSTR_MADD32,
mbed_official 50:a417edff4437 475 CRYPTO_CMD_INSTR_DDATA0TODDATA1);
mbed_official 50:a417edff4437 476 blockLen = 0;
mbed_official 50:a417edff4437 477 }
mbed_official 50:a417edff4437 478
mbed_official 50:a417edff4437 479 /* Pad upto 56 bytes of zeroes */
mbed_official 50:a417edff4437 480 while (blockLen < 56)
mbed_official 50:a417edff4437 481 p8ShaBlock[blockLen++] = 0;
mbed_official 50:a417edff4437 482
mbed_official 50:a417edff4437 483 /* And finally, encode the message length. */
mbed_official 50:a417edff4437 484 {
mbed_official 50:a417edff4437 485 uint64_t msgLenInBits = msgLen << 3;
mbed_official 50:a417edff4437 486 temp = msgLenInBits >> 32;
mbed_official 50:a417edff4437 487 *(uint32_t *)&p8ShaBlock[56] = SWAP32(temp);
mbed_official 50:a417edff4437 488 temp = msgLenInBits & 0xFFFFFFFF;
mbed_official 50:a417edff4437 489 *(uint32_t *)&p8ShaBlock[60] = SWAP32(temp);
mbed_official 50:a417edff4437 490 }
mbed_official 50:a417edff4437 491
mbed_official 50:a417edff4437 492 /* Write the final block to QDATA1BIG. */
<> 150:02e0a0aed4ec 493 CRYPTO_QDataWrite(&crypto->QDATA1BIG, shaBlock);
mbed_official 50:a417edff4437 494
mbed_official 50:a417edff4437 495 /* Execute SHA */
<> 150:02e0a0aed4ec 496 CRYPTO_EXECUTE_3(crypto,
<> 150:02e0a0aed4ec 497 CRYPTO_CMD_INSTR_SHA,
mbed_official 50:a417edff4437 498 CRYPTO_CMD_INSTR_MADD32,
mbed_official 50:a417edff4437 499 CRYPTO_CMD_INSTR_DDATA0TODDATA1);
mbed_official 50:a417edff4437 500
mbed_official 50:a417edff4437 501 /* Read resulting message digest from DDATA0BIG. */
<> 150:02e0a0aed4ec 502 CRYPTO_DDataRead(&crypto->DDATA0BIG, (uint32_t *)msgDigest);
mbed_official 50:a417edff4437 503 }
mbed_official 50:a417edff4437 504
mbed_official 50:a417edff4437 505 /***************************************************************************//**
mbed_official 50:a417edff4437 506 * @brief
mbed_official 50:a417edff4437 507 * Set 32bit word array to zero.
mbed_official 50:a417edff4437 508 *
mbed_official 50:a417edff4437 509 * @param[in] words32bits Pointer to 32bit word array
mbed_official 50:a417edff4437 510 * @param[in] num32bitWords Number of 32bit words in array
mbed_official 50:a417edff4437 511 ******************************************************************************/
mbed_official 50:a417edff4437 512 __STATIC_INLINE void cryptoBigintZeroize(uint32_t * words32bits,
mbed_official 50:a417edff4437 513 int num32bitWords)
mbed_official 50:a417edff4437 514 {
mbed_official 50:a417edff4437 515 while (num32bitWords--)
mbed_official 50:a417edff4437 516 *words32bits++ = 0;
mbed_official 50:a417edff4437 517 }
mbed_official 50:a417edff4437 518
mbed_official 50:a417edff4437 519 /***************************************************************************//**
mbed_official 50:a417edff4437 520 * @brief
mbed_official 50:a417edff4437 521 * Increment value of 32bit word array by one.
mbed_official 50:a417edff4437 522 *
mbed_official 50:a417edff4437 523 * @param[in] words32bits Pointer to 32bit word array
mbed_official 50:a417edff4437 524 * @param[in] num32bitWords Number of 32bit words in array
mbed_official 50:a417edff4437 525 ******************************************************************************/
mbed_official 50:a417edff4437 526 __STATIC_INLINE void cryptoBigintIncrement(uint32_t * words32bits,
mbed_official 50:a417edff4437 527 int num32bitWords)
mbed_official 50:a417edff4437 528 {
mbed_official 50:a417edff4437 529 int i;
AnnaBridge 179:b0033dcd6934 530 for (i = 0; i < num32bitWords; i++) {
AnnaBridge 179:b0033dcd6934 531 if (++words32bits[i] != 0) {
mbed_official 50:a417edff4437 532 break;
AnnaBridge 179:b0033dcd6934 533 }
AnnaBridge 179:b0033dcd6934 534 }
mbed_official 50:a417edff4437 535 return;
mbed_official 50:a417edff4437 536 }
mbed_official 50:a417edff4437 537
mbed_official 50:a417edff4437 538 /***************************************************************************//**
mbed_official 50:a417edff4437 539 * @brief
mbed_official 50:a417edff4437 540 * Multiply two big integers.
mbed_official 50:a417edff4437 541 *
mbed_official 50:a417edff4437 542 * @details
mbed_official 50:a417edff4437 543 * This function uses the CRYPTO unit to multiply two big integer operands.
mbed_official 50:a417edff4437 544 * If USE_VARIABLE_SIZED_DATA_LOADS is defined, the sizes of the operands
mbed_official 50:a417edff4437 545 * may be any multiple of 32 bits. If USE_VARIABLE_SIZED_DATA_LOADS is _not_
mbed_official 50:a417edff4437 546 * defined, the sizes of the operands must be a multiple of 128 bits.
mbed_official 50:a417edff4437 547 *
mbed_official 50:a417edff4437 548 * @param[in] A operand A
mbed_official 50:a417edff4437 549 * @param[in] aSize size of operand A in bits
mbed_official 50:a417edff4437 550 * @param[in] B operand B
mbed_official 50:a417edff4437 551 * @param[in] bSize size of operand B in bits
mbed_official 50:a417edff4437 552 * @param[out] R result of multiplication
mbed_official 50:a417edff4437 553 * @param[in] rSize size of result buffer R in bits
mbed_official 50:a417edff4437 554 ******************************************************************************/
<> 150:02e0a0aed4ec 555 void CRYPTO_Mul(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 556 uint32_t * A, int aSize,
mbed_official 50:a417edff4437 557 uint32_t * B, int bSize,
mbed_official 50:a417edff4437 558 uint32_t * R, int rSize)
mbed_official 50:a417edff4437 559 {
mbed_official 50:a417edff4437 560 int i, j;
mbed_official 50:a417edff4437 561
mbed_official 50:a417edff4437 562 /**************** Initializations ******************/
mbed_official 50:a417edff4437 563
mbed_official 50:a417edff4437 564 #ifdef USE_VARIABLE_SIZED_DATA_LOADS
AnnaBridge 179:b0033dcd6934 565 int numWordsLastOperandA = (aSize & PARTIAL_OPERAND_WIDTH_MASK) >> 5;
AnnaBridge 179:b0033dcd6934 566 int numPartialOperandsA = numWordsLastOperandA
AnnaBridge 179:b0033dcd6934 567 ? (aSize >> PARTIAL_OPERAND_WIDTH_LOG2) + 1
AnnaBridge 179:b0033dcd6934 568 : aSize >> PARTIAL_OPERAND_WIDTH_LOG2;
AnnaBridge 179:b0033dcd6934 569 int numWordsLastOperandB = (bSize & PARTIAL_OPERAND_WIDTH_MASK) >> 5;
AnnaBridge 179:b0033dcd6934 570 int numPartialOperandsB = numWordsLastOperandB
AnnaBridge 179:b0033dcd6934 571 ? (bSize >> PARTIAL_OPERAND_WIDTH_LOG2) + 1
AnnaBridge 179:b0033dcd6934 572 : bSize >> PARTIAL_OPERAND_WIDTH_LOG2;
AnnaBridge 179:b0033dcd6934 573 int numWordsLastOperandR = (rSize & PARTIAL_OPERAND_WIDTH_MASK) >> 5;
AnnaBridge 179:b0033dcd6934 574 int numPartialOperandsR = numWordsLastOperandR
AnnaBridge 179:b0033dcd6934 575 ? (rSize >> PARTIAL_OPERAND_WIDTH_LOG2) + 1
AnnaBridge 179:b0033dcd6934 576 : rSize >> PARTIAL_OPERAND_WIDTH_LOG2;
mbed_official 50:a417edff4437 577 EFM_ASSERT(numPartialOperandsA + numPartialOperandsB <= numPartialOperandsR);
mbed_official 50:a417edff4437 578 #else
mbed_official 50:a417edff4437 579 int numPartialOperandsA = aSize >> PARTIAL_OPERAND_WIDTH_LOG2;
mbed_official 50:a417edff4437 580 int numPartialOperandsB = bSize >> PARTIAL_OPERAND_WIDTH_LOG2;
mbed_official 50:a417edff4437 581 EFM_ASSERT((aSize & PARTIAL_OPERAND_WIDTH_MASK) == 0);
mbed_official 50:a417edff4437 582 EFM_ASSERT((bSize & PARTIAL_OPERAND_WIDTH_MASK) == 0);
mbed_official 50:a417edff4437 583 #endif
mbed_official 50:a417edff4437 584 EFM_ASSERT(aSize + bSize <= rSize);
<> 150:02e0a0aed4ec 585
mbed_official 50:a417edff4437 586 /* Set R to zero. */
mbed_official 50:a417edff4437 587 cryptoBigintZeroize(R, rSize >> 5);
mbed_official 50:a417edff4437 588
mbed_official 50:a417edff4437 589 /* Set multiplication width. */
<> 150:02e0a0aed4ec 590 crypto->WAC = CRYPTO_WAC_MULWIDTH_MUL128 | CRYPTO_WAC_RESULTWIDTH_256BIT;
mbed_official 50:a417edff4437 591
mbed_official 50:a417edff4437 592 /* Setup DMA request signalling in order for MCU to run in parallel with
mbed_official 50:a417edff4437 593 CRYPTO instruction sequence execution, and prepare data loading which
mbed_official 50:a417edff4437 594 can take place immediately when CRYPTO is ready inside the instruction
mbed_official 50:a417edff4437 595 sequence. */
<> 150:02e0a0aed4ec 596 crypto->CTRL =
AnnaBridge 179:b0033dcd6934 597 CRYPTO_CTRL_DMA0RSEL_DATA0 | CRYPTO_CTRL_DMA0MODE_FULL
AnnaBridge 179:b0033dcd6934 598 | CRYPTO_CTRL_DMA1RSEL_DATA1 | CRYPTO_CTRL_DMA1MODE_FULL;
mbed_official 50:a417edff4437 599
<> 150:02e0a0aed4ec 600 CRYPTO_EXECUTE_4(crypto,
mbed_official 50:a417edff4437 601 CRYPTO_CMD_INSTR_CCLR, /* Carry = 0 */
mbed_official 50:a417edff4437 602 CRYPTO_CMD_INSTR_CLR, /* DDATA0 = 0 */
mbed_official 50:a417edff4437 603 /* clear result accumulation register */
mbed_official 50:a417edff4437 604 CRYPTO_CMD_INSTR_DDATA0TODDATA2,
mbed_official 50:a417edff4437 605 CRYPTO_CMD_INSTR_SELDDATA1DDATA3);
mbed_official 50:a417edff4437 606 /*
AnnaBridge 179:b0033dcd6934 607 register map:
AnnaBridge 179:b0033dcd6934 608 DDATA0: working register
AnnaBridge 179:b0033dcd6934 609 DDATA1: B(j)
AnnaBridge 179:b0033dcd6934 610 DDATA2: R(i+j+1) and R(i+j), combined with DMA entry for B(j)
AnnaBridge 179:b0033dcd6934 611 DDATA3: A(i)
AnnaBridge 179:b0033dcd6934 612 */
mbed_official 50:a417edff4437 613
<> 150:02e0a0aed4ec 614 CRYPTO_SEQ_LOAD_10(crypto,
mbed_official 50:a417edff4437 615 /* Temporarily load partial operand B(j) to DATA0. */
mbed_official 50:a417edff4437 616 /* R(i+j+1) is still in DATA1 */
mbed_official 50:a417edff4437 617 CRYPTO_CMD_INSTR_DMA0TODATA,
mbed_official 50:a417edff4437 618 /* Move B(j) to DDATA1 */
mbed_official 50:a417edff4437 619 CRYPTO_CMD_INSTR_DDATA2TODDATA1,
mbed_official 50:a417edff4437 620
mbed_official 50:a417edff4437 621 /* Restore previous partial result (now R(i+j)) */
mbed_official 50:a417edff4437 622 CRYPTO_CMD_INSTR_DATA1TODATA0,
mbed_official 50:a417edff4437 623
mbed_official 50:a417edff4437 624 /* Load next partial result R(i+j+1) */
mbed_official 50:a417edff4437 625 CRYPTO_CMD_INSTR_DMA1TODATA,
mbed_official 50:a417edff4437 626
mbed_official 50:a417edff4437 627 /* Execute partial multiplication A(i)inDDATA1 * B(j)inDDATA3*/
mbed_official 50:a417edff4437 628 CRYPTO_CMD_INSTR_MULO,
mbed_official 50:a417edff4437 629
mbed_official 50:a417edff4437 630 /* Add the result to the previous partial result */
mbed_official 50:a417edff4437 631 /* AND take the previous carry value into account */
mbed_official 50:a417edff4437 632 /* at the right place (bit 128, ADDIC instruction */
mbed_official 50:a417edff4437 633 CRYPTO_CMD_INSTR_SELDDATA0DDATA2,
mbed_official 50:a417edff4437 634 CRYPTO_CMD_INSTR_ADDIC,
mbed_official 50:a417edff4437 635
mbed_official 50:a417edff4437 636 /* Save the new partial result (lower half) */
mbed_official 50:a417edff4437 637 CRYPTO_CMD_INSTR_DDATA0TODDATA2,
mbed_official 50:a417edff4437 638 CRYPTO_CMD_INSTR_DATATODMA0,
mbed_official 50:a417edff4437 639 /* Reset the operand selector for next*/
mbed_official 50:a417edff4437 640 CRYPTO_CMD_INSTR_SELDDATA2DDATA3
mbed_official 50:a417edff4437 641 );
mbed_official 50:a417edff4437 642
mbed_official 50:a417edff4437 643 /**************** End Initializations ******************/
mbed_official 50:a417edff4437 644
AnnaBridge 179:b0033dcd6934 645 for (i = 0; i < numPartialOperandsA; i++) {
mbed_official 50:a417edff4437 646 /* Load partial operand #1 A>>(i*PARTIAL_OPERAND_WIDTH) to DDATA1. */
mbed_official 50:a417edff4437 647 #ifdef USE_VARIABLE_SIZED_DATA_LOADS
AnnaBridge 179:b0033dcd6934 648 if ( (numWordsLastOperandA != 0) && (i == numPartialOperandsA - 1) ) {
<> 150:02e0a0aed4ec 649 CRYPTO_DataWriteVariableSize(&crypto->DATA2,
AnnaBridge 179:b0033dcd6934 650 &A[i * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS],
mbed_official 50:a417edff4437 651 numWordsLastOperandA);
AnnaBridge 179:b0033dcd6934 652 } else {
AnnaBridge 179:b0033dcd6934 653 CRYPTO_DataWrite(&crypto->DATA2, &A[i * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
AnnaBridge 179:b0033dcd6934 654 }
mbed_official 50:a417edff4437 655 #else
AnnaBridge 179:b0033dcd6934 656 CRYPTO_DataWrite(&crypto->DATA2, &A[i * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
mbed_official 50:a417edff4437 657 #endif
mbed_official 50:a417edff4437 658
mbed_official 50:a417edff4437 659 /* Load partial result in R>>(i*PARTIAL_OPERAND_WIDTH) to DATA1. */
mbed_official 50:a417edff4437 660 #ifdef USE_VARIABLE_SIZED_DATA_LOADS
AnnaBridge 179:b0033dcd6934 661 if ( (numWordsLastOperandR != 0) && (i == numPartialOperandsR - 1) ) {
<> 150:02e0a0aed4ec 662 CRYPTO_DataWriteVariableSize(&crypto->DATA1,
AnnaBridge 179:b0033dcd6934 663 &R[i * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS],
mbed_official 50:a417edff4437 664 numWordsLastOperandR);
AnnaBridge 179:b0033dcd6934 665 } else {
AnnaBridge 179:b0033dcd6934 666 CRYPTO_DataWrite(&crypto->DATA1, &R[i * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
AnnaBridge 179:b0033dcd6934 667 }
mbed_official 50:a417edff4437 668 #else
AnnaBridge 179:b0033dcd6934 669 CRYPTO_DataWrite(&crypto->DATA1, &R[i * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
mbed_official 50:a417edff4437 670 #endif
<> 150:02e0a0aed4ec 671
mbed_official 50:a417edff4437 672 /* Clear carry */
<> 150:02e0a0aed4ec 673 crypto->CMD = CRYPTO_CMD_INSTR_CCLR;
mbed_official 50:a417edff4437 674
mbed_official 50:a417edff4437 675 /* Setup number of sequence iterations and block size. */
<> 150:02e0a0aed4ec 676 crypto->SEQCTRL = CRYPTO_SEQCTRL_BLOCKSIZE_16BYTES
AnnaBridge 179:b0033dcd6934 677 | (PARTIAL_OPERAND_WIDTH_IN_BYTES * numPartialOperandsB);
mbed_official 50:a417edff4437 678
mbed_official 50:a417edff4437 679 /* Execute the MULtiply instruction sequence. */
<> 150:02e0a0aed4ec 680 CRYPTO_InstructionSequenceExecute(crypto);
mbed_official 50:a417edff4437 681
AnnaBridge 179:b0033dcd6934 682 for (j = 0; j < numPartialOperandsB; j++) {
mbed_official 50:a417edff4437 683 /* Load partial operand 2 B>>(j*`PARTIAL_OPERAND_WIDTH) to DDATA2
mbed_official 50:a417edff4437 684 (via DATA0). */
mbed_official 50:a417edff4437 685 #ifdef USE_VARIABLE_SIZED_DATA_LOADS
AnnaBridge 179:b0033dcd6934 686 if ( (numWordsLastOperandB != 0) && (j == numPartialOperandsB - 1) ) {
<> 150:02e0a0aed4ec 687 CRYPTO_DataWriteVariableSize(&crypto->DATA0,
AnnaBridge 179:b0033dcd6934 688 &B[j * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS],
mbed_official 50:a417edff4437 689 numWordsLastOperandB);
AnnaBridge 179:b0033dcd6934 690 } else {
<> 150:02e0a0aed4ec 691 CRYPTO_DataWrite(&crypto->DATA0,
AnnaBridge 179:b0033dcd6934 692 &B[j * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
AnnaBridge 179:b0033dcd6934 693 }
mbed_official 50:a417edff4437 694 #else
<> 150:02e0a0aed4ec 695 CRYPTO_DataWrite(&crypto->DATA0,
AnnaBridge 179:b0033dcd6934 696 &B[j * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
mbed_official 50:a417edff4437 697 #endif
mbed_official 50:a417edff4437 698
mbed_official 50:a417edff4437 699 /* Load most significant partial result
mbed_official 50:a417edff4437 700 R>>((i+j+1)*`PARTIAL_OPERAND_WIDTH) into DATA1. */
mbed_official 50:a417edff4437 701 #ifdef USE_VARIABLE_SIZED_DATA_LOADS
AnnaBridge 179:b0033dcd6934 702 if ( (numWordsLastOperandR != 0) && ( (i + j + 1) == numPartialOperandsR - 1) ) {
<> 150:02e0a0aed4ec 703 CRYPTO_DataWriteVariableSize(&crypto->DATA1,
AnnaBridge 179:b0033dcd6934 704 &R[(i + j + 1) * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS],
mbed_official 50:a417edff4437 705 numWordsLastOperandR);
AnnaBridge 179:b0033dcd6934 706 } else {
<> 150:02e0a0aed4ec 707 CRYPTO_DataWrite(&crypto->DATA1,
AnnaBridge 179:b0033dcd6934 708 &R[(i + j + 1) * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
AnnaBridge 179:b0033dcd6934 709 }
mbed_official 50:a417edff4437 710 #else
<> 150:02e0a0aed4ec 711 CRYPTO_DataWrite(&crypto->DATA1,
AnnaBridge 179:b0033dcd6934 712 &R[(i + j + 1) * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
mbed_official 50:a417edff4437 713 #endif
mbed_official 50:a417edff4437 714 /* Store least significant partial result */
<> 150:02e0a0aed4ec 715 CRYPTO_DataRead(&crypto->DATA0,
AnnaBridge 179:b0033dcd6934 716 &R[(i + j) * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
mbed_official 50:a417edff4437 717 } /* for (j=0; j<numPartialOperandsB; j++) */
mbed_official 50:a417edff4437 718
mbed_official 50:a417edff4437 719 /* Handle carry at the end of the inner loop. */
AnnaBridge 179:b0033dcd6934 720 if (CRYPTO_CarryIsSet(crypto)) {
AnnaBridge 179:b0033dcd6934 721 cryptoBigintIncrement(&R[(i + numPartialOperandsB + 1)
AnnaBridge 179:b0033dcd6934 722 * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS],
AnnaBridge 179:b0033dcd6934 723 (numPartialOperandsA - i - 1)
AnnaBridge 179:b0033dcd6934 724 * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS);
AnnaBridge 179:b0033dcd6934 725 }
mbed_official 50:a417edff4437 726
<> 150:02e0a0aed4ec 727 CRYPTO_DataRead(&crypto->DATA1,
AnnaBridge 179:b0033dcd6934 728 &R[(i + numPartialOperandsB)
mbed_official 50:a417edff4437 729 * PARTIAL_OPERAND_WIDTH_IN_32BIT_WORDS]);
mbed_official 50:a417edff4437 730 } /* for (i=0; i<numPartialOperandsA; i++) */
mbed_official 50:a417edff4437 731 }
mbed_official 50:a417edff4437 732
mbed_official 50:a417edff4437 733 /***************************************************************************//**
mbed_official 50:a417edff4437 734 * @brief
mbed_official 50:a417edff4437 735 * AES Cipher-block chaining (CBC) cipher mode encryption/decryption, 128 bit key.
mbed_official 50:a417edff4437 736 *
mbed_official 50:a417edff4437 737 * @details
mbed_official 50:a417edff4437 738 * Encryption:
mbed_official 50:a417edff4437 739 * @verbatim
mbed_official 50:a417edff4437 740 * Plaintext Plaintext
mbed_official 50:a417edff4437 741 * | |
mbed_official 50:a417edff4437 742 * V V
mbed_official 50:a417edff4437 743 * InitVector ->XOR +-------------->XOR
mbed_official 50:a417edff4437 744 * | | |
mbed_official 50:a417edff4437 745 * V | V
mbed_official 50:a417edff4437 746 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 747 * Key ->| Block cipher | | Key ->| Block cipher |
mbed_official 50:a417edff4437 748 * | encryption | | | encryption |
mbed_official 50:a417edff4437 749 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 750 * |---------+ |
mbed_official 50:a417edff4437 751 * V V
mbed_official 50:a417edff4437 752 * Ciphertext Ciphertext
mbed_official 50:a417edff4437 753 * @endverbatim
mbed_official 50:a417edff4437 754 * Decryption:
mbed_official 50:a417edff4437 755 * @verbatim
mbed_official 50:a417edff4437 756 * Ciphertext Ciphertext
mbed_official 50:a417edff4437 757 * |----------+ |
mbed_official 50:a417edff4437 758 * V | V
mbed_official 50:a417edff4437 759 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 760 * Key ->| Block cipher | | Key ->| Block cipher |
mbed_official 50:a417edff4437 761 * | decryption | | | decryption |
mbed_official 50:a417edff4437 762 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 763 * | | |
mbed_official 50:a417edff4437 764 * V | V
mbed_official 50:a417edff4437 765 * InitVector ->XOR +-------------->XOR
mbed_official 50:a417edff4437 766 * | |
mbed_official 50:a417edff4437 767 * V V
mbed_official 50:a417edff4437 768 * Plaintext Plaintext
mbed_official 50:a417edff4437 769 * @endverbatim
mbed_official 50:a417edff4437 770 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 771 *
<> 150:02e0a0aed4ec 772 * @param[in] crypto
<> 150:02e0a0aed4ec 773 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 774 *
mbed_official 50:a417edff4437 775 * @param[out] out
mbed_official 50:a417edff4437 776 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 777 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 778 *
mbed_official 50:a417edff4437 779 * @param[in] in
mbed_official 50:a417edff4437 780 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 781 *
mbed_official 50:a417edff4437 782 * @param[in] len
mbed_official 50:a417edff4437 783 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 784 *
mbed_official 50:a417edff4437 785 * @param[in] key
mbed_official 50:a417edff4437 786 * When doing encryption, this is the 128 bit encryption key. When doing
mbed_official 50:a417edff4437 787 * decryption, this is the 128 bit decryption key. The decryption key may
mbed_official 50:a417edff4437 788 * be generated from the encryption key with CRYPTO_AES_DecryptKey128().
mbed_official 50:a417edff4437 789 * If this argument is null, the key will not be loaded, as it is assumed
mbed_official 50:a417edff4437 790 * the key has been loaded into KEYHA previously.
mbed_official 50:a417edff4437 791 *
mbed_official 50:a417edff4437 792 * @param[in] iv
mbed_official 50:a417edff4437 793 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 794 *
mbed_official 50:a417edff4437 795 * @param[in] encrypt
mbed_official 50:a417edff4437 796 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 797 ******************************************************************************/
<> 150:02e0a0aed4ec 798 void CRYPTO_AES_CBC128(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 799 uint8_t * out,
<> 150:02e0a0aed4ec 800 const uint8_t * in,
<> 150:02e0a0aed4ec 801 unsigned int len,
<> 150:02e0a0aed4ec 802 const uint8_t * key,
<> 150:02e0a0aed4ec 803 const uint8_t * iv,
<> 150:02e0a0aed4ec 804 bool encrypt)
mbed_official 50:a417edff4437 805 {
<> 150:02e0a0aed4ec 806 crypto->CTRL = CRYPTO_CTRL_AES_AES128;
<> 150:02e0a0aed4ec 807 CRYPTO_AES_CBCx(crypto, out, in, len, key, iv, encrypt, cryptoKey128Bits);
mbed_official 50:a417edff4437 808 }
mbed_official 50:a417edff4437 809
mbed_official 50:a417edff4437 810 /***************************************************************************//**
mbed_official 50:a417edff4437 811 * @brief
mbed_official 50:a417edff4437 812 * AES Cipher-block chaining (CBC) cipher mode encryption/decryption, 256 bit
mbed_official 50:a417edff4437 813 * key.
mbed_official 50:a417edff4437 814 *
mbed_official 50:a417edff4437 815 * @details
mbed_official 50:a417edff4437 816 * Please see CRYPTO_AES_CBC128() for CBC figure.
mbed_official 50:a417edff4437 817 *
mbed_official 50:a417edff4437 818 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 819 *
<> 150:02e0a0aed4ec 820 * @param[in] crypto
<> 150:02e0a0aed4ec 821 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 822 *
mbed_official 50:a417edff4437 823 * @param[out] out
mbed_official 50:a417edff4437 824 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 825 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 826 *
mbed_official 50:a417edff4437 827 * @param[in] in
mbed_official 50:a417edff4437 828 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 829 *
mbed_official 50:a417edff4437 830 * @param[in] len
mbed_official 50:a417edff4437 831 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 832 *
mbed_official 50:a417edff4437 833 * @param[in] key
mbed_official 50:a417edff4437 834 * When doing encryption, this is the 256 bit encryption key. When doing
mbed_official 50:a417edff4437 835 * decryption, this is the 256 bit decryption key. The decryption key may
mbed_official 50:a417edff4437 836 * be generated from the encryption key with CRYPTO_AES_DecryptKey256().
mbed_official 50:a417edff4437 837 *
mbed_official 50:a417edff4437 838 * @param[in] iv
mbed_official 50:a417edff4437 839 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 840 *
mbed_official 50:a417edff4437 841 * @param[in] encrypt
mbed_official 50:a417edff4437 842 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 843 ******************************************************************************/
<> 150:02e0a0aed4ec 844 void CRYPTO_AES_CBC256(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 845 uint8_t * out,
<> 150:02e0a0aed4ec 846 const uint8_t * in,
<> 150:02e0a0aed4ec 847 unsigned int len,
<> 150:02e0a0aed4ec 848 const uint8_t * key,
<> 150:02e0a0aed4ec 849 const uint8_t * iv,
<> 150:02e0a0aed4ec 850 bool encrypt)
mbed_official 50:a417edff4437 851 {
<> 150:02e0a0aed4ec 852 crypto->CTRL = CRYPTO_CTRL_AES_AES256;
<> 150:02e0a0aed4ec 853 CRYPTO_AES_CBCx(crypto, out, in, len, key, iv, encrypt, cryptoKey256Bits);
mbed_official 50:a417edff4437 854 }
mbed_official 50:a417edff4437 855
mbed_official 50:a417edff4437 856 /***************************************************************************//**
mbed_official 50:a417edff4437 857 * @brief
mbed_official 50:a417edff4437 858 * AES Cipher feedback (CFB) cipher mode encryption/decryption, 128 bit key.
mbed_official 50:a417edff4437 859 *
mbed_official 50:a417edff4437 860 * @details
mbed_official 50:a417edff4437 861 * Encryption:
mbed_official 50:a417edff4437 862 * @verbatim
mbed_official 50:a417edff4437 863 * InitVector +----------------+
mbed_official 50:a417edff4437 864 * | | |
mbed_official 50:a417edff4437 865 * V | V
mbed_official 50:a417edff4437 866 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 867 * Key ->| Block cipher | | Key ->| Block cipher |
mbed_official 50:a417edff4437 868 * | encryption | | | encryption |
mbed_official 50:a417edff4437 869 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 870 * | | |
mbed_official 50:a417edff4437 871 * V | V
mbed_official 50:a417edff4437 872 * Plaintext ->XOR | Plaintext ->XOR
mbed_official 50:a417edff4437 873 * |---------+ |
mbed_official 50:a417edff4437 874 * V V
mbed_official 50:a417edff4437 875 * Ciphertext Ciphertext
mbed_official 50:a417edff4437 876 * @endverbatim
mbed_official 50:a417edff4437 877 * Decryption:
mbed_official 50:a417edff4437 878 * @verbatim
mbed_official 50:a417edff4437 879 * InitVector +----------------+
mbed_official 50:a417edff4437 880 * | | |
mbed_official 50:a417edff4437 881 * V | V
mbed_official 50:a417edff4437 882 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 883 * Key ->| Block cipher | | Key ->| Block cipher |
mbed_official 50:a417edff4437 884 * | encryption | | | encryption |
mbed_official 50:a417edff4437 885 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 886 * | | |
mbed_official 50:a417edff4437 887 * V | V
mbed_official 50:a417edff4437 888 * XOR<- Ciphertext XOR<- Ciphertext
mbed_official 50:a417edff4437 889 * | |
mbed_official 50:a417edff4437 890 * V V
mbed_official 50:a417edff4437 891 * Plaintext Plaintext
mbed_official 50:a417edff4437 892 * @endverbatim
mbed_official 50:a417edff4437 893 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 894 *
<> 150:02e0a0aed4ec 895 * @param[in] crypto
<> 150:02e0a0aed4ec 896 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 897 *
mbed_official 50:a417edff4437 898 * @param[out] out
mbed_official 50:a417edff4437 899 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 900 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 901 *
mbed_official 50:a417edff4437 902 * @param[in] in
mbed_official 50:a417edff4437 903 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 904 *
mbed_official 50:a417edff4437 905 * @param[in] len
mbed_official 50:a417edff4437 906 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 907 *
mbed_official 50:a417edff4437 908 * @param[in] key
mbed_official 50:a417edff4437 909 * 128 bit encryption key is used for both encryption and decryption modes.
mbed_official 50:a417edff4437 910 *
mbed_official 50:a417edff4437 911 * @param[in] iv
mbed_official 50:a417edff4437 912 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 913 *
mbed_official 50:a417edff4437 914 * @param[in] encrypt
mbed_official 50:a417edff4437 915 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 916 ******************************************************************************/
<> 150:02e0a0aed4ec 917 void CRYPTO_AES_CFB128(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 918 uint8_t * out,
<> 150:02e0a0aed4ec 919 const uint8_t * in,
<> 150:02e0a0aed4ec 920 unsigned int len,
<> 150:02e0a0aed4ec 921 const uint8_t * key,
<> 150:02e0a0aed4ec 922 const uint8_t * iv,
<> 150:02e0a0aed4ec 923 bool encrypt)
mbed_official 50:a417edff4437 924 {
<> 150:02e0a0aed4ec 925 crypto->CTRL = CRYPTO_CTRL_AES_AES128;
<> 150:02e0a0aed4ec 926 CRYPTO_AES_CFBx(crypto, out, in, len, key, iv, encrypt, cryptoKey128Bits);
mbed_official 50:a417edff4437 927 }
mbed_official 50:a417edff4437 928
mbed_official 50:a417edff4437 929 /***************************************************************************//**
mbed_official 50:a417edff4437 930 * @brief
mbed_official 50:a417edff4437 931 * AES Cipher feedback (CFB) cipher mode encryption/decryption, 256 bit key.
mbed_official 50:a417edff4437 932 *
mbed_official 50:a417edff4437 933 * @details
mbed_official 50:a417edff4437 934 * Please see CRYPTO_AES_CFB128() for CFB figure.
mbed_official 50:a417edff4437 935 *
mbed_official 50:a417edff4437 936 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 937 *
<> 150:02e0a0aed4ec 938 * @param[in] crypto
<> 150:02e0a0aed4ec 939 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 940 *
mbed_official 50:a417edff4437 941 * @param[out] out
mbed_official 50:a417edff4437 942 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 943 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 944 *
mbed_official 50:a417edff4437 945 * @param[in] in
mbed_official 50:a417edff4437 946 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 947 *
mbed_official 50:a417edff4437 948 * @param[in] len
mbed_official 50:a417edff4437 949 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 950 *
mbed_official 50:a417edff4437 951 * @param[in] key
mbed_official 50:a417edff4437 952 * 256 bit encryption key is used for both encryption and decryption modes.
mbed_official 50:a417edff4437 953 *
mbed_official 50:a417edff4437 954 * @param[in] iv
mbed_official 50:a417edff4437 955 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 956 *
mbed_official 50:a417edff4437 957 * @param[in] encrypt
mbed_official 50:a417edff4437 958 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 959 ******************************************************************************/
<> 150:02e0a0aed4ec 960 void CRYPTO_AES_CFB256(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 961 uint8_t * out,
<> 150:02e0a0aed4ec 962 const uint8_t * in,
<> 150:02e0a0aed4ec 963 unsigned int len,
<> 150:02e0a0aed4ec 964 const uint8_t * key,
<> 150:02e0a0aed4ec 965 const uint8_t * iv,
<> 150:02e0a0aed4ec 966 bool encrypt)
mbed_official 50:a417edff4437 967 {
<> 150:02e0a0aed4ec 968 crypto->CTRL = CRYPTO_CTRL_AES_AES256;
<> 150:02e0a0aed4ec 969 CRYPTO_AES_CFBx(crypto, out, in, len, key, iv, encrypt, cryptoKey256Bits);
mbed_official 50:a417edff4437 970 }
mbed_official 50:a417edff4437 971
mbed_official 50:a417edff4437 972 /***************************************************************************//**
mbed_official 50:a417edff4437 973 * @brief
mbed_official 50:a417edff4437 974 * AES Counter (CTR) cipher mode encryption/decryption, 128 bit key.
mbed_official 50:a417edff4437 975 *
mbed_official 50:a417edff4437 976 * @details
mbed_official 50:a417edff4437 977 * Encryption:
mbed_official 50:a417edff4437 978 * @verbatim
mbed_official 50:a417edff4437 979 * Counter Counter
mbed_official 50:a417edff4437 980 * | |
mbed_official 50:a417edff4437 981 * V V
mbed_official 50:a417edff4437 982 * +--------------+ +--------------+
mbed_official 50:a417edff4437 983 * Key ->| Block cipher | Key ->| Block cipher |
mbed_official 50:a417edff4437 984 * | encryption | | encryption |
mbed_official 50:a417edff4437 985 * +--------------+ +--------------+
mbed_official 50:a417edff4437 986 * | |
mbed_official 50:a417edff4437 987 * Plaintext ->XOR Plaintext ->XOR
mbed_official 50:a417edff4437 988 * | |
mbed_official 50:a417edff4437 989 * V V
mbed_official 50:a417edff4437 990 * Ciphertext Ciphertext
mbed_official 50:a417edff4437 991 * @endverbatim
mbed_official 50:a417edff4437 992 * Decryption:
mbed_official 50:a417edff4437 993 * @verbatim
mbed_official 50:a417edff4437 994 * Counter Counter
mbed_official 50:a417edff4437 995 * | |
mbed_official 50:a417edff4437 996 * V V
mbed_official 50:a417edff4437 997 * +--------------+ +--------------+
mbed_official 50:a417edff4437 998 * Key ->| Block cipher | Key ->| Block cipher |
mbed_official 50:a417edff4437 999 * | encryption | | encryption |
mbed_official 50:a417edff4437 1000 * +--------------+ +--------------+
mbed_official 50:a417edff4437 1001 * | |
mbed_official 50:a417edff4437 1002 * Ciphertext ->XOR Ciphertext ->XOR
mbed_official 50:a417edff4437 1003 * | |
mbed_official 50:a417edff4437 1004 * V V
mbed_official 50:a417edff4437 1005 * Plaintext Plaintext
mbed_official 50:a417edff4437 1006 * @endverbatim
mbed_official 50:a417edff4437 1007 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1008 *
<> 150:02e0a0aed4ec 1009 * @param[in] crypto
<> 150:02e0a0aed4ec 1010 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1011 *
mbed_official 50:a417edff4437 1012 * @param[out] out
mbed_official 50:a417edff4437 1013 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1014 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1015 *
mbed_official 50:a417edff4437 1016 * @param[in] in
mbed_official 50:a417edff4437 1017 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1018 *
mbed_official 50:a417edff4437 1019 * @param[in] len
mbed_official 50:a417edff4437 1020 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1021 *
mbed_official 50:a417edff4437 1022 * @param[in] key
mbed_official 50:a417edff4437 1023 * 128 bit encryption key.
mbed_official 50:a417edff4437 1024 * If this argument is null, the key will not be loaded, as it is assumed
mbed_official 50:a417edff4437 1025 * the key has been loaded into KEYHA previously.
mbed_official 50:a417edff4437 1026 *
mbed_official 50:a417edff4437 1027 * @param[in,out] ctr
mbed_official 50:a417edff4437 1028 * 128 bit initial counter value. The counter is updated after each AES
mbed_official 50:a417edff4437 1029 * block encoding through use of @p ctrFunc.
mbed_official 50:a417edff4437 1030 *
mbed_official 50:a417edff4437 1031 * @param[in] ctrFunc
mbed_official 50:a417edff4437 1032 * Function used to update counter value. Not supported by CRYPTO.
mbed_official 50:a417edff4437 1033 * This parameter is included in order for backwards compatibility with
mbed_official 50:a417edff4437 1034 * the EFM32 em_aes.h API.
mbed_official 50:a417edff4437 1035 ******************************************************************************/
<> 150:02e0a0aed4ec 1036 void CRYPTO_AES_CTR128(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1037 uint8_t * out,
<> 150:02e0a0aed4ec 1038 const uint8_t * in,
<> 150:02e0a0aed4ec 1039 unsigned int len,
<> 150:02e0a0aed4ec 1040 const uint8_t * key,
<> 150:02e0a0aed4ec 1041 uint8_t * ctr,
mbed_official 50:a417edff4437 1042 CRYPTO_AES_CtrFuncPtr_TypeDef ctrFunc)
mbed_official 50:a417edff4437 1043 {
<> 150:02e0a0aed4ec 1044 crypto->CTRL = CRYPTO_CTRL_AES_AES128;
<> 150:02e0a0aed4ec 1045 CRYPTO_AES_CTRx(crypto, out, in, len, key, ctr, ctrFunc, cryptoKey128Bits);
mbed_official 50:a417edff4437 1046 }
mbed_official 50:a417edff4437 1047
mbed_official 50:a417edff4437 1048 /***************************************************************************//**
mbed_official 50:a417edff4437 1049 * @brief
mbed_official 50:a417edff4437 1050 * AES Counter (CTR) cipher mode encryption/decryption, 256 bit key.
mbed_official 50:a417edff4437 1051 *
mbed_official 50:a417edff4437 1052 * @details
mbed_official 50:a417edff4437 1053 * Please see CRYPTO_AES_CTR128() for CTR figure.
mbed_official 50:a417edff4437 1054 *
mbed_official 50:a417edff4437 1055 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1056 *
<> 150:02e0a0aed4ec 1057 * @param[in] crypto
<> 150:02e0a0aed4ec 1058 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1059 *
mbed_official 50:a417edff4437 1060 * @param[out] out
mbed_official 50:a417edff4437 1061 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1062 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1063 *
mbed_official 50:a417edff4437 1064 * @param[in] in
mbed_official 50:a417edff4437 1065 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1066 *
mbed_official 50:a417edff4437 1067 * @param[in] len
mbed_official 50:a417edff4437 1068 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1069 *
mbed_official 50:a417edff4437 1070 * @param[in] key
mbed_official 50:a417edff4437 1071 * 256 bit encryption key.
mbed_official 50:a417edff4437 1072 *
mbed_official 50:a417edff4437 1073 * @param[in,out] ctr
mbed_official 50:a417edff4437 1074 * 128 bit initial counter value. The counter is updated after each AES
mbed_official 50:a417edff4437 1075 * block encoding through use of @p ctrFunc.
mbed_official 50:a417edff4437 1076 *
mbed_official 50:a417edff4437 1077 * @param[in] ctrFunc
mbed_official 50:a417edff4437 1078 * Function used to update counter value. Not supported by CRYPTO.
mbed_official 50:a417edff4437 1079 * This parameter is included in order for backwards compatibility with
mbed_official 50:a417edff4437 1080 * the EFM32 em_aes.h API.
mbed_official 50:a417edff4437 1081 ******************************************************************************/
<> 150:02e0a0aed4ec 1082 void CRYPTO_AES_CTR256(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1083 uint8_t * out,
<> 150:02e0a0aed4ec 1084 const uint8_t * in,
<> 150:02e0a0aed4ec 1085 unsigned int len,
<> 150:02e0a0aed4ec 1086 const uint8_t * key,
<> 150:02e0a0aed4ec 1087 uint8_t * ctr,
mbed_official 50:a417edff4437 1088 CRYPTO_AES_CtrFuncPtr_TypeDef ctrFunc)
mbed_official 50:a417edff4437 1089 {
<> 150:02e0a0aed4ec 1090 crypto->CTRL = CRYPTO_CTRL_AES_AES256;
<> 150:02e0a0aed4ec 1091 CRYPTO_AES_CTRx(crypto, out, in, len, key, ctr, ctrFunc, cryptoKey256Bits);
mbed_official 50:a417edff4437 1092 }
mbed_official 50:a417edff4437 1093
mbed_official 50:a417edff4437 1094 /***************************************************************************//**
mbed_official 50:a417edff4437 1095 * @brief
mbed_official 50:a417edff4437 1096 * Update last 32 bits of 128 bit counter, by incrementing with 1.
mbed_official 50:a417edff4437 1097 *
mbed_official 50:a417edff4437 1098 * @details
mbed_official 50:a417edff4437 1099 * Notice that no special consideration is given to possible wrap around. If
mbed_official 50:a417edff4437 1100 * 32 least significant bits are 0xFFFFFFFF, they will be updated to 0x00000000,
mbed_official 50:a417edff4437 1101 * ignoring overflow.
mbed_official 50:a417edff4437 1102 *
mbed_official 50:a417edff4437 1103 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1104 *
mbed_official 50:a417edff4437 1105 * @param[in,out] ctr
mbed_official 50:a417edff4437 1106 * Buffer holding 128 bit counter to be updated.
mbed_official 50:a417edff4437 1107 ******************************************************************************/
mbed_official 50:a417edff4437 1108 void CRYPTO_AES_CTRUpdate32Bit(uint8_t * ctr)
mbed_official 50:a417edff4437 1109 {
mbed_official 50:a417edff4437 1110 uint32_t * _ctr = (uint32_t *) ctr;
mbed_official 50:a417edff4437 1111
mbed_official 50:a417edff4437 1112 _ctr[3] = __REV(__REV(_ctr[3]) + 1);
mbed_official 50:a417edff4437 1113 }
mbed_official 50:a417edff4437 1114
mbed_official 50:a417edff4437 1115 /***************************************************************************//**
mbed_official 50:a417edff4437 1116 * @brief
mbed_official 50:a417edff4437 1117 * Generate 128 bit AES decryption key from 128 bit encryption key. The
mbed_official 50:a417edff4437 1118 * decryption key is used for some cipher modes when decrypting.
mbed_official 50:a417edff4437 1119 *
mbed_official 50:a417edff4437 1120 * @details
mbed_official 50:a417edff4437 1121 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1122 *
<> 150:02e0a0aed4ec 1123 * @param[in] crypto
<> 150:02e0a0aed4ec 1124 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1125 *
mbed_official 50:a417edff4437 1126 * @param[out] out
mbed_official 50:a417edff4437 1127 * Buffer to place 128 bit decryption key. Must be at least 16 bytes long. It
mbed_official 50:a417edff4437 1128 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1129 *
mbed_official 50:a417edff4437 1130 * @param[in] in
mbed_official 50:a417edff4437 1131 * Buffer holding 128 bit encryption key. Must be at least 16 bytes long.
mbed_official 50:a417edff4437 1132 ******************************************************************************/
<> 150:02e0a0aed4ec 1133 void CRYPTO_AES_DecryptKey128(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1134 uint8_t * out,
<> 150:02e0a0aed4ec 1135 const uint8_t * in)
mbed_official 50:a417edff4437 1136 {
mbed_official 50:a417edff4437 1137 uint32_t * _out = (uint32_t *) out;
mbed_official 50:a417edff4437 1138 const uint32_t * _in = (const uint32_t *) in;
mbed_official 50:a417edff4437 1139
<> 161:2cc1468da177 1140 /* Setup CRYPTO in AES-128 mode. */
<> 161:2cc1468da177 1141 crypto->CTRL = CRYPTO_CTRL_AES_AES128;
AnnaBridge 179:b0033dcd6934 1142
mbed_official 50:a417edff4437 1143 /* Load key */
<> 150:02e0a0aed4ec 1144 CRYPTO_BurstToCrypto(&crypto->KEYBUF, &_in[0]);
mbed_official 50:a417edff4437 1145
mbed_official 50:a417edff4437 1146 /* Do dummy encryption to generate decrypt key */
<> 150:02e0a0aed4ec 1147 crypto->CMD = CRYPTO_CMD_INSTR_AESENC;
mbed_official 50:a417edff4437 1148
mbed_official 50:a417edff4437 1149 /* Save decryption key */
<> 150:02e0a0aed4ec 1150 CRYPTO_BurstFromCrypto(&crypto->KEY, &_out[0]);
mbed_official 50:a417edff4437 1151 }
mbed_official 50:a417edff4437 1152
mbed_official 50:a417edff4437 1153 /***************************************************************************//**
mbed_official 50:a417edff4437 1154 * @brief
mbed_official 50:a417edff4437 1155 * Generate 256 bit AES decryption key from 256 bit encryption key. The
mbed_official 50:a417edff4437 1156 * decryption key is used for some cipher modes when decrypting.
mbed_official 50:a417edff4437 1157 *
mbed_official 50:a417edff4437 1158 * @details
mbed_official 50:a417edff4437 1159 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1160 *
<> 150:02e0a0aed4ec 1161 * @param[in] crypto
<> 150:02e0a0aed4ec 1162 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1163 *
mbed_official 50:a417edff4437 1164 * @param[out] out
mbed_official 50:a417edff4437 1165 * Buffer to place 256 bit decryption key. Must be at least 32 bytes long. It
mbed_official 50:a417edff4437 1166 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1167 *
mbed_official 50:a417edff4437 1168 * @param[in] in
mbed_official 50:a417edff4437 1169 * Buffer holding 256 bit encryption key. Must be at least 32 bytes long.
mbed_official 50:a417edff4437 1170 ******************************************************************************/
<> 150:02e0a0aed4ec 1171 void CRYPTO_AES_DecryptKey256(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1172 uint8_t * out,
<> 150:02e0a0aed4ec 1173 const uint8_t * in)
mbed_official 50:a417edff4437 1174 {
mbed_official 50:a417edff4437 1175 uint32_t * _out = (uint32_t *) out;
mbed_official 50:a417edff4437 1176 const uint32_t * _in = (const uint32_t *) in;
mbed_official 50:a417edff4437 1177
<> 161:2cc1468da177 1178 /* Setup CRYPTO in AES-256 mode. */
<> 161:2cc1468da177 1179 crypto->CTRL = CRYPTO_CTRL_AES_AES256;
AnnaBridge 179:b0033dcd6934 1180
mbed_official 50:a417edff4437 1181 /* Load key */
<> 150:02e0a0aed4ec 1182 CRYPTO_BurstToCrypto(&crypto->KEYBUF, &_in[0]);
<> 150:02e0a0aed4ec 1183 CRYPTO_BurstToCrypto(&crypto->KEYBUF, &_in[4]);
mbed_official 50:a417edff4437 1184
mbed_official 50:a417edff4437 1185 /* Do dummy encryption to generate decrypt key */
<> 150:02e0a0aed4ec 1186 crypto->CMD = CRYPTO_CMD_INSTR_AESENC;
mbed_official 50:a417edff4437 1187
mbed_official 50:a417edff4437 1188 /* Save decryption key */
<> 150:02e0a0aed4ec 1189 CRYPTO_BurstFromCrypto(&crypto->KEY, &_out[0]);
<> 150:02e0a0aed4ec 1190 CRYPTO_BurstFromCrypto(&crypto->KEY, &_out[4]);
mbed_official 50:a417edff4437 1191 }
mbed_official 50:a417edff4437 1192
mbed_official 50:a417edff4437 1193 /***************************************************************************//**
mbed_official 50:a417edff4437 1194 * @brief
mbed_official 50:a417edff4437 1195 * AES Electronic Codebook (ECB) cipher mode encryption/decryption,
mbed_official 50:a417edff4437 1196 * 128 bit key.
mbed_official 50:a417edff4437 1197 *
mbed_official 50:a417edff4437 1198 * @details
mbed_official 50:a417edff4437 1199 * Encryption:
mbed_official 50:a417edff4437 1200 * @verbatim
mbed_official 50:a417edff4437 1201 * Plaintext Plaintext
mbed_official 50:a417edff4437 1202 * | |
mbed_official 50:a417edff4437 1203 * V V
mbed_official 50:a417edff4437 1204 * +--------------+ +--------------+
mbed_official 50:a417edff4437 1205 * Key ->| Block cipher | Key ->| Block cipher |
mbed_official 50:a417edff4437 1206 * | encryption | | encryption |
mbed_official 50:a417edff4437 1207 * +--------------+ +--------------+
mbed_official 50:a417edff4437 1208 * | |
mbed_official 50:a417edff4437 1209 * V V
mbed_official 50:a417edff4437 1210 * Ciphertext Ciphertext
mbed_official 50:a417edff4437 1211 * @endverbatim
mbed_official 50:a417edff4437 1212 * Decryption:
mbed_official 50:a417edff4437 1213 * @verbatim
mbed_official 50:a417edff4437 1214 * Ciphertext Ciphertext
mbed_official 50:a417edff4437 1215 * | |
mbed_official 50:a417edff4437 1216 * V V
mbed_official 50:a417edff4437 1217 * +--------------+ +--------------+
mbed_official 50:a417edff4437 1218 * Key ->| Block cipher | Key ->| Block cipher |
mbed_official 50:a417edff4437 1219 * | decryption | | decryption |
mbed_official 50:a417edff4437 1220 * +--------------+ +--------------+
mbed_official 50:a417edff4437 1221 * | |
mbed_official 50:a417edff4437 1222 * V V
mbed_official 50:a417edff4437 1223 * Plaintext Plaintext
mbed_official 50:a417edff4437 1224 * @endverbatim
mbed_official 50:a417edff4437 1225 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1226 *
<> 150:02e0a0aed4ec 1227 * @param[in] crypto
<> 150:02e0a0aed4ec 1228 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1229 *
mbed_official 50:a417edff4437 1230 * @param[out] out
mbed_official 50:a417edff4437 1231 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1232 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1233 *
mbed_official 50:a417edff4437 1234 * @param[in] in
mbed_official 50:a417edff4437 1235 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1236 *
mbed_official 50:a417edff4437 1237 * @param[in] len
mbed_official 50:a417edff4437 1238 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1239 *
mbed_official 50:a417edff4437 1240 * @param[in] key
mbed_official 50:a417edff4437 1241 * When doing encryption, this is the 128 bit encryption key. When doing
mbed_official 50:a417edff4437 1242 * decryption, this is the 128 bit decryption key. The decryption key may
mbed_official 50:a417edff4437 1243 * be generated from the encryption key with CRYPTO_AES_DecryptKey128().
mbed_official 50:a417edff4437 1244 *
mbed_official 50:a417edff4437 1245 * @param[in] encrypt
mbed_official 50:a417edff4437 1246 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 1247 ******************************************************************************/
<> 150:02e0a0aed4ec 1248 void CRYPTO_AES_ECB128(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1249 uint8_t * out,
<> 150:02e0a0aed4ec 1250 const uint8_t * in,
<> 150:02e0a0aed4ec 1251 unsigned int len,
<> 150:02e0a0aed4ec 1252 const uint8_t * key,
<> 150:02e0a0aed4ec 1253 bool encrypt)
mbed_official 50:a417edff4437 1254 {
<> 150:02e0a0aed4ec 1255 crypto->CTRL = CRYPTO_CTRL_AES_AES128;
<> 150:02e0a0aed4ec 1256 CRYPTO_AES_ECBx(crypto, out, in, len, key, encrypt, cryptoKey128Bits);
mbed_official 50:a417edff4437 1257 }
mbed_official 50:a417edff4437 1258
mbed_official 50:a417edff4437 1259 /***************************************************************************//**
mbed_official 50:a417edff4437 1260 * @brief
mbed_official 50:a417edff4437 1261 * AES Electronic Codebook (ECB) cipher mode encryption/decryption,
mbed_official 50:a417edff4437 1262 * 256 bit key.
mbed_official 50:a417edff4437 1263 *
mbed_official 50:a417edff4437 1264 * @details
mbed_official 50:a417edff4437 1265 * Please see CRYPTO_AES_ECB128() for ECB figure.
mbed_official 50:a417edff4437 1266 *
mbed_official 50:a417edff4437 1267 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1268 *
<> 150:02e0a0aed4ec 1269 * @param[in] crypto
<> 150:02e0a0aed4ec 1270 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1271 *
mbed_official 50:a417edff4437 1272 * @param[out] out
mbed_official 50:a417edff4437 1273 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1274 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1275 *
mbed_official 50:a417edff4437 1276 * @param[in] in
mbed_official 50:a417edff4437 1277 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1278 *
mbed_official 50:a417edff4437 1279 * @param[in] len
mbed_official 50:a417edff4437 1280 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1281 *
mbed_official 50:a417edff4437 1282 * @param[in] key
mbed_official 50:a417edff4437 1283 * When doing encryption, this is the 256 bit encryption key. When doing
mbed_official 50:a417edff4437 1284 * decryption, this is the 256 bit decryption key. The decryption key may
mbed_official 50:a417edff4437 1285 * be generated from the encryption key with CRYPTO_AES_DecryptKey256().
mbed_official 50:a417edff4437 1286 *
mbed_official 50:a417edff4437 1287 * @param[in] encrypt
mbed_official 50:a417edff4437 1288 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 1289 ******************************************************************************/
<> 150:02e0a0aed4ec 1290 void CRYPTO_AES_ECB256(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1291 uint8_t * out,
<> 150:02e0a0aed4ec 1292 const uint8_t * in,
<> 150:02e0a0aed4ec 1293 unsigned int len,
<> 150:02e0a0aed4ec 1294 const uint8_t * key,
<> 150:02e0a0aed4ec 1295 bool encrypt)
mbed_official 50:a417edff4437 1296 {
<> 150:02e0a0aed4ec 1297 crypto->CTRL = CRYPTO_CTRL_AES_AES256;
<> 150:02e0a0aed4ec 1298 CRYPTO_AES_ECBx(crypto, out, in, len, key, encrypt, cryptoKey256Bits);
mbed_official 50:a417edff4437 1299 }
mbed_official 50:a417edff4437 1300
mbed_official 50:a417edff4437 1301 /***************************************************************************//**
mbed_official 50:a417edff4437 1302 * @brief
mbed_official 50:a417edff4437 1303 * AES Output feedback (OFB) cipher mode encryption/decryption, 128 bit key.
mbed_official 50:a417edff4437 1304 *
mbed_official 50:a417edff4437 1305 * @details
mbed_official 50:a417edff4437 1306 * Encryption:
mbed_official 50:a417edff4437 1307 * @verbatim
mbed_official 50:a417edff4437 1308 * InitVector +----------------+
mbed_official 50:a417edff4437 1309 * | | |
mbed_official 50:a417edff4437 1310 * V | V
mbed_official 50:a417edff4437 1311 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 1312 * Key ->| Block cipher | | Key ->| Block cipher |
mbed_official 50:a417edff4437 1313 * | encryption | | | encryption |
mbed_official 50:a417edff4437 1314 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 1315 * | | |
mbed_official 50:a417edff4437 1316 * |---------+ |
mbed_official 50:a417edff4437 1317 * V V
mbed_official 50:a417edff4437 1318 * Plaintext ->XOR Plaintext ->XOR
mbed_official 50:a417edff4437 1319 * | |
mbed_official 50:a417edff4437 1320 * V V
mbed_official 50:a417edff4437 1321 * Ciphertext Ciphertext
mbed_official 50:a417edff4437 1322 * @endverbatim
mbed_official 50:a417edff4437 1323 * Decryption:
mbed_official 50:a417edff4437 1324 * @verbatim
mbed_official 50:a417edff4437 1325 * InitVector +----------------+
mbed_official 50:a417edff4437 1326 * | | |
mbed_official 50:a417edff4437 1327 * V | V
mbed_official 50:a417edff4437 1328 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 1329 * Key ->| Block cipher | | Key ->| Block cipher |
mbed_official 50:a417edff4437 1330 * | encryption | | | encryption |
mbed_official 50:a417edff4437 1331 * +--------------+ | +--------------+
mbed_official 50:a417edff4437 1332 * | | |
mbed_official 50:a417edff4437 1333 * |---------+ |
mbed_official 50:a417edff4437 1334 * V V
mbed_official 50:a417edff4437 1335 * Ciphertext ->XOR Ciphertext ->XOR
mbed_official 50:a417edff4437 1336 * | |
mbed_official 50:a417edff4437 1337 * V V
mbed_official 50:a417edff4437 1338 * Plaintext Plaintext
mbed_official 50:a417edff4437 1339 * @endverbatim
mbed_official 50:a417edff4437 1340 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1341 *
<> 150:02e0a0aed4ec 1342 * @param[in] crypto
<> 150:02e0a0aed4ec 1343 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1344 *
mbed_official 50:a417edff4437 1345 * @param[out] out
mbed_official 50:a417edff4437 1346 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1347 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1348 *
mbed_official 50:a417edff4437 1349 * @param[in] in
mbed_official 50:a417edff4437 1350 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1351 *
mbed_official 50:a417edff4437 1352 * @param[in] len
mbed_official 50:a417edff4437 1353 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1354 *
mbed_official 50:a417edff4437 1355 * @param[in] key
mbed_official 50:a417edff4437 1356 * 128 bit encryption key.
mbed_official 50:a417edff4437 1357 *
mbed_official 50:a417edff4437 1358 * @param[in] iv
mbed_official 50:a417edff4437 1359 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 1360 ******************************************************************************/
<> 150:02e0a0aed4ec 1361 void CRYPTO_AES_OFB128(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1362 uint8_t * out,
<> 150:02e0a0aed4ec 1363 const uint8_t * in,
<> 150:02e0a0aed4ec 1364 unsigned int len,
<> 150:02e0a0aed4ec 1365 const uint8_t * key,
<> 150:02e0a0aed4ec 1366 const uint8_t * iv)
mbed_official 50:a417edff4437 1367 {
<> 150:02e0a0aed4ec 1368 crypto->CTRL = CRYPTO_CTRL_AES_AES128;
<> 150:02e0a0aed4ec 1369 CRYPTO_AES_OFBx(crypto, out, in, len, key, iv, cryptoKey128Bits);
mbed_official 50:a417edff4437 1370 }
mbed_official 50:a417edff4437 1371
mbed_official 50:a417edff4437 1372 /***************************************************************************//**
mbed_official 50:a417edff4437 1373 * @brief
mbed_official 50:a417edff4437 1374 * AES Output feedback (OFB) cipher mode encryption/decryption, 256 bit key.
mbed_official 50:a417edff4437 1375 *
mbed_official 50:a417edff4437 1376 * @details
mbed_official 50:a417edff4437 1377 * Please see CRYPTO_AES_OFB128() for OFB figure.
mbed_official 50:a417edff4437 1378 *
mbed_official 50:a417edff4437 1379 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1380 *
<> 150:02e0a0aed4ec 1381 * @param[in] crypto
<> 150:02e0a0aed4ec 1382 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1383 *
mbed_official 50:a417edff4437 1384 * @param[out] out
mbed_official 50:a417edff4437 1385 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1386 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1387 *
mbed_official 50:a417edff4437 1388 * @param[in] in
mbed_official 50:a417edff4437 1389 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1390 *
mbed_official 50:a417edff4437 1391 * @param[in] len
mbed_official 50:a417edff4437 1392 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1393 *
mbed_official 50:a417edff4437 1394 * @param[in] key
mbed_official 50:a417edff4437 1395 * 256 bit encryption key.
mbed_official 50:a417edff4437 1396 *
mbed_official 50:a417edff4437 1397 * @param[in] iv
mbed_official 50:a417edff4437 1398 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 1399 ******************************************************************************/
<> 150:02e0a0aed4ec 1400 void CRYPTO_AES_OFB256(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1401 uint8_t * out,
<> 150:02e0a0aed4ec 1402 const uint8_t * in,
<> 150:02e0a0aed4ec 1403 unsigned int len,
<> 150:02e0a0aed4ec 1404 const uint8_t * key,
<> 150:02e0a0aed4ec 1405 const uint8_t * iv)
mbed_official 50:a417edff4437 1406 {
<> 150:02e0a0aed4ec 1407 crypto->CTRL = CRYPTO_CTRL_AES_AES256;
<> 150:02e0a0aed4ec 1408 CRYPTO_AES_OFBx(crypto, out, in, len, key, iv, cryptoKey256Bits);
mbed_official 50:a417edff4437 1409 }
mbed_official 50:a417edff4437 1410
mbed_official 50:a417edff4437 1411 /*******************************************************************************
mbed_official 50:a417edff4437 1412 ************************** LOCAL FUNCTIONS *******************************
mbed_official 50:a417edff4437 1413 ******************************************************************************/
mbed_official 50:a417edff4437 1414
mbed_official 50:a417edff4437 1415 /***************************************************************************//**
mbed_official 50:a417edff4437 1416 * @brief
mbed_official 50:a417edff4437 1417 * Cipher-block chaining (CBC) cipher mode encryption/decryption, 128/256 bit key.
mbed_official 50:a417edff4437 1418 *
mbed_official 50:a417edff4437 1419 * @details
mbed_official 50:a417edff4437 1420 * Please see CRYPTO_AES_CBC128() for CBC figure.
mbed_official 50:a417edff4437 1421 *
mbed_official 50:a417edff4437 1422 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1423 *
<> 150:02e0a0aed4ec 1424 * @param[in] crypto
<> 150:02e0a0aed4ec 1425 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1426 *
mbed_official 50:a417edff4437 1427 * @param[out] out
mbed_official 50:a417edff4437 1428 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1429 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1430 *
mbed_official 50:a417edff4437 1431 * @param[in] in
mbed_official 50:a417edff4437 1432 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1433 *
mbed_official 50:a417edff4437 1434 * @param[in] len
mbed_official 50:a417edff4437 1435 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1436 *
mbed_official 50:a417edff4437 1437 * @param[in] key
mbed_official 50:a417edff4437 1438 * When doing encryption, this is the 256 bit encryption key. When doing
mbed_official 50:a417edff4437 1439 * decryption, this is the 256 bit decryption key. The decryption key may
mbed_official 50:a417edff4437 1440 * be generated from the encryption key with CRYPTO_AES_DecryptKey256().
mbed_official 50:a417edff4437 1441 *
mbed_official 50:a417edff4437 1442 * @param[in] iv
mbed_official 50:a417edff4437 1443 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 1444 *
mbed_official 50:a417edff4437 1445 * @param[in] encrypt
mbed_official 50:a417edff4437 1446 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 1447 *
mbed_official 50:a417edff4437 1448 * @param[in] keyWidth
mbed_official 50:a417edff4437 1449 * Set to cryptoKey128Bits or cryptoKey256Bits.
mbed_official 50:a417edff4437 1450 ******************************************************************************/
<> 150:02e0a0aed4ec 1451 static void CRYPTO_AES_CBCx(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1452 uint8_t * out,
<> 150:02e0a0aed4ec 1453 const uint8_t * in,
<> 150:02e0a0aed4ec 1454 unsigned int len,
<> 150:02e0a0aed4ec 1455 const uint8_t * key,
<> 150:02e0a0aed4ec 1456 const uint8_t * iv,
<> 150:02e0a0aed4ec 1457 bool encrypt,
mbed_official 50:a417edff4437 1458 CRYPTO_KeyWidth_TypeDef keyWidth)
mbed_official 50:a417edff4437 1459 {
mbed_official 50:a417edff4437 1460 EFM_ASSERT(!(len % CRYPTO_AES_BLOCKSIZE));
mbed_official 50:a417edff4437 1461
mbed_official 50:a417edff4437 1462 /* Initialize control registers. */
<> 150:02e0a0aed4ec 1463 crypto->WAC = 0;
<> 150:02e0a0aed4ec 1464
<> 150:02e0a0aed4ec 1465 CRYPTO_KeyBufWrite(crypto, (uint32_t *)key, keyWidth);
mbed_official 50:a417edff4437 1466
AnnaBridge 179:b0033dcd6934 1467 if (encrypt) {
<> 150:02e0a0aed4ec 1468 CRYPTO_DataWrite(&crypto->DATA0, (uint32_t *)iv);
mbed_official 50:a417edff4437 1469
AnnaBridge 179:b0033dcd6934 1470 crypto->SEQ0 = CRYPTO_CMD_INSTR_DATA1TODATA0XOR << _CRYPTO_SEQ0_INSTR0_SHIFT
AnnaBridge 179:b0033dcd6934 1471 | CRYPTO_CMD_INSTR_AESENC << _CRYPTO_SEQ0_INSTR1_SHIFT;
<> 150:02e0a0aed4ec 1472
<> 150:02e0a0aed4ec 1473 CRYPTO_AES_ProcessLoop(crypto, len,
<> 150:02e0a0aed4ec 1474 &crypto->DATA1, (uint32_t *) in,
<> 150:02e0a0aed4ec 1475 &crypto->DATA0, (uint32_t *) out);
AnnaBridge 179:b0033dcd6934 1476 } else {
<> 150:02e0a0aed4ec 1477 CRYPTO_DataWrite(&crypto->DATA2, (uint32_t *) iv);
mbed_official 50:a417edff4437 1478
AnnaBridge 179:b0033dcd6934 1479 crypto->SEQ0 = CRYPTO_CMD_INSTR_DATA1TODATA0 << _CRYPTO_SEQ0_INSTR0_SHIFT
AnnaBridge 179:b0033dcd6934 1480 | CRYPTO_CMD_INSTR_AESDEC << _CRYPTO_SEQ0_INSTR1_SHIFT
AnnaBridge 179:b0033dcd6934 1481 | CRYPTO_CMD_INSTR_DATA2TODATA0XOR << _CRYPTO_SEQ0_INSTR2_SHIFT
AnnaBridge 179:b0033dcd6934 1482 | CRYPTO_CMD_INSTR_DATA1TODATA2 << _CRYPTO_SEQ0_INSTR3_SHIFT;
mbed_official 50:a417edff4437 1483
<> 150:02e0a0aed4ec 1484 crypto->SEQ1 = 0;
mbed_official 50:a417edff4437 1485
mbed_official 50:a417edff4437 1486 /* The following call is equivalent to the last call in the
mbed_official 50:a417edff4437 1487 'if( encrypt )' branch. However moving this
mbed_official 50:a417edff4437 1488 call outside the conditional scope results in slightly poorer
mbed_official 50:a417edff4437 1489 performance for some compiler optimizations. */
<> 150:02e0a0aed4ec 1490 CRYPTO_AES_ProcessLoop(crypto, len,
<> 150:02e0a0aed4ec 1491 &crypto->DATA1, (uint32_t *) in,
<> 150:02e0a0aed4ec 1492 &crypto->DATA0, (uint32_t *) out);
mbed_official 50:a417edff4437 1493 }
mbed_official 50:a417edff4437 1494 }
mbed_official 50:a417edff4437 1495
mbed_official 50:a417edff4437 1496 /***************************************************************************//**
mbed_official 50:a417edff4437 1497 * @brief
mbed_official 50:a417edff4437 1498 * Cipher feedback (CFB) cipher mode encryption/decryption, 128/256 bit key.
mbed_official 50:a417edff4437 1499 *
mbed_official 50:a417edff4437 1500 * @details
mbed_official 50:a417edff4437 1501 * Please see CRYPTO_AES_CFB128() for CFB figure.
mbed_official 50:a417edff4437 1502 *
mbed_official 50:a417edff4437 1503 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1504 *
<> 150:02e0a0aed4ec 1505 * @param[in] crypto
<> 150:02e0a0aed4ec 1506 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1507 *
mbed_official 50:a417edff4437 1508 * @param[out] out
mbed_official 50:a417edff4437 1509 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1510 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1511 *
mbed_official 50:a417edff4437 1512 * @param[in] in
mbed_official 50:a417edff4437 1513 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1514 *
mbed_official 50:a417edff4437 1515 * @param[in] len
mbed_official 50:a417edff4437 1516 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1517 *
mbed_official 50:a417edff4437 1518 * @param[in] key
mbed_official 50:a417edff4437 1519 * 256 bit encryption key is used for both encryption and decryption modes.
mbed_official 50:a417edff4437 1520 *
mbed_official 50:a417edff4437 1521 * @param[in] iv
mbed_official 50:a417edff4437 1522 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 1523 *
mbed_official 50:a417edff4437 1524 * @param[in] encrypt
mbed_official 50:a417edff4437 1525 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 1526 *
mbed_official 50:a417edff4437 1527 * @param[in] keyWidth
mbed_official 50:a417edff4437 1528 * Set to cryptoKey128Bits or cryptoKey256Bits.
mbed_official 50:a417edff4437 1529 ******************************************************************************/
<> 150:02e0a0aed4ec 1530 static void CRYPTO_AES_CFBx(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1531 uint8_t * out,
<> 150:02e0a0aed4ec 1532 const uint8_t * in,
<> 150:02e0a0aed4ec 1533 unsigned int len,
<> 150:02e0a0aed4ec 1534 const uint8_t * key,
<> 150:02e0a0aed4ec 1535 const uint8_t * iv,
<> 150:02e0a0aed4ec 1536 bool encrypt,
mbed_official 50:a417edff4437 1537 CRYPTO_KeyWidth_TypeDef keyWidth)
mbed_official 50:a417edff4437 1538 {
mbed_official 50:a417edff4437 1539 EFM_ASSERT(!(len % CRYPTO_AES_BLOCKSIZE));
mbed_official 50:a417edff4437 1540
mbed_official 50:a417edff4437 1541 /* Initialize control registers. */
<> 150:02e0a0aed4ec 1542 crypto->WAC = 0;
mbed_official 50:a417edff4437 1543
mbed_official 50:a417edff4437 1544 /* Load Key */
<> 150:02e0a0aed4ec 1545 CRYPTO_KeyBufWrite(crypto, (uint32_t *)key, keyWidth);
mbed_official 50:a417edff4437 1546
mbed_official 50:a417edff4437 1547 /* Load instructions to CRYPTO sequencer. */
AnnaBridge 179:b0033dcd6934 1548 if (encrypt) {
mbed_official 50:a417edff4437 1549 /* Load IV */
<> 150:02e0a0aed4ec 1550 CRYPTO_DataWrite(&crypto->DATA0, (uint32_t *)iv);
mbed_official 50:a417edff4437 1551
AnnaBridge 179:b0033dcd6934 1552 crypto->SEQ0 = CRYPTO_CMD_INSTR_AESENC << _CRYPTO_SEQ0_INSTR0_SHIFT
AnnaBridge 179:b0033dcd6934 1553 | CRYPTO_CMD_INSTR_DATA1TODATA0XOR << _CRYPTO_SEQ0_INSTR1_SHIFT;
<> 150:02e0a0aed4ec 1554
<> 150:02e0a0aed4ec 1555 CRYPTO_AES_ProcessLoop(crypto, len,
<> 150:02e0a0aed4ec 1556 &crypto->DATA1, (uint32_t *)in,
<> 150:02e0a0aed4ec 1557 &crypto->DATA0, (uint32_t *)out
mbed_official 50:a417edff4437 1558 );
AnnaBridge 179:b0033dcd6934 1559 } else {
mbed_official 50:a417edff4437 1560 /* Load IV */
<> 150:02e0a0aed4ec 1561 CRYPTO_DataWrite(&crypto->DATA2, (uint32_t *)iv);
mbed_official 50:a417edff4437 1562
AnnaBridge 179:b0033dcd6934 1563 crypto->SEQ0 = CRYPTO_CMD_INSTR_DATA2TODATA0 << _CRYPTO_SEQ0_INSTR0_SHIFT
AnnaBridge 179:b0033dcd6934 1564 | CRYPTO_CMD_INSTR_AESENC << _CRYPTO_SEQ0_INSTR1_SHIFT
AnnaBridge 179:b0033dcd6934 1565 | CRYPTO_CMD_INSTR_DATA1TODATA0XOR << _CRYPTO_SEQ0_INSTR2_SHIFT
AnnaBridge 179:b0033dcd6934 1566 | CRYPTO_CMD_INSTR_DATA1TODATA2 << _CRYPTO_SEQ0_INSTR3_SHIFT;
<> 150:02e0a0aed4ec 1567 crypto->SEQ1 = 0;
<> 150:02e0a0aed4ec 1568
<> 150:02e0a0aed4ec 1569 CRYPTO_AES_ProcessLoop(crypto, len,
<> 150:02e0a0aed4ec 1570 &crypto->DATA1, (uint32_t *)in,
<> 150:02e0a0aed4ec 1571 &crypto->DATA0, (uint32_t *)out
mbed_official 50:a417edff4437 1572 );
mbed_official 50:a417edff4437 1573 }
mbed_official 50:a417edff4437 1574 }
mbed_official 50:a417edff4437 1575
mbed_official 50:a417edff4437 1576 /***************************************************************************//**
mbed_official 50:a417edff4437 1577 * @brief
mbed_official 50:a417edff4437 1578 * Counter (CTR) cipher mode encryption/decryption, 128/256 bit key.
mbed_official 50:a417edff4437 1579 *
mbed_official 50:a417edff4437 1580 * @details
mbed_official 50:a417edff4437 1581 * Please see CRYPTO_AES_CTR128() for CTR figure.
mbed_official 50:a417edff4437 1582 *
mbed_official 50:a417edff4437 1583 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1584 *
<> 150:02e0a0aed4ec 1585 * @param[in] crypto
<> 150:02e0a0aed4ec 1586 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1587 *
mbed_official 50:a417edff4437 1588 * @param[out] out
mbed_official 50:a417edff4437 1589 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1590 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1591 *
mbed_official 50:a417edff4437 1592 * @param[in] in
mbed_official 50:a417edff4437 1593 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1594 *
mbed_official 50:a417edff4437 1595 * @param[in] len
mbed_official 50:a417edff4437 1596 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1597 *
mbed_official 50:a417edff4437 1598 * @param[in] key
mbed_official 50:a417edff4437 1599 * 256 bit encryption key.
mbed_official 50:a417edff4437 1600 *
mbed_official 50:a417edff4437 1601 * @param[in,out] ctr
mbed_official 50:a417edff4437 1602 * 128 bit initial counter value. The counter is updated after each AES
mbed_official 50:a417edff4437 1603 * block encoding through use of @p ctrFunc.
mbed_official 50:a417edff4437 1604 *
mbed_official 50:a417edff4437 1605 * @param[in] ctrFunc
mbed_official 50:a417edff4437 1606 * Function used to update counter value. Not supported by CRYPTO.
mbed_official 50:a417edff4437 1607 * This parameter is included in order for backwards compatibility with
mbed_official 50:a417edff4437 1608 * the EFM32 em_aes.h API.
mbed_official 50:a417edff4437 1609 *
mbed_official 50:a417edff4437 1610 * @param[in] keyWidth
mbed_official 50:a417edff4437 1611 * Set to cryptoKey128Bits or cryptoKey256Bits.
mbed_official 50:a417edff4437 1612 ******************************************************************************/
<> 150:02e0a0aed4ec 1613 static void CRYPTO_AES_CTRx(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1614 uint8_t * out,
<> 150:02e0a0aed4ec 1615 const uint8_t * in,
<> 150:02e0a0aed4ec 1616 unsigned int len,
<> 150:02e0a0aed4ec 1617 const uint8_t * key,
<> 150:02e0a0aed4ec 1618 uint8_t * ctr,
mbed_official 50:a417edff4437 1619 CRYPTO_AES_CtrFuncPtr_TypeDef ctrFunc,
mbed_official 50:a417edff4437 1620 CRYPTO_KeyWidth_TypeDef keyWidth)
mbed_official 50:a417edff4437 1621 {
mbed_official 50:a417edff4437 1622 (void) ctrFunc;
<> 150:02e0a0aed4ec 1623
mbed_official 50:a417edff4437 1624 EFM_ASSERT(!(len % CRYPTO_AES_BLOCKSIZE));
mbed_official 50:a417edff4437 1625
mbed_official 50:a417edff4437 1626 /* Initialize control registers. */
<> 150:02e0a0aed4ec 1627 crypto->CTRL |= CRYPTO_CTRL_INCWIDTH_INCWIDTH4;
<> 150:02e0a0aed4ec 1628 crypto->WAC = 0;
mbed_official 50:a417edff4437 1629
<> 150:02e0a0aed4ec 1630 CRYPTO_KeyBufWrite(crypto, (uint32_t *)key, keyWidth);
mbed_official 50:a417edff4437 1631
<> 150:02e0a0aed4ec 1632 CRYPTO_DataWrite(&crypto->DATA1, (uint32_t *) ctr);
mbed_official 50:a417edff4437 1633
AnnaBridge 179:b0033dcd6934 1634 crypto->SEQ0 = CRYPTO_CMD_INSTR_DATA1TODATA0 << _CRYPTO_SEQ0_INSTR0_SHIFT
AnnaBridge 179:b0033dcd6934 1635 | CRYPTO_CMD_INSTR_AESENC << _CRYPTO_SEQ0_INSTR1_SHIFT
AnnaBridge 179:b0033dcd6934 1636 | CRYPTO_CMD_INSTR_DATA0TODATA3 << _CRYPTO_SEQ0_INSTR2_SHIFT
AnnaBridge 179:b0033dcd6934 1637 | CRYPTO_CMD_INSTR_DATA1INC << _CRYPTO_SEQ0_INSTR3_SHIFT;
mbed_official 50:a417edff4437 1638
<> 150:02e0a0aed4ec 1639 crypto->SEQ1 = CRYPTO_CMD_INSTR_DATA2TODATA0XOR << _CRYPTO_SEQ1_INSTR4_SHIFT;
mbed_official 50:a417edff4437 1640
<> 150:02e0a0aed4ec 1641 CRYPTO_AES_ProcessLoop(crypto, len,
<> 150:02e0a0aed4ec 1642 &crypto->DATA2, (uint32_t *) in,
<> 150:02e0a0aed4ec 1643 &crypto->DATA0, (uint32_t *) out);
mbed_official 50:a417edff4437 1644
<> 150:02e0a0aed4ec 1645 CRYPTO_DataRead(&crypto->DATA1, (uint32_t *) ctr);
mbed_official 50:a417edff4437 1646 }
mbed_official 50:a417edff4437 1647
mbed_official 50:a417edff4437 1648 /***************************************************************************//**
mbed_official 50:a417edff4437 1649 * @brief
mbed_official 50:a417edff4437 1650 * Electronic Codebook (ECB) cipher mode encryption/decryption, 128/256 bit key.
mbed_official 50:a417edff4437 1651 *
mbed_official 50:a417edff4437 1652 * @details
mbed_official 50:a417edff4437 1653 * Please see CRYPTO_AES_ECB128() for ECB figure.
mbed_official 50:a417edff4437 1654 *
mbed_official 50:a417edff4437 1655 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1656 *
<> 150:02e0a0aed4ec 1657 * @param[in] crypto
<> 150:02e0a0aed4ec 1658 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1659 *
mbed_official 50:a417edff4437 1660 * @param[out] out
mbed_official 50:a417edff4437 1661 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1662 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1663 *
mbed_official 50:a417edff4437 1664 * @param[in] in
mbed_official 50:a417edff4437 1665 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1666 *
mbed_official 50:a417edff4437 1667 * @param[in] len
mbed_official 50:a417edff4437 1668 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1669 *
mbed_official 50:a417edff4437 1670 * @param[in] key
mbed_official 50:a417edff4437 1671 * When doing encryption, this is the 256 bit encryption key. When doing
mbed_official 50:a417edff4437 1672 * decryption, this is the 256 bit decryption key. The decryption key may
mbed_official 50:a417edff4437 1673 * be generated from the encryption key with CRYPTO_AES_DecryptKey256().
mbed_official 50:a417edff4437 1674 *
mbed_official 50:a417edff4437 1675 * @param[in] encrypt
mbed_official 50:a417edff4437 1676 * Set to true to encrypt, false to decrypt.
mbed_official 50:a417edff4437 1677 *
mbed_official 50:a417edff4437 1678 * @param[in] keyWidth
mbed_official 50:a417edff4437 1679 * Set to cryptoKey128Bits or cryptoKey256Bits.
mbed_official 50:a417edff4437 1680 ******************************************************************************/
<> 150:02e0a0aed4ec 1681 static void CRYPTO_AES_ECBx(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1682 uint8_t * out,
<> 150:02e0a0aed4ec 1683 const uint8_t * in,
<> 150:02e0a0aed4ec 1684 unsigned int len,
<> 150:02e0a0aed4ec 1685 const uint8_t * key,
<> 150:02e0a0aed4ec 1686 bool encrypt,
mbed_official 50:a417edff4437 1687 CRYPTO_KeyWidth_TypeDef keyWidth)
mbed_official 50:a417edff4437 1688 {
mbed_official 50:a417edff4437 1689 EFM_ASSERT(!(len % CRYPTO_AES_BLOCKSIZE));
mbed_official 50:a417edff4437 1690
<> 150:02e0a0aed4ec 1691 crypto->WAC = 0;
mbed_official 50:a417edff4437 1692
<> 150:02e0a0aed4ec 1693 CRYPTO_KeyBufWrite(crypto, (uint32_t *)key, keyWidth);
mbed_official 50:a417edff4437 1694
AnnaBridge 179:b0033dcd6934 1695 if (encrypt) {
AnnaBridge 179:b0033dcd6934 1696 crypto->SEQ0 = CRYPTO_CMD_INSTR_AESENC << _CRYPTO_SEQ0_INSTR0_SHIFT
AnnaBridge 179:b0033dcd6934 1697 | CRYPTO_CMD_INSTR_DATA0TODATA1 << _CRYPTO_SEQ0_INSTR1_SHIFT;
AnnaBridge 179:b0033dcd6934 1698 } else {
AnnaBridge 179:b0033dcd6934 1699 crypto->SEQ0 = CRYPTO_CMD_INSTR_AESDEC << _CRYPTO_SEQ0_INSTR0_SHIFT
AnnaBridge 179:b0033dcd6934 1700 | CRYPTO_CMD_INSTR_DATA0TODATA1 << _CRYPTO_SEQ0_INSTR1_SHIFT;
mbed_official 50:a417edff4437 1701 }
mbed_official 50:a417edff4437 1702
<> 150:02e0a0aed4ec 1703 CRYPTO_AES_ProcessLoop(crypto, len,
<> 150:02e0a0aed4ec 1704 &crypto->DATA0, (uint32_t *) in,
<> 150:02e0a0aed4ec 1705 &crypto->DATA1, (uint32_t *) out);
mbed_official 50:a417edff4437 1706 }
mbed_official 50:a417edff4437 1707
mbed_official 50:a417edff4437 1708 /***************************************************************************//**
mbed_official 50:a417edff4437 1709 * @brief
mbed_official 50:a417edff4437 1710 * Output feedback (OFB) cipher mode encryption/decryption, 128/256 bit key.
mbed_official 50:a417edff4437 1711 *
mbed_official 50:a417edff4437 1712 * @details
mbed_official 50:a417edff4437 1713 * Please see CRYPTO_AES_OFB128() for OFB figure.
mbed_official 50:a417edff4437 1714 *
mbed_official 50:a417edff4437 1715 * Please refer to general comments on layout and byte ordering of parameters.
mbed_official 50:a417edff4437 1716 *
<> 150:02e0a0aed4ec 1717 * @param[in] crypto
<> 150:02e0a0aed4ec 1718 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1719 *
mbed_official 50:a417edff4437 1720 * @param[out] out
mbed_official 50:a417edff4437 1721 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1722 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1723 *
mbed_official 50:a417edff4437 1724 * @param[in] in
mbed_official 50:a417edff4437 1725 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1726 *
mbed_official 50:a417edff4437 1727 * @param[in] len
mbed_official 50:a417edff4437 1728 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1729 *
mbed_official 50:a417edff4437 1730 * @param[in] key
mbed_official 50:a417edff4437 1731 * 256 bit encryption key.
mbed_official 50:a417edff4437 1732 *
mbed_official 50:a417edff4437 1733 * @param[in] iv
mbed_official 50:a417edff4437 1734 * 128 bit initialization vector to use.
mbed_official 50:a417edff4437 1735 *
mbed_official 50:a417edff4437 1736 * @param[in] keyWidth
mbed_official 50:a417edff4437 1737 * Set to cryptoKey128Bits or cryptoKey256Bits.
mbed_official 50:a417edff4437 1738 ******************************************************************************/
<> 150:02e0a0aed4ec 1739 static void CRYPTO_AES_OFBx(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1740 uint8_t * out,
<> 150:02e0a0aed4ec 1741 const uint8_t * in,
<> 150:02e0a0aed4ec 1742 unsigned int len,
<> 150:02e0a0aed4ec 1743 const uint8_t * key,
<> 150:02e0a0aed4ec 1744 const uint8_t * iv,
mbed_official 50:a417edff4437 1745 CRYPTO_KeyWidth_TypeDef keyWidth)
mbed_official 50:a417edff4437 1746 {
mbed_official 50:a417edff4437 1747 EFM_ASSERT(!(len % CRYPTO_AES_BLOCKSIZE));
mbed_official 50:a417edff4437 1748
<> 150:02e0a0aed4ec 1749 crypto->WAC = 0;
mbed_official 50:a417edff4437 1750
<> 150:02e0a0aed4ec 1751 CRYPTO_KeyBufWrite(crypto, (uint32_t *)key, keyWidth);
mbed_official 50:a417edff4437 1752
<> 150:02e0a0aed4ec 1753 CRYPTO_DataWrite(&crypto->DATA2, (uint32_t *)iv);
mbed_official 50:a417edff4437 1754
AnnaBridge 179:b0033dcd6934 1755 crypto->SEQ0 = CRYPTO_CMD_INSTR_DATA0TODATA1 << _CRYPTO_SEQ0_INSTR0_SHIFT
AnnaBridge 179:b0033dcd6934 1756 | CRYPTO_CMD_INSTR_DATA2TODATA0 << _CRYPTO_SEQ0_INSTR1_SHIFT
AnnaBridge 179:b0033dcd6934 1757 | CRYPTO_CMD_INSTR_AESENC << _CRYPTO_SEQ0_INSTR2_SHIFT
AnnaBridge 179:b0033dcd6934 1758 | CRYPTO_CMD_INSTR_DATA0TODATA2 << _CRYPTO_SEQ0_INSTR3_SHIFT;
AnnaBridge 179:b0033dcd6934 1759 crypto->SEQ1 = CRYPTO_CMD_INSTR_DATA1TODATA0XOR << _CRYPTO_SEQ1_INSTR4_SHIFT
AnnaBridge 179:b0033dcd6934 1760 | CRYPTO_CMD_INSTR_DATA0TODATA1 << _CRYPTO_SEQ1_INSTR5_SHIFT;
mbed_official 50:a417edff4437 1761
<> 150:02e0a0aed4ec 1762 CRYPTO_AES_ProcessLoop(crypto, len,
<> 150:02e0a0aed4ec 1763 &crypto->DATA0, (uint32_t *) in,
<> 150:02e0a0aed4ec 1764 &crypto->DATA1, (uint32_t *) out);
mbed_official 50:a417edff4437 1765 }
mbed_official 50:a417edff4437 1766
mbed_official 50:a417edff4437 1767 /***************************************************************************//**
mbed_official 50:a417edff4437 1768 * @brief
mbed_official 50:a417edff4437 1769 * Function performs generic AES loop.
mbed_official 50:a417edff4437 1770 *
mbed_official 50:a417edff4437 1771 * @details
mbed_official 50:a417edff4437 1772 * Function loads given register with provided input data. Triggers CRYPTO to
mbed_official 50:a417edff4437 1773 * perform sequence of instructions and read specified output register to
mbed_official 50:a417edff4437 1774 * output buffer.
mbed_official 50:a417edff4437 1775 *
<> 150:02e0a0aed4ec 1776 * @param[in] crypto
<> 150:02e0a0aed4ec 1777 * Pointer to CRYPTO peripheral register block.
<> 150:02e0a0aed4ec 1778 *
mbed_official 50:a417edff4437 1779 * @param[in] len
mbed_official 50:a417edff4437 1780 * Number of bytes to encrypt/decrypt. Must be a multiple of 16.
mbed_official 50:a417edff4437 1781 *
mbed_official 50:a417edff4437 1782 * @param[in] inReg
mbed_official 50:a417edff4437 1783 * Input register - one of DATA0,DATA1,DATA2,DATA3
mbed_official 50:a417edff4437 1784 *
mbed_official 50:a417edff4437 1785 * @param[in] in
mbed_official 50:a417edff4437 1786 * Buffer holding data to encrypt/decrypt. Must be at least @p len long.
mbed_official 50:a417edff4437 1787 *
mbed_official 50:a417edff4437 1788 * @param[in] outReg
mbed_official 50:a417edff4437 1789 * Output register - one of DATA0,DATA1,DATA2,DATA3
mbed_official 50:a417edff4437 1790 *
mbed_official 50:a417edff4437 1791 * @param[out] out
mbed_official 50:a417edff4437 1792 * Buffer to place encrypted/decrypted data. Must be at least @p len long. It
mbed_official 50:a417edff4437 1793 * may be set equal to @p in, in which case the input buffer is overwritten.
mbed_official 50:a417edff4437 1794 ******************************************************************************/
<> 150:02e0a0aed4ec 1795 static inline void CRYPTO_AES_ProcessLoop(CRYPTO_TypeDef * crypto,
<> 150:02e0a0aed4ec 1796 uint32_t len,
mbed_official 50:a417edff4437 1797 CRYPTO_DataReg_TypeDef inReg,
mbed_official 50:a417edff4437 1798 uint32_t * in,
mbed_official 50:a417edff4437 1799 CRYPTO_DataReg_TypeDef outReg,
mbed_official 50:a417edff4437 1800 uint32_t * out)
mbed_official 50:a417edff4437 1801 {
mbed_official 50:a417edff4437 1802 len /= CRYPTO_AES_BLOCKSIZE;
<> 150:02e0a0aed4ec 1803 crypto->SEQCTRL = 16 << _CRYPTO_SEQCTRL_LENGTHA_SHIFT;
mbed_official 50:a417edff4437 1804
AnnaBridge 179:b0033dcd6934 1805 while (len--) {
mbed_official 50:a417edff4437 1806 /* Load data and trigger encryption */
mbed_official 50:a417edff4437 1807 CRYPTO_DataWrite(inReg, (uint32_t *)in);
mbed_official 50:a417edff4437 1808
<> 150:02e0a0aed4ec 1809 crypto->CMD = CRYPTO_CMD_SEQSTART;
mbed_official 50:a417edff4437 1810
mbed_official 50:a417edff4437 1811 /* Save encrypted/decrypted data */
mbed_official 50:a417edff4437 1812 CRYPTO_DataRead(outReg, (uint32_t *)out);
mbed_official 50:a417edff4437 1813
mbed_official 50:a417edff4437 1814 out += 4;
mbed_official 50:a417edff4437 1815 in += 4;
mbed_official 50:a417edff4437 1816 }
mbed_official 50:a417edff4437 1817 }
mbed_official 50:a417edff4437 1818
mbed_official 50:a417edff4437 1819 /** @} (end addtogroup CRYPTO) */
<> 150:02e0a0aed4ec 1820 /** @} (end addtogroup emlib) */
mbed_official 50:a417edff4437 1821
mbed_official 50:a417edff4437 1822 #endif /* defined(CRYPTO_COUNT) && (CRYPTO_COUNT > 0) */