| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * \brief AES block cipher, ESP32 hardware accelerated version | 
					
						
							|  |  |  |  * Based on mbedTLS FIPS-197 compliant version. | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |  *  Additions Copyright (C) 2016-2017, Espressif Systems (Shanghai) PTE Ltd | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |  *  SPDX-License-Identifier: Apache-2.0 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Licensed under the Apache License, Version 2.0 (the "License"); you may | 
					
						
							|  |  |  |  *  not use this file except in compliance with the License. | 
					
						
							|  |  |  |  *  You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
					
						
							|  |  |  |  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  *  See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  *  limitations under the License. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  *  The AES block cipher was designed by Vincent Rijmen and Joan Daemen. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
 | 
					
						
							|  |  |  |  *  http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  | #include "mbedtls/aes.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-18 03:54:40 +08:00
										 |  |  | #include "mbedtls/platform_util.h"
 | 
					
						
							| 
									
										
										
										
											2019-03-25 14:15:14 +08:00
										 |  |  | #include "esp32/aes.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-13 18:02:45 +08:00
										 |  |  | #include "soc/hwcrypto_periph.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | #include <sys/lock.h>
 | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 09:06:52 +10:00
										 |  |  | #include <freertos/FreeRTOS.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "soc/cpu.h"
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:55:02 +08:00
										 |  |  | #include "driver/periph_ctrl.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-16 09:06:52 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* AES uses a spinlock mux not a lock as the underlying block operation
 | 
					
						
							|  |  |  |    only takes 208 cycles (to write key & compute block), +600 cycles | 
					
						
							|  |  |  |    for DPORT protection but +3400 cycles again if you use a full sized lock. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For CBC, CFB, etc. this may mean that interrupts are disabled for a longer | 
					
						
							|  |  |  |    period of time for bigger lengths. However at the moment this has to happen | 
					
						
							|  |  |  |    anyway due to DPORT protection... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | static portMUX_TYPE aes_spinlock = portMUX_INITIALIZER_UNLOCKED; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  | static inline bool valid_key_length(const esp_aes_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ctx->key_bytes == 128/8 || ctx->key_bytes == 192/8 || ctx->key_bytes == 256/8; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | void esp_aes_acquire_hardware( void ) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-08-16 09:06:52 +10:00
										 |  |  |     portENTER_CRITICAL(&aes_spinlock); | 
					
						
							| 
									
										
										
										
											2017-08-15 16:45:55 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-22 17:39:59 +05:00
										 |  |  |     /* Enable AES hardware */ | 
					
						
							| 
									
										
										
										
											2018-10-29 23:55:02 +08:00
										 |  |  |     periph_module_enable(PERIPH_AES_MODULE); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void esp_aes_release_hardware( void ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-22 17:39:59 +05:00
										 |  |  |     /* Disable AES hardware */ | 
					
						
							| 
									
										
										
										
											2018-10-29 23:55:02 +08:00
										 |  |  |     periph_module_disable(PERIPH_AES_MODULE); | 
					
						
							| 
									
										
										
										
											2017-08-15 16:45:55 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 09:06:52 +10:00
										 |  |  |     portEXIT_CRITICAL(&aes_spinlock); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  | void esp_aes_init( esp_aes_context *ctx ) | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  |     bzero( ctx, sizeof( esp_aes_context ) ); | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  | void esp_aes_free( esp_aes_context *ctx ) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     if ( ctx == NULL ) { | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |         return; | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  |     bzero( ctx, sizeof( esp_aes_context ) ); | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 16:40:43 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |  * AES key schedule (same for encryption or decryption, as hardware handles schedule) | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  | int esp_aes_setkey( esp_aes_context *ctx, const unsigned char *key, | 
					
						
							|  |  |  |                     unsigned int keybits ) | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |     if (keybits != 128 && keybits != 192 && keybits != 256) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |     ctx->key_bytes = keybits / 8; | 
					
						
							|  |  |  |     memcpy(ctx->key, key, ctx->key_bytes); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |  * Helper function to copy key from esp_aes_context buffer | 
					
						
							|  |  |  |  * to hardware key registers. | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |  * Call only while holding esp_aes_acquire_hardware(). | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  | static void esp_aes_setkey_hardware(esp_aes_context *ctx, int mode) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |     const uint32_t MODE_DECRYPT_BIT = 4; | 
					
						
							|  |  |  |     unsigned mode_reg_base = (mode == ESP_AES_ENCRYPT) ? 0 : MODE_DECRYPT_BIT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:55:02 +08:00
										 |  |  |     for (int i = 0; i < ctx->key_bytes/4; ++i) { | 
					
						
							|  |  |  |         DPORT_REG_WRITE(AES_KEY_BASE + i * 4, *(((uint32_t *)ctx->key) + i)); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |         ctx->key_in_hardware += 4; | 
					
						
							| 
									
										
										
										
											2018-10-29 23:55:02 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |     DPORT_REG_WRITE(AES_MODE_REG, mode_reg_base + ((ctx->key_bytes / 8) - 2)); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Fault injection check: all words of key data should have been written to hardware */ | 
					
						
							|  |  |  |     if (ctx->key_in_hardware < 16 | 
					
						
							|  |  |  |         || ctx->key_in_hardware != ctx->key_bytes) { | 
					
						
							|  |  |  |         abort(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  | /* Run a single 16 byte block of AES, using the hardware engine.
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |  * Call only while holding esp_aes_acquire_hardware(). | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  | static int esp_aes_block(esp_aes_context *ctx, const void *input, void *output) | 
					
						
							| 
									
										
										
										
											2016-08-08 13:56:36 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |     const uint32_t *input_words = (const uint32_t *)input; | 
					
						
							| 
									
										
										
										
											2019-05-18 03:54:40 +08:00
										 |  |  |     uint32_t i0, i1, i2, i3; | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |     uint32_t *output_words = (uint32_t *)output; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     /* If no key is written to hardware yet, either the user hasn't called
 | 
					
						
							|  |  |  |        mbedtls_aes_setkey_enc/mbedtls_aes_setkey_dec - meaning we also don't | 
					
						
							|  |  |  |        know which mode to use - or a fault skipped the | 
					
						
							|  |  |  |        key write to hardware. Treat this as a fatal error and zero the output block. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     if (ctx->key_in_hardware != ctx->key_bytes) { | 
					
						
							|  |  |  |         bzero(output, 16); | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-18 03:54:40 +08:00
										 |  |  |     /* Storing i0,i1,i2,i3 in registers not an array
 | 
					
						
							|  |  |  |        helps a lot with optimisations at -Os level */ | 
					
						
							|  |  |  |     i0 = input_words[0]; | 
					
						
							|  |  |  |     DPORT_REG_WRITE(AES_TEXT_BASE, i0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     i1 = input_words[1]; | 
					
						
							|  |  |  |     DPORT_REG_WRITE(AES_TEXT_BASE + 4, i1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     i2 = input_words[2]; | 
					
						
							|  |  |  |     DPORT_REG_WRITE(AES_TEXT_BASE + 8, i2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     i3 = input_words[3]; | 
					
						
							|  |  |  |     DPORT_REG_WRITE(AES_TEXT_BASE + 12, i3); | 
					
						
							| 
									
										
										
										
											2016-08-08 13:56:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |     DPORT_REG_WRITE(AES_START_REG, 1); | 
					
						
							| 
									
										
										
										
											2019-05-18 03:54:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-22 17:39:59 +05:00
										 |  |  |     while (DPORT_REG_READ(AES_IDLE_REG) != 1) { } | 
					
						
							| 
									
										
										
										
											2019-05-18 03:54:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     esp_dport_access_read_buffer(output_words, AES_TEXT_BASE, 4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Physical security check: Verify the AES accelerator actually ran, and wasn't
 | 
					
						
							|  |  |  |        skipped due to external fault injection while starting the peripheral. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        Note that i0,i1,i2,i3 are copied from input buffer in case input==output. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        Bypassing this check requires at least one additional fault. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     if(i0 == output_words[0] && i1 == output_words[1] && i2 == output_words[2] && i3 == output_words[3]) { | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |         // calling zeroing functions to narrow the
 | 
					
						
							|  |  |  |         // window for a double-fault of the abort step, here
 | 
					
						
							| 
									
										
										
										
											2019-05-18 03:54:40 +08:00
										 |  |  |         memset(output, 0, 16); | 
					
						
							|  |  |  |         mbedtls_platform_zeroize(output, 16); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |         abort(); | 
					
						
							| 
									
										
										
										
											2019-05-18 03:54:40 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2017-08-15 16:45:55 +10:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * AES-ECB block encryption | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-05-08 23:50:22 +08:00
										 |  |  | int esp_internal_aes_encrypt( esp_aes_context *ctx, | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |                       const unsigned char input[16], | 
					
						
							|  |  |  |                       unsigned char output[16] ) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     int r; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!valid_key_length(ctx)) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_acquire_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							| 
									
										
										
										
											2016-09-07 14:48:20 +10:00
										 |  |  |     esp_aes_setkey_hardware(ctx, ESP_AES_ENCRYPT); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     r = esp_aes_block(ctx, input, output); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_release_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     return r; | 
					
						
							| 
									
										
										
										
											2018-05-08 23:50:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * AES-ECB block decryption | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-08 23:50:22 +08:00
										 |  |  | int esp_internal_aes_decrypt( esp_aes_context *ctx, | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |                       const unsigned char input[16], | 
					
						
							|  |  |  |                       unsigned char output[16] ) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     int r; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!valid_key_length(ctx)) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_acquire_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							| 
									
										
										
										
											2016-09-07 14:48:20 +10:00
										 |  |  |     esp_aes_setkey_hardware(ctx, ESP_AES_DECRYPT); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     r = esp_aes_block(ctx, input, output); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_release_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     return r; | 
					
						
							| 
									
										
										
										
											2018-05-08 23:50:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * AES-ECB block encryption/decryption | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  | int esp_aes_crypt_ecb( esp_aes_context *ctx, | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |                        int mode, | 
					
						
							|  |  |  |                        const unsigned char input[16], | 
					
						
							|  |  |  |                        unsigned char output[16] ) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     int r; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!valid_key_length(ctx)) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_acquire_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							| 
									
										
										
										
											2016-09-07 14:48:20 +10:00
										 |  |  |     esp_aes_setkey_hardware(ctx, mode); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     r = esp_aes_block(ctx, input, output); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_release_hardware(); | 
					
						
							| 
									
										
										
										
											2017-08-16 09:06:52 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     return r; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * AES-CBC buffer encryption/decryption | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  | int esp_aes_crypt_cbc( esp_aes_context *ctx, | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |                        int mode, | 
					
						
							|  |  |  |                        size_t length, | 
					
						
							|  |  |  |                        unsigned char iv[16], | 
					
						
							|  |  |  |                        const unsigned char *input, | 
					
						
							|  |  |  |                        unsigned char *output ) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |     uint32_t *output_words = (uint32_t *)output; | 
					
						
							|  |  |  |     const uint32_t *input_words = (const uint32_t *)input; | 
					
						
							|  |  |  |     uint32_t *iv_words = (uint32_t *)iv; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |     unsigned char temp[16]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     if ( length % 16 ) { | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  |         return ( ERR_ESP_AES_INVALID_INPUT_LENGTH ); | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-08 13:56:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     if (!valid_key_length(ctx)) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_acquire_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:48:20 +10:00
										 |  |  |     esp_aes_setkey_hardware(ctx, mode); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  |     if ( mode == ESP_AES_DECRYPT ) { | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |         while ( length > 0 ) { | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |             memcpy(temp, input_words, 16); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |             esp_aes_block(ctx, input_words, output_words); | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |             for ( i = 0; i < 4; i++ ) { | 
					
						
							|  |  |  |                 output_words[i] = output_words[i] ^ iv_words[i]; | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |             memcpy( iv_words, temp, 16 ); | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |             input_words += 4; | 
					
						
							|  |  |  |             output_words += 4; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |             length -= 16; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-08-15 16:45:55 +10:00
										 |  |  |     } else { // ESP_AES_ENCRYPT
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |         while ( length > 0 ) { | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for ( i = 0; i < 4; i++ ) { | 
					
						
							|  |  |  |                 output_words[i] = input_words[i] ^ iv_words[i]; | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |             esp_aes_block(ctx, output_words, output_words); | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |             memcpy( iv_words, output_words, 16 ); | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  |             input_words  += 4; | 
					
						
							|  |  |  |             output_words += 4; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |             length -= 16; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-08 13:56:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_release_hardware(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * AES-CFB128 buffer encryption/decryption | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  | int esp_aes_crypt_cfb128( esp_aes_context *ctx, | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |                           int mode, | 
					
						
							|  |  |  |                           size_t length, | 
					
						
							|  |  |  |                           size_t *iv_off, | 
					
						
							|  |  |  |                           unsigned char iv[16], | 
					
						
							|  |  |  |                           const unsigned char *input, | 
					
						
							|  |  |  |                           unsigned char *output ) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     int c; | 
					
						
							|  |  |  |     size_t n = *iv_off; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     if (!valid_key_length(ctx)) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_acquire_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 17:06:27 +10:00
										 |  |  |     esp_aes_setkey_hardware(ctx, ESP_AES_ENCRYPT); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  |     if ( mode == ESP_AES_DECRYPT ) { | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |         while ( length-- ) { | 
					
						
							|  |  |  |             if ( n == 0 ) { | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |                 esp_aes_block(ctx, iv, iv); | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             c = *input++; | 
					
						
							|  |  |  |             *output++ = (unsigned char)( c ^ iv[n] ); | 
					
						
							|  |  |  |             iv[n] = (unsigned char) c; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             n = ( n + 1 ) & 0x0F; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         while ( length-- ) { | 
					
						
							|  |  |  |             if ( n == 0 ) { | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |                 esp_aes_block(ctx, iv, iv); | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             n = ( n + 1 ) & 0x0F; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     *iv_off = n; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_release_hardware(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * AES-CFB8 buffer encryption/decryption | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  | int esp_aes_crypt_cfb8( esp_aes_context *ctx, | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |                         int mode, | 
					
						
							|  |  |  |                         size_t length, | 
					
						
							|  |  |  |                         unsigned char iv[16], | 
					
						
							|  |  |  |                         const unsigned char *input, | 
					
						
							|  |  |  |                         unsigned char *output ) | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     unsigned char c; | 
					
						
							|  |  |  |     unsigned char ov[17]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     if (!valid_key_length(ctx)) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_acquire_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 17:06:27 +10:00
										 |  |  |     esp_aes_setkey_hardware(ctx, ESP_AES_ENCRYPT); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     while ( length-- ) { | 
					
						
							|  |  |  |         memcpy( ov, iv, 16 ); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |         esp_aes_block(ctx, iv, iv); | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  |         if ( mode == ESP_AES_DECRYPT ) { | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |             ov[16] = *input; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         c = *output++ = (unsigned char)( iv[0] ^ *input++ ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  |         if ( mode == ESP_AES_ENCRYPT ) { | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |             ov[16] = c; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         memcpy( iv, ov + 1, 16 ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_release_hardware(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * AES-CTR buffer encryption/decryption | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-09-06 10:38:12 +10:00
										 |  |  | int esp_aes_crypt_ctr( esp_aes_context *ctx, | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |                        size_t length, | 
					
						
							|  |  |  |                        size_t *nc_off, | 
					
						
							|  |  |  |                        unsigned char nonce_counter[16], | 
					
						
							|  |  |  |                        unsigned char stream_block[16], | 
					
						
							|  |  |  |                        const unsigned char *input, | 
					
						
							|  |  |  |                        unsigned char *output ) | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     int c, i; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |     size_t n = *nc_off; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     if (!valid_key_length(ctx)) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_acquire_hardware(); | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     ctx->key_in_hardware = 0; | 
					
						
							| 
									
										
										
										
											2017-08-16 08:58:33 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 14:48:20 +10:00
										 |  |  |     esp_aes_setkey_hardware(ctx, ESP_AES_ENCRYPT); | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     while ( length-- ) { | 
					
						
							|  |  |  |         if ( n == 0 ) { | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |             esp_aes_block(ctx, nonce_counter, stream_block); | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |             for ( i = 16; i > 0; i-- ) | 
					
						
							|  |  |  |                 if ( ++nonce_counter[i - 1] != 0 ) { | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         c = *input++; | 
					
						
							|  |  |  |         *output++ = (unsigned char)( c ^ stream_block[n] ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         n = ( n + 1 ) & 0x0F; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     *nc_off = n; | 
					
						
							| 
									
										
										
										
											2016-08-08 13:56:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 18:36:26 +10:00
										 |  |  |     esp_aes_release_hardware(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-02 11:31:38 +08:00
										 |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2016-08-05 17:40:32 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-07-02 16:40:43 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 15:21:30 +05:30
										 |  |  | /*
 | 
					
						
							|  |  |  |  * AES-OFB (Output Feedback Mode) buffer encryption/decryption | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | int esp_aes_crypt_ofb( esp_aes_context *ctx, | 
					
						
							|  |  |  |                            size_t length, | 
					
						
							|  |  |  |                            size_t *iv_off, | 
					
						
							|  |  |  |                            unsigned char iv[16], | 
					
						
							|  |  |  |                            const unsigned char *input, | 
					
						
							|  |  |  |                            unsigned char *output ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret = 0; | 
					
						
							|  |  |  |     size_t n; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ( ctx == NULL || iv_off == NULL || iv == NULL || | 
					
						
							|  |  |  |         input == NULL || output == NULL ) { | 
					
						
							|  |  |  |             return MBEDTLS_ERR_AES_BAD_INPUT_DATA; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     n = *iv_off; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if( n > 15 ) { | 
					
						
							|  |  |  |         return( MBEDTLS_ERR_AES_BAD_INPUT_DATA ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |     if (!valid_key_length(ctx)) { | 
					
						
							|  |  |  |         return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 15:21:30 +05:30
										 |  |  |     esp_aes_acquire_hardware(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     esp_aes_setkey_hardware(ctx, ESP_AES_ENCRYPT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while( length-- ) { | 
					
						
							|  |  |  |         if( n == 0 ) { | 
					
						
							| 
									
										
										
										
											2019-05-21 18:12:42 +10:00
										 |  |  |             esp_aes_block(ctx, iv, iv); | 
					
						
							| 
									
										
										
										
											2019-06-26 15:21:30 +05:30
										 |  |  |         } | 
					
						
							|  |  |  |         *output++ =  *input++ ^ iv[n]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         n = ( n + 1 ) & 0x0F; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     *iv_off = n; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     esp_aes_release_hardware(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return( ret ); | 
					
						
							| 
									
										
										
										
											2020-01-16 14:31:10 +08:00
										 |  |  | } |