| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  | /* mbedTLS AES performance test
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdbool.h>
 | 
					
						
							|  |  |  | #include <esp_system.h>
 | 
					
						
							|  |  |  | #include "mbedtls/aes.h"
 | 
					
						
							| 
									
										
										
										
											2020-01-16 14:31:10 +08:00
										 |  |  | #include "mbedtls/gcm.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  | #include "unity.h"
 | 
					
						
							|  |  |  | #include "sdkconfig.h"
 | 
					
						
							|  |  |  | #include "esp_heap_caps.h"
 | 
					
						
							|  |  |  | #include "test_utils.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-23 11:30:55 +08:00
										 |  |  | #include "ccomp_timer.h"
 | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 15:49:40 +08:00
										 |  |  | TEST_CASE("mbedtls AES performance", "[aes][timeout=60]") | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  | { | 
					
						
							|  |  |  |     const unsigned CALLS = 256; | 
					
						
							| 
									
										
										
										
											2020-01-16 14:31:10 +08:00
										 |  |  |     const unsigned CALL_SZ = 32 * 1024; | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  |     mbedtls_aes_context ctx; | 
					
						
							| 
									
										
										
										
											2020-03-23 11:30:55 +08:00
										 |  |  |     float elapsed_usec; | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  |     uint8_t iv[16]; | 
					
						
							|  |  |  |     uint8_t key[16]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     memset(iv, 0xEE, 16); | 
					
						
							|  |  |  |     memset(key, 0x44, 16); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // allocate internal memory
 | 
					
						
							| 
									
										
										
										
											2020-11-12 15:11:38 +08:00
										 |  |  |     uint8_t *buf = heap_caps_malloc(CALL_SZ, MALLOC_CAP_DMA | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL); | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  |     TEST_ASSERT_NOT_NULL(buf); | 
					
						
							|  |  |  |     mbedtls_aes_init(&ctx); | 
					
						
							|  |  |  |     mbedtls_aes_setkey_enc(&ctx, key, 128); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-23 11:30:55 +08:00
										 |  |  |     ccomp_timer_start(); | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  |     for (int c = 0; c < CALLS; c++) { | 
					
						
							|  |  |  |         memset(buf, 0xAA, CALL_SZ); | 
					
						
							|  |  |  |         mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, CALL_SZ, iv, buf, buf); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-03-23 11:30:55 +08:00
										 |  |  |     elapsed_usec = ccomp_timer_stop(); | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Sanity check: make sure the last ciphertext block matches
 | 
					
						
							|  |  |  |        what we expect to see. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        Last block produced via this Python: | 
					
						
							|  |  |  |        import os, binascii | 
					
						
							|  |  |  |        from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes | 
					
						
							|  |  |  |        from cryptography.hazmat.backends import default_backend | 
					
						
							|  |  |  |        key = b'\x44' * 16 | 
					
						
							|  |  |  |        iv = b'\xee' * 16 | 
					
						
							|  |  |  |        cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) | 
					
						
							|  |  |  |        encryptor = cipher.encryptor() | 
					
						
							|  |  |  |        ct = encryptor.update(b'\xaa' * 256 * 32 * 1024) + encryptor.finalize() | 
					
						
							|  |  |  |        print(binascii.hexlify(ct[-16:])) | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     const uint8_t expected_last_block[] = { | 
					
						
							|  |  |  |         0x50, 0x81, 0xe0, 0xe1, 0x15, 0x2f, 0x14, 0xe9, | 
					
						
							|  |  |  |         0x97, 0xa0, 0xc6, 0xe6, 0x36, 0xf3, 0x5c, 0x25, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     TEST_ASSERT_EQUAL_HEX8_ARRAY(expected_last_block, buf + CALL_SZ - 16, 16); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-14 15:25:06 +08:00
										 |  |  |     mbedtls_aes_free(&ctx); | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  |     free(buf); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // bytes/usec = MB/sec
 | 
					
						
							| 
									
										
										
										
											2020-03-23 11:30:55 +08:00
										 |  |  |     float mb_sec = (CALL_SZ * CALLS) / elapsed_usec; | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  |     printf("Encryption rate %.3fMB/sec\n", mb_sec); | 
					
						
							|  |  |  | #ifdef CONFIG_MBEDTLS_HARDWARE_AES
 | 
					
						
							| 
									
										
										
										
											2020-01-16 14:31:10 +08:00
										 |  |  |     // Don't put a hard limit on software AES performance
 | 
					
						
							| 
									
										
										
										
											2020-12-04 11:35:21 +08:00
										 |  |  |     TEST_PERFORMANCE_CCOMP_GREATER_THAN(AES_CBC_THROUGHPUT_MBSEC, "%.3fMB/sec", mb_sec); | 
					
						
							| 
									
										
										
										
											2019-05-20 09:44:42 +10:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } |