mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
esp32c3/Digital Signature: mbedtls integration through ESP-TLS
This commit is contained in:
parent
cf9ac2ef9e
commit
79c23a1886
@ -26,7 +26,7 @@ menu "ESP-TLS"
|
|||||||
|
|
||||||
config ESP_TLS_USE_DS_PERIPHERAL
|
config ESP_TLS_USE_DS_PERIPHERAL
|
||||||
bool "Use Digital Signature (DS) Peripheral with ESP-TLS"
|
bool "Use Digital Signature (DS) Peripheral with ESP-TLS"
|
||||||
depends on IDF_TARGET_ESP32S2 && ESP_TLS_USING_MBEDTLS
|
depends on (IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S2) && ESP_TLS_USING_MBEDTLS
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Enable use of the Digital Signature Peripheral for ESP-TLS.The DS peripheral
|
Enable use of the Digital Signature Peripheral for ESP-TLS.The DS peripheral
|
||||||
|
@ -30,6 +30,7 @@ extern "C" {
|
|||||||
is produced anyway and can be read*/
|
is produced anyway and can be read*/
|
||||||
|
|
||||||
#define ESP_DS_IV_BIT_LEN 128
|
#define ESP_DS_IV_BIT_LEN 128
|
||||||
|
#define ESP_DS_IV_LEN (ESP_DS_IV_BIT_LEN / 8)
|
||||||
#define ESP_DS_SIGNATURE_MAX_BIT_LEN 3072
|
#define ESP_DS_SIGNATURE_MAX_BIT_LEN 3072
|
||||||
#define ESP_DS_SIGNATURE_MD_BIT_LEN 256
|
#define ESP_DS_SIGNATURE_MD_BIT_LEN 256
|
||||||
#define ESP_DS_SIGNATURE_M_PRIME_BIT_LEN 32
|
#define ESP_DS_SIGNATURE_M_PRIME_BIT_LEN 32
|
||||||
|
@ -122,8 +122,9 @@ target_sources(mbedcrypto PRIVATE "${COMPONENT_DIR}/port/esp_hardware.c"
|
|||||||
"${AES_DMA_SRCS}"
|
"${AES_DMA_SRCS}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# CONFIG_ESP_TLS_USE_DS_PERIPHERAL can be enabled only for the supported targets.
|
||||||
if(CONFIG_ESP_TLS_USE_DS_PERIPHERAL)
|
if(CONFIG_ESP_TLS_USE_DS_PERIPHERAL)
|
||||||
target_sources(mbedcrypto PRIVATE "${COMPONENT_DIR}/port/esp32s2/esp_rsa_sign_alt.c")
|
target_sources(mbedcrypto PRIVATE "${COMPONENT_DIR}/port/esp_ds/esp_rsa_sign_alt.c")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Note: some mbedTLS hardware acceleration can be enabled/disabled by config.
|
# Note: some mbedTLS hardware acceleration can be enabled/disabled by config.
|
||||||
|
@ -14,7 +14,15 @@
|
|||||||
|
|
||||||
#include "esp_ds.h"
|
#include "esp_ds.h"
|
||||||
#include "rsa_sign_alt.h"
|
#include "rsa_sign_alt.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_IDF_TARGET_ESP32S2
|
||||||
#include "esp32s2/rom/digital_signature.h"
|
#include "esp32s2/rom/digital_signature.h"
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||||
|
#include "esp32c3/rom/digital_signature.h"
|
||||||
|
#else
|
||||||
|
#error "Selected target does not support esp_rsa_sign_alt (for DS)"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_heap_caps.h"
|
#include "esp_heap_caps.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
@ -22,9 +22,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL
|
#ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL
|
||||||
|
#include "esp_ds/esp_rsa_sign_alt.h"
|
||||||
#include "esp32s2/esp_rsa_sign_alt.h"
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#error "DS configuration flags not activated, please enable required menuconfig flags"
|
#error "DS configuration flags not activated, please enable required menuconfig flags"
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
| Supported Targets | ESP32-S2 |
|
| Supported Targets | ESP32-S2 | ESP32-C3 |
|
||||||
# ESP-MQTT SSL Mutual Authentication with Digital Signature
|
# ESP-MQTT SSL Mutual Authentication with Digital Signature
|
||||||
(See the README.md file in the upper level 'examples' directory for more information about examples.)
|
(See the README.md file in the upper level 'examples' directory for more information about examples.)
|
||||||
|
|
||||||
Espressif's ESP32-S2 MCU has a built-in Digital Signature (DS) Peripheral, which provides hardware acceleration for RSA signature. More details can be found at [Digital Signature with ESP-TLS](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-reference/protocols/esp_tls.html#digital-signature-with-esp-tls).
|
Espressif's ESP32-S2 and ESP32-C3 MCU have a built-in Digital Signature (DS) Peripheral, which provides hardware acceleration for RSA signature. More details can be found at [Digital Signature with ESP-TLS](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-reference/protocols/esp_tls.html#digital-signature-with-esp-tls).
|
||||||
|
|
||||||
This example connects to the broker test.mosquitto.org using ssl transport with client certificate(RSA) and as a demonstration subscribes/unsubscribes and sends a message on certain topic.The RSA signature operation required in the ssl connection is performed with help of the Digital Signature (DS) peripheral.
|
This example connects to the broker test.mosquitto.org using ssl transport with client certificate(RSA) and as a demonstration subscribes/unsubscribes and sends a message on certain topic.The RSA signature operation required in the ssl connection is performed with help of the Digital Signature (DS) peripheral.
|
||||||
(Please note that the public broker is maintained by the community so may not be always available, for details please visit http://test.mosquitto.org)
|
(Please note that the public broker is maintained by the community so may not be always available, for details please visit http://test.mosquitto.org)
|
||||||
@ -12,14 +12,14 @@ It uses ESP-MQTT library which implements mqtt client to connect to mqtt broker.
|
|||||||
|
|
||||||
### Hardware Required
|
### Hardware Required
|
||||||
|
|
||||||
This example can be executed on any ESP32-S2 board (which has a built-in DS peripheral), the only required interface is WiFi and connection to internet.
|
This example can be executed on any ESP32-S2, ESP32-C3 board (which has a built-in DS peripheral), the only required interface is WiFi and connection to internet.
|
||||||
|
|
||||||
### Configure the project
|
### Configure the project
|
||||||
|
|
||||||
#### 1) Selecting the target
|
#### 1) Selecting the target
|
||||||
As the project is to be built for the target ESP32-S2, it should be selected with the following command
|
As the project is to be built for the target ESP32-S2, ESP32-C3 it should be selected with the following command
|
||||||
```
|
```
|
||||||
idf.py set-target esp32s2
|
idf.py set-target /* target */
|
||||||
```
|
```
|
||||||
More detials can be found at [Selecting the target](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#selecting-the-target).
|
More detials can be found at [Selecting the target](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#selecting-the-target).
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ Please note, that the supplied file `client.crt` in the `main` directory is only
|
|||||||
python configure_ds.py --port /* USB COM port */ --private-key /* RSA priv key */
|
python configure_ds.py --port /* USB COM port */ --private-key /* RSA priv key */
|
||||||
```
|
```
|
||||||
|
|
||||||
In the command USB COM port is nothing but the serial port to which the ESP32-S2 chip is connected. see
|
In the command USB COM port is nothing but the serial port to which the ESP chip is connected. see
|
||||||
[check serial port](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/establish-serial-connection.html#check-port-on-windows) for more details.
|
[check serial port](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/establish-serial-connection.html#check-port-on-windows) for more details.
|
||||||
RSA private key is nothing but the client private key ( RSA ) generated in Step 2.
|
RSA private key is nothing but the client private key ( RSA ) generated in Step 2.
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ DATA=data
|
|||||||
|
|
||||||
|
|
||||||
### configure_ds.py
|
### configure_ds.py
|
||||||
The script [configure_ds.py](./configure_ds.py) is used for configuring the DS peripheral on the ESP32-S2 SoC. The steps in the script are based on technical details of certain operations in the Digital Signature calculation, which can be found at Digital Signature Section of [ESP32-S2 TRM](https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf)
|
The script [configure_ds.py](./configure_ds.py) is used for configuring the DS peripheral on the ESP32-S2/ESP32-C3 SoC. The steps in the script are based on technical details of certain operations in the Digital Signature calculation, which can be found at Digital Signature Section of [ESP32-S2 TRM](https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf)
|
||||||
|
|
||||||
The configuration script performs the following steps -
|
The configuration script performs the following steps -
|
||||||
|
|
||||||
|
@ -12,13 +12,14 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import hmac
|
import hmac
|
||||||
|
import json
|
||||||
|
import os
|
||||||
import struct
|
import struct
|
||||||
import subprocess
|
import subprocess
|
||||||
import json
|
import sys
|
||||||
|
|
||||||
from cryptography.hazmat.backends import default_backend
|
from cryptography.hazmat.backends import default_backend
|
||||||
from cryptography.hazmat.primitives import serialization
|
from cryptography.hazmat.primitives import serialization
|
||||||
from cryptography.hazmat.primitives.asymmetric import rsa
|
from cryptography.hazmat.primitives.asymmetric import rsa
|
||||||
@ -45,7 +46,8 @@ csv_filename = esp_ds_data_dir + '/pre_prov.csv'
|
|||||||
bin_filename = esp_ds_data_dir + '/pre_prov.bin'
|
bin_filename = esp_ds_data_dir + '/pre_prov.bin'
|
||||||
expected_json_path = os.path.join('build', 'config', 'sdkconfig.json')
|
expected_json_path = os.path.join('build', 'config', 'sdkconfig.json')
|
||||||
# Targets supported by the script
|
# Targets supported by the script
|
||||||
supported_targets = {'esp32s2'}
|
supported_targets = {'esp32s2', 'esp32c3'}
|
||||||
|
supported_key_size = {'esp32s2':[1024, 2048, 3072, 4096], 'esp32c3':[1024, 2048, 3072]}
|
||||||
|
|
||||||
|
|
||||||
# @return
|
# @return
|
||||||
@ -87,10 +89,11 @@ def number_as_bytes(number, pad_bits=None):
|
|||||||
# privkey : path to the RSA private key
|
# privkey : path to the RSA private key
|
||||||
# priv_key_pass : path to the RSA privaete key password
|
# priv_key_pass : path to the RSA privaete key password
|
||||||
# hmac_key : HMAC key value ( to calculate DS params)
|
# hmac_key : HMAC key value ( to calculate DS params)
|
||||||
|
# idf_target : The target chip for the script (e.g. esp32s2, esp32c3)
|
||||||
# @info
|
# @info
|
||||||
# The function calculates the encrypted private key parameters.
|
# The function calculates the encrypted private key parameters.
|
||||||
# Consult the DS documentation (available for the ESP32-S2) in the esp-idf programming guide for more details about the variables and calculations.
|
# Consult the DS documentation (available for the ESP32-S2) in the esp-idf programming guide for more details about the variables and calculations.
|
||||||
def calculate_ds_parameters(privkey, priv_key_pass, hmac_key):
|
def calculate_ds_parameters(privkey, priv_key_pass, hmac_key, idf_target):
|
||||||
private_key = load_privatekey(privkey, priv_key_pass)
|
private_key = load_privatekey(privkey, priv_key_pass)
|
||||||
if not isinstance(private_key, rsa.RSAPrivateKey):
|
if not isinstance(private_key, rsa.RSAPrivateKey):
|
||||||
print("ERROR: Only RSA private keys are supported")
|
print("ERROR: Only RSA private keys are supported")
|
||||||
@ -104,9 +107,9 @@ def calculate_ds_parameters(privkey, priv_key_pass, hmac_key):
|
|||||||
Y = priv_numbers.d
|
Y = priv_numbers.d
|
||||||
M = pub_numbers.n
|
M = pub_numbers.n
|
||||||
key_size = private_key.key_size
|
key_size = private_key.key_size
|
||||||
supported_key_size = [1024, 2048, 3072, 4096]
|
if key_size not in supported_key_size[idf_target]:
|
||||||
if key_size not in supported_key_size:
|
print("ERROR: Private key size {0} not supported for the target {1},\nthe supported key sizes are {2}"
|
||||||
print("Key size not supported, supported sizes are" + str(supported_key_size))
|
.format(key_size, idf_target, str(supported_key_size[idf_target])))
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
iv = os.urandom(16)
|
iv = os.urandom(16)
|
||||||
@ -117,25 +120,34 @@ def calculate_ds_parameters(privkey, priv_key_pass, hmac_key):
|
|||||||
mprime &= 0xFFFFFFFF
|
mprime &= 0xFFFFFFFF
|
||||||
length = key_size // 32 - 1
|
length = key_size // 32 - 1
|
||||||
|
|
||||||
|
# get max supported key size for the respective target
|
||||||
|
max_len = max(supported_key_size[idf_target])
|
||||||
aes_key = hmac.HMAC(hmac_key, b"\xFF" * 32, hashlib.sha256).digest()
|
aes_key = hmac.HMAC(hmac_key, b"\xFF" * 32, hashlib.sha256).digest()
|
||||||
|
|
||||||
md_in = number_as_bytes(Y, 4096) + \
|
md_in = number_as_bytes(Y, max_len) + \
|
||||||
number_as_bytes(M, 4096) + \
|
number_as_bytes(M, max_len) + \
|
||||||
number_as_bytes(rinv, 4096) + \
|
number_as_bytes(rinv, max_len) + \
|
||||||
struct.pack("<II", mprime, length) + \
|
struct.pack("<II", mprime, length) + \
|
||||||
iv
|
iv
|
||||||
assert len(md_in) == 12480 / 8
|
|
||||||
md = hashlib.sha256(md_in).digest()
|
|
||||||
|
|
||||||
|
# expected_len = max_len_Y + max_len_M + max_len_rinv + (mprime + length packed (8 bytes))+ iv (16 bytes)
|
||||||
|
expected_len = (max_len / 8) * 3 + 8 + 16
|
||||||
|
assert len(md_in) == expected_len
|
||||||
|
md = hashlib.sha256(md_in).digest()
|
||||||
|
# In case of ESP32-S2
|
||||||
# Y4096 || M4096 || Rb4096 || M_prime32 || LENGTH32 || MD256 || 0x08*8
|
# Y4096 || M4096 || Rb4096 || M_prime32 || LENGTH32 || MD256 || 0x08*8
|
||||||
p = number_as_bytes(Y, 4096) + \
|
# In case of ESP32-C3
|
||||||
number_as_bytes(M, 4096) + \
|
# Y3072 || M3072 || Rb3072 || M_prime32 || LENGTH32 || MD256 || 0x08*8
|
||||||
number_as_bytes(rinv, 4096) + \
|
p = number_as_bytes(Y, max_len) + \
|
||||||
|
number_as_bytes(M, max_len) + \
|
||||||
|
number_as_bytes(rinv, max_len) + \
|
||||||
md + \
|
md + \
|
||||||
struct.pack("<II", mprime, length) + \
|
struct.pack("<II", mprime, length) + \
|
||||||
b'\x08' * 8
|
b'\x08' * 8
|
||||||
|
|
||||||
assert len(p) == 12672 / 8
|
# expected_len = max_len_Y + max_len_M + max_len_rinv + md (32 bytes) + (mprime + length packed (8bytes)) + padding (8 bytes)
|
||||||
|
expected_len = (max_len / 8) * 3 + 32 + 8 + 8
|
||||||
|
assert len(p) == expected_len
|
||||||
|
|
||||||
cipher = Cipher(algorithms.AES(aes_key), modes.CBC(iv), backend=default_backend())
|
cipher = Cipher(algorithms.AES(aes_key), modes.CBC(iv), backend=default_backend())
|
||||||
encryptor = cipher.encryptor()
|
encryptor = cipher.encryptor()
|
||||||
@ -171,7 +183,7 @@ def efuse_burn_key(args, idf_target):
|
|||||||
def generate_csv_file(c, iv, hmac_key_id, key_size, csv_file):
|
def generate_csv_file(c, iv, hmac_key_id, key_size, csv_file):
|
||||||
|
|
||||||
with open(csv_file, 'wt', encoding='utf8') as f:
|
with open(csv_file, 'wt', encoding='utf8') as f:
|
||||||
f.write("# This is a generated csv file containing required parameters for the Digital Signature operaiton\n")
|
f.write("# This is a generated csv file containing required parameters for the Digital Signature operation\n")
|
||||||
f.write("key,type,encoding,value\nesp_ds_ns,namespace,,\n")
|
f.write("key,type,encoding,value\nesp_ds_ns,namespace,,\n")
|
||||||
f.write("esp_ds_c,data,hex2bin,%s\n" % (c.hex()))
|
f.write("esp_ds_c,data,hex2bin,%s\n" % (c.hex()))
|
||||||
f.write("esp_ds_iv,data,hex2bin,%s\n" % (iv.hex()))
|
f.write("esp_ds_iv,data,hex2bin,%s\n" % (iv.hex()))
|
||||||
@ -371,7 +383,7 @@ def main():
|
|||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
# Calculate the encrypted private key data along with all other parameters
|
# Calculate the encrypted private key data along with all other parameters
|
||||||
c, iv, key_size = calculate_ds_parameters(args.privkey, args.priv_key_pass, hmac_key_read)
|
c, iv, key_size = calculate_ds_parameters(args.privkey, args.priv_key_pass, hmac_key_read, idf_target)
|
||||||
|
|
||||||
# Generate csv file for the DS data and generate an NVS partition.
|
# Generate csv file for the DS data and generate an NVS partition.
|
||||||
generate_csv_file(c, iv, args.efuse_key_id, key_size, csv_filename)
|
generate_csv_file(c, iv, args.efuse_key_id, key_size, csv_filename)
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
idf_component_register(SRCS "app_main.c"
|
idf_component_register(SRCS "app_main.c"
|
||||||
INCLUDE_DIRS ".")
|
INCLUDE_DIRS "."
|
||||||
|
REQUIRED_IDF_TARGETS esp32s2 esp32c3)
|
||||||
|
@ -117,40 +117,40 @@ void *esp_read_ds_data_from_nvs(void)
|
|||||||
esp_err_t esp_ret;
|
esp_err_t esp_ret;
|
||||||
esp_ret = nvs_flash_init_partition(NVS_PARTITION_NAME);
|
esp_ret = nvs_flash_init_partition(NVS_PARTITION_NAME);
|
||||||
if (esp_ret != ESP_OK) {
|
if (esp_ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Error in esp_ds_nvs partition init, returned %02x", esp_ret);
|
ESP_LOGE(TAG, "Error in esp_ds_nvs partition init,\nreturned %02x (%s)", esp_ret, esp_err_to_name(esp_ret));
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_ret = nvs_open_from_partition(NVS_PARTITION_NAME, NVS_NAMESPACE,
|
esp_ret = nvs_open_from_partition(NVS_PARTITION_NAME, NVS_NAMESPACE,
|
||||||
NVS_READONLY, &esp_ds_nvs_handle);
|
NVS_READONLY, &esp_ds_nvs_handle);
|
||||||
if (esp_ret != ESP_OK) {
|
if (esp_ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Error in esp_ds_nvs partition open, returned %02x", esp_ret);
|
ESP_LOGE(TAG, "Error in esp_ds_nvs partition open,\nreturned %02x (%s)", esp_ret, esp_err_to_name(esp_ret));
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_ret = nvs_get_u8(esp_ds_nvs_handle, NVS_EFUSE_KEY_ID, &ds_data_ctx->efuse_key_id);
|
esp_ret = nvs_get_u8(esp_ds_nvs_handle, NVS_EFUSE_KEY_ID, &ds_data_ctx->efuse_key_id);
|
||||||
if (esp_ret != ESP_OK) {
|
if (esp_ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Error in efuse_key_id value from nvs, returned %02x", esp_ret);
|
ESP_LOGE(TAG, "Error in efuse_key_id value from nvs,\nreturned %02x (%s)", esp_ret, esp_err_to_name(esp_ret));
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_ret = nvs_get_u16(esp_ds_nvs_handle, NVS_RSA_LEN, &ds_data_ctx->rsa_length_bits);
|
esp_ret = nvs_get_u16(esp_ds_nvs_handle, NVS_RSA_LEN, &ds_data_ctx->rsa_length_bits);
|
||||||
if (esp_ret != ESP_OK) {
|
if (esp_ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Error in reading rsa key length value from nvs, returned %02x", esp_ret);
|
ESP_LOGE(TAG, "Error in reading rsa key length value from nvs,\nreturned %02x (%s)", esp_ret, esp_err_to_name(esp_ret));
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t blob_length = ESP_DS_C_LEN;
|
size_t blob_length = ESP_DS_C_LEN;
|
||||||
esp_ret = nvs_get_blob(esp_ds_nvs_handle, NVS_CIPHER_C, (void *)(ds_data_ctx->esp_ds_data->c), &blob_length);
|
esp_ret = nvs_get_blob(esp_ds_nvs_handle, NVS_CIPHER_C, (void *)(ds_data_ctx->esp_ds_data->c), &blob_length);
|
||||||
if ((esp_ret != ESP_OK) || (blob_length != ESP_DS_C_LEN)) {
|
if ((esp_ret != ESP_OK) || (blob_length != ESP_DS_C_LEN)) {
|
||||||
ESP_LOGE(TAG, "Error in reading initialization vector value from nvs,bytes_read = %d, returned %02x", blob_length, esp_ret);
|
ESP_LOGE(TAG, "Error in reading ciphertext_c value from nvs,bytes_read = %d,\nreturned %02x (%s)", blob_length, esp_ret, esp_err_to_name(esp_ret));
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
blob_length = ESP_DS_IV_LEN;
|
blob_length = ESP_DS_IV_LEN;
|
||||||
esp_ret = nvs_get_blob(esp_ds_nvs_handle, NVS_IV, (void *)(ds_data_ctx->esp_ds_data->iv), &blob_length);
|
esp_ret = nvs_get_blob(esp_ds_nvs_handle, NVS_IV, (void *)(ds_data_ctx->esp_ds_data->iv), &blob_length);
|
||||||
if ((esp_ret != ESP_OK) || (blob_length != ESP_DS_IV_LEN)) {
|
if ((esp_ret != ESP_OK) || (blob_length != ESP_DS_IV_LEN)) {
|
||||||
ESP_LOGE(TAG, "Error in reading initialization vector value from nvs,bytes_read = %d, returned %02x", blob_length, esp_ret);
|
ESP_LOGE(TAG, "Error in reading initialization vector value from nvs,bytes_read = %d,\nreturned %02x (%s)", blob_length, esp_ret, esp_err_to_name(esp_ret));
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user