feat(mbedtls): remove util algorithm and add them to esp8266 rom and mbedtls

This commit is contained in:
yuanjm
2020-03-02 14:46:45 +08:00
parent c4f549dbc1
commit 514bca61f4
60 changed files with 2192 additions and 2230 deletions

View File

@ -1,12 +1,13 @@
idf_component_register(INCLUDE_DIRS "port/include" "port/esp8266/include" "mbedtls/include"
REQUIRES lwip util)
idf_build_get_property(target IDF_TARGET)
idf_component_register(INCLUDE_DIRS "port/include" "port/include/${target}" "mbedtls/include"
REQUIRES lwip)
# Only build mbedtls libraries
set(ENABLE_TESTING CACHE BOOL OFF)
set(ENABLE_PROGRAMS CACHE BOOL OFF)
# Needed to for include_next includes to work from within mbedtls
include_directories("${COMPONENT_DIR}/port/include" "${COMPONENT_DIR}/port/esp8266/include")
include_directories("${COMPONENT_DIR}/port/include" "${COMPONENT_DIR}/port/include/${target}")
# Import mbedtls library targets
add_subdirectory(mbedtls)
@ -25,10 +26,17 @@ target_sources(mbedtls PRIVATE "${COMPONENT_DIR}/port/mbedtls_debug.c"
target_sources(mbedcrypto PRIVATE "${COMPONENT_DIR}/port/esp_hardware.c"
"${COMPONENT_DIR}/port/esp_mem.c"
"${COMPONENT_DIR}/port/esp_timing.c"
"${COMPONENT_DIR}/port/esp8266/aes.c"
"${COMPONENT_DIR}/port/esp8266/sha1.c"
"${COMPONENT_DIR}/port/esp8266/sha256.c"
"${COMPONENT_DIR}/port/esp8266/sha512.c")
"${COMPONENT_DIR}/port/esp_aes.c"
"${COMPONENT_DIR}/port/esp_sha1.c"
"${COMPONENT_DIR}/port/esp_sha256.c"
"${COMPONENT_DIR}/port/esp_sha512.c"
"${COMPONENT_DIR}/port/${target}/aes.c"
"${COMPONENT_DIR}/port/${target}/arc4.c"
"${COMPONENT_DIR}/port/${target}/base64.c"
"${COMPONENT_DIR}/port/${target}/md5.c"
"${COMPONENT_DIR}/port/${target}/sha1.c"
"${COMPONENT_DIR}/port/${target}/sha256.c"
"${COMPONENT_DIR}/port/${target}/sha512.c")
foreach(target ${mbedtls_targets})
target_compile_definitions(${target} PUBLIC -DMBEDTLS_CONFIG_FILE="mbedtls/esp_config.h" -DCONFIG_SSL_USING_MBEDTLS)

View File

@ -552,4 +552,75 @@ menu "mbedTLS"
# end of Elliptic Curve options
menu "Util"
config util_assert
bool "Enable assert for util components"
default n
help
Enable this option, util components will use assert to check if input
parameters are correct.
Disable this option will speed up the process of some calculation a lot.
config ESP_SHA
bool "Enable Espressif SHA"
default n
help
Enable Espressif SHA1, SHA256, SHA384 & SHA512 for other components to
save code size for ESP8285(ESP8266 + 1MB flash) users.
Although this option is disable, bootloader will use it if booloader
is configured to use SHA256 to check hash.
Disabling the "assert" function at menuconfig can speed up the calculation.
config ESP_AES
bool "Enable Espressif AES"
default y
help
Enable Espressif AES ECB, CBC, CFB128, CFB8 & CRT for other components to
speed up process speed and save code size.
ESP8285 is like ESP8266 + 1MB flash, but its internal I/O connection from CPU
core to flash is DIO not QIO, which makes it read flash data slower.
So the function will speed up ESP8285 obviously.
The calculation uses "ibus_data" to speed up load data from instruction bus.
Disabling the "assert" function at menuconfig can speed up the calculation.
config ESP_MD5
bool "Enable Espressif MD5"
default y
help
Enable Espressif MD5 for other components to
speed up process speed and save code size.
ESP8285 is like ESP8266 + 1MB flash, but its internal I/O connection from CPU
core to flash is DIO not QIO, which makes it read flash data slower.
So the function will speed up ESP8285 obviously.
The calculation uses "ibus_data" to speed up load data from instruction bus.
Disabling the "assert" function at menuconfig can speed up the calculation.
config ESP_ARC4
bool "Enable Espressif ARC4"
default y
help
Enable Espressif ARC4 for other components to
speed up process speed and save code size.
ESP8285 is like ESP8266 + 1MB flash, but its internal I/O connection from CPU
core to flash is DIO not QIO, which makes it read flash data slower.
So the function will speed up ESP8285 obviously.
The calculation uses "ibus_data" to speed up load data from instruction bus.
Disabling the "assert" function at menuconfig can speed up the calculation.
endmenu # Util
endmenu # mbedTLS

View File

@ -2,9 +2,9 @@
# Component Makefile
#
COMPONENT_ADD_INCLUDEDIRS := port/include mbedtls/include port/esp8266/include
COMPONENT_ADD_INCLUDEDIRS := port/include mbedtls/include port/include/$(IDF_TARGET)
COMPONENT_SRCDIRS := mbedtls/library port port/esp8266
COMPONENT_SRCDIRS := mbedtls/library port port/$(IDF_TARGET)
COMPONENT_OBJEXCLUDE := mbedtls/library/net_sockets.o

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,91 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <sys/errno.h>
#include <string.h>
#include "esp_arc4.h"
#include "ibus_data.h"
#include "util_assert.h"
/*
* ARC4 key schedule
*/
void esp_arc4_setup(esp_arc4_context *ctx, const uint8_t *key, uint32_t keylen)
{
int i, j, a;
uint32_t k;
uint8_t *m;
util_assert(ctx);
util_assert(key);
ctx->x = 0;
ctx->y = 0;
m = ctx->m;
for(i = 0; i < 256; i++)
m[i] = (uint8_t) i;
j = k = 0;
for(i = 0; i < 256; i++, k++)
{
if(k >= keylen) k = 0;
a = m[i];
j = (j + a + key[k]) & 0xFF;
m[i] = m[j];
m[j] = (uint8_t) a;
}
}
/*
* ARC4 cipher function
*/
int esp_arc4_encrypt(esp_arc4_context *ctx, size_t length, const uint8_t *input, uint8_t *output)
{
int x, y, a, b;
size_t i;
uint8_t *m;
util_assert(ctx);
util_assert(input);
util_assert(output);
x = ctx->x;
y = ctx->y;
m = ctx->m;
for(i = 0; i < length; i++)
{
x = (x + 1) & 0xFF; a = m[x];
y = (y + a) & 0xFF; b = m[y];
m[x] = (uint8_t) b;
m[y] = (uint8_t) a;
output[i] = (uint8_t)(input[i] ^ m[(uint8_t)(a + b)]);
}
ctx->x = x;
ctx->y = y;
return 0;
}
int esp_arc4_decrypt(esp_arc4_context *ctx, size_t length, const uint8_t *input, uint8_t *output)
{
return esp_arc4_encrypt(ctx, length, input, output);
}

View File

@ -0,0 +1,182 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include "sdkconfig.h"
#include "esp_base64.h"
#include "ibus_data.h"
#include "util_assert.h"
#include <sys/errno.h>
typedef union _cache {
uint32_t u32d;
uint8_t u8d[4];
} cache_t;
/**
* We use 4-byte align look-up table to speed up loading data
*/
static const uint32_t s_base64_enc_lut[16] = {
0x44434241, 0x48474645, 0x4c4b4a49, 0x504f4e4d,
0x54535251, 0x58575655, 0x62615a59, 0x66656463,
0x6a696867, 0x6e6d6c6b, 0x7271706f, 0x76757473,
0x7a797877, 0x33323130, 0x37363534, 0x2f2b3938
};
static const uint32_t s_base64_dec_lut[32] = {
0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f,
0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f,
0x7f7f7f7f, 0x7f7f7f7f, 0x3e7f7f7f, 0x3f7f7f7f,
0x37363534, 0x3b3a3938, 0x7f7f3d3c, 0x7f7f407f,
0x0201007f, 0x06050403, 0x0a090807, 0x0e0d0c0b,
0x1211100f, 0x16151413, 0x7f191817, 0x7f7f7f7f,
0x1c1b1a7f, 0x201f1e1d, 0x24232221, 0x28272625,
0x2c2b2a29, 0x302f2e2d, 0x7f333231, 0x7f7f7f7f
};
/*
* Encode a buffer into base64 format
*/
int esp_base64_encode(const void *p_src, uint32_t slen, void *p_dst, uint32_t dlen)
{
uint32_t i, n;
uint32_t C1, C2, C3;
uint8_t *p;
uint8_t *dst = (uint8_t *)p_dst;
const uint8_t *src = (const uint8_t *)p_src;
assert(p_dst);
assert(dlen);
assert(p_src);
assert(slen);
n = slen / 3 + (slen % 3 != 0);
n *= 4;
if (dlen < (n + 1))
return -ENOBUFS;
n = (slen / 3) * 3;
for (i = 0, p = dst; i < n; i += 3) {
C1 = *src++;
C2 = *src++;
C3 = *src++;
*p++ = ESP_IBUS_GET_U8_DATA((C1 >> 2) & 0x3F, s_base64_enc_lut);
*p++ = ESP_IBUS_GET_U8_DATA((((C1 & 3) << 4) + (C2 >> 4)) & 0x3F, s_base64_enc_lut);
*p++ = ESP_IBUS_GET_U8_DATA((((C2 & 15) << 2) + (C3 >> 6)) & 0x3F, s_base64_enc_lut);
*p++ = ESP_IBUS_GET_U8_DATA(C3 & 0x3F, s_base64_enc_lut);
}
if (i < slen) {
C1 = *src++;
C2 = ((i + 1) < slen) ? *src++ : 0;
*p++ = ESP_IBUS_GET_U8_DATA((C1 >> 2) & 0x3F, s_base64_enc_lut);
*p++ = ESP_IBUS_GET_U8_DATA((((C1 & 3) << 4) + (C2 >> 4)) & 0x3F, s_base64_enc_lut);
if ((i + 1) < slen)
*p++ = ESP_IBUS_GET_U8_DATA(((C2 & 15) << 2) & 0x3F, s_base64_enc_lut);
else
*p++ = '=';
*p++ = '=';
}
*p = 0;
return p - dst;
}
/*
* Decode a base64-formatted buffer
*/
int esp_base64_decode(const void *p_src, uint32_t slen, void *p_dst, uint32_t dlen)
{
uint32_t i, n;
uint32_t j, x;
uint8_t *p;
uint8_t *dst = (uint8_t *)p_dst;
const uint8_t *src = (const uint8_t *)p_src;
assert(p_dst);
assert(dlen);
assert(p_src);
assert(slen);
/* First pass: check for validity and get output length */
for (i = n = j = 0; i < slen; i++) {
/* Skip spaces before checking for EOL */
x = 0;
while (i < slen && src[i] == ' ') {
++i;
++x;
}
/* Spaces at end of buffer are OK */
if (i == slen)
break;
if ((slen - i ) >= 2 && src[i] == '\r' && src[i + 1] == '\n')
continue;
if (src[i] == '\n')
continue;
/* Space inside a line is an error */
if (x != 0)
return -EINVAL;
if (src[i] == '=' && ++j > 2)
return -EINVAL;
if (src[i] > 127 || ESP_IBUS_GET_U8_DATA(src[i], s_base64_dec_lut) == 127)
return -EINVAL;
if (ESP_IBUS_GET_U8_DATA(src[i], s_base64_dec_lut) < 64 && j != 0)
return -EINVAL;
n++;
}
if( n == 0 )
return -EINVAL;
n = (6 * (n >> 3)) + ((6 * (n & 0x7) + 7) >> 3);
n -= j;
if (dlen < n )
return -ENOBUFS;
for (j = 3, n = x = 0, p = dst; i > 0; i--, src++) {
if (*src == '\r' || *src == '\n' || *src == ' ')
continue;
j -= (ESP_IBUS_GET_U8_DATA(*src, s_base64_dec_lut) == 64);
x = (x << 6) | (ESP_IBUS_GET_U8_DATA(*src, s_base64_dec_lut) & 0x3F);
if (++n == 4) {
n = 0;
if (j > 0)
*p++ = (uint8_t)(x >> 16);
if (j > 1)
*p++ = (uint8_t)(x >> 8);
if (j > 2)
*p++ = (uint8_t)(x >> 0);
}
}
return p - dst;
}

View File

@ -0,0 +1,228 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <sys/errno.h>
#include <string.h>
#include "esp_md5.h"
#include "ibus_data.h"
#include "util_assert.h"
static const uint32_t esp_md5_init_value[4] = {0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476};
static const uint8_t esp_md5_padding[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
static int esp_md5_process(esp_md5_context_t *ctx, const uint8_t data[64])
{
uint32_t X[64], Y[4];
util_assert(ctx);
memcpy(X, data, 64);
#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
#define P(a,b,c,d,k,s,t) \
{ \
a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
}
memcpy(Y, ctx->state, sizeof(Y));
#define A Y[0]
#define B Y[1]
#define C Y[2]
#define D Y[3]
#define F(x,y,z) (z ^ (x & (y ^ z)))
P(A, B, C, D, 0, 7, 0xD76AA478);
P(D, A, B, C, 1, 12, 0xE8C7B756);
P(C, D, A, B, 2, 17, 0x242070DB);
P(B, C, D, A, 3, 22, 0xC1BDCEEE);
P(A, B, C, D, 4, 7, 0xF57C0FAF);
P(D, A, B, C, 5, 12, 0x4787C62A);
P(C, D, A, B, 6, 17, 0xA8304613);
P(B, C, D, A, 7, 22, 0xFD469501);
P(A, B, C, D, 8, 7, 0x698098D8);
P(D, A, B, C, 9, 12, 0x8B44F7AF);
P(C, D, A, B, 10, 17, 0xFFFF5BB1);
P(B, C, D, A, 11, 22, 0x895CD7BE);
P(A, B, C, D, 12, 7, 0x6B901122);
P(D, A, B, C, 13, 12, 0xFD987193);
P(C, D, A, B, 14, 17, 0xA679438E);
P(B, C, D, A, 15, 22, 0x49B40821);
#undef F
#define F(x,y,z) (y ^ (z & (x ^ y)))
P(A, B, C, D, 1, 5, 0xF61E2562);
P(D, A, B, C, 6, 9, 0xC040B340);
P(C, D, A, B, 11, 14, 0x265E5A51);
P(B, C, D, A, 0, 20, 0xE9B6C7AA);
P(A, B, C, D, 5, 5, 0xD62F105D);
P(D, A, B, C, 10, 9, 0x02441453);
P(C, D, A, B, 15, 14, 0xD8A1E681);
P(B, C, D, A, 4, 20, 0xE7D3FBC8);
P(A, B, C, D, 9, 5, 0x21E1CDE6);
P(D, A, B, C, 14, 9, 0xC33707D6);
P(C, D, A, B, 3, 14, 0xF4D50D87);
P(B, C, D, A, 8, 20, 0x455A14ED);
P(A, B, C, D, 13, 5, 0xA9E3E905);
P(D, A, B, C, 2, 9, 0xFCEFA3F8);
P(C, D, A, B, 7, 14, 0x676F02D9);
P(B, C, D, A, 12, 20, 0x8D2A4C8A);
#undef F
#define F(x,y,z) (x ^ y ^ z)
P(A, B, C, D, 5, 4, 0xFFFA3942);
P(D, A, B, C, 8, 11, 0x8771F681);
P(C, D, A, B, 11, 16, 0x6D9D6122);
P(B, C, D, A, 14, 23, 0xFDE5380C);
P(A, B, C, D, 1, 4, 0xA4BEEA44);
P(D, A, B, C, 4, 11, 0x4BDECFA9);
P(C, D, A, B, 7, 16, 0xF6BB4B60);
P(B, C, D, A, 10, 23, 0xBEBFBC70);
P(A, B, C, D, 13, 4, 0x289B7EC6);
P(D, A, B, C, 0, 11, 0xEAA127FA);
P(C, D, A, B, 3, 16, 0xD4EF3085);
P(B, C, D, A, 6, 23, 0x04881D05);
P(A, B, C, D, 9, 4, 0xD9D4D039);
P(D, A, B, C, 12, 11, 0xE6DB99E5);
P(C, D, A, B, 15, 16, 0x1FA27CF8);
P(B, C, D, A, 2, 23, 0xC4AC5665);
#undef F
#define F(x,y,z) (y ^ (x | ~z))
P(A, B, C, D, 0, 6, 0xF4292244);
P(D, A, B, C, 7, 10, 0x432AFF97);
P(C, D, A, B, 14, 15, 0xAB9423A7);
P(B, C, D, A, 5, 21, 0xFC93A039);
P(A, B, C, D, 12, 6, 0x655B59C3);
P(D, A, B, C, 3, 10, 0x8F0CCC92);
P(C, D, A, B, 10, 15, 0xFFEFF47D);
P(B, C, D, A, 1, 21, 0x85845DD1);
P(A, B, C, D, 8, 6, 0x6FA87E4F);
P(D, A, B, C, 15, 10, 0xFE2CE6E0);
P(C, D, A, B, 6, 15, 0xA3014314);
P(B, C, D, A, 13, 21, 0x4E0811A1);
P(A, B, C, D, 4, 6, 0xF7537E82);
P(D, A, B, C, 11, 10, 0xBD3AF235);
P(C, D, A, B, 2, 15, 0x2AD7D2BB);
P(B, C, D, A, 9, 21, 0xEB86D391);
#undef F
ctx->state[0] += A;
ctx->state[1] += B;
ctx->state[2] += C;
ctx->state[3] += D;
return 0;
}
/*
* MD5 context setup
*/
int esp_md5_init(esp_md5_context_t *ctx)
{
util_assert(ctx);
memset(ctx->total, 0, sizeof(ctx->total));
memcpy(ctx->state, esp_md5_init_value, sizeof(ctx->state));
return 0;
}
/*
* MD5 process buffer
*/
int esp_md5_update(esp_md5_context_t *ctx, const uint8_t *input, size_t ilen)
{
int ret;
size_t fill;
uint32_t left;
util_assert(ctx);
util_assert(input);
util_assert(ilen > 0);
left = (ctx->total[0] >> 3)& 0x3F;
fill = 64 - left;
ctx->total[0] += (uint32_t) ilen << 3;
if(ctx->total[0] < (uint32_t) ilen << 3)
ctx->total[1]++;
if(left && ilen >= fill)
{
memcpy((void *) (ctx->buffer + left), input, fill);
if((ret = esp_md5_process(ctx, ctx->buffer)) != 0)
return ret;
input += fill;
ilen -= fill;
left = 0;
}
while(ilen >= 64)
{
if((ret = esp_md5_process(ctx, input)) != 0)
return ret;
input += 64;
ilen -= 64;
}
if(ilen > 0)
{
memcpy((void *) (ctx->buffer + left), input, ilen);
}
return 0;
}
/*
* MD5 final digest
*/
int esp_md5_final(esp_md5_context_t *ctx, uint8_t output[16])
{
int ret;
uint32_t last, padn;
uint8_t msglen[8];
util_assert(ctx);
last = (ctx->total[0] >> 3) & 0x3F;
padn = (last < 56) ? (56 - last) : (120 - last);
memcpy(msglen, ctx->total, 8);
if((ret = esp_md5_update(ctx, esp_md5_padding, padn)) != 0)
return ret ;
if((ret = esp_md5_update(ctx, msglen, 8)) != 0)
return ret ;
memcpy(output, ctx->state, 16);
return 0;
}

View File

@ -1,68 +1,165 @@
/**
* \brief AES block cipher, ESP8266 accelerated version
* Based on mbedTLS FIPS-197 compliant version.
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* Additions Copyright (C) 2016-2017, Espressif Systems (Shanghai) PTE Ltd
* 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.
*
*/
// Copyright 2018 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <stdio.h>
#include <string.h>
#include "mbedtls/sha1.h"
#include "util_assert.h"
#include <sys/errno.h>
#include "esp_sha.h"
#include "esp_log.h"
#if defined(MBEDTLS_SHA1_ALT)
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
void mbedtls_sha1_init(mbedtls_sha1_context *ctx)
#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
(rol(block->l[i], 8) & 0x00FF00FF))
#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
#define R0(v,w,x,y,z,i) \
z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
w = rol(w, 30);
#define R1(v,w,x,y,z,i) \
z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
w = rol(w, 30);
#define R2(v,w,x,y,z,i) \
z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
#define R3(v,w,x,y,z,i) \
z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
w = rol(w, 30);
#define R4(v,w,x,y,z,i) \
z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
w=rol(w, 30);
typedef union {
uint8_t c[64];
uint32_t l[16];
} block_t;
static void esp_sha1_transform(uint32_t state[5], const uint8_t buffer[64])
{
memset(ctx, 0, sizeof(mbedtls_sha1_context));
uint32_t a, b, c, d, e;
block_t workspace;
block_t *block = &workspace;
memcpy(block, buffer, 64);
a = state[0];
b = state[1];
c = state[2];
d = state[3];
e = state[4];
R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
state[4] += e;
}
void mbedtls_sha1_free(mbedtls_sha1_context *ctx)
int esp_sha1_init(esp_sha1_t *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha1_context));
util_assert(ctx);
ctx->state[0] = 0x67452301;
ctx->state[1] = 0xEFCDAB89;
ctx->state[2] = 0x98BADCFE;
ctx->state[3] = 0x10325476;
ctx->state[4] = 0xC3D2E1F0;
ctx->total[0] = ctx->total[1] = 0;
return 0;
}
void mbedtls_sha1_clone(mbedtls_sha1_context *dst, const mbedtls_sha1_context *src)
int esp_sha1_update(esp_sha1_t *ctx, const void *src, size_t size)
{
memcpy(dst, src, sizeof(mbedtls_sha1_context));
uint32_t i, j;
const uint8_t *data = (const uint8_t *)src;
util_assert(ctx);
util_assert(src);
util_assert(size);
j = (ctx->total[0] >> 3) & 63;
if ((ctx->total[0] += size << 3) < (size << 3))
ctx->total[1]++;
ctx->total[1] += (size >> 29);
if ((j + size) > 63) {
memcpy(&ctx->buffer[j], data, (i = 64-j));
esp_sha1_transform(ctx->state, ctx->buffer);
for ( ; i + 63 < size; i += 64)
esp_sha1_transform(ctx->state, &data[i]);
j = 0;
} else
i = 0;
memcpy(&ctx->buffer[j], &data[i], size - i);
return 0;
}
int mbedtls_sha1_starts_ret(mbedtls_sha1_context *ctx)
int esp_sha1_finish(esp_sha1_t *ctx, void *dest)
{
return esp_sha1_init(ctx);
uint32_t i;
uint32_t index;
uint8_t finalcount[8];
uint8_t *digest = (uint8_t *)dest;
util_assert(ctx);
util_assert(dest);
for (i = 0; i < 8; i++)
finalcount[i] = (uint8_t)((ctx->total[(i >= 4 ? 0 : 1)] >> ((3-(i & 3)) * 8) ) & 255);
index = 0x80;
esp_sha1_update(ctx, (uint8_t *)&index, 1);
while ((ctx->total[0] & 504) != 448) {
index = 0;
esp_sha1_update(ctx, (uint8_t *)&index, 1);
}
esp_sha1_update(ctx, finalcount, 8);
for (i = 0; i < 20; i++)
digest[i] = (uint8_t)((ctx->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
return 0;
}
int mbedtls_sha1_update_ret(mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen)
{
return esp_sha1_update(ctx, input, ilen);
}
int mbedtls_sha1_finish_ret(mbedtls_sha1_context *ctx, unsigned char output[64])
{
return esp_sha1_finish(ctx, output);
}
int mbedtls_internal_sha1_process(mbedtls_sha1_context *ctx, const unsigned char data[128])
{
return esp_sha1_update(ctx, data, 64);
}
// int mbedtls_sha512_ret(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
// {
// }
#endif /* MBEDTLS_AES_ALT */

View File

@ -1,75 +1,252 @@
/**
* \brief AES block cipher, ESP8266 accelerated version
* Based on mbedTLS FIPS-197 compliant version.
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* Additions Copyright (C) 2016-2017, Espressif Systems (Shanghai) PTE Ltd
* 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.
*
*/
// Copyright 2018 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <stdio.h>
#include <string.h>
#include "mbedtls/sha256.h"
#include "util_assert.h"
#include <sys/errno.h>
#include "esp_sha.h"
#include "esp_log.h"
#if defined(MBEDTLS_SHA256_ALT)
#define ESP_GET_BE32(a) ((((uint32_t) (a)[0]) << 24) | (((uint32_t) (a)[1]) << 16) | \
(((uint32_t) (a)[2]) << 8) | ((uint32_t) (a)[3]))
void mbedtls_sha256_init(mbedtls_sha256_context *ctx)
#define ESP_PUT_BE64(a, val) \
do { \
(a)[0] = (uint8_t) (((uint64_t) (val)) >> 56); \
(a)[1] = (uint8_t) (((uint64_t) (val)) >> 48); \
(a)[2] = (uint8_t) (((uint64_t) (val)) >> 40); \
(a)[3] = (uint8_t) (((uint64_t) (val)) >> 32); \
(a)[4] = (uint8_t) (((uint64_t) (val)) >> 24); \
(a)[5] = (uint8_t) (((uint64_t) (val)) >> 16); \
(a)[6] = (uint8_t) (((uint64_t) (val)) >> 8); \
(a)[7] = (uint8_t) (((uint64_t) (val)) & 0xff); \
} while (0)
#define ESP_PUT_BE32(a, val) \
do { \
(a)[0] = (uint8_t) ((((uint32_t) (val)) >> 24) & 0xff); \
(a)[1] = (uint8_t) ((((uint32_t) (val)) >> 16) & 0xff); \
(a)[2] = (uint8_t) ((((uint32_t) (val)) >> 8) & 0xff); \
(a)[3] = (uint8_t) (((uint32_t) (val)) & 0xff); \
} while (0)
#define RORc(x, y) \
( ((((uint32_t) (x) & 0xFFFFFFFFUL) >> (uint32_t) ((y) & 31)) | \
((uint32_t) (x) << (uint32_t) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
#define Ch(x,y,z) (z ^ (x & (y ^ z)))
#define Maj(x,y,z) (((x | y) & z) | (x & y))
#define S(x, n) RORc((x), (n))
#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
#ifndef MIN
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#endif
#define RND(a,b,c,d,e,f,g,h,i) \
t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
t1 = Sigma0(a) + Maj(a, b, c); \
d += t0; \
h = t0 + t1;
static const uint32_t K[64] = {
0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
};
static void esp_sha256_transform(esp_sha256_t *ctx, const uint8_t *buf)
{
memset(ctx, 0, sizeof(mbedtls_sha256_context));
uint32_t S[8], W[64], t0, t1;
uint32_t t;
int i;
for (i = 0; i < 8; i++)
S[i] = ctx->state[i];
for (i = 0; i < 16; i++)
W[i] = ESP_GET_BE32(buf + (4 * i));
for (i = 16; i < 64; i++)
W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
for (i = 0; i < 64; ++i) {
RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i);
t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4];
S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;
}
for (i = 0; i < 8; i++)
ctx->state[i] = ctx->state[i] + S[i];
}
void mbedtls_sha256_free(mbedtls_sha256_context *ctx)
int esp_sha256_init(esp_sha256_t *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha256_context));
util_assert(ctx);
ctx->is224 = 0;
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = 0x6A09E667UL;
ctx->state[1] = 0xBB67AE85UL;
ctx->state[2] = 0x3C6EF372UL;
ctx->state[3] = 0xA54FF53AUL;
ctx->state[4] = 0x510E527FUL;
ctx->state[5] = 0x9B05688CUL;
ctx->state[6] = 0x1F83D9ABUL;
ctx->state[7] = 0x5BE0CD19UL;
return 0;
}
void mbedtls_sha256_clone(mbedtls_sha256_context *dst, const mbedtls_sha256_context *src)
int esp_sha224_init(esp_sha224_t *ctx)
{
memcpy(dst, src, sizeof(mbedtls_sha256_context));
util_assert(ctx);
ctx->is224 = 1;
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = 0xC1059ED8;
ctx->state[1] = 0x367CD507;
ctx->state[2] = 0x3070DD17;
ctx->state[3] = 0xF70E5939;
ctx->state[4] = 0xFFC00B31;
ctx->state[5] = 0x68581511;
ctx->state[6] = 0x64F98FA7;
ctx->state[7] = 0xBEFA4FA4;
return 0;
}
int mbedtls_sha256_starts_ret(mbedtls_sha256_context *ctx, int is224)
int esp_sha256_update(esp_sha256_t *ctx, const void *src, size_t size)
{
int ret;
size_t fill;
uint32_t left;
const uint8_t *input = (const uint8_t *)src;
if (is224)
ret = esp_sha224_init(ctx);
else
ret = esp_sha256_init(ctx);
util_assert(ctx);
util_assert(src);
util_assert(size);
return ret;
left = ctx->total[0] & 0x3F;
fill = 64 - left;
ctx->total[0] += size;
ctx->total[0] &= 0xFFFFFFFF;
if (ctx->total[0] < size)
ctx->total[1]++;
if (left && size >= fill) {
memcpy(ctx->buffer + left, input, fill);
esp_sha256_transform(ctx, ctx->buffer);
input += fill;
size -= fill;
left = 0;
}
while (size >= 64) {
esp_sha256_transform(ctx, input);
input += 64;
size -= 64;
}
if (size > 0)
memcpy(ctx->buffer + left, input, size);
return 0;
}
int mbedtls_sha256_update_ret(mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen)
int esp_sha224_update(esp_sha224_t *ctx, const void *src, size_t size)
{
return esp_sha256_update(ctx, input, ilen);
util_assert(ctx);
util_assert(src);
util_assert(size);
return esp_sha256_update(ctx, src, size);
}
int mbedtls_sha256_finish_ret(mbedtls_sha256_context *ctx, unsigned char output[64])
int esp_sha224_finish(esp_sha224_t *ctx, void *dest)
{
return esp_sha256_finish(ctx, output);
uint32_t used;
uint32_t high, low;
uint8_t *out = (uint8_t *)dest;
util_assert(ctx);
util_assert(dest);
used = ctx->total[0] & 0x3F;
ctx->buffer[used++] = 0x80;
if (used <= 56) {
memset(ctx->buffer + used, 0, 56 - used);
} else {
memset(ctx->buffer + used, 0, 64 - used);
esp_sha256_transform(ctx, ctx->buffer);
memset(ctx->buffer, 0, 56);
}
high = (ctx->total[0] >> 29) | (ctx->total[1] << 3);
low = (ctx->total[0] << 3);
ESP_PUT_BE32(ctx->buffer + 56, high);
ESP_PUT_BE32(ctx->buffer + 60, low);
esp_sha256_transform(ctx, ctx->buffer);
ESP_PUT_BE32(out + 0, ctx->state[0]);
ESP_PUT_BE32(out + 4, ctx->state[1]);
ESP_PUT_BE32(out + 8, ctx->state[2]);
ESP_PUT_BE32(out + 12, ctx->state[3]);
ESP_PUT_BE32(out + 16, ctx->state[4]);
ESP_PUT_BE32(out + 20, ctx->state[5]);
ESP_PUT_BE32(out + 24, ctx->state[6]);
if (!ctx->is224) {
ESP_PUT_BE32(out + 28, ctx->state[7]);
}
return( 0 );
}
int mbedtls_internal_sha256_process(mbedtls_sha256_context *ctx, const unsigned char data[128])
int esp_sha256_finish(esp_sha256_t *ctx, void *dest)
{
return esp_sha256_update(ctx, data, 64);
util_assert(ctx);
util_assert(dest);
esp_sha224_finish(ctx, dest);
return 0;
}
// int mbedtls_sha512_ret(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
// {
// }
#endif /* MBEDTLS_AES_ALT */

View File

@ -1,75 +1,302 @@
/**
* \brief AES block cipher, ESP8266 accelerated version
* Based on mbedTLS FIPS-197 compliant version.
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* Additions Copyright (C) 2016-2017, Espressif Systems (Shanghai) PTE Ltd
* 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.
*
*/
// Copyright 2018 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <stdio.h>
#include <string.h>
#include "mbedtls/sha512.h"
#include "util_assert.h"
#include <sys/errno.h>
#include "esp_sha.h"
#include "esp_log.h"
#if defined(MBEDTLS_SHA512_ALT)
#define UL64(x) x##ULL
void mbedtls_sha512_init(mbedtls_sha512_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha512_context));
#define SHR(x,n) ((x) >> (n))
#define ROTR(x,n) (SHR((x),(n)) | ((x) << (64 - (n))))
#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6))
#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))
#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))
#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
#define P(a,b,c,d,e,f,g,h,x,K) \
do \
{ \
temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
temp2 = S2(a) + F0((a),(b),(c)); \
(d) += temp1; (h) = temp1 + temp2; \
} while( 0 )
#define GET_UINT64_BE(n,b,i) \
{ \
(n) = ( (uint64_t) (b)[(i) ] << 56 ) \
| ( (uint64_t) (b)[(i) + 1] << 48 ) \
| ( (uint64_t) (b)[(i) + 2] << 40 ) \
| ( (uint64_t) (b)[(i) + 3] << 32 ) \
| ( (uint64_t) (b)[(i) + 4] << 24 ) \
| ( (uint64_t) (b)[(i) + 5] << 16 ) \
| ( (uint64_t) (b)[(i) + 6] << 8 ) \
| ( (uint64_t) (b)[(i) + 7] ); \
}
void mbedtls_sha512_free(mbedtls_sha512_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha512_context));
#define PUT_UINT64_BE(n,b,i) \
{ \
(b)[(i) ] = (uint8_t) ( (n) >> 56 ); \
(b)[(i) + 1] = (uint8_t) ( (n) >> 48 ); \
(b)[(i) + 2] = (uint8_t) ( (n) >> 40 ); \
(b)[(i) + 3] = (uint8_t) ( (n) >> 32 ); \
(b)[(i) + 4] = (uint8_t) ( (n) >> 24 ); \
(b)[(i) + 5] = (uint8_t) ( (n) >> 16 ); \
(b)[(i) + 6] = (uint8_t) ( (n) >> 8 ); \
(b)[(i) + 7] = (uint8_t) ( (n) ); \
}
void mbedtls_sha512_clone(mbedtls_sha512_context *dst, const mbedtls_sha512_context *src)
static const uint64_t K[80] =
{
memcpy(dst, src, sizeof(mbedtls_sha512_context));
UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD),
UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC),
UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019),
UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118),
UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE),
UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2),
UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1),
UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694),
UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3),
UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65),
UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483),
UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5),
UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210),
UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4),
UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725),
UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70),
UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926),
UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF),
UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8),
UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B),
UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001),
UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30),
UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910),
UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8),
UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53),
UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8),
UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB),
UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3),
UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60),
UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC),
UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9),
UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B),
UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207),
UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178),
UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6),
UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B),
UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493),
UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C),
UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A),
UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817)
};
static int esp_sha512_transform(esp_sha512_t *ctx, const uint8_t *data)
{
int i;
uint64_t temp1, temp2, W[80];
uint64_t A, B, C, D, E, F, G, H;
for( i = 0; i < 16; i++ ) {
GET_UINT64_BE(W[i], data, i << 3);
}
for( ; i < 80; i++ )
W[i] = S1(W[i - 2]) + W[i - 7] + S0(W[i - 15]) + W[i - 16];
A = ctx->state[0];
B = ctx->state[1];
C = ctx->state[2];
D = ctx->state[3];
E = ctx->state[4];
F = ctx->state[5];
G = ctx->state[6];
H = ctx->state[7];
i = 0;
do {
P(A, B, C, D, E, F, G, H, W[i], K[i]); i++;
P(H, A, B, C, D, E, F, G, W[i], K[i]); i++;
P(G, H, A, B, C, D, E, F, W[i], K[i]); i++;
P(F, G, H, A, B, C, D, E, W[i], K[i]); i++;
P(E, F, G, H, A, B, C, D, W[i], K[i]); i++;
P(D, E, F, G, H, A, B, C, W[i], K[i]); i++;
P(C, D, E, F, G, H, A, B, W[i], K[i]); i++;
P(B, C, D, E, F, G, H, A, W[i], K[i]); i++;
} while (i < 80);
ctx->state[0] += A;
ctx->state[1] += B;
ctx->state[2] += C;
ctx->state[3] += D;
ctx->state[4] += E;
ctx->state[5] += F;
ctx->state[6] += G;
ctx->state[7] += H;
return( 0 );
}
int mbedtls_sha512_starts_ret(mbedtls_sha512_context *ctx, int is384)
int esp_sha512_init(esp_sha512_t *ctx)
{
int ret;
util_assert(ctx);
if (is384)
ret = esp_sha384_init(ctx);
else
ret = esp_sha512_init(ctx);
ctx->is384 = 0;
return ret;
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = UL64(0x6A09E667F3BCC908);
ctx->state[1] = UL64(0xBB67AE8584CAA73B);
ctx->state[2] = UL64(0x3C6EF372FE94F82B);
ctx->state[3] = UL64(0xA54FF53A5F1D36F1);
ctx->state[4] = UL64(0x510E527FADE682D1);
ctx->state[5] = UL64(0x9B05688C2B3E6C1F);
ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);
ctx->state[7] = UL64(0x5BE0CD19137E2179);
return 0;
}
int mbedtls_sha512_update_ret(mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen)
int esp_sha384_init(esp_sha384_t *ctx)
{
return esp_sha512_update(ctx, input, ilen);
util_assert(ctx);
ctx->is384 = 1;
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);
ctx->state[1] = UL64(0x629A292A367CD507);
ctx->state[2] = UL64(0x9159015A3070DD17);
ctx->state[3] = UL64(0x152FECD8F70E5939);
ctx->state[4] = UL64(0x67332667FFC00B31);
ctx->state[5] = UL64(0x8EB44A8768581511);
ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);
ctx->state[7] = UL64(0x47B5481DBEFA4FA4);
return 0;
}
int mbedtls_sha512_finish_ret(mbedtls_sha512_context *ctx, unsigned char output[64])
int esp_sha512_update(esp_sha512_t *ctx, const void *src, size_t size)
{
return esp_sha512_finish(ctx, output);
size_t fill;
uint32_t left;
const uint8_t *input = (const uint8_t *)src;
util_assert(ctx);
util_assert(src);
util_assert(size);
left = (uint32_t) (ctx->total[0] & 0x7F);
fill = 128 - left;
ctx->total[0] += (uint64_t)size;
if( ctx->total[0] < (uint64_t)size)
ctx->total[1]++;
if (left && size >= fill) {
memcpy(ctx->buffer + left, input, fill);
esp_sha512_transform(ctx, ctx->buffer);
input += fill;
size -= fill;
left = 0;
}
while (size >= 128) {
esp_sha512_transform(ctx, input);
input += 128;
size -= 128;
}
if (size > 0)
memcpy((void *) (ctx->buffer + left), input, size);
return( 0 );
}
int mbedtls_internal_sha512_process(mbedtls_sha512_context *ctx, const unsigned char data[128])
int esp_sha384_update(esp_sha384_t *ctx, const void *src, size_t size)
{
return esp_sha512_update(ctx, data, 128);
util_assert(ctx);
util_assert(src);
util_assert(size);
return esp_sha512_update(ctx, src, size);
}
// int mbedtls_sha512_ret(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
// {
// }
int esp_sha384_finish(esp_sha384_t *ctx, void *dest)
{
uint8_t used;
uint64_t high, low;
uint8_t *output = (uint8_t *)dest;
#endif /* MBEDTLS_AES_ALT */
util_assert(ctx);
util_assert(dest);
used = ctx->total[0] & 0x7F;
ctx->buffer[used++] = 0x80;
if (used <= 112)
memset(ctx->buffer + used, 0, 112 - used);
else {
memset(ctx->buffer + used, 0, 128 - used);
esp_sha512_transform(ctx, ctx->buffer);
memset(ctx->buffer, 0, 112);
}
high = (ctx->total[0] >> 61) | (ctx->total[1] << 3);
low = (ctx->total[0] << 3);
PUT_UINT64_BE(high, ctx->buffer, 112);
PUT_UINT64_BE(low, ctx->buffer, 120);
esp_sha512_transform(ctx, ctx->buffer);
PUT_UINT64_BE(ctx->state[0], output, 0);
PUT_UINT64_BE(ctx->state[1], output, 8);
PUT_UINT64_BE(ctx->state[2], output, 16);
PUT_UINT64_BE(ctx->state[3], output, 24);
PUT_UINT64_BE(ctx->state[4], output, 32);
PUT_UINT64_BE(ctx->state[5], output, 40);
if (!ctx->is384) {
PUT_UINT64_BE(ctx->state[6], output, 48);
PUT_UINT64_BE(ctx->state[7], output, 56);
}
return 0;
}
int esp_sha512_finish(esp_sha512_t *ctx, void *dest)
{
util_assert(ctx);
util_assert(dest);
esp_sha384_finish(ctx, dest);
return 0;
}

View File

@ -0,0 +1,181 @@
/**
* \brief AES block cipher, ESP8266 accelerated version
* Based on mbedTLS FIPS-197 compliant version.
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* Additions Copyright (C) 2016-2017, Espressif Systems (Shanghai) PTE Ltd
* 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.
*
*/
#include <string.h>
#include "mbedtls/aes.h"
#if defined(MBEDTLS_AES_ALT)
void mbedtls_aes_init(mbedtls_aes_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_aes_context));
}
void mbedtls_aes_free(mbedtls_aes_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_aes_context));
}
#if defined(MBEDTLS_CIPHER_MODE_XTS)
void mbedtls_aes_xts_init(mbedtls_aes_xts_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_aes_xts_context));
}
void mbedtls_aes_xts_free(mbedtls_aes_xts_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_aes_xts_context));
}
int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context *ctx,
const unsigned char *key,
unsigned int keybits)
{
return esp_aes_xts_set_encrypt_key(ctx, key, keybits);
}
int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context *ctx,
const unsigned char *key,
unsigned int keybits)
{
return esp_aes_xts_set_decrypt_key(ctx, key, keybits);
}
int mbedtls_aes_crypt_xts(mbedtls_aes_xts_context *ctx,
int mode,
size_t length,
const unsigned char data_unit[16],
const unsigned char *input,
unsigned char *output)
{
return esp_aes_crypt_xts(ctx, MBEDTLS_AES_ENCRYPT == mode, length, data_unit, input, output);
}
#endif
int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key,
unsigned int keybits)
{
return esp_aes_set_encrypt_key(ctx, key, keybits);
}
int mbedtls_aes_setkey_dec(mbedtls_aes_context *ctx, const unsigned char *key,
unsigned int keybits)
{
return esp_aes_set_decrypt_key(ctx, key, keybits);
}
int mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx,
int mode,
const unsigned char input[16],
unsigned char output[16])
{
if (MBEDTLS_AES_DECRYPT == mode)
return esp_aes_decrypt_ecb(ctx, input, output);
else
return esp_aes_encrypt_ecb(ctx, input, output);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
int mbedtls_aes_crypt_cbc(mbedtls_aes_context *ctx,
int mode,
size_t length,
unsigned char iv[16],
const unsigned char *input,
unsigned char *output)
{
if (MBEDTLS_AES_DECRYPT == mode)
return esp_aes_decrypt_cbc(ctx, input, length, output, length, iv);
else
return esp_aes_encrypt_cbc(ctx, input, length, output, length, iv);
}
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
int mbedtls_aes_crypt_cfb128(mbedtls_aes_context *ctx,
int mode,
size_t length,
size_t *iv_off,
unsigned char iv[16],
const unsigned char *input,
unsigned char *output)
{
if (MBEDTLS_AES_DECRYPT == mode)
return esp_aes_decrypt_cfb128(ctx, input, length, output, length, iv, iv_off);
else
return esp_aes_encrypt_cfb128(ctx, input, length, output, length, iv, iv_off);
}
int mbedtls_aes_crypt_cfb8(mbedtls_aes_context *ctx,
int mode,
size_t length,
unsigned char iv[16],
const unsigned char *input,
unsigned char *output)
{
if (MBEDTLS_AES_DECRYPT == mode)
return esp_aes_decrypt_cfb8(ctx, input, length, output, length, iv);
else
return esp_aes_encrypt_cfb8(ctx, input, length, output, length, iv);
}
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
int mbedtls_aes_crypt_ofb(mbedtls_aes_context *ctx,
size_t length,
size_t *iv_off,
unsigned char iv[16],
const unsigned char *input,
unsigned char *output)
{
return esp_aes_crypt_ofb(ctx, length, iv_off, iv, input, output);
}
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
int mbedtls_aes_crypt_ctr(mbedtls_aes_context *ctx,
size_t length,
size_t *nc_off,
unsigned char nonce_counter[16],
unsigned char stream_block[16],
const unsigned char *input,
unsigned char *output)
{
return esp_aes_encrypt_ctr(ctx, nc_off, nonce_counter, stream_block, input,
length, output, length);
}
#endif
int mbedtls_internal_aes_encrypt(mbedtls_aes_context *ctx,
const unsigned char input[16],
unsigned char output[16])
{
return esp_aes_encrypt(ctx, input, 16, output, 16);
}
int mbedtls_internal_aes_decrypt(mbedtls_aes_context *ctx,
const unsigned char input[16],
unsigned char output[16])
{
return esp_aes_decrypt(ctx, input, 16, output, 16);
}
#endif /* MBEDTLS_AES_ALT */

View File

@ -0,0 +1,68 @@
/**
* \brief AES block cipher, ESP8266 accelerated version
* Based on mbedTLS FIPS-197 compliant version.
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* Additions Copyright (C) 2016-2017, Espressif Systems (Shanghai) PTE Ltd
* 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.
*
*/
#include <string.h>
#include "mbedtls/sha1.h"
#if defined(MBEDTLS_SHA1_ALT)
void mbedtls_sha1_init(mbedtls_sha1_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha1_context));
}
void mbedtls_sha1_free(mbedtls_sha1_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha1_context));
}
void mbedtls_sha1_clone(mbedtls_sha1_context *dst, const mbedtls_sha1_context *src)
{
memcpy(dst, src, sizeof(mbedtls_sha1_context));
}
int mbedtls_sha1_starts_ret(mbedtls_sha1_context *ctx)
{
return esp_sha1_init(ctx);
}
int mbedtls_sha1_update_ret(mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen)
{
return esp_sha1_update(ctx, input, ilen);
}
int mbedtls_sha1_finish_ret(mbedtls_sha1_context *ctx, unsigned char output[64])
{
return esp_sha1_finish(ctx, output);
}
int mbedtls_internal_sha1_process(mbedtls_sha1_context *ctx, const unsigned char data[128])
{
return esp_sha1_update(ctx, data, 64);
}
// int mbedtls_sha512_ret(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
// {
// }
#endif /* MBEDTLS_AES_ALT */

View File

@ -0,0 +1,75 @@
/**
* \brief AES block cipher, ESP8266 accelerated version
* Based on mbedTLS FIPS-197 compliant version.
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* Additions Copyright (C) 2016-2017, Espressif Systems (Shanghai) PTE Ltd
* 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.
*
*/
#include <string.h>
#include "mbedtls/sha256.h"
#if defined(MBEDTLS_SHA256_ALT)
void mbedtls_sha256_init(mbedtls_sha256_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha256_context));
}
void mbedtls_sha256_free(mbedtls_sha256_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha256_context));
}
void mbedtls_sha256_clone(mbedtls_sha256_context *dst, const mbedtls_sha256_context *src)
{
memcpy(dst, src, sizeof(mbedtls_sha256_context));
}
int mbedtls_sha256_starts_ret(mbedtls_sha256_context *ctx, int is224)
{
int ret;
if (is224)
ret = esp_sha224_init(ctx);
else
ret = esp_sha256_init(ctx);
return ret;
}
int mbedtls_sha256_update_ret(mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen)
{
return esp_sha256_update(ctx, input, ilen);
}
int mbedtls_sha256_finish_ret(mbedtls_sha256_context *ctx, unsigned char output[64])
{
return esp_sha256_finish(ctx, output);
}
int mbedtls_internal_sha256_process(mbedtls_sha256_context *ctx, const unsigned char data[128])
{
return esp_sha256_update(ctx, data, 64);
}
// int mbedtls_sha512_ret(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
// {
// }
#endif /* MBEDTLS_AES_ALT */

View File

@ -0,0 +1,75 @@
/**
* \brief AES block cipher, ESP8266 accelerated version
* Based on mbedTLS FIPS-197 compliant version.
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* Additions Copyright (C) 2016-2017, Espressif Systems (Shanghai) PTE Ltd
* 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.
*
*/
#include <string.h>
#include "mbedtls/sha512.h"
#if defined(MBEDTLS_SHA512_ALT)
void mbedtls_sha512_init(mbedtls_sha512_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha512_context));
}
void mbedtls_sha512_free(mbedtls_sha512_context *ctx)
{
memset(ctx, 0, sizeof(mbedtls_sha512_context));
}
void mbedtls_sha512_clone(mbedtls_sha512_context *dst, const mbedtls_sha512_context *src)
{
memcpy(dst, src, sizeof(mbedtls_sha512_context));
}
int mbedtls_sha512_starts_ret(mbedtls_sha512_context *ctx, int is384)
{
int ret;
if (is384)
ret = esp_sha384_init(ctx);
else
ret = esp_sha512_init(ctx);
return ret;
}
int mbedtls_sha512_update_ret(mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen)
{
return esp_sha512_update(ctx, input, ilen);
}
int mbedtls_sha512_finish_ret(mbedtls_sha512_context *ctx, unsigned char output[64])
{
return esp_sha512_finish(ctx, output);
}
int mbedtls_internal_sha512_process(mbedtls_sha512_context *ctx, const unsigned char data[128])
{
return esp_sha512_update(ctx, data, 128);
}
// int mbedtls_sha512_ret(const unsigned char *input, size_t ilen, unsigned char output[64], int is384)
// {
// }
#endif /* MBEDTLS_AES_ALT */

View File

@ -0,0 +1,284 @@
// Copyright 2019-2020 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#pragma once
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct esp_aes {
int32_t nr; /*!< The number of AES key bits */
uint32_t *rk; /*!< The AES AES key */
uint32_t buf[68]; /*!< The AES calculation cache */
} esp_aes_t;
typedef struct esp_aes_xts {
esp_aes_t crypt; /*!< The AES context to use for AES block encryption or decryption. */
esp_aes_t tweak; /*!< The AES context used for tweak computation. */
} esp_aes_xts_t;
/**
* @brief Set AES encrypt key
*
* @param aes AES contex pointer
* @param p_key AES key data buffer
* @param keybits number of AES key bits
*
* @return 0 if success or fail
*/
int esp_aes_set_encrypt_key(esp_aes_t *aes, const void *p_key, size_t keybits);
/**
* @brief Set AES decrypt key
*
* @param aes AES contex pointer
* @param p_key AES key data buffer
* @param keybits number of AES key bits
*
* @return 0 if success or fail
*/
int esp_aes_set_decrypt_key(esp_aes_t *aes, const void *key, size_t keybits);
/**
* @brief AES normal encrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
*
* @return 0 if success or fail
*/
int esp_aes_encrypt(esp_aes_t *aes, const void *p_src, size_t slen, void *p_dst, size_t dlen);
/**
* @brief AES normal decrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
*
* @return 0 if success or fail
*/
int esp_aes_decrypt(esp_aes_t *aes, const void *p_src, size_t slen, void *p_dst, size_t dlen);
/**
* @brief AES-ECB encrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param p_dst output data buffer
*
* @return 0 if success or fail
*/
static inline int esp_aes_encrypt_ecb(esp_aes_t *aes, const void *p_src, void *p_dst)
{
return esp_aes_encrypt(aes, p_src, 16, p_dst, 16);
}
/**
* @brief AES-ECB decrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param p_dst output data buffer
*
* @return 0 if success or fail
*/
static inline int esp_aes_decrypt_ecb(esp_aes_t *aes, const void *p_src, void *p_dst)
{
return esp_aes_decrypt(aes, p_src, 16, p_dst, 16);
}
/**
* @brief AES-CBC encrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
* @param p_iv initialization vector buffer
*
* @return 0 if success or fail
*/
int esp_aes_encrypt_cbc(esp_aes_t *aes, const void *p_src, size_t slen, void *p_dst, size_t dlen, void *p_iv);
/**
* @brief AES-CBC decrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
* @param p_iv initialization vector buffer
*
* @return 0 if success or fail
*/
int esp_aes_decrypt_cbc(esp_aes_t *aes, const void *p_src, size_t slen, void *p_dst, size_t dlen, void *p_iv);
/**
* @brief AES-CFB128 encrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
* @param p_iv initialization vector buffer
* @param iv_off initialization vector offset
*
* @return 0 if success or fail
*/
int esp_aes_encrypt_cfb128(esp_aes_t *aes, const void *p_src, size_t slen, void *p_dst, size_t dlen, void *p_iv, size_t *iv_off);
/**
* @brief AES-CFB128 decrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
* @param p_iv initialization vector buffer
* @param iv_off initialization vector offset
*
* @return 0 if success or fail
*/
int esp_aes_decrypt_cfb128(esp_aes_t *aes, const void *p_src, size_t slen, void *p_dst, size_t dlen, void *p_iv, size_t *iv_off);
/**
* @brief AES-CFB8 encrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
* @param p_iv initialization vector buffer
*
* @return 0 if success or fail
*/
int esp_aes_encrypt_cfb8(esp_aes_t *aes, const void *p_src, size_t slen, void *p_dst, size_t dlen, void *p_iv);
/**
* @brief AES-CFB8 decrypt calculation
*
* @param aes AES contex pointer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
* @param p_iv initialization vector buffer
*
* @return 0 if success or fail
*/
int esp_aes_decrypt_cfb8(esp_aes_t *aes, const void *p_src, size_t slen, void *p_dst, size_t dlen, void *p_iv);
/**
* @brief AES-CTR encrypt calculation
*
* @param aes AES contex pointer
* @param nc_off offset in the current stream block
* @param p_nonce_counter 128-bit nonce and counter buffer
* @param p_stream_block current stream block buffer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
*
* @return 0 if success or fail
*/
int esp_aes_encrypt_ctr(esp_aes_t *aes, size_t *nc_off, void *p_nonce_counter, void *p_stream_block, const void *p_src, size_t slen, void *p_dst, size_t dlen);
/**
* @brief AES-CTR decrypt calculation
*
* @param aes AES contex pointer
* @param nc_off offset in the current stream block
* @param p_nonce_counter 128-bit nonce and counter buffer
* @param p_stream_block current stream block buffer
* @param p_src input data buffer
* @param slen input data length by bytes
* @param p_dst output data buffer
* @param dlen output data length by bytes
*
* @return 0 if success or fail
*/
static inline int esp_aes_decrypt_ctr(esp_aes_t *aes, size_t *nc_off, void *p_nonce_counter, void *p_stream_block, const void *p_src, size_t slen, void *p_dst, size_t dlen)
{
return esp_aes_encrypt_ctr(aes, nc_off, p_nonce_counter, p_stream_block, p_src, slen, p_dst, dlen);
}
/**
* @brief Set AES XTS encrypt key
*
* @param aes AES XTS contex pointer
* @param p_key AES XTS key data buffer
* @param keybits number of AES XTS key bits
*
* @return 0 if success or fail
*/
int esp_aes_xts_set_encrypt_key(esp_aes_xts_t *aes, const void *p_key, size_t keybits);
/**
* @brief Set AES XTS decrypt key
*
* @param aes AES XTS contex pointer
* @param p_key AES XTS key data buffer
* @param keybits number of AES XTS key bits
*
* @return 0 if success or fail
*/
int esp_aes_xts_set_decrypt_key(esp_aes_xts_t *aes, const void *p_key, size_t keybits);
/**
* @brief AES XTS encrypt/decrypt calculation
*
* @param aes AES contex pointer
* @param encrypt 1 : encrypt, 0 : decrypt
* @param length data unit data length by bytes
* @param p_data_unit data unit buffer
* @param p_src input data buffer
* @param p_dst output data buffer
*
* @return 0 if success or fail
*/
int esp_aes_crypt_xts(esp_aes_xts_t *aes, int encrypt, size_t length, const void *p_data_unit, const void *p_src, void *p_dst);
/**
* @brief AES OFB encrypt/decrypt calculation
*
* @param aes AES contex pointer
* @param length data length by bytes
* @param iv_off IV offset
* @param p_iv IV data buffer
* @param p_src input data buffer
* @param p_dst output data buffer
*
* @return 0 if success or fail
*/
int esp_aes_crypt_ofb(esp_aes_t *ctx, size_t length, size_t *iv_off, void *p_iv, const void *p_src, void *p_dst);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,71 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#pragma once
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief ARC4 context structure
*/
typedef struct
{
int x; /*!< permutation index */
int y; /*!< permutation index */
unsigned char m[256]; /*!< permutation table */
}esp_arc4_context;
/**
* @brief ARC4 key schedule
*
* @param ctx ARC4 context to be setup
* @param key the secret key
* @param keylen length of the key, in bytes
*/
void esp_arc4_setup(esp_arc4_context *ctx, const uint8_t *key, uint32_t keylen);
/**
* @brief ARC4 cipher function
*
* @param ctx ARC4 context
* @param length length of the input data
* @param input buffer holding the input data
* @param output buffer for the output data
*
* @return 0 if successful
*/
int esp_arc4_encrypt(esp_arc4_context *ctx, size_t length, const uint8_t *input, uint8_t *output);
/**
* @brief ARC4 cipher function
*
* @param ctx ARC4 context
* @param length length of the input data
* @param input buffer holding the input data
* @param output buffer for the output data
*
* @return 0 if successful
* @Note When you encrypt or decrypt, must call esp_arc4_setup function to set key.
* Encrypt and decrypt will change the ctx value
*/
int esp_arc4_decrypt(esp_arc4_context *ctx, size_t length, const uint8_t *input, uint8_t *output );
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,46 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#pragma once
#include <stdint.h>
/**
* @brief encode a base64-formatted buffer
*
* @param p_src input encoded data buffer pointer
* @param slen input data length by bytes
* @param p_dst output buffer pointer
* @param dlen output buffer length by bytes
*
* @return the result
* 0 : Success
* -ENOBUFS : output buffer it not enough
*/
int esp_base64_encode(const void *p_src, uint32_t slen, void *p_dst, uint32_t dlen);
/**
* @brief decode a base64-formatted buffer
*
* @param p_src input encoded data buffer pointer
* @param slen input data length by bytes
* @param p_dst output buffer pointer
* @param dlen output buffer length by bytes
*
* @return the result
* 0 : Success
* -EINVAL : input parameter invalid
* -ENOBUFS : output buffer it not enough
*/
int esp_base64_decode(const void *p_src, uint32_t slen, void *p_dst, uint32_t dlen);

View File

@ -0,0 +1,59 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#pragma once
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief MD5 context structure
*/
typedef struct MD5Context{
uint32_t total[2]; /*!< number of bytes processed */
uint32_t state[4]; /*!< intermediate digest state */
uint8_t buffer[64]; /*!< data block being processed */
} esp_md5_context_t;
/**
* @brief MD5 context setup
* @param ctx context to be initialized
* @return 0 if successful
*/
int esp_md5_init(esp_md5_context_t *ctx);
/**
* @brief MD5 process buffer
* @param ctx MD5 context
* @param input buffer holding the data
* @param ilen length of the input data
* @return 0 if successful
*/
int esp_md5_update(esp_md5_context_t *ctx, const uint8_t *input, size_t ilen);
/**
* @brief MD5 final digest
* @param ctx MD5 context
* @param output MD5 checksum result
* @return 0 if successful
*/
int esp_md5_final(esp_md5_context_t *ctx, uint8_t output[16]);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,721 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "esp_aes.h"
#include "unity.h"
#define TEST_AES_COUNT 1
#define TEST_AES_DEBUG 0
#define TEST_AES_DEBUG_TIME 0
#if TEST_AES_DEBUG_TIME
#undef TEST_ASSERT_TRUE
#define TEST_ASSERT_TRUE(__e) ((__e) ? (void)0 : (void)0)
#endif
static const uint32_t s_aes_ecb_result[3][4] = {
// keybits = 128
{
0x34eff23c, 0xb90aab82, 0x5781d455, 0x743e4cef,
},
// keybits = 192
{
0x8b47f409, 0x2752feb6, 0x8001f471, 0x76f0bb1d,
},
// keybits = 256
{
0x3d33ac44, 0x709b21d1, 0x7372cd80, 0x6bad3758,
}
};
static const uint32_t s_aes_cbc_result[3][8] = {
// keybits = 128
{
0xda3f4f4f, 0x9b96f894, 0xbfbbf671, 0x2da753f9, 0xad8a1a91, 0x958360a3, 0x857d1ae4, 0xda4c89e1,
},
// keybits = 192
{
0xe92a9715, 0xbe5983de, 0xefce73cf, 0x21ef8004, 0x31499c08, 0xb7753f3d, 0x54afc778, 0xc2a8209f,
},
// keybits = 256
{
0x2288383b, 0x8e541787, 0x3eb2c691, 0x76ae0dcd, 0x2a6f677a, 0xa1b0118d, 0x150ca144, 0x41def443,
}
};
static const uint32_t s_aes_cfb8_result[3][8] = {
// keybits = 128
{
0x6b5dabee, 0x41102894, 0x13e333be, 0x4fd60d9c, 0x2974dde7, 0xcaa73794, 0x1dc3d2d8, 0x3a210c38,
},
// keybits = 192
{
0xf3e04de7, 0xeca9fd81, 0xebf7ee9e, 0x7b6e7091, 0xa8bde865, 0xc150d7d9, 0xddaf6657, 0x77d6e3f0,
},
// keybits = 256
{
0xc510918d, 0xac9004da, 0xc23fea19, 0x6914df10, 0xa34d6dd5, 0x9ecc2cc7, 0x9941cd88, 0x1d472bb7,
}
};
static const uint32_t s_aes_cfb128_result[3][8] = {
// keybits = 128
{
0xfe2d65ee, 0x2d86806b, 0xea5d2e84, 0x10ebab93, 0x32f9354f, 0x0dcbc189, 0x087d75d8, 0xc456acd3,
},
// keybits = 192
{
0xfaaf66e7, 0x9c2cbe18, 0xa1f67fe2, 0x5f92ac9e, 0x1432de12, 0x4e115c08, 0x36d6a739, 0x5d8c1bce,
},
// keybits = 256
{
0x14e2318d, 0x185ac4df, 0xe6efc826, 0x65b796fb, 0x39f9a2e7, 0xffd706f4, 0x7ac79119, 0x47b99a97,
}
};
static const uint32_t s_aes_ctr_result[3][8] = {
// keybits = 128
{
0xfe2d65ee, 0x2d86806b, 0xea5d2e84, 0x10ebab93, 0x26a701de, 0x0e9d716f, 0x2d87c066, 0x2ff1f3af,
},
// keybits = 192
{
0xfaaf66e7, 0x9c2cbe18, 0xa1f67fe2, 0x5f92ac9e, 0xf7e0935e, 0xf0d3b9c1, 0x0f442d3b, 0xf7368de3,
},
// keybits = 256
{
0x14e2318d, 0x185ac4df, 0xe6efc826, 0x65b796fb, 0x9fef3b32, 0x742db24c, 0x08c56021, 0x5f5c8bf4,
}
};
static const uint8_t aes_test_xts_key[][32] = {
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
{
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
},
{
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
},
};
static const uint8_t aes_test_xts_pt32[][32] =
{
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
{
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44
},
{
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44
},
};
static const uint8_t aes_test_xts_ct32[][32] =
{
{
0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e
},
{
0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0
},
{
0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a,
0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2,
0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53,
0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89
},
};
static const uint8_t aes_test_xts_data_unit[][16] =
{
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
{
0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
{
0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
};
static const unsigned char aes_test_ofb_key[3][32] =
{
{
0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
},
{
0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,
0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,
0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B
},
{
0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,
0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,
0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,
0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4
}
};
static const unsigned char aes_test_ofb_iv[16] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
};
static const unsigned char aes_test_ofb_pt[64] =
{
0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10
};
static const unsigned char aes_test_ofb_ct[3][64] =
{
{
0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,
0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,
0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03,
0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6,
0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78,
0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e
},
{
0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,
0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,
0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c,
0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f,
0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e,
0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a
},
{
0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,
0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,
0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a,
0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed,
0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8,
0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84
}
};
TEST_CASE("Test AES-ECB", "[AES]")
{
uint32_t buf[4];
uint32_t output[4];
uint8_t key[32];
esp_aes_t ctx;
uint32_t encode_time = 0, decode_time = 0;
extern uint32_t esp_get_time(void);
memset(key, 0x11, sizeof(key));
for (int cnt = 0; cnt < TEST_AES_COUNT; cnt++) {
int index = 0;
for (int i = 128; i <= 256; i += 64) {
memset(buf, 11, sizeof(buf));
memset(output, 0, sizeof(output));
uint32_t tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_encrypt_ecb(&ctx, buf, output) == 0);
encode_time += esp_get_time() - tmp;
#if TEST_AES_DEBUG
for (int j = 0; j < 4; j++)
printf("0x%08x(0x%08x), ", output[j], s_aes_ecb_result[index][j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, s_aes_ecb_result[index++], sizeof(output)) == 0);
tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_decrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_decrypt_ecb(&ctx, output, buf) == 0);
decode_time += esp_get_time() - tmp;
memset(output, 11, sizeof(output));
#if TEST_AES_DEBUG
for (int j = 0; j < 4; j++)
printf("0x%08x(0x%08x), ", buf[j], output[j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, buf, sizeof(output)) == 0);
}
}
#if TEST_AES_DEBUG_TIME
printf("AES-ECB test cost time totally encode %u us and decode %u us, once cost is about encode %u us and decode %u us\n",
encode_time, decode_time, encode_time / TEST_AES_COUNT, decode_time / TEST_AES_COUNT);
#endif
}
// align: AES-ECB test cost time totally encode 370305 us and decode 905644 us, once cost is about encode 361 us and decode 884 us
// no align: AES-ECB test cost time totally encode 513219 us and decode 1729937 us, once cost is about encode 501 us and decode 1689 us
TEST_CASE("Test AES-CBC", "[AES]")
{
uint32_t buf[8];
uint32_t output[8];
uint8_t key[32];
uint8_t iv[16];
esp_aes_t ctx;
uint32_t encode_time = 0, decode_time = 0;
extern uint32_t esp_get_time(void);
memset(key, 0x11, sizeof(key));
for (int cnt = 0; cnt < TEST_AES_COUNT; cnt++) {
int index = 0;
for (int i = 128; i <= 256; i += 64) {
memset(buf, 11, sizeof(buf));
memset(output, 0, sizeof(output));
memset(iv, 0x11, sizeof(iv));
uint32_t tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_encrypt_cbc(&ctx, buf, sizeof(buf), output, sizeof(output), iv) == 0);
encode_time += esp_get_time() - tmp;
#if TEST_AES_DEBUG
for (int j = 0; j < 8; j++)
printf("0x%08x(0x%08x), ", output[j], s_aes_cbc_result[index][j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, s_aes_cbc_result[index++], sizeof(output)) == 0);
memset(iv, 0x11, sizeof(iv));
tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_decrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_decrypt_cbc(&ctx, output, sizeof(output), buf, sizeof(buf), iv) == 0);
decode_time += esp_get_time() - tmp;
memset(output, 11, sizeof(output));
#if TEST_AES_DEBUG
for (int j = 0; j < 8; j++)
printf("0x%08x(0x%08x), ", buf[j], output[j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, buf, sizeof(output)) == 0);
}
}
#if TEST_AES_DEBUG_TIME
printf("AES-CBC test cost time totally encode %u us and decode %u us, once cost is about encode %u us and decode %u us\n",
encode_time, decode_time, encode_time / TEST_AES_COUNT, decode_time / TEST_AES_COUNT);
#endif
}
// align: AES-CBC test cost time totally encode 554920 us and decode 1098010 us, once cost is about encode 541 us and decode 1072 us
// no align: AES-CBC test cost time totally encode 730527 us and decode 2052009 us, once cost is about encode 713 us and decode 2003 us
TEST_CASE("Test AES-CFB8", "[AES]")
{
uint32_t buf[8];
uint32_t output[8];
uint8_t key[32];
uint8_t iv[16];
esp_aes_t ctx;
uint32_t encode_time = 0, decode_time = 0;
extern uint32_t esp_get_time(void);
memset(key, 0x11, sizeof(key));
for (int cnt = 0; cnt < TEST_AES_COUNT; cnt++) {
int index = 0;
for (int i = 128; i <= 256; i += 64) {
memset(buf, 11, sizeof(buf));
memset(output, 0, sizeof(output));
memset(iv, 0x11, sizeof(iv));
uint32_t tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_encrypt_cfb8(&ctx, buf, sizeof(buf), output, sizeof(output), iv) == 0);
encode_time += esp_get_time() - tmp;
#if TEST_AES_DEBUG
for (int j = 0; j < 8; j++)
printf("0x%08x(0x%08x), ", output[j], s_aes_cfb8_result[index][j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, s_aes_cfb8_result[index++], sizeof(output)) == 0);
memset(iv, 0x11, sizeof(iv));
tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_decrypt_cfb8(&ctx, output, sizeof(output), buf, sizeof(buf), iv) == 0);
decode_time += esp_get_time() - tmp;
memset(output, 11, sizeof(output));
#if TEST_AES_DEBUG
for (int j = 0; j < 8; j++)
printf("0x%08x(0x%08x), ", buf[j], output[j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, buf, sizeof(output)) == 0);
}
}
#if TEST_AES_DEBUG_TIME
printf("AES-CFB8 test cost time totally encode %u us and decode %u us, once cost is about encode %u us and decode %u us\n",
encode_time, decode_time, encode_time / TEST_AES_COUNT, decode_time / TEST_AES_COUNT);
#endif
}
// align: AES-CFB8 test cost time totally encode 3951207 us and decode 3918394 us, once cost is about encode 3858 us and decode 3826 us
// no align: AES-CFB8 test cost time totally encode 5510528 us and decode 5481662 us, once cost is about encode 5381 us and decode 5353 us
TEST_CASE("Test AES-CFB128", "[AES]")
{
uint32_t buf[8];
uint32_t output[8];
uint8_t key[32];
uint8_t iv[16];
size_t iv_off;
esp_aes_t ctx;
uint32_t encode_time = 0, decode_time = 0;
extern uint32_t esp_get_time(void);
memset(key, 0x11, sizeof(key));
for (int cnt = 0; cnt < TEST_AES_COUNT; cnt++) {
int index = 0;
for (int i = 128; i <= 256; i += 64) {
memset(buf, 11, sizeof(buf));
memset(output, 0, sizeof(output));
memset(iv, 0x11, sizeof(iv));
iv_off = 0;
uint32_t tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_encrypt_cfb128(&ctx, buf, sizeof(buf), output, sizeof(output), iv, &iv_off) == 0);
encode_time += esp_get_time() - tmp;
#if TEST_AES_DEBUG
for (int j = 0; j < 8; j++)
printf("0x%08x(0x%08x), ", output[j], s_aes_cfb128_result[index][j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, s_aes_cfb128_result[index++], sizeof(output)) == 0);
memset(iv, 0x11, sizeof(iv));
iv_off = 0;
tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_decrypt_cfb128(&ctx, output, sizeof(output), buf, sizeof(buf), iv, &iv_off) == 0);
decode_time += esp_get_time() - tmp;
memset(output, 11, sizeof(output));
#if TEST_AES_DEBUG
for (int j = 0; j < 8; j++)
printf("0x%08x(0x%08x), ", buf[j], output[j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, buf, sizeof(buf)) == 0);
}
}
#if TEST_AES_DEBUG_TIME
printf("AES-CFB128 test cost time totally encode %u us and decode %u us, once cost is about encode %u us and decode %u us\n",
encode_time, decode_time, encode_time / TEST_AES_COUNT, decode_time / TEST_AES_COUNT);
#endif
}
// align: AES-CFB128 test cost time totally encode 468238 us and decode 423293 us, once cost is about encode 457 us and decode 413 us
// no align: AES-CFB128 test cost time totally encode 675645 us and decode 667750 us, once cost is about encode 659 us and decode 652 us
TEST_CASE("Test AES-CTR", "[AES]")
{
uint32_t buf[8];
uint32_t output[8];
uint8_t key[32];
uint8_t nonce_counter[16];
uint8_t stream_block[16];
size_t nc_off;
esp_aes_t ctx;
uint32_t encode_time = 0, decode_time = 0;
extern uint32_t esp_get_time(void);
memset(key, 0x11, sizeof(key));
for (int cnt = 0; cnt < TEST_AES_COUNT; cnt++) {
int index = 0;
for (int i = 128; i <= 256; i += 64) {
memset(buf, 11, sizeof(buf));
memset(output, 0, sizeof(output));
memset(nonce_counter, 0x11, sizeof(nonce_counter));
nc_off = 0;
uint32_t tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_encrypt_ctr(&ctx, &nc_off, nonce_counter, stream_block, buf, sizeof(buf), output, sizeof(output)) == 0);
encode_time += esp_get_time() - tmp;
#if TEST_AES_DEBUG
for (int j = 0; j < 8; j++)
printf("0x%08x(0x%08x), ", output[j], s_aes_cfb128_result[index][j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, s_aes_ctr_result[index++], sizeof(output)) == 0);
memset(nonce_counter, 0x11, sizeof(nonce_counter));
nc_off = 0;
tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, i) == 0);
TEST_ASSERT_TRUE(esp_aes_decrypt_ctr(&ctx, &nc_off, nonce_counter, stream_block, output, sizeof(output), buf, sizeof(buf)) == 0);
decode_time += esp_get_time() - tmp;
memset(output, 11, sizeof(output));
#if TEST_AES_DEBUG
for (int j = 0; j < 8; j++)
printf("0x%08x(0x%08x), ", buf[j], output[j]);
printf("\n");
#endif
TEST_ASSERT_TRUE(memcmp(output, buf, sizeof(buf)) == 0);
}
}
#if TEST_AES_DEBUG_TIME
printf("AES-CRT test cost time totally encode %u us and decode %u us, once cost is about encode %u us and decode %u us\n",
encode_time, decode_time, encode_time / TEST_AES_COUNT, decode_time / TEST_AES_COUNT);
#endif
}
// align: AES-CRT test cost time totally encode 344845 us and decode 344421 us, once cost is about encode 336 us and decode 336 us
// no align: AES-CRT test cost time totally encode 639256 us and decode 635343 us, once cost is about encode 624 us and decode 620 us
TEST_CASE("Test AES-XTS", "[AES]")
{
uint32_t encode_time = 0, decode_time = 0;
const int num_tests = sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
extern uint32_t esp_get_time(void);
for (int cnt = 0; cnt < TEST_AES_COUNT; cnt++) {
for (int i = 0; i < num_tests; i++) {
const int len = sizeof(*aes_test_xts_ct32);
uint32_t buf[8];
uint8_t key[32];
const uint8_t *data_unit = aes_test_xts_data_unit[i];
esp_aes_xts_t ctx_xts;
memcpy(key, aes_test_xts_key[i], 32);
TEST_ASSERT_TRUE(esp_aes_xts_set_encrypt_key(&ctx_xts, key, 256) == 0);
memcpy(buf, aes_test_xts_pt32[i], len);
uint32_t tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_crypt_xts(&ctx_xts, 1, len, data_unit, buf, buf) == 0);
encode_time += esp_get_time() - tmp;
TEST_ASSERT_TRUE(memcmp(buf, aes_test_xts_ct32[i], len) == 0);
TEST_ASSERT_TRUE(esp_aes_xts_set_decrypt_key(&ctx_xts, key, 256) == 0);
memcpy(buf, aes_test_xts_ct32[i], len);
tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_crypt_xts(&ctx_xts, 0, len, data_unit, buf, buf) == 0);
decode_time += esp_get_time() - tmp;
TEST_ASSERT_TRUE(memcmp(buf, aes_test_xts_pt32[i], len) == 0);
}
}
#if TEST_AES_DEBUG_TIME
printf("AES-XTS test cost time totally encode %u us and decode %u us, once cost is about encode %u us and decode %u us\n",
encode_time, decode_time, encode_time / TEST_AES_COUNT, decode_time / TEST_AES_COUNT);
#endif
}
// align: AES-XTS test cost time totally encode 723197 us and decode 533441 us, once cost is about encode 706 us and decode 520 us
// no align: AES-XTS test cost time totally encode 675249 us and decode 645998 us, once cost is about encode 659 us and decode 630 us
TEST_CASE("Test AES-OFB", "[AES]")
{
uint32_t encode_time = 0, decode_time = 0;
const int num_tests = sizeof(aes_test_ofb_ct) / sizeof(*aes_test_ofb_ct);
extern uint32_t esp_get_time(void);
for (int cnt = 0; cnt < TEST_AES_COUNT; cnt++) {
for (int i = 0; i < num_tests; i++) {
uint8_t buf[64];
uint8_t key[32];
uint8_t iv[16];
esp_aes_t ctx;
size_t keybits;
size_t offset;
offset = 0;
keybits = i * 64 + 128;
memcpy(iv, aes_test_ofb_iv, 16);
memcpy(key, aes_test_ofb_key[i], keybits / 8);
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, keybits) == 0);
memcpy(buf, aes_test_ofb_ct[i], 64);
uint32_t tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf) == 0);
encode_time += esp_get_time() - tmp;
TEST_ASSERT_TRUE(memcmp(buf, aes_test_ofb_pt, 64) == 0);
offset = 0;
keybits = i * 64 + 128;
memcpy(iv, aes_test_ofb_iv, 16);
memcpy(key, aes_test_ofb_key[i], keybits / 8);
TEST_ASSERT_TRUE(esp_aes_set_encrypt_key(&ctx, key, keybits) == 0);
memcpy(buf, aes_test_ofb_pt, 64);
tmp = esp_get_time();
TEST_ASSERT_TRUE(esp_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf) == 0);
decode_time += esp_get_time() - tmp;
TEST_ASSERT_TRUE(memcmp(buf, aes_test_ofb_ct[i], 64) == 0);
}
}
#if TEST_AES_DEBUG_TIME
printf("AES-OFB test cost time totally encode %u us and decode %u us, once cost is about encode %u us and decode %u us\n",
encode_time, decode_time, encode_time / TEST_AES_COUNT, decode_time / TEST_AES_COUNT);
#endif
}
// align: AES-OFB test cost time totally encode 465340 us and decode 455726 us, once cost is about encode 454 us and decode 445 us
// no align: AES-OFB test cost time totally encode 743898 us and decode 736479 us, once cost is about encode 726 us and decode 719 us

View File

@ -0,0 +1,74 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <string.h>
#include <stdio.h>
#include "esp_arc4.h"
#include "unity.h"
#define TEST_ARC4_COUNT 512
#define TEST_ARC4_DEBUG 1
static const uint8_t arc4_test_key[3][8] =
{
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
};
static const uint8_t arc4_test_pt[3][8] =
{
{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
};
static const uint8_t arc4_test_ct[3][8] =
{
{ 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 },
{ 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 },
{ 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A }
};
TEST_CASE("Test ARC4", "[ARC4]")
{
int i, n = 0;
uint32_t encode_time = 0;
uint8_t ibuf[8];
uint8_t obuf[8];
extern uint32_t esp_get_time(void);
for (n = 0; n < TEST_ARC4_COUNT; n++) {
for(i = 0; i < 3; i++)
{
memcpy(ibuf, arc4_test_pt[i], 8);
uint32_t tmp = esp_get_time();
esp_arc4_context ctx;
esp_arc4_setup(&ctx, arc4_test_key[i], 8);
TEST_ASSERT_TRUE(esp_arc4_encrypt(&ctx, 8, ibuf, obuf) == 0);
encode_time += esp_get_time() - tmp;
TEST_ASSERT_TRUE(memcmp(obuf, arc4_test_ct[i], 8) == 0);
}
}
#if TEST_ARC4_DEBUG
printf("ARC4 test cost time totally encode %u us , once cost is about encode %u us\n",
encode_time, encode_time / (TEST_ARC4_COUNT * 3));
#endif
}
// ARC4 test cost time totally encode 794288 us , once cost is about encode 517 us

View File

@ -0,0 +1,77 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <string.h>
#include <stdio.h>
#include "esp_base64.h"
#include "unity.h"
#define TEST_BASE64_COUNT 4096
#define TEST_BASE64_DEBUG 1
static unsigned char base64_test_dec[] =
{
0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,
0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,
0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,
0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,
0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,
0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,
0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,
0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97
};
static unsigned char base64_test_enc[] =
"JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"
"swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";
TEST_CASE("Test base64 codec", "[base64]")
{
int ret;
uint32_t encode_time = 0, decode_time = 0;
unsigned char buffer[128];
extern uint32_t esp_get_time(void);
for (int i = 0; i < TEST_BASE64_COUNT; i++) {
uint32_t tmp = esp_get_time();
ret = esp_base64_encode(base64_test_dec, sizeof(base64_test_dec), buffer, sizeof(buffer));
TEST_ASSERT_TRUE(ret > 0);
encode_time += esp_get_time() - tmp;
TEST_ASSERT_TRUE(memcmp(base64_test_enc, buffer, ret) == 0);
tmp = esp_get_time();
ret = esp_base64_decode(base64_test_enc, sizeof(base64_test_enc) - 1, buffer, sizeof(buffer));
TEST_ASSERT_TRUE(ret > 0);
decode_time += esp_get_time() - tmp;
TEST_ASSERT_TRUE(memcmp(base64_test_dec, buffer, ret) == 0);
}
#if TEST_BASE64_DEBUG
printf("base64 test cost time totally encode %u us and decode %u us, once cost is about encode %u us and decode %u us\n",
encode_time, decode_time, encode_time / TEST_BASE64_COUNT, decode_time / TEST_BASE64_COUNT);
#endif
}
// align: base64 test cost time totally encode 100921 us and decode 549040 us,
// once cost is about encode 29 us and decode 133 us
// no align : base64 test cost time totally encode 640726 us and decode 1601834 us,
// once cost is about encode 156 us and decode 391 us

View File

@ -0,0 +1,81 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "rom/crc.h"
#include "unity.h"
#define TEST_CRC_COUNT 4096
#define TEST_CRC_DEBUG 1
#define TEST_DATA_BYTES 128
static uint8_t s_crc_src[TEST_DATA_BYTES];
TEST_CASE("Test CRC8", "[CRC8]")
{
uint8_t crc = 0;
uint32_t crc_time = 0;
extern uint32_t esp_get_time(void);
memset(s_crc_src, 11, TEST_DATA_BYTES);
for (int i = 0; i < TEST_CRC_COUNT; i++) {
uint32_t tmp = esp_get_time();
crc = esp_crc8(s_crc_src, sizeof(s_crc_src));
crc_time += esp_get_time() - tmp;
TEST_ASSERT_EQUAL(0xd7, crc);
}
#if TEST_CRC_DEBUG
printf("CRC8 test cost time totally %u us, once cost is about %u us\n",
crc_time, crc_time / TEST_CRC_COUNT);
#endif
}
// no align: CRC8 test cost time totally 955287 us, once cost is about 233 us
// align : CRC8 test cost time totally 186694 us, once cost is about 45 us
TEST_CASE("Test CRC16", "[CRC16]")
{
uint16_t crc = 0;
uint32_t crc_time = 0;
extern uint32_t esp_get_time(void);
memset(s_crc_src, 11, TEST_DATA_BYTES);
for (int i = 0; i < TEST_CRC_COUNT; i++) {
uint32_t tmp = esp_get_time();
crc = crc16_le(0, s_crc_src, sizeof(s_crc_src));
crc_time += esp_get_time() - tmp;
TEST_ASSERT_EQUAL(0x495d, crc);
}
#if TEST_CRC_DEBUG
printf("CRC16 test cost time totally %u us, once cost is about %u us\n",
crc_time, crc_time / TEST_CRC_COUNT);
#endif
}
// no align: CRC16 test cost time totally 1114398 us, once cost is about 272 us
// align : CRC16 test cost time totally 200268 us, once cost is about 48 us

View File

@ -0,0 +1,86 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <string.h>
#include <stdio.h>
#include "esp_md5.h"
#include "unity.h"
#define TEST_MD5_COUNT 256
#define TEST_MD5_DEBUG 1
static const uint8_t md5_test_buf[7][81] =
{
{""},
{"a"},
{"abc"},
{"message digest"},
{"abcdefghijklmnopqrstuvwxyz"},
{"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"},
{"12345678901234567890123456789012345678901234567890123456789012"
"345678901234567890"}
};
static const size_t md5_test_buflen[7] =
{
0, 1, 3, 14, 26, 62, 80
};
static const uint8_t md5_test_sum[7][16] =
{
{ 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04,
0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E },
{ 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8,
0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 },
{ 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0,
0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 },
{ 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D,
0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 },
{ 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00,
0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B },
{ 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5,
0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F },
{ 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55,
0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A }
};
TEST_CASE("Test MD5", "[md5]")
{
uint32_t encode_time = 0;
uint8_t md5sum[16] = {0};
extern uint32_t esp_get_time(void);
for (int i = 0; i < TEST_MD5_COUNT; i++) {
for (int j = 0; j < 7; j++)
{
uint32_t tmp = esp_get_time();
esp_md5_context_t ctx;
TEST_ASSERT_TRUE(esp_md5_init(&ctx) == 0);
TEST_ASSERT_TRUE(esp_md5_update(&ctx, md5_test_buf[j], md5_test_buflen[j]) == 0);
TEST_ASSERT_TRUE(esp_md5_final(&ctx, md5sum) == 0);
encode_time += esp_get_time() - tmp;
TEST_ASSERT_TRUE(memcmp(md5sum, md5_test_sum[j], 16) == 0);
}
}
#if TEST_MD5_DEBUG
printf("MD5 test cost time totally encode %u us , once cost is about encode %u us\n",
encode_time, encode_time / (TEST_MD5_COUNT * 7));
#endif
}
// MD5 test cost time totally encode 88614 us , once cost is about encode 49 us

View File

@ -0,0 +1,223 @@
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
//
// 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.
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "esp_sha.h"
#include "esp_heap_caps.h"
#include "esp_log.h"
#include "unity.h"
//#define DEBUG_SHA_RESULT
#define TAG "SHA_TEST"
TEST_CASE("Test SHA1", "[SHA]")
{
int ret;
uint8_t *buf;
esp_sha1_t sha_ctx;
const uint32_t sha_result[] = {
0xc3b837ce, 0x0c8a528c, 0x032939b5, 0x50a88285, 0x6433458d
};
buf = heap_caps_malloc(1024, MALLOC_CAP_8BIT);
TEST_ASSERT(buf != NULL);
memset(buf, 11, 1024);
ret = esp_sha1_init(&sha_ctx);
TEST_ASSERT(ret == 0);
ret = esp_sha1_update(&sha_ctx, buf, 1024);
TEST_ASSERT(ret == 0);
memset(buf, 0, 1024);
ret = esp_sha1_finish(&sha_ctx, buf);
TEST_ASSERT(ret == 0);
#ifdef DEBUG_SHA_RESULT
const uint32_t *pbuf = (const uint32_t *)buf;
printf("\n");
for (int j = 0; j < sizeof(sha_result) / sizeof(sha_result[0]); j++) {
printf("0x%x(0x%x) ", pbuf[j], sha_result[j]);
}
printf("\n");
#endif
TEST_ASSERT(memcmp(buf, sha_result, sizeof(sha_result)) == 0);
heap_caps_free(buf);
}
TEST_CASE("Test SHA224", "[SHA]")
{
int ret;
uint8_t *buf;
esp_sha224_t sha_ctx;
const uint32_t sha_result[] = {
0xeb5dd981, 0x0ea2508e, 0xfe5708b8, 0xc15f30b5, 0x833f2144, 0xbbf4de16, 0x50d112b7
};
buf = heap_caps_malloc(1024, MALLOC_CAP_8BIT);
TEST_ASSERT(buf != NULL);
memset(buf, 11, 1024);
ret = esp_sha224_init(&sha_ctx);
TEST_ASSERT(ret == 0);
ret = esp_sha224_update(&sha_ctx, buf, 1024);
TEST_ASSERT(ret == 0);
memset(buf, 0, 1024);
ret = esp_sha224_finish(&sha_ctx, buf);
TEST_ASSERT(ret == 0);
#ifdef DEBUG_SHA_RESULT
const uint32_t *pbuf = (const uint32_t *)buf;
printf("\n");
for (int j = 0; j < sizeof(sha_result) / sizeof(sha_result[0]); j++) {
printf("0x%x(0x%x) ", pbuf[j], sha_result[j]);
}
printf("\n");
#endif
TEST_ASSERT(memcmp(buf, sha_result, sizeof(sha_result)) == 0);
heap_caps_free(buf);
}
TEST_CASE("Test SHA256", "[SHA]")
{
int ret;
uint8_t *buf;
esp_sha256_t sha_ctx;
const uint32_t sha_result[] = {
0xfc875b5a, 0x318e3c5a, 0xac2b3233, 0x4df7b366, 0x4c4c9261, 0x0e70af8d, 0x69a7e57c, 0x179cd56e
};
buf = heap_caps_malloc(1024, MALLOC_CAP_8BIT);
TEST_ASSERT(buf != NULL);
memset(buf, 11, 1024);
ret = esp_sha256_init(&sha_ctx);
TEST_ASSERT(ret == 0);
ret = esp_sha256_update(&sha_ctx, buf, 1024);
TEST_ASSERT(ret == 0);
memset(buf, 0, 1024);
ret = esp_sha256_finish(&sha_ctx, buf);
TEST_ASSERT(ret == 0);
#ifdef DEBUG_SHA_RESULT
const uint32_t *pbuf = (const uint32_t *)buf;
printf("\n");
for (int j = 0; j < sizeof(sha_result) / sizeof(sha_result[0]); j++) {
printf("0x%x(0x%x) ", pbuf[j], sha_result[j]);
}
printf("\n");
#endif
TEST_ASSERT(memcmp(buf, sha_result, sizeof(sha_result)) == 0);
heap_caps_free(buf);
}
TEST_CASE("Test SHA384", "[SHA]")
{
int ret;
uint8_t *buf;
esp_sha384_t sha_ctx;
const uint32_t sha_result[] = {
0xd1d31575, 0x494afdef, 0x1d042951, 0x77a02c7b, 0x546db656, 0xdf31c571,
0x1c3f87c1, 0x0d5cd544, 0x73628b2a, 0xecf051e7, 0xb72e6478, 0x83cee28b
};
buf = heap_caps_malloc(1024, MALLOC_CAP_8BIT);
TEST_ASSERT(buf != NULL);
memset(buf, 11, 1024);
ret = esp_sha384_init(&sha_ctx);
TEST_ASSERT(ret == 0);
ret = esp_sha384_update(&sha_ctx, buf, 1024);
TEST_ASSERT(ret == 0);
memset(buf, 0, 1024);
ret = esp_sha384_finish(&sha_ctx, buf);
TEST_ASSERT(ret == 0);
#if DEBUG_SHA_RESULT
const uint32_t *pbuf = (const uint32_t *)buf;
printf("\n");
for (int j = 0; j < sizeof(sha_result) / sizeof(sha_result[0]); j++) {
printf("0x%x(0x%x) ", pbuf[j], sha_result[j]);
}
printf("\n");
#endif
TEST_ASSERT(memcmp(buf, sha_result, sizeof(sha_result)) == 0);
heap_caps_free(buf);
}
TEST_CASE("Test SHA512", "[SHA]")
{
int ret;
uint8_t *buf;
esp_sha512_t sha_ctx;
const uint32_t sha_result[] = {
0x153be81b, 0x37abc24e, 0x3b6f1a5b, 0x42c713f9, 0x51c9a8e1, 0x7303f29b,
0x2c979121, 0x1c4e632d, 0xad470c5a, 0xe7643b5e, 0x63447f10, 0x05d613e6,
0xa3c6b5cc, 0x99e52218, 0x665b659f, 0x1bfc639b
};
buf = heap_caps_malloc(1024, MALLOC_CAP_8BIT);
TEST_ASSERT(buf != NULL);
memset(buf, 11, 1024);
ret = esp_sha512_init(&sha_ctx);
TEST_ASSERT(ret == 0);
ret = esp_sha512_update(&sha_ctx, buf, 1024);
TEST_ASSERT(ret == 0);
memset(buf, 0, 1024);
ret = esp_sha512_finish(&sha_ctx, buf);
TEST_ASSERT(ret == 0);
#if DEBUG_SHA_RESULT
const uint32_t *pbuf = (const uint32_t *)buf;
printf("\n");
for (int j = 0; j < sizeof(sha_result) / sizeof(sha_result[0]); j++) {
printf("0x%x(0x%x) ", pbuf[j], sha_result[j]);
}
printf("\n");
#endif
TEST_ASSERT(memcmp(buf, sha_result, sizeof(sha_result)) == 0);
heap_caps_free(buf);
}