| 
									
										
										
										
											2022-01-17 16:47:32 +05:30
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2023-05-04 14:38:05 +05:30
										 |  |  |  * SPDX-FileCopyrightText: 2018-2023 Espressif Systems (Shanghai) CO LTD | 
					
						
							| 
									
										
										
										
											2022-01-17 16:47:32 +05:30
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: Apache-2.0 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <assert.h>
 | 
					
						
							| 
									
										
										
										
											2023-05-04 14:38:05 +05:30
										 |  |  | #include "hal/sha_hal.h"
 | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #include "hal/sha_types.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-29 10:51:36 +08:00
										 |  |  | #include "soc/soc_caps.h"
 | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #include "esp_log.h"
 | 
					
						
							| 
									
										
										
										
											2019-11-06 11:07:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  | #include <mbedtls/sha1.h>
 | 
					
						
							|  |  |  | #include <mbedtls/sha256.h>
 | 
					
						
							|  |  |  | #include <mbedtls/sha512.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #if SOC_SHA_SUPPORT_PARALLEL_ENG
 | 
					
						
							|  |  |  | #include "sha/sha_parallel_engine.h"
 | 
					
						
							|  |  |  | #elif SOC_SHA_SUPPORT_DMA
 | 
					
						
							|  |  |  | #include "sha/sha_dma.h"
 | 
					
						
							| 
									
										
										
										
											2021-09-24 14:32:58 +08:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #include "sha/sha_block.h"
 | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const char *TAG = "esp_sha"; | 
					
						
							| 
									
										
										
										
											2019-11-06 11:07:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  | void esp_sha(esp_sha_type sha_type, const unsigned char *input, size_t ilen, unsigned char *output) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |     union { | 
					
						
							|  |  |  | #if SOC_SHA_SUPPORT_SHA1
 | 
					
						
							|  |  |  |         mbedtls_sha1_context sha1; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if SOC_SHA_SUPPORT_SHA256
 | 
					
						
							|  |  |  |         mbedtls_sha256_context sha256; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if SOC_SHA_SUPPORT_SHA384 || SOC_SHA_SUPPORT_SHA512
 | 
					
						
							|  |  |  |         mbedtls_sha512_context sha512; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     } ctx; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-12 16:01:05 +11:00
										 |  |  |     int ret __attribute__((unused)); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |     assert(input != NULL && output != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #if SOC_SHA_SUPPORT_SHA1
 | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |     if (sha_type == SHA1) { | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |         mbedtls_sha1_init(&ctx.sha1); | 
					
						
							| 
									
										
										
										
											2021-05-28 18:43:32 +05:30
										 |  |  |         mbedtls_sha1_starts(&ctx.sha1); | 
					
						
							|  |  |  |         ret = mbedtls_sha1_update(&ctx.sha1, input, ilen); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |         assert(ret == 0); | 
					
						
							| 
									
										
										
										
											2021-05-28 18:43:32 +05:30
										 |  |  |         ret = mbedtls_sha1_finish(&ctx.sha1, output); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |         assert(ret == 0); | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |         mbedtls_sha1_free(&ctx.sha1); | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif //SOC_SHA_SUPPORT_SHA1
 | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #if SOC_SHA_SUPPORT_SHA256
 | 
					
						
							|  |  |  |     if (sha_type == SHA2_256) { | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |         mbedtls_sha256_init(&ctx.sha256); | 
					
						
							| 
									
										
										
										
											2021-05-28 18:43:32 +05:30
										 |  |  |         mbedtls_sha256_starts(&ctx.sha256, 0); | 
					
						
							|  |  |  |         ret = mbedtls_sha256_update(&ctx.sha256, input, ilen); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |         assert(ret == 0); | 
					
						
							| 
									
										
										
										
											2021-05-28 18:43:32 +05:30
										 |  |  |         ret = mbedtls_sha256_finish(&ctx.sha256, output); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |         assert(ret == 0); | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |         mbedtls_sha256_free(&ctx.sha256); | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif //SOC_SHA_SUPPORT_SHA256
 | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #if SOC_SHA_SUPPORT_SHA384
 | 
					
						
							|  |  |  |     if (sha_type == SHA2_384) { | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |         mbedtls_sha512_init(&ctx.sha512); | 
					
						
							| 
									
										
										
										
											2021-05-28 18:43:32 +05:30
										 |  |  |         mbedtls_sha512_starts(&ctx.sha512, 1); | 
					
						
							|  |  |  |         ret = mbedtls_sha512_update(&ctx.sha512, input, ilen); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |         assert(ret == 0); | 
					
						
							| 
									
										
										
										
											2021-05-28 18:43:32 +05:30
										 |  |  |         ret = mbedtls_sha512_finish(&ctx.sha512, output); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |         assert(ret == 0); | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |         mbedtls_sha512_free(&ctx.sha512); | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif //SOC_SHA_SUPPORT_SHA384
 | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #if SOC_SHA_SUPPORT_SHA512
 | 
					
						
							|  |  |  |     if (sha_type == SHA2_512) { | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |         mbedtls_sha512_init(&ctx.sha512); | 
					
						
							| 
									
										
										
										
											2021-05-28 18:43:32 +05:30
										 |  |  |         mbedtls_sha512_starts(&ctx.sha512, 0); | 
					
						
							|  |  |  |         ret = mbedtls_sha512_update(&ctx.sha512, input, ilen); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |         assert(ret == 0); | 
					
						
							| 
									
										
										
										
											2021-05-28 18:43:32 +05:30
										 |  |  |         ret = mbedtls_sha512_finish(&ctx.sha512, output); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |         assert(ret == 0); | 
					
						
							| 
									
										
										
										
											2020-11-06 14:50:22 +11:00
										 |  |  |         mbedtls_sha512_free(&ctx.sha512); | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  |         return; | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  | #endif //SOC_SHA_SUPPORT_SHA512
 | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-17 16:47:32 +05:30
										 |  |  |     ESP_LOGE(TAG, "SHA type %d not supported", (int)sha_type); | 
					
						
							| 
									
										
										
										
											2020-08-13 16:30:59 +08:00
										 |  |  |     abort(); | 
					
						
							| 
									
										
										
										
											2019-05-13 12:32:45 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2023-05-04 14:38:05 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if SOC_SHA_SUPPORT_SHA512_T
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The initial hash value for SHA512/t is generated according to the
 | 
					
						
							|  |  |  |    algorithm described in the TRM, chapter SHA-Accelerator | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int esp_sha_512_t_init_hash(uint16_t t) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     uint32_t t_string = 0; | 
					
						
							|  |  |  |     uint8_t t0, t1, t2, t_len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (t == 384) { | 
					
						
							|  |  |  |         ESP_LOGE(TAG, "Invalid t for SHA512/t, t = %u,cannot be 384", t); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (t <= 9) { | 
					
						
							|  |  |  |         t_string = (uint32_t)((1 << 23) | ((0x30 + t) << 24)); | 
					
						
							|  |  |  |         t_len = 0x48; | 
					
						
							|  |  |  |     } else if (t <= 99) { | 
					
						
							|  |  |  |         t0 = t % 10; | 
					
						
							|  |  |  |         t1 = (t / 10) % 10; | 
					
						
							|  |  |  |         t_string = (uint32_t)((1 << 15) | ((0x30 + t0) << 16) | | 
					
						
							|  |  |  |                               (((0x30 + t1) << 24))); | 
					
						
							|  |  |  |         t_len = 0x50; | 
					
						
							|  |  |  |     } else if (t <= 512) { | 
					
						
							|  |  |  |         t0 = t % 10; | 
					
						
							|  |  |  |         t1 = (t / 10) % 10; | 
					
						
							|  |  |  |         t2 = t / 100; | 
					
						
							|  |  |  |         t_string = (uint32_t)((1 << 7) | ((0x30 + t0) << 8) | | 
					
						
							|  |  |  |                               (((0x30 + t1) << 16) + ((0x30 + t2) << 24))); | 
					
						
							|  |  |  |         t_len = 0x58; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         ESP_LOGE(TAG, "Invalid t for SHA512/t, t = %u, must equal or less than 512", t); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sha_hal_sha512_init_hash(t_string, t_len); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif //SOC_SHA_SUPPORT_SHA512_T
 |