mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Thu Sep 06 13:40:20 2018 +0100
Revision:
187:0387e8f68319
mbed-dev library. Release version 163

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 187:0387e8f68319 1 /* mbed Microcontroller Library
AnnaBridge 187:0387e8f68319 2 * Copyright (c) 2017-2018 Nuvoton
AnnaBridge 187:0387e8f68319 3 *
AnnaBridge 187:0387e8f68319 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 187:0387e8f68319 5 * you may not use this file except in compliance with the License.
AnnaBridge 187:0387e8f68319 6 * You may obtain a copy of the License at
AnnaBridge 187:0387e8f68319 7 *
AnnaBridge 187:0387e8f68319 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 187:0387e8f68319 9 *
AnnaBridge 187:0387e8f68319 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 187:0387e8f68319 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 187:0387e8f68319 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 187:0387e8f68319 13 * See the License for the specific language governing permissions and
AnnaBridge 187:0387e8f68319 14 * limitations under the License.
AnnaBridge 187:0387e8f68319 15 */
AnnaBridge 187:0387e8f68319 16
AnnaBridge 187:0387e8f68319 17
AnnaBridge 187:0387e8f68319 18 #include "cmsis.h"
AnnaBridge 187:0387e8f68319 19 #include "mbed_assert.h"
AnnaBridge 187:0387e8f68319 20 #include "mbed_critical.h"
AnnaBridge 187:0387e8f68319 21 #include "mbed_error.h"
AnnaBridge 187:0387e8f68319 22 #include <limits.h>
AnnaBridge 187:0387e8f68319 23 #include "nu_modutil.h"
AnnaBridge 187:0387e8f68319 24 #include "nu_bitutil.h"
AnnaBridge 187:0387e8f68319 25 #include "crypto-misc.h"
AnnaBridge 187:0387e8f68319 26
AnnaBridge 187:0387e8f68319 27 #if DEVICE_TRNG || defined(MBEDTLS_CONFIG_HW_SUPPORT)
AnnaBridge 187:0387e8f68319 28
AnnaBridge 187:0387e8f68319 29 /* NOTE: There's inconsistency in cryptography related naming, Crpt or Crypto. For example, cryptography IRQ
AnnaBridge 187:0387e8f68319 30 * handler could be CRPT_IRQHandler or CRYPTO_IRQHandler. To override default cryptography IRQ handler, see
AnnaBridge 187:0387e8f68319 31 * device/startup_{CHIP}.c for its name or call NVIC_SetVector regardless of its name. */
AnnaBridge 187:0387e8f68319 32 void CRPT_IRQHandler();
AnnaBridge 187:0387e8f68319 33
AnnaBridge 187:0387e8f68319 34 /* Track if AES H/W is available */
AnnaBridge 187:0387e8f68319 35 static uint16_t crypto_aes_avail = 1;
AnnaBridge 187:0387e8f68319 36 /* Track if DES H/W is available */
AnnaBridge 187:0387e8f68319 37 static uint16_t crypto_des_avail = 1;
AnnaBridge 187:0387e8f68319 38 /* Track if SHA H/W is available */
AnnaBridge 187:0387e8f68319 39 static uint16_t crypto_sha_avail = 1;
AnnaBridge 187:0387e8f68319 40 /* Track if ECC H/W is available */
AnnaBridge 187:0387e8f68319 41 static uint16_t crypto_ecc_avail = 1;
AnnaBridge 187:0387e8f68319 42
AnnaBridge 187:0387e8f68319 43 /* Crypto (AES, DES, SHA, etc.) init counter. Crypto's keeps active as it is non-zero. */
AnnaBridge 187:0387e8f68319 44 static uint16_t crypto_init_counter = 0U;
AnnaBridge 187:0387e8f68319 45
AnnaBridge 187:0387e8f68319 46 static bool crypto_submodule_acquire(uint16_t *submodule_avail);
AnnaBridge 187:0387e8f68319 47 static void crypto_submodule_release(uint16_t *submodule_avail);
AnnaBridge 187:0387e8f68319 48
AnnaBridge 187:0387e8f68319 49 /* Crypto done flags */
AnnaBridge 187:0387e8f68319 50 #define CRYPTO_DONE_OK BIT0 /* Done with OK */
AnnaBridge 187:0387e8f68319 51 #define CRYPTO_DONE_ERR BIT1 /* Done with error */
AnnaBridge 187:0387e8f68319 52
AnnaBridge 187:0387e8f68319 53 /* Track if PRNG H/W operation is done */
AnnaBridge 187:0387e8f68319 54 static volatile uint16_t crypto_prng_done;
AnnaBridge 187:0387e8f68319 55 /* Track if AES H/W operation is done */
AnnaBridge 187:0387e8f68319 56 static volatile uint16_t crypto_aes_done;
AnnaBridge 187:0387e8f68319 57 /* Track if DES H/W operation is done */
AnnaBridge 187:0387e8f68319 58 static volatile uint16_t crypto_des_done;
AnnaBridge 187:0387e8f68319 59 /* Track if ECC H/W operation is done */
AnnaBridge 187:0387e8f68319 60 static volatile uint16_t crypto_ecc_done;
AnnaBridge 187:0387e8f68319 61
AnnaBridge 187:0387e8f68319 62 static void crypto_submodule_prestart(volatile uint16_t *submodule_done);
AnnaBridge 187:0387e8f68319 63 static bool crypto_submodule_wait(volatile uint16_t *submodule_done);
AnnaBridge 187:0387e8f68319 64
AnnaBridge 187:0387e8f68319 65 /* As crypto init counter changes from 0 to 1:
AnnaBridge 187:0387e8f68319 66 *
AnnaBridge 187:0387e8f68319 67 * 1. Enable crypto clock
AnnaBridge 187:0387e8f68319 68 * 2. Enable crypto interrupt
AnnaBridge 187:0387e8f68319 69 */
AnnaBridge 187:0387e8f68319 70 void crypto_init(void)
AnnaBridge 187:0387e8f68319 71 {
AnnaBridge 187:0387e8f68319 72 core_util_critical_section_enter();
AnnaBridge 187:0387e8f68319 73 if (crypto_init_counter == USHRT_MAX) {
AnnaBridge 187:0387e8f68319 74 core_util_critical_section_exit();
AnnaBridge 187:0387e8f68319 75 error("Crypto clock enable counter would overflow (> USHRT_MAX)");
AnnaBridge 187:0387e8f68319 76 }
AnnaBridge 187:0387e8f68319 77 core_util_atomic_incr_u16(&crypto_init_counter, 1);
AnnaBridge 187:0387e8f68319 78 if (crypto_init_counter == 1) {
AnnaBridge 187:0387e8f68319 79 /* Enable IP clock
AnnaBridge 187:0387e8f68319 80 *
AnnaBridge 187:0387e8f68319 81 * NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
AnnaBridge 187:0387e8f68319 82 */
AnnaBridge 187:0387e8f68319 83 CLK_EnableModuleClock_S(CRPT_MODULE);
AnnaBridge 187:0387e8f68319 84
AnnaBridge 187:0387e8f68319 85 NVIC_SetVector(CRPT_IRQn, (uint32_t) CRPT_IRQHandler);
AnnaBridge 187:0387e8f68319 86 NVIC_EnableIRQ(CRPT_IRQn);
AnnaBridge 187:0387e8f68319 87 }
AnnaBridge 187:0387e8f68319 88 core_util_critical_section_exit();
AnnaBridge 187:0387e8f68319 89 }
AnnaBridge 187:0387e8f68319 90
AnnaBridge 187:0387e8f68319 91 /* As crypto init counter changes from 1 to 0:
AnnaBridge 187:0387e8f68319 92 *
AnnaBridge 187:0387e8f68319 93 * 1. Disable crypto interrupt
AnnaBridge 187:0387e8f68319 94 * 2. Disable crypto clock
AnnaBridge 187:0387e8f68319 95 */
AnnaBridge 187:0387e8f68319 96 void crypto_uninit(void)
AnnaBridge 187:0387e8f68319 97 {
AnnaBridge 187:0387e8f68319 98 core_util_critical_section_enter();
AnnaBridge 187:0387e8f68319 99 if (crypto_init_counter == 0) {
AnnaBridge 187:0387e8f68319 100 core_util_critical_section_exit();
AnnaBridge 187:0387e8f68319 101 error("Crypto clock enable counter would underflow (< 0)");
AnnaBridge 187:0387e8f68319 102 }
AnnaBridge 187:0387e8f68319 103 core_util_atomic_decr_u16(&crypto_init_counter, 1);
AnnaBridge 187:0387e8f68319 104 if (crypto_init_counter == 0) {
AnnaBridge 187:0387e8f68319 105 NVIC_DisableIRQ(CRPT_IRQn);
AnnaBridge 187:0387e8f68319 106
AnnaBridge 187:0387e8f68319 107 /* Enable IP clock
AnnaBridge 187:0387e8f68319 108 *
AnnaBridge 187:0387e8f68319 109 * NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
AnnaBridge 187:0387e8f68319 110 */
AnnaBridge 187:0387e8f68319 111 CLK_DisableModuleClock_S(CRPT_MODULE);
AnnaBridge 187:0387e8f68319 112 }
AnnaBridge 187:0387e8f68319 113 core_util_critical_section_exit();
AnnaBridge 187:0387e8f68319 114 }
AnnaBridge 187:0387e8f68319 115
AnnaBridge 187:0387e8f68319 116 /* Implementation that should never be optimized out by the compiler */
AnnaBridge 187:0387e8f68319 117 void crypto_zeroize(void *v, size_t n)
AnnaBridge 187:0387e8f68319 118 {
AnnaBridge 187:0387e8f68319 119 volatile unsigned char *p = (volatile unsigned char*) v;
AnnaBridge 187:0387e8f68319 120 while (n--) {
AnnaBridge 187:0387e8f68319 121 *p++ = 0;
AnnaBridge 187:0387e8f68319 122 }
AnnaBridge 187:0387e8f68319 123 }
AnnaBridge 187:0387e8f68319 124
AnnaBridge 187:0387e8f68319 125 /* Implementation that should never be optimized out by the compiler */
AnnaBridge 187:0387e8f68319 126 void crypto_zeroize32(uint32_t *v, size_t n)
AnnaBridge 187:0387e8f68319 127 {
AnnaBridge 187:0387e8f68319 128 volatile uint32_t *p = (volatile uint32_t*) v;
AnnaBridge 187:0387e8f68319 129 while (n--) {
AnnaBridge 187:0387e8f68319 130 *p++ = 0;
AnnaBridge 187:0387e8f68319 131 }
AnnaBridge 187:0387e8f68319 132 }
AnnaBridge 187:0387e8f68319 133
AnnaBridge 187:0387e8f68319 134 bool crypto_aes_acquire(void)
AnnaBridge 187:0387e8f68319 135 {
AnnaBridge 187:0387e8f68319 136 return crypto_submodule_acquire(&crypto_aes_avail);
AnnaBridge 187:0387e8f68319 137 }
AnnaBridge 187:0387e8f68319 138
AnnaBridge 187:0387e8f68319 139 void crypto_aes_release(void)
AnnaBridge 187:0387e8f68319 140 {
AnnaBridge 187:0387e8f68319 141 crypto_submodule_release(&crypto_aes_avail);
AnnaBridge 187:0387e8f68319 142 }
AnnaBridge 187:0387e8f68319 143
AnnaBridge 187:0387e8f68319 144 bool crypto_des_acquire(void)
AnnaBridge 187:0387e8f68319 145 {
AnnaBridge 187:0387e8f68319 146 return crypto_submodule_acquire(&crypto_des_avail);
AnnaBridge 187:0387e8f68319 147 }
AnnaBridge 187:0387e8f68319 148
AnnaBridge 187:0387e8f68319 149 void crypto_des_release(void)
AnnaBridge 187:0387e8f68319 150 {
AnnaBridge 187:0387e8f68319 151 crypto_submodule_release(&crypto_des_avail);
AnnaBridge 187:0387e8f68319 152 }
AnnaBridge 187:0387e8f68319 153
AnnaBridge 187:0387e8f68319 154 bool crypto_sha_acquire(void)
AnnaBridge 187:0387e8f68319 155 {
AnnaBridge 187:0387e8f68319 156 return crypto_submodule_acquire(&crypto_sha_avail);
AnnaBridge 187:0387e8f68319 157 }
AnnaBridge 187:0387e8f68319 158
AnnaBridge 187:0387e8f68319 159 void crypto_sha_release(void)
AnnaBridge 187:0387e8f68319 160 {
AnnaBridge 187:0387e8f68319 161 crypto_submodule_release(&crypto_sha_avail);
AnnaBridge 187:0387e8f68319 162 }
AnnaBridge 187:0387e8f68319 163
AnnaBridge 187:0387e8f68319 164 bool crypto_ecc_acquire(void)
AnnaBridge 187:0387e8f68319 165 {
AnnaBridge 187:0387e8f68319 166 return crypto_submodule_acquire(&crypto_ecc_avail);
AnnaBridge 187:0387e8f68319 167 }
AnnaBridge 187:0387e8f68319 168
AnnaBridge 187:0387e8f68319 169 void crypto_ecc_release(void)
AnnaBridge 187:0387e8f68319 170 {
AnnaBridge 187:0387e8f68319 171 crypto_submodule_release(&crypto_ecc_avail);
AnnaBridge 187:0387e8f68319 172 }
AnnaBridge 187:0387e8f68319 173
AnnaBridge 187:0387e8f68319 174 void crypto_prng_prestart(void)
AnnaBridge 187:0387e8f68319 175 {
AnnaBridge 187:0387e8f68319 176 crypto_submodule_prestart(&crypto_prng_done);
AnnaBridge 187:0387e8f68319 177 }
AnnaBridge 187:0387e8f68319 178
AnnaBridge 187:0387e8f68319 179 bool crypto_prng_wait(void)
AnnaBridge 187:0387e8f68319 180 {
AnnaBridge 187:0387e8f68319 181 return crypto_submodule_wait(&crypto_prng_done);
AnnaBridge 187:0387e8f68319 182 }
AnnaBridge 187:0387e8f68319 183
AnnaBridge 187:0387e8f68319 184 void crypto_aes_prestart(void)
AnnaBridge 187:0387e8f68319 185 {
AnnaBridge 187:0387e8f68319 186 crypto_submodule_prestart(&crypto_aes_done);
AnnaBridge 187:0387e8f68319 187 }
AnnaBridge 187:0387e8f68319 188
AnnaBridge 187:0387e8f68319 189 bool crypto_aes_wait(void)
AnnaBridge 187:0387e8f68319 190 {
AnnaBridge 187:0387e8f68319 191 return crypto_submodule_wait(&crypto_aes_done);
AnnaBridge 187:0387e8f68319 192 }
AnnaBridge 187:0387e8f68319 193
AnnaBridge 187:0387e8f68319 194 void crypto_des_prestart(void)
AnnaBridge 187:0387e8f68319 195 {
AnnaBridge 187:0387e8f68319 196 crypto_submodule_prestart(&crypto_des_done);
AnnaBridge 187:0387e8f68319 197 }
AnnaBridge 187:0387e8f68319 198
AnnaBridge 187:0387e8f68319 199 bool crypto_des_wait(void)
AnnaBridge 187:0387e8f68319 200 {
AnnaBridge 187:0387e8f68319 201 return crypto_submodule_wait(&crypto_des_done);
AnnaBridge 187:0387e8f68319 202 }
AnnaBridge 187:0387e8f68319 203
AnnaBridge 187:0387e8f68319 204 void crypto_ecc_prestart(void)
AnnaBridge 187:0387e8f68319 205 {
AnnaBridge 187:0387e8f68319 206 crypto_submodule_prestart(&crypto_ecc_done);
AnnaBridge 187:0387e8f68319 207 }
AnnaBridge 187:0387e8f68319 208
AnnaBridge 187:0387e8f68319 209 bool crypto_ecc_wait(void)
AnnaBridge 187:0387e8f68319 210 {
AnnaBridge 187:0387e8f68319 211 return crypto_submodule_wait(&crypto_ecc_done);
AnnaBridge 187:0387e8f68319 212 }
AnnaBridge 187:0387e8f68319 213
AnnaBridge 187:0387e8f68319 214 bool crypto_dma_buff_compat(const void *buff, size_t buff_size, size_t size_aligned_to)
AnnaBridge 187:0387e8f68319 215 {
AnnaBridge 187:0387e8f68319 216 uint32_t buff_ = (uint32_t) buff;
AnnaBridge 187:0387e8f68319 217
AnnaBridge 187:0387e8f68319 218 return (((buff_ & 0x03) == 0) && /* Word-aligned buffer base address */
AnnaBridge 187:0387e8f68319 219 ((buff_size & (size_aligned_to - 1)) == 0) && /* Crypto submodule dependent buffer size alignment */
AnnaBridge 187:0387e8f68319 220 (((buff_ >> 28) == 0x2) && (buff_size <= (0x30000000 - buff_)))); /* 0x20000000-0x2FFFFFFF */
AnnaBridge 187:0387e8f68319 221 }
AnnaBridge 187:0387e8f68319 222
AnnaBridge 187:0387e8f68319 223 /* Overlap cases
AnnaBridge 187:0387e8f68319 224 *
AnnaBridge 187:0387e8f68319 225 * 1. in_buff in front of out_buff:
AnnaBridge 187:0387e8f68319 226 *
AnnaBridge 187:0387e8f68319 227 * in in_end
AnnaBridge 187:0387e8f68319 228 * | |
AnnaBridge 187:0387e8f68319 229 * ||||||||||||||||
AnnaBridge 187:0387e8f68319 230 * ||||||||||||||||
AnnaBridge 187:0387e8f68319 231 * | |
AnnaBridge 187:0387e8f68319 232 * out out_end
AnnaBridge 187:0387e8f68319 233 *
AnnaBridge 187:0387e8f68319 234 * 2. out_buff in front of in_buff:
AnnaBridge 187:0387e8f68319 235 *
AnnaBridge 187:0387e8f68319 236 * in in_end
AnnaBridge 187:0387e8f68319 237 * | |
AnnaBridge 187:0387e8f68319 238 * ||||||||||||||||
AnnaBridge 187:0387e8f68319 239 * ||||||||||||||||
AnnaBridge 187:0387e8f68319 240 * | |
AnnaBridge 187:0387e8f68319 241 * out out_end
AnnaBridge 187:0387e8f68319 242 */
AnnaBridge 187:0387e8f68319 243 bool crypto_dma_buffs_overlap(const void *in_buff, size_t in_buff_size, const void *out_buff, size_t out_buff_size)
AnnaBridge 187:0387e8f68319 244 {
AnnaBridge 187:0387e8f68319 245 uint32_t in = (uint32_t) in_buff;
AnnaBridge 187:0387e8f68319 246 uint32_t in_end = in + in_buff_size;
AnnaBridge 187:0387e8f68319 247 uint32_t out = (uint32_t) out_buff;
AnnaBridge 187:0387e8f68319 248 uint32_t out_end = out + out_buff_size;
AnnaBridge 187:0387e8f68319 249
AnnaBridge 187:0387e8f68319 250 bool overlap = (in <= out && out < in_end) || (out <= in && in < out_end);
AnnaBridge 187:0387e8f68319 251
AnnaBridge 187:0387e8f68319 252 return overlap;
AnnaBridge 187:0387e8f68319 253 }
AnnaBridge 187:0387e8f68319 254
AnnaBridge 187:0387e8f68319 255 static bool crypto_submodule_acquire(uint16_t *submodule_avail)
AnnaBridge 187:0387e8f68319 256 {
AnnaBridge 187:0387e8f68319 257 uint16_t expectedCurrentValue = 1;
AnnaBridge 187:0387e8f68319 258 return core_util_atomic_cas_u16(submodule_avail, &expectedCurrentValue, 0);
AnnaBridge 187:0387e8f68319 259 }
AnnaBridge 187:0387e8f68319 260
AnnaBridge 187:0387e8f68319 261 static void crypto_submodule_release(uint16_t *submodule_avail)
AnnaBridge 187:0387e8f68319 262 {
AnnaBridge 187:0387e8f68319 263 uint16_t expectedCurrentValue = 0;
AnnaBridge 187:0387e8f68319 264 while (! core_util_atomic_cas_u16(submodule_avail, &expectedCurrentValue, 1));
AnnaBridge 187:0387e8f68319 265 }
AnnaBridge 187:0387e8f68319 266
AnnaBridge 187:0387e8f68319 267 static void crypto_submodule_prestart(volatile uint16_t *submodule_done)
AnnaBridge 187:0387e8f68319 268 {
AnnaBridge 187:0387e8f68319 269 *submodule_done = 0;
AnnaBridge 187:0387e8f68319 270
AnnaBridge 187:0387e8f68319 271 /* Ensure memory accesses above are completed before DMA is started
AnnaBridge 187:0387e8f68319 272 *
AnnaBridge 187:0387e8f68319 273 * Replacing __DSB() with __DMB() is also OK in this case.
AnnaBridge 187:0387e8f68319 274 *
AnnaBridge 187:0387e8f68319 275 * Refer to "multi-master systems" section with DMA in:
AnnaBridge 187:0387e8f68319 276 * https://static.docs.arm.com/dai0321/a/DAI0321A_programming_guide_memory_barriers_for_m_profile.pdf
AnnaBridge 187:0387e8f68319 277 */
AnnaBridge 187:0387e8f68319 278 __DSB();
AnnaBridge 187:0387e8f68319 279 }
AnnaBridge 187:0387e8f68319 280
AnnaBridge 187:0387e8f68319 281 static bool crypto_submodule_wait(volatile uint16_t *submodule_done)
AnnaBridge 187:0387e8f68319 282 {
AnnaBridge 187:0387e8f68319 283 while (! *submodule_done);
AnnaBridge 187:0387e8f68319 284
AnnaBridge 187:0387e8f68319 285 /* Ensure while loop above and subsequent code are not reordered */
AnnaBridge 187:0387e8f68319 286 __DSB();
AnnaBridge 187:0387e8f68319 287
AnnaBridge 187:0387e8f68319 288 if ((*submodule_done & CRYPTO_DONE_OK)) {
AnnaBridge 187:0387e8f68319 289 /* Done with OK */
AnnaBridge 187:0387e8f68319 290 return true;
AnnaBridge 187:0387e8f68319 291 } else if ((*submodule_done & CRYPTO_DONE_ERR)) {
AnnaBridge 187:0387e8f68319 292 /* Done with error */
AnnaBridge 187:0387e8f68319 293 return false;
AnnaBridge 187:0387e8f68319 294 }
AnnaBridge 187:0387e8f68319 295
AnnaBridge 187:0387e8f68319 296 return false;
AnnaBridge 187:0387e8f68319 297 }
AnnaBridge 187:0387e8f68319 298
AnnaBridge 187:0387e8f68319 299 /* Crypto interrupt handler */
AnnaBridge 187:0387e8f68319 300 void CRPT_IRQHandler()
AnnaBridge 187:0387e8f68319 301 {
AnnaBridge 187:0387e8f68319 302 uint32_t intsts;
AnnaBridge 187:0387e8f68319 303
AnnaBridge 187:0387e8f68319 304 if ((intsts = PRNG_GET_INT_FLAG(CRYPTO_MODBASE())) != 0) {
AnnaBridge 187:0387e8f68319 305 /* Done with OK */
AnnaBridge 187:0387e8f68319 306 crypto_prng_done |= CRYPTO_DONE_OK;
AnnaBridge 187:0387e8f68319 307 /* Clear interrupt flag */
AnnaBridge 187:0387e8f68319 308 PRNG_CLR_INT_FLAG(CRYPTO_MODBASE());
AnnaBridge 187:0387e8f68319 309 } else if ((intsts = AES_GET_INT_FLAG(CRYPTO_MODBASE())) != 0) {
AnnaBridge 187:0387e8f68319 310 /* Done with OK */
AnnaBridge 187:0387e8f68319 311 crypto_aes_done |= CRYPTO_DONE_OK;
AnnaBridge 187:0387e8f68319 312 /* Clear interrupt flag */
AnnaBridge 187:0387e8f68319 313 AES_CLR_INT_FLAG(CRYPTO_MODBASE());
AnnaBridge 187:0387e8f68319 314 } else if ((intsts = TDES_GET_INT_FLAG(CRYPTO_MODBASE())) != 0) {
AnnaBridge 187:0387e8f68319 315 /* Done with OK */
AnnaBridge 187:0387e8f68319 316 crypto_des_done |= CRYPTO_DONE_OK;
AnnaBridge 187:0387e8f68319 317 /* Clear interrupt flag */
AnnaBridge 187:0387e8f68319 318 TDES_CLR_INT_FLAG(CRYPTO_MODBASE());
AnnaBridge 187:0387e8f68319 319 } else if ((intsts = ECC_GET_INT_FLAG(CRYPTO_MODBASE())) != 0) {
AnnaBridge 187:0387e8f68319 320 /* Check interrupt flags */
AnnaBridge 187:0387e8f68319 321 if (intsts & CRPT_INTSTS_ECCIF_Msk) {
AnnaBridge 187:0387e8f68319 322 /* Done with OK */
AnnaBridge 187:0387e8f68319 323 crypto_ecc_done |= CRYPTO_DONE_OK;
AnnaBridge 187:0387e8f68319 324 } else if (intsts & CRPT_INTSTS_ECCEIF_Msk) {
AnnaBridge 187:0387e8f68319 325 /* Done with error */
AnnaBridge 187:0387e8f68319 326 crypto_ecc_done |= CRYPTO_DONE_ERR;
AnnaBridge 187:0387e8f68319 327 }
AnnaBridge 187:0387e8f68319 328 /* Clear interrupt flag */
AnnaBridge 187:0387e8f68319 329 ECC_CLR_INT_FLAG(CRYPTO_MODBASE());
AnnaBridge 187:0387e8f68319 330 }
AnnaBridge 187:0387e8f68319 331 }
AnnaBridge 187:0387e8f68319 332
AnnaBridge 187:0387e8f68319 333 #endif /* #if DEVICE_TRNG || defined(MBEDTLS_CONFIG_HW_SUPPORT) */