From 9aba184c43ed1ef3537b7151ca4a0fbb470740ec Mon Sep 17 00:00:00 2001 From: "harshal.patil" Date: Tue, 21 Apr 2026 12:43:00 +0530 Subject: [PATCH] feat(esp_security): add ECDH1 deployment mode to Key Manager driver --- .../key_manager/gen_key_manager_test_cases.py | 108 ++++++++++- .../main/key_manager/key_manager_test_cases.h | 62 ++++++- .../main/key_manager/test_key_manager.c | 130 +++++++++++++ components/esp_security/include/esp_key_mgr.h | 30 +++ components/esp_security/src/esp_key_mgr.c | 173 ++++++++++++++++-- .../crypto_drivers/main/test_key_mgr.c | 83 +++++++++ .../api-reference/peripherals/key_manager.rst | 18 +- .../api-reference/peripherals/key_manager.rst | 18 +- 8 files changed, 583 insertions(+), 39 deletions(-) diff --git a/components/esp_hal_security/test_apps/crypto/main/key_manager/gen_key_manager_test_cases.py b/components/esp_hal_security/test_apps/crypto/main/key_manager/gen_key_manager_test_cases.py index 94c5752a8ff..b4eae1ba1d5 100644 --- a/components/esp_hal_security/test_apps/crypto/main/key_manager/gen_key_manager_test_cases.py +++ b/components/esp_hal_security/test_apps/crypto/main/key_manager/gen_key_manager_test_cases.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Unlicense OR CC0-1.0 import hashlib import hmac @@ -146,6 +146,39 @@ def generate_k1_G(k1_bytes: bytes) -> tuple: return k1_G, k1_G +def compute_ecdh1_x(k1_be: bytes, k2_le: bytes) -> int: + """Compute x(k1*k2*G) on NIST P-256 as an integer. + + k1 is interpreted big-endian (matches the user's k1*G computation in + generate_k1_G); k2 is interpreted little-endian (the KM's convention + for k2 recovered from k2_info). The deployed-key byte string is the + big-endian encoding of the returned integer. + """ + k1_int = int.from_bytes(k1_be, byteorder='big') + k2_int = int.from_bytes(k2_le, byteorder='little') + generator = NIST256p.generator.to_affine() + point = (k1_int * k2_int) * generator + return int(point.x()) + + +def generate_ecdsa_pub_from_scalar(scalar_int: int, curve_size_bits: int) -> tuple: + """Compute (scalar * G).x, .y for the given P-N curve and return them + as little-endian bytes (the ECDSA peripheral's exported-pubkey order).""" + if curve_size_bits == 192: + curve = ec.SECP192R1() + elif curve_size_bits == 256: + curve = ec.SECP256R1() + elif curve_size_bits == 384: + curve = ec.SECP384R1() + else: + raise ValueError(f'Unsupported curve size: {curve_size_bits}') + private_key = ec.derive_private_key(scalar_int, curve) + pub_numbers = private_key.public_key().public_numbers() + pubx = pub_numbers.x.to_bytes(curve_size_bits // 8, byteorder='little') + puby = pub_numbers.y.to_bytes(curve_size_bits // 8, byteorder='little') + return pubx, puby + + def generate_hmac_test_data(key: bytes) -> tuple: hmac_message = ( b'Deleniti voluptas explicabo et assumenda. Sed et aliquid minus quis. ' @@ -265,6 +298,10 @@ def write_to_c_header( ds_encrypted_input_params_3072: bytes, ds_result_3072: bytes, ds_iv: bytes, + ecdh1_xts_test_data: list, + ecdh1_hmac_result: bytes, + ecdh1_p256_pubx: bytes, + ecdh1_p256_puby: bytes, ) -> None: with open('key_manager_test_cases.h', 'w', encoding='utf-8') as file: header_content = f"""#include @@ -327,6 +364,21 @@ typedef struct test_data_ecdh0 {{ uint8_t k1_G[2][64]; }} test_data_ecdh0_mode_t; +// ECDH1 takes the AES-mode-style (init_key, k2_info) inputs plus the ECDH +// k1*G public point (sourced from test_data_ecdh0.k1_G to share the same +// k1 across ECDH0 and ECDH1 tests). k1_encrypted is unused, so it isn't in +// this struct. +typedef struct test_data_ecdh1 {{ + uint8_t init_key[32]; + uint8_t k2_info[64]; + uint8_t plaintext_data[128]; + union {{ + test_xts_data_t xts_test_data[TEST_COUNT]; + test_ecdsa_data_t ecdsa_test_data; + test_hmac_data_t hmac_test_data; + }}; +}} test_data_ecdh1_mode_t; + // For 32-byte k1 key test_data_aes_mode_t test_data_xts_aes_128 = {{ .init_key = {{ {key_to_c_format(init_key)} }}, @@ -431,6 +483,44 @@ test_data_aes_mode_t test_data_ds = {{ .ds_encrypted_input_params_iv = {{ {key_to_c_format(ds_iv)} }}, }}, }}; +""" + + # Per-key-type ECDH1 instances. Expected per-peripheral outputs + # (XTS ciphertext, HMAC result, ECDSA pubkey) are computed off-device + # using the deployed key x(k1*k2*G). + header_content += f""" +test_data_ecdh1_mode_t test_data_ecdh1_xts_aes_128 = {{ + .init_key = {{ {key_to_c_format(init_key)} }}, + .k2_info = {{ {key_to_c_format(k2_info)} }}, + .plaintext_data = {{ {key_to_c_format(bytes(range(1, 129)))} }}, + .xts_test_data = {{ +""" + for data_size, flash_address, ciphertext in ecdh1_xts_test_data: + header_content += ( + f'\t\t{{.data_size = {data_size}, ' + f'.data_offset = 0x{flash_address:x}, ' + f'.ciphertext = {{{key_to_c_format(ciphertext)}}}}},\n' + ) + header_content += '\t}\n};\n' + + header_content += f""" +test_data_ecdh1_mode_t test_data_ecdh1_hmac = {{ + .init_key = {{ {key_to_c_format(init_key)} }}, + .k2_info = {{ {key_to_c_format(k2_info)} }}, + .hmac_test_data = {{ + .message = {{ {key_to_c_format(hmac_message)} }}, + .hmac_result = {{ {key_to_c_format(ecdh1_hmac_result)} }} + }} +}}; + +test_data_ecdh1_mode_t test_data_ecdh1_ecdsa = {{ + .init_key = {{ {key_to_c_format(init_key)} }}, + .k2_info = {{ {key_to_c_format(k2_info)} }}, + .ecdsa_test_data = {{ + .ecdsa_p256_pubx = {{ {key_to_c_format(ecdh1_p256_pubx)} }}, + .ecdsa_p256_puby = {{ {key_to_c_format(ecdh1_p256_puby)} }}, + }} +}}; """ file.write(header_content) @@ -490,6 +580,18 @@ def generate_tests_cases() -> None: hmac_message, hmac_result = generate_hmac_test_data(k1_32) + # ECDH1: deployed key bytes = big-endian x(k1*k2*G). Per-peripheral + # effective key: + # - XTS-AES-128: key = x_be (32 BE bytes) + # - HMAC: key = x_le (= x_be[::-1], the slot is read LE) + # - ECDSA-P256: scalar = x_int mod n_p256 + ecdh1_x_int = compute_ecdh1_x(k1_32, k2) + ecdh1_x_be = ecdh1_x_int.to_bytes(32, byteorder='big') + ecdh1_x_le = ecdh1_x_be[::-1] + ecdh1_xts_test_data = generate_xts_test_data(ecdh1_x_be) + ecdh1_hmac_result = hmac.HMAC(ecdh1_x_le, hmac_message, hashlib.sha256).digest() + ecdh1_p256_pubx, ecdh1_p256_puby = generate_ecdsa_pub_from_scalar(ecdh1_x_int % NIST256p.order, 256) + ds_iv = os.urandom(16) ds_message_4096, ds_encrypted_input_params_4096, ds_result_4096 = generate_ds_encrypted_input_params( @@ -531,6 +633,10 @@ def generate_tests_cases() -> None: ds_encrypted_input_params_3072, ds_result_3072, ds_iv, + ecdh1_xts_test_data, + ecdh1_hmac_result, + ecdh1_p256_pubx, + ecdh1_p256_puby, ) diff --git a/components/esp_hal_security/test_apps/crypto/main/key_manager/key_manager_test_cases.h b/components/esp_hal_security/test_apps/crypto/main/key_manager/key_manager_test_cases.h index e87f74b1f97..f1ed412d76b 100644 --- a/components/esp_hal_security/test_apps/crypto/main/key_manager/key_manager_test_cases.h +++ b/components/esp_hal_security/test_apps/crypto/main/key_manager/key_manager_test_cases.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -63,6 +63,21 @@ typedef struct test_data_ecdh0 { uint8_t k1_G[2][64]; } test_data_ecdh0_mode_t; +// ECDH1 takes the AES-mode-style (init_key, k2_info) inputs plus the ECDH +// k1*G public point (sourced from test_data_ecdh0.k1_G to share the same +// k1 across ECDH0 and ECDH1 tests). k1_encrypted is unused, so it isn't in +// this struct. +typedef struct test_data_ecdh1 { + uint8_t init_key[32]; + uint8_t k2_info[64]; + uint8_t plaintext_data[128]; + union { + test_xts_data_t xts_test_data[TEST_COUNT]; + test_ecdsa_data_t ecdsa_test_data; + test_hmac_data_t hmac_test_data; + }; +} test_data_ecdh1_mode_t; + // For 32-byte k1 key test_data_aes_mode_t test_data_xts_aes_128 = { .init_key = { 0xee, 0x89, 0x95, 0xda, 0x3c, 0x8a, 0x43, 0x83, 0xa9, 0x4b, 0x25, 0x5b, 0x04, 0x7e, 0xf1, 0x57, 0xb8, 0xe8, 0x06, 0x45, 0x87, 0x76, 0xee, 0x1b, 0x4e, 0x2e, 0x55, 0xa7, 0x1f, 0x25, 0xe1, 0x94 }, @@ -140,16 +155,47 @@ test_data_aes_mode_t test_data_ds = { .k1_encrypted = { { 0x37, 0xcf, 0x5b, 0x9e, 0x08, 0x26, 0x36, 0x31, 0xd7, 0x51, 0x3c, 0x33, 0x0d, 0x5d, 0x03, 0xad, 0x48, 0x6e, 0xbe, 0x82, 0xce, 0xa9, 0xc8, 0xd5, 0x98, 0x11, 0x24, 0xcc, 0x83, 0xf8, 0xf9, 0x53 }, { } }, .ds_test_data = { #if SOC_DS_SIGNATURE_MAX_BIT_LEN == 4096 - .ds_message = { 0x29, 0x35, 0xb7, 0x0d, 0x63, 0x95, 0xaf, 0x34, 0xc3, 0xc1, 0xe5, 0x21, 0xb8, 0x74, 0xb8, 0x38, 0x95, 0xe9, 0x10, 0xf6, 0x81, 0x7e, 0xf8, 0x65, 0x05, 0x59, 0x7f, 0x2b, 0xda, 0x85, 0xa9, 0xaa, 0xa6, 0xcf, 0xf7, 0xdf, 0xa7, 0x16, 0x08, 0x48, 0x02, 0x5c, 0x2b, 0x1c, 0xed, 0x92, 0xb6, 0x0c, 0xac, 0xd2, 0x7f, 0x70, 0x50, 0x1e, 0x5b, 0x4a, 0x32, 0xec, 0x19, 0xe8, 0xa3, 0x88, 0xca, 0x36, 0x83, 0x24, 0xe4, 0x5d, 0x1a, 0xf6, 0x38, 0x11, 0xdb, 0xcb, 0xab, 0x3e, 0x2b, 0xcb, 0x76, 0x6a, 0x88, 0x3c, 0xf8, 0x11, 0x8f, 0xfd, 0x85, 0x82, 0xbf, 0xad, 0xc0, 0x47, 0x5a, 0xcd, 0xaf, 0x3b, 0x77, 0xf0, 0x53, 0x89, 0xe9, 0xfe, 0x0a, 0x76, 0x93, 0xf9, 0xf3, 0xf5, 0x5f, 0x16, 0x12, 0x07, 0x53, 0x15, 0x31, 0x03, 0xb9, 0x16, 0x62, 0x88, 0x6c, 0x2e, 0x41, 0x10, 0x88, 0x63, 0xb9, 0x77, 0xa5, 0xc2, 0xa1, 0xb8, 0x90, 0x8c, 0x3d, 0x74, 0x14, 0xb1, 0xf3, 0xde, 0x4b, 0x90, 0xd4, 0xb0, 0x95, 0xd9, 0xc0, 0x3d, 0x61, 0x1e, 0x03, 0xf7, 0x79, 0x9f, 0x98, 0x44, 0x4b, 0x13, 0xf5, 0xb1, 0x57, 0xfd, 0x76, 0xde, 0x30, 0x0e, 0x16, 0xf0, 0xb0, 0x7b, 0xa9, 0x5e, 0x0d, 0xf8, 0xf8, 0x39, 0xea, 0xe4, 0x72, 0x9b, 0xb7, 0xb9, 0xa6, 0xb2, 0x97, 0xd8, 0x2e, 0xf2, 0xf3, 0x18, 0xc3, 0x35, 0xd1, 0x69, 0x9b, 0x07, 0x4e, 0x37, 0xcd, 0xb5, 0xae, 0x8e, 0x7c, 0x3e, 0xaf, 0xfa, 0x29, 0x7f, 0x2b, 0x7c, 0x85, 0x57, 0x0f, 0x45, 0x49, 0xd8, 0x76, 0x2a, 0x7f, 0xc4, 0xf0, 0x3b, 0xca, 0x38, 0x90, 0x7d, 0x99, 0x7b, 0x0c, 0xf1, 0x07, 0x98, 0x0b, 0x00, 0x86, 0xbb, 0xa0, 0x55, 0x2b, 0xd0, 0x84, 0x56, 0x05, 0x05, 0x30, 0x61, 0xa5, 0xe5, 0xca, 0x6d, 0xb4, 0x43, 0x7c, 0x61, 0x4f, 0x84, 0xe1, 0xed, 0xd9, 0xdc, 0xf8, 0x17, 0xf4, 0x11, 0xd2, 0xa1, 0x85, 0xde, 0x00, 0x5e, 0x29, 0x2b, 0x64, 0xcb, 0x88, 0x2f, 0xc8, 0x13, 0x2d, 0xfb, 0xd6, 0xc7, 0x49, 0xc8, 0xf7, 0x41, 0x56, 0x20, 0xd9, 0x8c, 0xb4, 0xb8, 0xba, 0x82, 0xe9, 0xe7, 0xa5, 0x73, 0xec, 0xc5, 0xaa, 0x47, 0x47, 0x07, 0xf0, 0x34, 0x27, 0x4b, 0x3d, 0x6c, 0x79, 0x57, 0x52, 0x4c, 0xdd, 0x39, 0xb1, 0x57, 0x38, 0xd8, 0x5e, 0x89, 0x96, 0x2b, 0x38, 0xd9, 0x2d, 0x88, 0x88, 0x7d, 0xb3, 0x6e, 0xde, 0x80, 0x05, 0xd5, 0xc4, 0xeb, 0x7b, 0xcd, 0x36, 0xbf, 0xa4, 0xd6, 0xaa, 0x63, 0x61, 0xbc, 0xa8, 0x78, 0xd1, 0xb3, 0xbb, 0x30, 0x96, 0x73, 0xf1, 0x47, 0xcb, 0x77, 0xa4, 0x45, 0x04, 0x57, 0x6b, 0x4b, 0x3d, 0x7f, 0xd4, 0x84, 0xac, 0x5e, 0x3a, 0xf2, 0xa4, 0x89, 0x07, 0x52, 0x3b, 0xed, 0xcd, 0x08, 0xd8, 0xb9, 0xff, 0x3e, 0x72, 0xf3, 0x4e, 0xbd, 0x59, 0x97, 0x22, 0x8e, 0x58, 0xc3, 0x2c, 0x66, 0x97, 0x79, 0x53, 0x20, 0x9e, 0x7b, 0x20, 0xf9, 0xde, 0xad, 0x21, 0x65, 0x0a, 0x4f, 0x61, 0xea, 0x13, 0xa9, 0x95, 0x89, 0xd2, 0xbb, 0x8d, 0x1e, 0x3c, 0x01, 0x41, 0x51, 0xb3, 0xe7, 0xd5, 0xa3, 0xdd, 0x78, 0x29, 0x5d, 0xe9, 0x2f, 0x2c, 0x1e, 0xf7, 0x74, 0x6c, 0x6e, 0x66, 0x44, 0xb7, 0xd3, 0x8e, 0x09, 0x27, 0xf6, 0x7f, 0x1a, 0xd4, 0x2b, 0xc2, 0x57, 0xcc, 0xb3, 0x5e, 0x22, 0xc1, 0x82, 0x5d, 0xcc, 0x66, 0xc8, 0xb2, 0x86, 0x42, 0x83, 0xc4, 0xe7, 0xea, 0x70, 0x48, 0x20, 0x2a, 0x33, 0x54, 0xda, 0x46, 0x15, 0x64, 0x4b, 0x72, 0x97, 0x1a, 0x83, 0xe9, 0x6a, 0x65, 0x7a, 0xe0, 0xec, 0x0a, 0xe1, 0xbc, 0xe2, 0x0b, 0x1a, 0x1c, 0x39, 0x31, 0x15, 0x2b, 0xbf, 0xf8, 0x64, 0x00, 0x69, 0x1b, 0xa4 }, - .ds_encrypted_input_params = { 0x8b, 0x5a, 0x3f, 0x8b, 0xf0, 0x8a, 0x45, 0x00, 0x4e, 0x13, 0x97, 0x3b, 0x24, 0x50, 0x00, 0x11, 0x92, 0xfe, 0xb5, 0x51, 0xfa, 0x75, 0xbc, 0x95, 0xbf, 0x90, 0xad, 0xf1, 0x08, 0x1c, 0x44, 0xa6, 0xae, 0x7b, 0x51, 0x2e, 0x88, 0x59, 0xb3, 0xb4, 0x41, 0x9f, 0x3d, 0x01, 0x5d, 0x82, 0xe9, 0xcc, 0x94, 0x87, 0x2d, 0x17, 0x6b, 0x8f, 0x04, 0xc1, 0x93, 0xa1, 0x93, 0x8e, 0x73, 0xe6, 0x08, 0xeb, 0x9b, 0x9f, 0x24, 0x87, 0x27, 0x9b, 0xb8, 0x27, 0x30, 0xeb, 0x3a, 0x8f, 0x3c, 0x97, 0xce, 0x34, 0xa6, 0xa7, 0xdd, 0xa3, 0x66, 0x25, 0xf8, 0x39, 0x0a, 0xb9, 0xb6, 0x49, 0x62, 0x2d, 0x3e, 0xe5, 0xe4, 0x8e, 0x35, 0xbf, 0xf8, 0x8b, 0xb3, 0xc1, 0xa8, 0xc8, 0x48, 0x60, 0x9d, 0x1f, 0xd2, 0x0e, 0x91, 0xbc, 0xb6, 0xae, 0xff, 0x8b, 0xd9, 0x99, 0xcb, 0x05, 0x3e, 0xdb, 0x36, 0x36, 0xe1, 0x36, 0xf4, 0x89, 0x03, 0xb9, 0xf9, 0xbc, 0xe9, 0x36, 0x29, 0x68, 0x22, 0x4f, 0x2f, 0x9e, 0x6e, 0x8f, 0xe1, 0xb0, 0x0a, 0xcf, 0xc9, 0xab, 0x00, 0x1c, 0x75, 0xaa, 0x8b, 0x4d, 0xf0, 0x07, 0x30, 0xf7, 0xea, 0x40, 0x7b, 0xee, 0x82, 0xd3, 0xab, 0xe1, 0x29, 0xc4, 0x17, 0x7e, 0x9c, 0x85, 0xe9, 0x49, 0xa9, 0x6d, 0xaa, 0xdb, 0xb3, 0x27, 0xd4, 0x76, 0x62, 0x02, 0x5e, 0x63, 0x43, 0x12, 0x04, 0xb5, 0x12, 0x9e, 0x6f, 0xb5, 0xab, 0x8f, 0x53, 0x5a, 0xf3, 0xc0, 0x03, 0x09, 0xc0, 0x53, 0xc4, 0x8a, 0xb0, 0x9b, 0xfb, 0xf3, 0x0d, 0xe8, 0x08, 0x8a, 0x09, 0xcf, 0x09, 0x55, 0xd5, 0xce, 0x8b, 0x2c, 0x3c, 0xed, 0x46, 0x82, 0xaa, 0x30, 0xe9, 0x06, 0xa1, 0xfc, 0x14, 0xf8, 0x98, 0x76, 0x6a, 0x56, 0x57, 0xa1, 0x1a, 0x79, 0x14, 0x6b, 0x2c, 0xca, 0x67, 0xda, 0x5b, 0x19, 0x01, 0xd8, 0x77, 0x32, 0x73, 0x74, 0x1d, 0xa1, 0x5a, 0x90, 0xc3, 0x6a, 0xcc, 0xf7, 0x87, 0x7d, 0x5c, 0x76, 0x7b, 0xae, 0x06, 0x27, 0x55, 0x9a, 0xa4, 0x09, 0xf0, 0x5a, 0x51, 0x20, 0xcf, 0x67, 0x75, 0x55, 0xfc, 0x83, 0x4c, 0x02, 0x64, 0x12, 0x16, 0xc4, 0x54, 0x46, 0x8b, 0x37, 0x29, 0x55, 0x68, 0xa0, 0xd2, 0xd7, 0x31, 0x42, 0x2b, 0x16, 0xf2, 0x54, 0x56, 0x78, 0x5a, 0xde, 0x20, 0xc0, 0xd0, 0x89, 0x53, 0xf1, 0x9e, 0xaa, 0x1c, 0x6f, 0xca, 0xf9, 0xee, 0x28, 0xf0, 0x2d, 0xfc, 0x40, 0x90, 0x4d, 0x8b, 0xf9, 0xec, 0xb3, 0x5f, 0x8a, 0x16, 0xc6, 0xc3, 0xce, 0x73, 0xc5, 0xde, 0x47, 0x93, 0xca, 0xa6, 0x15, 0xf1, 0x06, 0xb0, 0xfe, 0xed, 0x2b, 0xea, 0x2f, 0x33, 0xd5, 0x7c, 0x4a, 0x20, 0x3c, 0xfe, 0x09, 0x54, 0x5a, 0xcc, 0x9d, 0x31, 0x61, 0xa5, 0x1b, 0x28, 0xa2, 0x46, 0xd5, 0xcf, 0xab, 0x37, 0x0e, 0x25, 0x4d, 0x04, 0xd2, 0x96, 0x5a, 0x44, 0xc0, 0xcb, 0x7b, 0x67, 0xd3, 0x78, 0x2d, 0x72, 0xc8, 0x9d, 0x1e, 0xf9, 0xe1, 0x46, 0x83, 0x9b, 0x9e, 0xa1, 0x40, 0x6e, 0x5e, 0x61, 0x66, 0x21, 0x86, 0x40, 0x5d, 0x72, 0xca, 0x90, 0xd9, 0xcd, 0x57, 0x9c, 0x13, 0x42, 0x76, 0x38, 0xc9, 0x9b, 0x58, 0x8b, 0x3b, 0x15, 0x49, 0xfc, 0x67, 0x18, 0x93, 0x00, 0xb4, 0xc6, 0x22, 0x13, 0x08, 0x4e, 0x53, 0x50, 0x34, 0x6d, 0x88, 0x50, 0x24, 0x53, 0x24, 0x7c, 0x0d, 0x5a, 0x05, 0xcd, 0x3f, 0x5c, 0x15, 0x9a, 0xdb, 0x66, 0x03, 0x3e, 0xf0, 0x4d, 0x2d, 0x6f, 0x38, 0xc9, 0xef, 0xf5, 0xcb, 0xaf, 0x98, 0x38, 0x55, 0xc3, 0xbd, 0x60, 0xdb, 0x9b, 0xc8, 0x06, 0x87, 0xd0, 0xe2, 0x7b, 0x6c, 0x39, 0x9e, 0x65, 0xaa, 0xff, 0x70, 0xe5, 0xaa, 0x50, 0x24, 0xe4, 0x61, 0x42, 0xc8, 0x62, 0x90, 0xc2, 0x37, 0xae, 0x29, 0x8d, 0xd3, 0xbd, 0xb5, 0x14, 0x5d, 0xd6, 0x84, 0xc3, 0xa6, 0xfa, 0x5c, 0xc3, 0x1b, 0xe5, 0xae, 0x76, 0x91, 0x0b, 0xcc, 0x44, 0x42, 0x3b, 0x3f, 0x49, 0x75, 0xe0, 0x66, 0xb1, 0x1a, 0x42, 0x34, 0xf4, 0x6c, 0x3e, 0x67, 0x5e, 0x4f, 0x5e, 0x68, 0x4a, 0xa9, 0xd7, 0x28, 0x16, 0xf9, 0xb6, 0xad, 0x1e, 0x2a, 0x0a, 0xe7, 0x6c, 0xee, 0x97, 0x83, 0xfa, 0x64, 0xf0, 0xab, 0x02, 0x72, 0xd4, 0xbb, 0xe4, 0xe5, 0xd3, 0xd7, 0x67, 0xe0, 0xd2, 0x7c, 0xaa, 0x15, 0x42, 0x64, 0x13, 0x33, 0x98, 0x63, 0x7a, 0x3a, 0xd6, 0x99, 0xe6, 0x96, 0x81, 0x44, 0x87, 0x2b, 0x1f, 0xd1, 0x4e, 0xd1, 0xde, 0xa7, 0x9b, 0x3b, 0x0d, 0xaf, 0x41, 0xee, 0x40, 0xc5, 0x9e, 0xd4, 0x62, 0xd6, 0x72, 0x59, 0xc2, 0xd7, 0xb9, 0x55, 0x96, 0x26, 0xde, 0xc2, 0x82, 0xa3, 0x8c, 0xcc, 0xfa, 0xd8, 0x49, 0x57, 0x32, 0x11, 0x95, 0xf2, 0xba, 0xdb, 0x67, 0xd0, 0xb0, 0x66, 0xda, 0x89, 0x23, 0xff, 0x79, 0x16, 0xc1, 0xee, 0xd9, 0xeb, 0xea, 0x10, 0x8e, 0xf1, 0x77, 0x6c, 0x11, 0x7a, 0x83, 0xfd, 0xa5, 0x29, 0x67, 0x72, 0x28, 0x66, 0x24, 0x5d, 0x4d, 0xc1, 0x85, 0x8d, 0x06, 0x5a, 0xcb, 0xd5, 0xad, 0x5e, 0x08, 0xdd, 0x02, 0xa8, 0x14, 0xe4, 0x84, 0x6a, 0x90, 0xa5, 0x97, 0x14, 0x78, 0xc6, 0x8d, 0xcf, 0x07, 0xb1, 0xf5, 0xdb, 0x12, 0xf7, 0x67, 0x51, 0x19, 0x7c, 0x23, 0x7d, 0x97, 0xac, 0x5d, 0xda, 0xc4, 0xe3, 0x62, 0x2d, 0x31, 0xf4, 0x31, 0x74, 0xa4, 0x06, 0x7a, 0x35, 0x24, 0x4d, 0xa8, 0x86, 0xeb, 0xee, 0xdc, 0x0f, 0xd6, 0xc7, 0x31, 0xbb, 0xb2, 0x1d, 0xfb, 0xab, 0xb1, 0xf0, 0xb8, 0x37, 0xef, 0xd7, 0x0d, 0x2a, 0x9e, 0x63, 0xcf, 0x60, 0xa1, 0xd6, 0x9f, 0x2d, 0xd3, 0x8d, 0x64, 0x78, 0xe4, 0x3d, 0xfb, 0x3f, 0x2c, 0x76, 0x79, 0x09, 0xb7, 0x67, 0x69, 0x5e, 0x18, 0x66, 0x8a, 0x72, 0x4a, 0x77, 0x4d, 0x48, 0x04, 0xc2, 0x33, 0xda, 0x54, 0x46, 0xe1, 0x7c, 0xfa, 0xbe, 0x7e, 0xf3, 0xc9, 0xa8, 0x97, 0xe4, 0xf2, 0xbb, 0xb3, 0x9d, 0x5c, 0xd3, 0xd2, 0x88, 0x6e, 0x69, 0x9a, 0xa5, 0x8a, 0x05, 0x69, 0x55, 0xc1, 0x7a, 0x2a, 0x3e, 0x10, 0x87, 0x67, 0xbf, 0x78, 0x98, 0x73, 0x33, 0xe2, 0x02, 0x25, 0xfa, 0x5d, 0x39, 0xd1, 0xe3, 0x9b, 0x37, 0xd1, 0xc4, 0xfa, 0x94, 0xb9, 0x2a, 0x54, 0xc5, 0x2d, 0x66, 0x34, 0x3b, 0x6c, 0x7f, 0x1c, 0x28, 0x37, 0x4c, 0xd0, 0x84, 0x10, 0x46, 0x89, 0xf2, 0xb5, 0xf0, 0xbf, 0xa6, 0xad, 0xca, 0xc9, 0x2b, 0x26, 0xa7, 0x91, 0x9c, 0x4b, 0xa9, 0xb3, 0x49, 0x6f, 0xfc, 0x11, 0x29, 0x34, 0x03, 0x4d, 0xe3, 0x5c, 0x84, 0xe3, 0x49, 0x15, 0x56, 0x4f, 0x84, 0x21, 0xff, 0xa7, 0x7d, 0xa1, 0x58, 0x03, 0xaa, 0xb8, 0x52, 0xc9, 0xb4, 0x51, 0x24, 0x79, 0xf6, 0x7a, 0xa9, 0xcd, 0x6c, 0xb6, 0xdc, 0x77, 0xf2, 0xad, 0x7c, 0x74, 0x1d, 0xf0, 0xce, 0x11, 0x6c, 0x05, 0x0b, 0x86, 0x14, 0x76, 0x61, 0x6f, 0xd0, 0x6f, 0x81, 0x47, 0x78, 0x5f, 0x62, 0x80, 0x75, 0xb9, 0xbe, 0xb3, 0x24, 0x88, 0x57, 0x9f, 0x0e, 0x6c, 0x94, 0x44, 0x55, 0x72, 0x62, 0x54, 0xd5, 0x18, 0xdc, 0xee, 0x5d, 0x28, 0xea, 0xf4, 0x70, 0x80, 0x0f, 0x6d, 0xa7, 0x11, 0x38, 0x05, 0xa5, 0x0c, 0xa0, 0xe0, 0x4a, 0x1d, 0x66, 0x53, 0x8c, 0x85, 0x8b, 0xbd, 0x58, 0x59, 0x6e, 0x3a, 0x19, 0x19, 0x74, 0xdf, 0x30, 0x0c, 0x1b, 0x93, 0x25, 0xbd, 0xee, 0xb5, 0x73, 0x9c, 0x41, 0x04, 0x00, 0x0f, 0xbd, 0x21, 0x4b, 0x62, 0x7f, 0x1f, 0xb0, 0xd2, 0xeb, 0x3c, 0xdb, 0x2d, 0x41, 0x19, 0x1b, 0xea, 0x3f, 0xf0, 0x14, 0x2c, 0xf9, 0x0e, 0x4b, 0x01, 0xe5, 0x4d, 0x14, 0x90, 0x8e, 0xb2, 0x8e, 0xfb, 0xd7, 0x37, 0x14, 0x3b, 0x2c, 0xe1, 0x6e, 0xe8, 0x1d, 0x64, 0x0d, 0xe3, 0x24, 0xa0, 0x67, 0x2e, 0xd8, 0x27, 0x69, 0x3f, 0x41, 0x6a, 0x2b, 0x83, 0xda, 0x5a, 0x4b, 0x97, 0xc6, 0x3f, 0x86, 0xe0, 0x8c, 0x6d, 0xe6, 0x19, 0xae, 0xa9, 0xdf, 0x85, 0xbb, 0xcc, 0x23, 0x4d, 0x23, 0x24, 0x84, 0x61, 0xe8, 0x95, 0x73, 0x38, 0xcd, 0xce, 0x95, 0x92, 0x7f, 0xc5, 0x73, 0x33, 0x8e, 0x2e, 0x6e, 0x14, 0xcd, 0x56, 0xec, 0xac, 0xc9, 0x02, 0x12, 0x01, 0xb3, 0x07, 0xa4, 0xb9, 0x6a, 0xe9, 0xde, 0x87, 0x8f, 0x42, 0xea, 0x8d, 0x39, 0x18, 0xd3, 0xbb, 0xf6, 0x4d, 0xe1, 0xd4, 0xbe, 0x25, 0x04, 0xed, 0x51, 0xf3, 0x1c, 0xef, 0x1b, 0x8e, 0xbc, 0x3a, 0x6e, 0x68, 0x4b, 0x37, 0xfd, 0x4c, 0xa0, 0x5a, 0x38, 0x7e, 0xa2, 0xa2, 0xde, 0x9e, 0x5d, 0xe8, 0x48, 0x9e, 0x92, 0x2d, 0xe5, 0x2e, 0xba, 0x64, 0x4e, 0xaf, 0x74, 0xc8, 0xcc, 0xde, 0xa3, 0xe1, 0xf4, 0x0c, 0xdd, 0x66, 0x99, 0xd2, 0x1d, 0xef, 0x40, 0x25, 0x8f, 0xe5, 0x77, 0xe3, 0x33, 0xbe, 0xa9, 0xdf, 0x5c, 0xb4, 0x7b, 0x97, 0xe9, 0xd9, 0x05, 0xa0, 0x1b, 0xb0, 0xda, 0x2f, 0xd5, 0xa3, 0xdf, 0x46, 0x8f, 0xa5, 0xe8, 0xe1, 0x12, 0xe3, 0x43, 0xb6, 0xf2, 0xcd, 0x1d, 0xb9, 0xdd, 0xfc, 0xb2, 0xcb, 0x5f, 0xdd, 0xb7, 0x13, 0x52, 0xae, 0x9b, 0x72, 0xfb, 0xab, 0xb9, 0xeb, 0x21, 0xa1, 0xf2, 0x52, 0x44, 0x32, 0xe5, 0xa0, 0xe6, 0xb7, 0x08, 0xec, 0x5e, 0x93, 0x54, 0x4a, 0x76, 0x09, 0xae, 0x2a, 0x55, 0x9c, 0x98, 0x76, 0xc9, 0x19, 0xe1, 0x1f, 0xc1, 0x3c, 0x17, 0xc4, 0xb1, 0xc0, 0xf9, 0xd5, 0x6a, 0x83, 0xde, 0xc1, 0x67, 0x09, 0x60, 0xd0, 0x01, 0x3e, 0xc4, 0x83, 0xc9, 0x26, 0x59, 0x8b, 0xc4, 0xbe, 0x26, 0x5f, 0xe0, 0x69, 0x8e, 0x43, 0x4d, 0x1d, 0x8e, 0xe3, 0x97, 0x7f, 0xb6, 0x38, 0x03, 0x31, 0x45, 0x11, 0x9e, 0xb7, 0x38, 0xca, 0xe5, 0x7f, 0xf3, 0x87, 0xd6, 0x3b, 0x75, 0x6e, 0x58, 0x8b, 0x98, 0xdb, 0x6e, 0x7b, 0x46, 0x27, 0x17, 0x65, 0xec, 0x04, 0x07, 0x82, 0xea, 0xab, 0x98, 0x11, 0xe1, 0x4c, 0x8e, 0xf3, 0xb0, 0x83, 0xf2, 0xb7, 0xd2, 0xcf, 0x6d, 0x0a, 0xf3, 0xad, 0xc4, 0x0e, 0x25, 0x2e, 0xcd, 0xfe, 0xee, 0x4d, 0xfd, 0x03, 0xc4, 0x78, 0xad, 0x4e, 0x58, 0xac, 0x36, 0x4a, 0x68, 0xba, 0x7f, 0xdd, 0x73, 0xef, 0xfc, 0xca, 0xf2, 0x58, 0x75, 0x94, 0xfd, 0x70, 0x25, 0xef, 0x7c, 0x17, 0x96, 0x6d, 0x70, 0x97, 0xf2, 0x56, 0x7b, 0x5f, 0xfa, 0x03, 0xe5, 0x6f, 0xf3, 0x0e, 0x37, 0x6b, 0x60, 0x04, 0x9d, 0x1b, 0x30, 0xbf, 0xe0, 0xda, 0x42, 0x69, 0x3c, 0x33, 0xcb, 0xac, 0x89, 0xff, 0x8f, 0x92, 0x20, 0xea, 0x2f, 0xb0, 0xdf, 0xee, 0x7b, 0x04, 0xc2, 0x13, 0xea, 0x23, 0xa2, 0xf8, 0x2b, 0x1b, 0xc9, 0x6a, 0x34, 0xf8, 0x18, 0x4e, 0x1c, 0xc9, 0x6d, 0xe5, 0xd6, 0x37, 0xe8, 0x56, 0x12, 0x3e, 0xc3, 0xe9, 0x4a, 0x85, 0x0b, 0x1f, 0xac, 0x6b, 0x26, 0xf3, 0x20, 0x4c, 0x61, 0x70, 0x79, 0xaa, 0x08, 0xf0, 0x17, 0xb9, 0x7f, 0xc7, 0xe7, 0xc5, 0x5a, 0xfe, 0xcd, 0x6d, 0xa0, 0x5a, 0x11, 0x88, 0x52, 0xcf, 0x37, 0x32, 0xa1, 0x6f, 0x2d, 0xc7, 0xed, 0x74, 0x5e, 0xf0, 0x5d, 0x32, 0x5f, 0xcc, 0xf9, 0xfa, 0x33, 0x3a, 0xd4, 0xfa, 0x81, 0x5c, 0xb5, 0x73, 0x00, 0x60, 0xb0, 0x11, 0xa4, 0xa0, 0x8c, 0x0a, 0x9c, 0x97, 0x19, 0xfa, 0x59, 0x6d, 0xc2, 0x75, 0xd5, 0x00, 0x05, 0x8c, 0x72, 0x5e, 0xa3, 0x85, 0xb3, 0xf2, 0xef, 0x0d, 0xef, 0x9f, 0x80, 0x45, 0x2a, 0x8a, 0x42, 0xc7, 0x2b, 0x3c, 0x0f, 0x78, 0xf0, 0x54, 0x94, 0xd5, 0x2e, 0x0d, 0x76, 0x2d, 0xfe, 0x2a, 0xb9, 0x1a, 0xb2, 0x95, 0x3d, 0xa4, 0x52, 0xbe, 0xa6, 0xa2, 0x8e, 0x77, 0x9d, 0xa5, 0x77, 0x0a, 0x46 }, + .ds_message = { 0x63, 0xb3, 0x88, 0x61, 0xac, 0xe7, 0x90, 0x18, 0x99, 0xf4, 0x46, 0x88, 0x59, 0x9a, 0xe1, 0xe7, 0x58, 0x53, 0xdf, 0x53, 0x23, 0x26, 0x70, 0x3f, 0x9b, 0xb6, 0x2e, 0xbd, 0xa0, 0x3a, 0x81, 0x85, 0x8d, 0x1f, 0x50, 0xdb, 0x6e, 0x67, 0x8b, 0x19, 0xaa, 0x87, 0x2a, 0xa7, 0x73, 0x57, 0xe6, 0xe0, 0x7a, 0x78, 0x27, 0xf1, 0xaf, 0xff, 0xd3, 0x04, 0x21, 0x46, 0x95, 0x9d, 0x60, 0xc6, 0x72, 0x7b, 0x54, 0x21, 0xfb, 0x65, 0x40, 0x75, 0x58, 0x88, 0x03, 0x0d, 0x56, 0x85, 0x3c, 0x73, 0x9e, 0xba, 0xdc, 0xd2, 0x89, 0x26, 0x61, 0xe3, 0x5b, 0xcf, 0x86, 0xbf, 0x6c, 0x44, 0x2d, 0xd6, 0x25, 0x2e, 0xb4, 0xb8, 0xbd, 0x31, 0xa1, 0x6d, 0x37, 0x47, 0xba, 0x83, 0x38, 0x9d, 0x42, 0xea, 0x44, 0x07, 0x7e, 0xbc, 0x57, 0x6e, 0x75, 0xf7, 0x7f, 0x8e, 0xb9, 0xa7, 0x93, 0xb3, 0x99, 0x50, 0x9e, 0xda, 0x86, 0xa9, 0xea, 0xb6, 0x59, 0x2a, 0xef, 0xf3, 0x29, 0xe0, 0x17, 0x6c, 0xaf, 0x19, 0x94, 0xc8, 0x3d, 0xa3, 0xec, 0x42, 0x2c, 0x48, 0x2a, 0x9b, 0x0f, 0xcc, 0x1c, 0x9f, 0xff, 0x4d, 0xc4, 0xf4, 0x6f, 0x9a, 0x38, 0x1c, 0x94, 0xb3, 0x87, 0xbf, 0xb4, 0xde, 0x58, 0xed, 0x37, 0xc5, 0x22, 0x6e, 0x75, 0xe6, 0xde, 0x08, 0xb2, 0x6f, 0x50, 0xf2, 0x5a, 0x91, 0x4b, 0x56, 0xf9, 0x4f, 0xcc, 0x29, 0x9d, 0xb1, 0x05, 0x72, 0xc6, 0x60, 0x8f, 0x5d, 0xc2, 0xe7, 0x19, 0xb4, 0xb1, 0x1a, 0x35, 0x69, 0xa6, 0x7b, 0x5e, 0xe7, 0x29, 0x8e, 0x1b, 0xf3, 0x6e, 0x64, 0xbd, 0x5c, 0x47, 0xe4, 0x82, 0x28, 0x52, 0xde, 0xfd, 0x0a, 0x2c, 0x10, 0x66, 0x36, 0x28, 0x28, 0x7d, 0xee, 0xdb, 0xcb, 0xb7, 0xa8, 0x7a, 0x59, 0xf5, 0x1f, 0x63, 0x98, 0xc8, 0x08, 0xdd, 0xfd, 0xed, 0xee, 0xc8, 0x39, 0xc6, 0xcc, 0x42, 0x36, 0xc1, 0xd7, 0xfb, 0x9e, 0xd1, 0x2b, 0x83, 0x66, 0x1b, 0x6f, 0x0f, 0x09, 0xeb, 0x3e, 0xd4, 0x58, 0x9d, 0x3d, 0x7b, 0xac, 0x8d, 0xc9, 0xaf, 0xa4, 0x01, 0x37, 0xd7, 0x24, 0x96, 0x8e, 0xa3, 0xbe, 0x3d, 0x08, 0xe8, 0x65, 0x0d, 0xd9, 0xf8, 0x21, 0xa8, 0x89, 0xcb, 0x09, 0x2f, 0xc0, 0x6e, 0x19, 0x75, 0x6b, 0xbd, 0x3b, 0x28, 0xb9, 0x32, 0xb6, 0xa5, 0xe8, 0x12, 0xe7, 0xd0, 0x33, 0xca, 0x31, 0xa9, 0xf5, 0xd6, 0x26, 0x94, 0x39, 0x0d, 0xf0, 0xcc, 0xf4, 0x59, 0x25, 0x6e, 0x4e, 0xe5, 0x0a, 0x13, 0x33, 0xb4, 0x92, 0x8d, 0x1f, 0x38, 0x05, 0xeb, 0xf3, 0xa6, 0x8d, 0xcb, 0x35, 0x0f, 0x82, 0x33, 0x92, 0xa7, 0xd2, 0x70, 0xc2, 0x74, 0x4c, 0x32, 0xd4, 0xd7, 0x11, 0xf1, 0x5f, 0xee, 0xb1, 0x18, 0x6f, 0xed, 0xfa, 0x97, 0x13, 0x77, 0xd4, 0xb6, 0xe2, 0x4a, 0xc9, 0xd2, 0xb4, 0xa2, 0x51, 0x69, 0xa9, 0x57, 0x53, 0x84, 0x98, 0x91, 0x45, 0xb9, 0x93, 0x8e, 0xe1, 0xc7, 0x4a, 0xd5, 0xad, 0x68, 0x68, 0x9c, 0xc5, 0x04, 0x16, 0x3b, 0x7a, 0xe2, 0x8f, 0x8a, 0x09, 0xaa, 0x02, 0x98, 0x18, 0x2d, 0x05, 0xbc, 0xa5, 0x55, 0xa7, 0xe8, 0x70, 0x6d, 0x08, 0x73, 0xf7, 0x0e, 0xc6, 0x0c, 0xd4, 0xec, 0x30, 0x7f, 0x81, 0xeb, 0x1f, 0x7e, 0xc9, 0xfd, 0x4c, 0xe1, 0x2f, 0xd1, 0xbe, 0xbd, 0x33, 0x0a, 0x31, 0x06, 0xfe, 0x3e, 0xd6, 0x5c, 0x75, 0x72, 0x4d, 0x56, 0x25, 0x43, 0x83, 0xe0, 0x91, 0x17, 0x74, 0x75, 0x67, 0xfd, 0xd9, 0xa4, 0x32, 0x6f, 0x37, 0x61, 0x5c, 0x7a, 0x65, 0x26, 0x31, 0x4f, 0xc6, 0x12, 0x68, 0xcb, 0x9d, 0xca, 0xa9, 0x44, 0xd8, 0x46, 0x5c, 0x89, 0xf4, 0xe3, 0x81, 0x81, 0x3f, 0xc9, 0x7b, 0x7e, 0x46, 0xf1, 0xae, 0x38, 0xda, 0x47, 0xf3, 0x33, 0x6d }, + .ds_encrypted_input_params = { 0x5a, 0x7e, 0x0f, 0x0a, 0x28, 0x9c, 0xfa, 0x41, 0xf3, 0xa6, 0x61, 0x32, 0x3c, 0xc3, 0xe1, 0xda, 0xea, 0x7e, 0x8c, 0x3f, 0xd1, 0x4f, 0x7f, 0x33, 0x2e, 0x2a, 0xef, 0x17, 0xea, 0x66, 0x9f, 0xda, 0x42, 0x7f, 0xd6, 0x00, 0x89, 0xc1, 0x73, 0x0e, 0xb0, 0x37, 0x38, 0x20, 0xc3, 0xa8, 0xe5, 0x17, 0xad, 0xad, 0xa9, 0xf2, 0x17, 0x07, 0xec, 0xe6, 0x76, 0x2c, 0xbc, 0x20, 0xf8, 0x63, 0xa1, 0x39, 0x56, 0x9f, 0x95, 0x95, 0xdd, 0xd8, 0xa8, 0x4b, 0x17, 0x38, 0x6e, 0xda, 0x3f, 0x8f, 0x67, 0x61, 0xbe, 0xb7, 0x79, 0x52, 0x66, 0xe9, 0x75, 0x43, 0x6c, 0x48, 0xd7, 0xce, 0x01, 0x2d, 0x04, 0xf9, 0x70, 0xca, 0x30, 0xf3, 0x1c, 0x74, 0xe7, 0x55, 0xdf, 0xe5, 0xa1, 0x85, 0x40, 0xa1, 0xa8, 0xc4, 0xf6, 0x66, 0x9e, 0xc8, 0x42, 0x5e, 0x78, 0xca, 0x2d, 0x93, 0xb9, 0xb4, 0x5f, 0x12, 0xa6, 0x06, 0x21, 0x7c, 0x56, 0x5c, 0x77, 0xee, 0x38, 0x71, 0xaa, 0x22, 0x6f, 0xbf, 0x48, 0xc8, 0x3e, 0xc7, 0xef, 0x17, 0x93, 0xc3, 0xdb, 0x3c, 0xb3, 0x10, 0xe3, 0xe2, 0x26, 0x13, 0x76, 0xf5, 0x22, 0x90, 0xdc, 0x76, 0x24, 0xa8, 0xb1, 0x5b, 0xd3, 0x83, 0x19, 0x5b, 0x2e, 0x4f, 0xba, 0x4f, 0x89, 0x65, 0x29, 0xd4, 0x7b, 0x98, 0x4c, 0x95, 0x06, 0xf0, 0xd2, 0x12, 0xee, 0xd0, 0x11, 0x85, 0x55, 0x21, 0xf4, 0x81, 0xfd, 0x34, 0x63, 0xfa, 0xaa, 0x9f, 0x2a, 0x1d, 0xd9, 0x22, 0x97, 0x1b, 0x61, 0x2d, 0x7c, 0x26, 0x2c, 0xc9, 0x4b, 0xf9, 0xb1, 0xab, 0x3b, 0xb5, 0x79, 0x89, 0xc6, 0x85, 0x2a, 0xe8, 0x68, 0xd9, 0x72, 0x48, 0xe9, 0x6d, 0xa3, 0x2d, 0x7f, 0x7c, 0xe8, 0xd1, 0x6a, 0x76, 0xb9, 0x1b, 0xf1, 0x9d, 0x33, 0xe2, 0x1a, 0xc7, 0x82, 0xc0, 0xd2, 0x58, 0x52, 0x22, 0x9d, 0xa2, 0x39, 0x3b, 0x52, 0x22, 0x67, 0x5c, 0x76, 0xd8, 0xe7, 0x28, 0x04, 0xf4, 0x91, 0x7e, 0xd5, 0x08, 0x82, 0x24, 0xc2, 0x31, 0x14, 0x10, 0x99, 0x73, 0x83, 0x1c, 0x26, 0xd1, 0x9f, 0xc1, 0x9d, 0x29, 0xca, 0xa9, 0xcf, 0x00, 0xea, 0xa5, 0x51, 0x24, 0x57, 0x21, 0xcd, 0xb3, 0xbe, 0xc3, 0xaf, 0x27, 0xce, 0x13, 0x2f, 0x41, 0x73, 0xf8, 0x1d, 0x26, 0x0c, 0x43, 0x83, 0x98, 0x68, 0x31, 0xcb, 0x14, 0xcc, 0x94, 0x78, 0xa2, 0x65, 0x98, 0xbe, 0x03, 0x06, 0x99, 0x0f, 0x53, 0x7a, 0x0a, 0x27, 0x23, 0x72, 0x1b, 0xb8, 0x5f, 0xf7, 0x2e, 0x37, 0xac, 0x46, 0x56, 0xf7, 0x85, 0xae, 0x6a, 0xe9, 0xfc, 0x91, 0xa8, 0x3c, 0x50, 0x77, 0x79, 0x6c, 0x40, 0x92, 0xc7, 0xe1, 0x3c, 0x58, 0x76, 0x30, 0xfd, 0xec, 0xf7, 0x04, 0x7e, 0x27, 0xab, 0x39, 0x00, 0xf4, 0xbb, 0x48, 0xd2, 0x39, 0x18, 0x3e, 0xa2, 0x79, 0x13, 0x88, 0x15, 0xff, 0x1e, 0x8a, 0xa1, 0x8f, 0xc5, 0x21, 0x4f, 0x61, 0xfd, 0x45, 0x01, 0x50, 0x04, 0x68, 0x2d, 0x9a, 0x96, 0xd0, 0xdc, 0x6b, 0xaa, 0x61, 0x8c, 0xc4, 0x3e, 0x7f, 0xf0, 0x41, 0xfc, 0x42, 0xc9, 0xee, 0xe2, 0x69, 0x9e, 0x88, 0xfd, 0xa2, 0x13, 0xc7, 0xa5, 0x37, 0xb2, 0xfa, 0xbb, 0x39, 0xfc, 0x32, 0x42, 0x3a, 0xe2, 0xae, 0x2b, 0xf7, 0x14, 0xa2, 0x72, 0x7a, 0x56, 0x59, 0xac, 0x5b, 0xae, 0x0f, 0x06, 0x0c, 0x51, 0xb2, 0x37, 0x9f, 0x5e, 0xc5, 0x9f, 0xf6, 0xb3, 0xb3, 0xc3, 0xe3, 0x11, 0x10, 0x45, 0xc1, 0xb9, 0x8f, 0x4b, 0x93, 0x29, 0x83, 0x20, 0x92, 0x26, 0x72, 0x1c, 0xf4, 0xf3, 0x7a, 0x35, 0x1b, 0x99, 0x9e, 0x7f, 0x21, 0x71, 0x46, 0x87, 0x43, 0x09, 0x7a, 0x3c, 0xdf, 0x70, 0x62, 0x6b, 0x1d, 0xda, 0xb4, 0x64, 0xff, 0x34, 0x7f, 0xc7, 0x53, 0xbb, 0xcf, 0xd9, 0x6c, 0x53, 0x5f, 0x9f, 0xa1, 0x5f, 0xb3, 0x6c, 0xed, 0xe9, 0xc9, 0x8c, 0xfb, 0x9a, 0x01, 0xa5, 0x20, 0xaa, 0xc0, 0xa1, 0x48, 0x44, 0x5c, 0xff, 0xb8, 0x92, 0xbe, 0x19, 0xd3, 0x0c, 0xb2, 0x85, 0xe2, 0x21, 0x7d, 0xe8, 0x18, 0xeb, 0x6e, 0x26, 0x93, 0x17, 0x3e, 0xcd, 0x17, 0x7d, 0x27, 0x95, 0x47, 0xad, 0x35, 0xc4, 0xed, 0xab, 0x91, 0x06, 0xad, 0xbb, 0x89, 0x84, 0x69, 0x1a, 0xb3, 0x02, 0x52, 0xe6, 0x60, 0x85, 0x8b, 0x88, 0x62, 0x3f, 0x1b, 0x66, 0x5a, 0x92, 0x6f, 0xf1, 0x6b, 0x48, 0x17, 0x10, 0x49, 0x81, 0x5e, 0xf2, 0x8b, 0x74, 0x6b, 0xb7, 0x6e, 0x28, 0x2b, 0x3b, 0x8d, 0xe0, 0x44, 0xc3, 0xf0, 0x32, 0x92, 0x8c, 0x02, 0x18, 0x04, 0xbb, 0x57, 0x8a, 0x17, 0xd7, 0xe7, 0x3f, 0xc2, 0xf6, 0x24, 0xde, 0x4e, 0x3d, 0x73, 0x1a, 0x5c, 0xe4, 0x16, 0x2b, 0xb2, 0xb4, 0x5d, 0x8a, 0x74, 0x8e, 0x04, 0x77, 0xe3, 0x54, 0xd2, 0x9c, 0x14, 0x32, 0x0c, 0x67, 0xba, 0x75, 0x76, 0x58, 0x3f, 0x50, 0x2b, 0xf9, 0x85, 0x7b, 0xa1, 0x6e, 0x78, 0x86, 0xe7, 0xfd, 0xd2, 0x3f, 0x83, 0xb9, 0x33, 0xb4, 0x2c, 0x01, 0x67, 0xfe, 0x11, 0x79, 0xc2, 0x3a, 0x30, 0xab, 0x8a, 0xd3, 0x31, 0x19, 0xf2, 0xa7, 0xca, 0x77, 0x7d, 0xc5, 0x1b, 0x81, 0x2f, 0x8f, 0x63, 0x19, 0x75, 0x56, 0xc9, 0x62, 0x48, 0x9d, 0x7b, 0x6d, 0x81, 0x63, 0x48, 0x96, 0xfb, 0xdc, 0x6b, 0xc0, 0xe9, 0x60, 0xfb, 0x3f, 0x82, 0x71, 0x99, 0x52, 0x9a, 0x27, 0xc9, 0x46, 0x78, 0xb3, 0xb5, 0xa3, 0xc9, 0x97, 0x46, 0x5d, 0x46, 0x17, 0x9d, 0x77, 0x49, 0x6f, 0x61, 0x13, 0xe2, 0x26, 0x85, 0xa3, 0xc0, 0x99, 0xe9, 0x30, 0x2d, 0x29, 0x40, 0xe8, 0xcd, 0xf0, 0xde, 0x66, 0x42, 0xcf, 0x5e, 0x7f, 0x32, 0x83, 0x75, 0x5f, 0xe4, 0xa0, 0x95, 0x58, 0x48, 0xd5, 0x2b, 0x81, 0xa6, 0x45, 0x6d, 0xb8, 0x97, 0x08, 0x60, 0xd9, 0x66, 0x6b, 0x12, 0xaa, 0x39, 0x8f, 0x7d, 0x0a, 0xfc, 0xde, 0xea, 0xd0, 0xbc, 0x6d, 0xfa, 0x85, 0x4e, 0x9c, 0x2e, 0xb5, 0x61, 0x89, 0x2b, 0xec, 0x41, 0x5d, 0x76, 0x9c, 0x01, 0xba, 0xe2, 0x79, 0xb9, 0x1f, 0x37, 0x35, 0x1d, 0xbd, 0x34, 0xb4, 0xa6, 0x4d, 0xec, 0xf6, 0xf8, 0x5a, 0xc4, 0xa0, 0xd2, 0xc7, 0xab, 0x68, 0x04, 0x7b, 0x22, 0x13, 0xbe, 0x22, 0x98, 0x38, 0xe9, 0xac, 0x94, 0xbe, 0x05, 0x75, 0x3a, 0xa7, 0x3b, 0xe0, 0x2a, 0x1c, 0x89, 0xc1, 0x01, 0x7f, 0x18, 0x91, 0x76, 0xaf, 0x1e, 0xe9, 0xa0, 0xd1, 0x71, 0x6b, 0x7d, 0x52, 0xec, 0x62, 0x4f, 0x3f, 0xf7, 0xa1, 0xcf, 0x66, 0xdb, 0xea, 0xdd, 0xe1, 0x24, 0x3b, 0x9c, 0x26, 0xe1, 0x54, 0xdd, 0x8b, 0x13, 0x7b, 0x65, 0x08, 0x16, 0x3a, 0x5b, 0x04, 0x2d, 0xc8, 0x15, 0x1f, 0x65, 0xcf, 0x8c, 0xe1, 0x69, 0xc6, 0x71, 0x6d, 0x35, 0xa2, 0xa3, 0xed, 0xec, 0x21, 0xf5, 0x4c, 0xd8, 0x14, 0xf4, 0x8f, 0x43, 0x84, 0xcb, 0xa3, 0xe9, 0x99, 0x80, 0xf1, 0xd4, 0x76, 0x84, 0xc7, 0x84, 0x35, 0xb6, 0xc7, 0x2e, 0xd2, 0xc4, 0x43, 0x73, 0x7f, 0x08, 0xa3, 0xe5, 0x74, 0xdc, 0x0f, 0x7a, 0x9b, 0x0c, 0x5c, 0x72, 0x31, 0xa4, 0x20, 0x58, 0xfe, 0x63, 0xa7, 0x34, 0x78, 0xd6, 0x3c, 0x44, 0x60, 0x34, 0xb7, 0x30, 0xca, 0x0d, 0x2d, 0xef, 0x98, 0xb1, 0xf0, 0x71, 0xed, 0xff, 0x20, 0x41, 0xca, 0x16, 0x55, 0x05, 0x51, 0x5a, 0xd2, 0xc9, 0x5c, 0x8f, 0xa6, 0x6c, 0x75, 0x59, 0x95, 0x54, 0xd5, 0x55, 0x4e, 0x8b, 0xa3, 0x01, 0x9e, 0xaf, 0x19, 0x72, 0x15, 0x43, 0x77, 0x9d, 0x36, 0x31, 0x75, 0x88, 0xc4, 0x4b, 0x80, 0x5a, 0x97, 0x05, 0x05, 0x47, 0x45, 0xee, 0xef, 0x5b, 0xc8, 0x73, 0xd5, 0xfc, 0xf0, 0x74, 0x8c, 0xe3, 0x7b, 0x08, 0xb1, 0x76, 0x3e, 0x9a, 0x8e, 0x13, 0x7a, 0xd1, 0x66, 0x29, 0xfb, 0x9f, 0xce, 0xbe, 0x43, 0xc2, 0xe5, 0x74, 0xdf, 0x60, 0x6f, 0xad, 0x84, 0xb3, 0x6c, 0x2e, 0x6a, 0x2a, 0xb6, 0x52, 0x4b, 0xef, 0x13, 0xd9, 0x9b, 0x0e, 0xdc, 0x83, 0x57, 0x9b, 0x44, 0x9f, 0x0f, 0x33, 0x90, 0x09, 0xba, 0xaa, 0x81, 0xb0, 0x32, 0x6f, 0xf2, 0x23, 0x95, 0x1e, 0xe1, 0xc9, 0xf5, 0x3f, 0x0a, 0x62, 0x5a, 0x82, 0x82, 0xc2, 0x56, 0x3d, 0xeb, 0x53, 0xf7, 0xc5, 0xda, 0x3c, 0xdd, 0x96, 0xde, 0xf5, 0x4d, 0xfa, 0x39, 0x1c, 0xf8, 0x69, 0xf7, 0x24, 0x45, 0x3c, 0x64, 0x44, 0x12, 0x2a, 0xfa, 0x1e, 0xfa, 0x58, 0xc7, 0xf5, 0x1d, 0xa7, 0xb0, 0x03, 0xb8, 0xdc, 0xf4, 0xd5, 0x52, 0x43, 0xd0, 0xb8, 0xca, 0x89, 0xe8, 0xa1, 0xf1, 0x71, 0xa7, 0xfd, 0xcb, 0x2d, 0xcf, 0x7d, 0x41, 0x3d, 0x89, 0x43, 0x23, 0x8d, 0x32, 0x77, 0x84, 0x7e, 0x29, 0xa1, 0x94, 0xb7, 0x0e, 0x89, 0xe7, 0x9a, 0xa3, 0x2f, 0x02, 0xe4, 0x36, 0x72, 0xeb, 0xaa, 0xab, 0x13, 0x43, 0x75, 0x26, 0xce, 0x53, 0x04, 0xbd, 0x5e, 0x7c, 0xc0, 0x3c, 0x51, 0x0a, 0xf7, 0x92, 0x6f, 0x1a, 0x49, 0x99, 0x3e, 0xd6, 0xcf, 0xfe, 0x6c, 0x9f, 0x38, 0x6a, 0xb8, 0x43, 0xdd, 0xa1, 0x52, 0xc8, 0x88, 0x49, 0x08, 0x28, 0xc1, 0x65, 0x5f, 0x70, 0x43, 0x9c, 0x7a, 0xf5, 0x07, 0xe2, 0xfb, 0xa6, 0x3b, 0x47, 0x15, 0x9c, 0xdf, 0x49, 0xf1, 0x6f, 0x6b, 0xc2, 0x96, 0x0e, 0x30, 0x98, 0x2b, 0x85, 0x37, 0x52, 0x10, 0xad, 0x46, 0x84, 0x0b, 0xfb, 0xb6, 0x16, 0x72, 0x83, 0x15, 0x15, 0x14, 0x03, 0x50, 0x8b, 0xde, 0xa1, 0xcb, 0x68, 0x2c, 0xe6, 0xb8, 0x9d, 0xe4, 0xff, 0x89, 0xde, 0x15, 0xb7, 0x7c, 0x2a, 0xba, 0x85, 0x7c, 0x85, 0x83, 0xdb, 0xab, 0x35, 0xef, 0x70, 0xec, 0x56, 0xf6, 0x2d, 0xcb, 0xad, 0x14, 0xeb, 0x5c, 0xbf, 0x63, 0x79, 0x0d, 0x96, 0x05, 0x95, 0xb2, 0xd6, 0x08, 0xc1, 0x32, 0x3d, 0x57, 0x44, 0x40, 0xee, 0xd6, 0xb2, 0x65, 0x52, 0xa6, 0xe0, 0x5c, 0x6b, 0x24, 0x98, 0xb3, 0x8c, 0xdf, 0xc3, 0x8a, 0x29, 0x0b, 0x73, 0x61, 0xf6, 0x62, 0xd8, 0xf1, 0x5b, 0xbc, 0xb6, 0x5a, 0xe6, 0x7f, 0x59, 0x26, 0xa2, 0xe0, 0xcc, 0x38, 0xee, 0xe7, 0x50, 0x3a, 0x74, 0x37, 0xb0, 0xf5, 0xb5, 0x20, 0x65, 0x63, 0x49, 0x52, 0x49, 0x37, 0x84, 0x29, 0x29, 0xda, 0xf8, 0x56, 0xc5, 0x70, 0x70, 0xc1, 0xeb, 0xd1, 0x6c, 0x99, 0x92, 0x7c, 0xed, 0x44, 0xd3, 0x44, 0xd2, 0xe2, 0x0a, 0x44, 0x53, 0x88, 0x82, 0xfd, 0x54, 0x0a, 0xb8, 0x92, 0x10, 0x8d, 0xfe, 0x37, 0x28, 0x78, 0xa6, 0x47, 0xf4, 0x44, 0x97, 0xf2, 0x09, 0xbf, 0x47, 0x28, 0x4e, 0xaa, 0x5c, 0xd1, 0xaa, 0xbe, 0xfc, 0xff, 0x5e, 0xb4, 0x92, 0x47, 0x11, 0x08, 0xdc, 0x46, 0xa2, 0xd0, 0x4d, 0x1b, 0xfa, 0x42, 0x33, 0x7b, 0xee, 0x12, 0x45, 0x93, 0xe6, 0x28, 0x35, 0x44, 0x8d, 0x64, 0x85, 0xa9, 0xa7, 0xba, 0x7b, 0x8f, 0xfe, 0xa7, 0x3c, 0x99, 0x47, 0x02, 0x2f, 0x61, 0x01, 0x01, 0x79, 0xb8, 0x7e, 0xe1, 0xdd, 0x61, 0x70, 0x25, 0x88, 0xc0, 0xf3, 0x40, 0x52, 0x6a, 0x6b, 0xf6, 0x3c, 0xab, 0xfd, 0x44, 0x17, 0xdf, 0x11, 0x70, 0x96, 0x52, 0x52, 0x58, 0xee, 0xd6, 0x48, 0x72, 0x4f, 0xe7, 0x11, 0x94, 0x60, 0x4a, 0x3a, 0xc0, 0x35, 0x0b, 0x17, 0x83, 0xc8, 0x3b, 0x16, 0xb3, 0xd2, 0x21, 0x4d, 0x29, 0x4c, 0xc0, 0x0f, 0x75, 0x37, 0xf1, 0x7d, 0x8d, 0x57, 0x8a, 0xac, 0x67, 0x69, 0x7c, 0x00, 0x05, 0xc3, 0xb9, 0xf0, 0xd1, 0x8b, 0xe6, 0xc6, 0x16, 0x59, 0x2b, 0xa7, 0x8f, 0x2a, 0x8d, 0xed, 0xa7, 0xad, 0x3a, 0x05, 0xc2, 0x19, 0x11, 0x43, 0xf0, 0x5e, 0x40, 0xea, 0x95, 0x8f, 0xde, 0x8f, 0xad, 0x92, 0x8f, 0x54, 0x6a, 0x22, 0x84, 0x65, 0x83, 0x78 }, .ds_key_size = 4096, - .ds_result = { 0xf1, 0xdd, 0xd5, 0x9d, 0x73, 0x05, 0xc4, 0x21, 0x9c, 0x69, 0x5f, 0x04, 0x28, 0x30, 0x58, 0xc8, 0x77, 0x7b, 0xbf, 0x44, 0x9f, 0xd1, 0xdf, 0x2e, 0xac, 0x7c, 0x64, 0x92, 0x73, 0xf2, 0x70, 0x98, 0x7c, 0x80, 0x05, 0xf0, 0x1f, 0x90, 0xdb, 0x9d, 0x21, 0x60, 0x3d, 0x0f, 0x39, 0x16, 0xe1, 0x39, 0xab, 0x62, 0xa8, 0xc5, 0x43, 0x86, 0xb3, 0x5a, 0x99, 0x99, 0xae, 0x9c, 0x20, 0x02, 0xd6, 0x6f, 0x5e, 0x26, 0xd4, 0x12, 0x7f, 0xcd, 0xab, 0x43, 0xd1, 0x46, 0x72, 0x79, 0x1a, 0x1e, 0x2b, 0xcc, 0xb7, 0xe3, 0xf3, 0x7e, 0xd1, 0x31, 0x22, 0xe0, 0x61, 0x7d, 0x18, 0x3e, 0xcb, 0x94, 0xc9, 0xe0, 0x64, 0xf6, 0x4e, 0x7a, 0x7a, 0x3f, 0x8c, 0x80, 0xad, 0x68, 0x4c, 0x98, 0x3c, 0xc1, 0xe3, 0x0f, 0xc5, 0x4b, 0xbb, 0xa8, 0x5d, 0xad, 0xd0, 0x6d, 0x56, 0x92, 0xcf, 0x5f, 0x63, 0x83, 0x93, 0xa2, 0x52, 0xb1, 0x55, 0x11, 0xb6, 0xfc, 0xb2, 0x7d, 0xe4, 0x22, 0xb7, 0xfd, 0xf4, 0xf0, 0x6f, 0x4c, 0xa9, 0x4e, 0x30, 0xc6, 0xad, 0xb4, 0x1c, 0x30, 0xf4, 0x1e, 0x1c, 0xe4, 0x0f, 0x5a, 0x4d, 0x34, 0xd7, 0x91, 0xe1, 0xcd, 0x18, 0xfc, 0x77, 0x05, 0xa9, 0x5c, 0x72, 0xab, 0x79, 0x2a, 0xa8, 0x26, 0x9e, 0xb6, 0x3b, 0xd1, 0x18, 0x01, 0x4a, 0x5f, 0xf0, 0x40, 0x8d, 0x39, 0x41, 0x54, 0x90, 0xc4, 0xbb, 0xf9, 0xb0, 0x84, 0x70, 0x59, 0x6c, 0xc2, 0x91, 0xfe, 0x02, 0x18, 0xe0, 0xa3, 0xc8, 0xc6, 0x62, 0xa6, 0x64, 0x53, 0xb8, 0xc0, 0xd2, 0x64, 0x7c, 0x41, 0x15, 0x17, 0x4f, 0xd0, 0xa8, 0x8b, 0xad, 0x35, 0xe6, 0x35, 0xd4, 0x92, 0x34, 0x03, 0xb7, 0x41, 0xc8, 0x5a, 0x5e, 0xc8, 0xe2, 0x55, 0x67, 0x9d, 0x95, 0x83, 0x3a, 0xc8, 0x17, 0xa3, 0x0a, 0x4e, 0x47, 0xe6, 0x44, 0xa1, 0x22, 0x30, 0x50, 0xdb, 0x68, 0xb5, 0x69, 0x97, 0x52, 0xa7, 0xc6, 0x5b, 0x33, 0x86, 0x25, 0xe3, 0x5b, 0x16, 0xb1, 0x7a, 0x77, 0xe6, 0xf8, 0xd7, 0xde, 0xc8, 0x17, 0xe7, 0x7a, 0x12, 0xdf, 0x95, 0xae, 0xa5, 0xb3, 0x01, 0x58, 0xfe, 0x0e, 0xec, 0x74, 0x0c, 0xfc, 0x08, 0xcc, 0xb7, 0xbb, 0xb1, 0x6c, 0x46, 0x09, 0x9d, 0x36, 0x4a, 0x39, 0xa9, 0xb5, 0x9b, 0xe3, 0x02, 0xbf, 0x74, 0xf0, 0x3e, 0xc5, 0xd9, 0xd2, 0xf7, 0x55, 0xbc, 0x40, 0xdd, 0x0c, 0x6f, 0xae, 0xf8, 0xe4, 0xe2, 0x36, 0x75, 0x53, 0x8a, 0xae, 0x78, 0x6d, 0x4b, 0xc3, 0x91, 0xaf, 0xfd, 0x74, 0xd5, 0x45, 0xed, 0x1d, 0xe4, 0xdc, 0xad, 0x71, 0x87, 0xa8, 0x52, 0x4a, 0x20, 0xcb, 0xcc, 0x30, 0x98, 0x64, 0xb3, 0x08, 0x47, 0xce, 0xb0, 0x93, 0xd1, 0x2b, 0xcd, 0xa4, 0x3d, 0xee, 0x52, 0x37, 0xfe, 0xd8, 0x55, 0x2b, 0x0e, 0x0c, 0xa3, 0x2d, 0x01, 0x9b, 0xfc, 0x65, 0x41, 0xa0, 0x81, 0x71, 0x43, 0x64, 0xd8, 0x1d, 0x8c, 0x36, 0xc2, 0xc8, 0xe7, 0x89, 0x84, 0xb7, 0xa7, 0x8e, 0xbd, 0x32, 0xf0, 0xe0, 0xa0, 0x5b, 0x47, 0x97, 0xe7, 0x81, 0x15, 0xa3, 0x24, 0x39, 0x40, 0x47, 0x17, 0x07, 0xe5, 0x35, 0x19, 0x81, 0x04, 0xdc, 0x57, 0xce, 0x52, 0xd4, 0xcd, 0xe7, 0xe4, 0x97, 0xb3, 0x1d, 0x60, 0x7b, 0xbb, 0xb5, 0x15, 0xb3, 0x4b, 0x27, 0xf1, 0xda, 0x2b, 0xd9, 0xe9, 0x4e, 0xca, 0x57, 0x1d, 0xb6, 0xde, 0x8d, 0x0f, 0x9e, 0xbd, 0xdb, 0xaf, 0xde, 0x69, 0x0a, 0xd6, 0x5a, 0x37, 0xc5, 0x38, 0x76, 0x33, 0x73, 0xc9, 0x07, 0xa6, 0xbb, 0x50, 0xa4, 0x31, 0x0e, 0x27, 0x50, 0xef, 0xab, 0x34, 0x7a, 0xe2, 0xb5, 0x42, 0xec, 0x0c, 0x63, 0x70, 0x2b, 0xed, 0x97, 0xee, 0xe4, 0x7b, 0x62, 0xc9, 0xaf, 0x02, 0x7b, 0xc6, 0x17, 0x43 }, + .ds_result = { 0xba, 0x80, 0x62, 0x96, 0xa2, 0x82, 0x5e, 0xd2, 0x63, 0xb8, 0x22, 0xbf, 0xde, 0x6e, 0x5e, 0x76, 0x0d, 0x9f, 0x22, 0x5c, 0x59, 0x69, 0x8b, 0x93, 0x1f, 0x72, 0x55, 0x9a, 0x07, 0xad, 0x2f, 0x7a, 0x93, 0x1a, 0x4e, 0x20, 0xe1, 0xd5, 0x98, 0xa5, 0x59, 0x57, 0xf5, 0x8c, 0x22, 0xdc, 0x13, 0x8d, 0x3b, 0x4d, 0x1c, 0xb2, 0x35, 0xa2, 0x90, 0x94, 0x5b, 0x11, 0xc1, 0xc2, 0xf4, 0x4a, 0x5d, 0x59, 0x01, 0xd2, 0x82, 0xe6, 0x02, 0x3c, 0x79, 0xee, 0x34, 0xc8, 0xb2, 0xfe, 0x44, 0x24, 0x8a, 0xa6, 0x41, 0xc3, 0xf0, 0x11, 0x4d, 0xd2, 0x1f, 0x34, 0x4c, 0xa9, 0x88, 0x01, 0x3e, 0x88, 0x57, 0x13, 0xd2, 0x66, 0xda, 0xfa, 0x2c, 0x6e, 0xb8, 0xf3, 0x39, 0x3f, 0xcc, 0x76, 0x84, 0xa4, 0x89, 0xae, 0x2d, 0x4f, 0x89, 0x87, 0x0e, 0x2f, 0xad, 0xf8, 0xb3, 0xbf, 0x3f, 0x87, 0x84, 0x1c, 0xfb, 0x93, 0x1b, 0x27, 0x94, 0xfc, 0x2a, 0xef, 0x93, 0x14, 0xbe, 0x9a, 0x50, 0x1e, 0x53, 0x8a, 0xe2, 0x00, 0xd8, 0x0b, 0x67, 0x78, 0x8d, 0x3b, 0xae, 0xa9, 0xd0, 0x31, 0x00, 0x46, 0x4a, 0xe5, 0x8c, 0x54, 0x74, 0x2d, 0x81, 0x4d, 0xa0, 0x31, 0x4c, 0x73, 0xfb, 0x28, 0x55, 0xdc, 0x9b, 0x83, 0x6d, 0xce, 0x8e, 0xa5, 0x02, 0x8b, 0x6b, 0x39, 0xc4, 0x4b, 0x82, 0x6c, 0x62, 0x80, 0xcc, 0x0a, 0x89, 0xd5, 0x14, 0x83, 0xbe, 0xfa, 0xba, 0x4f, 0x2b, 0x6f, 0xba, 0x7f, 0xc4, 0x9b, 0x4c, 0xd6, 0xb2, 0x75, 0x0b, 0x9a, 0xe3, 0x88, 0x86, 0x77, 0x52, 0x2a, 0xf5, 0x98, 0xab, 0xc1, 0x49, 0x4d, 0xe6, 0x04, 0xaa, 0xd7, 0x05, 0x11, 0x7d, 0x8e, 0x7a, 0xd7, 0xa2, 0x2d, 0x7d, 0x52, 0x7f, 0x11, 0x7d, 0x08, 0x3b, 0xd0, 0xd1, 0x10, 0x98, 0xf4, 0x04, 0xf4, 0xcb, 0x1f, 0x57, 0x8e, 0x1d, 0xad, 0xe9, 0xc4, 0x53, 0x7a, 0x1b, 0x85, 0x59, 0xf0, 0xe6, 0x7d, 0x8e, 0xff, 0x20, 0xf7, 0x71, 0x21, 0x2c, 0x21, 0xea, 0xaa, 0x77, 0x5f, 0x9d, 0x1c, 0x77, 0x1f, 0x7c, 0xeb, 0xd8, 0xde, 0xc7, 0x07, 0x4d, 0x3b, 0xde, 0x3a, 0x9b, 0xd5, 0x36, 0xcd, 0xbe, 0x3c, 0xd8, 0x87, 0xc0, 0x5d, 0xc5, 0xaa, 0x75, 0xea, 0x34, 0xd8, 0x07, 0x97, 0x03, 0xea, 0x7d, 0xda, 0x25, 0x1a, 0x5a, 0x10, 0xd0, 0x94, 0x76, 0x28, 0x59, 0x39, 0x4f, 0xa4, 0xee, 0xa8, 0x7a, 0xf1, 0x41, 0x73, 0x8d, 0xe1, 0x9e, 0x39, 0xb9, 0x3f, 0x2d, 0xb2, 0x21, 0x8e, 0x89, 0xc6, 0x29, 0x97, 0x11, 0x90, 0x2e, 0x8d, 0xd6, 0x88, 0xc5, 0x5d, 0x8a, 0x52, 0x79, 0x92, 0xc6, 0x20, 0x9a, 0xf9, 0x3e, 0xa8, 0xac, 0x42, 0x34, 0xa4, 0x05, 0xcf, 0xe2, 0xd9, 0xf1, 0x7f, 0x21, 0xc9, 0x35, 0x4f, 0xa4, 0x6c, 0xa7, 0x7a, 0xfe, 0x6a, 0x1a, 0xab, 0xa1, 0xff, 0x65, 0xfb, 0x3e, 0xe5, 0x1a, 0xfe, 0x15, 0x03, 0x6d, 0x03, 0x5f, 0xb4, 0x43, 0xc0, 0x8e, 0xe7, 0x69, 0xaa, 0x97, 0x8e, 0x78, 0xbf, 0x7f, 0xc8, 0x3b, 0xf4, 0xb0, 0x2b, 0x3d, 0x94, 0x8e, 0xdf, 0x07, 0x98, 0xe8, 0xca, 0xaa, 0x4d, 0xf9, 0x71, 0x84, 0x06, 0x40, 0x0f, 0x19, 0xda, 0x26, 0x03, 0x06, 0xf0, 0xc6, 0xa2, 0xe9, 0x99, 0x90, 0xa7, 0x03, 0x64, 0xd5, 0xc9, 0x38, 0x8d, 0x89, 0x47, 0x45, 0xa4, 0x66, 0xbb, 0x41, 0xb7, 0x76, 0xe0, 0x03, 0x7f, 0xf8, 0x98, 0xc8, 0xe9, 0xb9, 0xf5, 0x9b, 0x88, 0x07, 0x1b, 0x6d, 0x7a, 0x9f, 0x32, 0x25, 0x88, 0x17, 0xf6, 0xa8, 0x88, 0x6a, 0xac, 0x2d, 0x88, 0x6d, 0xf5, 0xcf, 0xdd, 0xd0, 0x44, 0x08, 0x62, 0x9f, 0x8d, 0x08, 0x36, 0xd1, 0x28, 0x04, 0xae, 0xd3, 0x7b, 0xaf, 0x10, 0xd4, 0xcd, 0xb1, 0x01, 0x58, 0x19, 0xa4, 0x46 }, #elif SOC_DS_SIGNATURE_MAX_BIT_LEN == 3072 - .ds_message = { 0x6e, 0xec, 0x39, 0xd5, 0xc7, 0x09, 0x68, 0x9f, 0xcd, 0xb6, 0x3e, 0x1c, 0x74, 0xa7, 0x03, 0x91, 0xe7, 0xbd, 0x26, 0x8b, 0xeb, 0xbe, 0x3f, 0x81, 0xf9, 0xcc, 0xd6, 0x10, 0xea, 0x4c, 0xd6, 0xb1, 0xb9, 0xe5, 0x2f, 0x9d, 0x56, 0xc9, 0x44, 0x2e, 0xb1, 0x62, 0x2f, 0x61, 0xac, 0x15, 0x2c, 0x69, 0xe8, 0xb0, 0x97, 0x4b, 0x2c, 0xd5, 0x3e, 0xc1, 0xce, 0x19, 0x31, 0xb1, 0x73, 0xa3, 0xe8, 0xc8, 0x0a, 0x6f, 0x31, 0xa4, 0x02, 0x71, 0x06, 0xa0, 0xae, 0xed, 0xdc, 0xb5, 0x67, 0xfe, 0xe9, 0xcf, 0x6e, 0x3f, 0xa6, 0x2f, 0x29, 0x5f, 0xcf, 0x20, 0x36, 0x80, 0xdb, 0x62, 0xae, 0x84, 0xd7, 0x47, 0x09, 0x43, 0xd2, 0x95, 0x1d, 0x68, 0x07, 0xc1, 0x0e, 0xcc, 0x15, 0x8c, 0xe2, 0x00, 0x3e, 0x12, 0x0b, 0xf5, 0x7e, 0x7e, 0xec, 0x2d, 0x72, 0xf5, 0xd3, 0xb8, 0x0b, 0x37, 0x92, 0xd8, 0xea, 0x1e, 0x80, 0x00, 0x75, 0xb9, 0x8b, 0x8d, 0x7e, 0x2e, 0x91, 0xf5, 0xdb, 0x91, 0x26, 0x8a, 0x07, 0x1b, 0x0b, 0xf1, 0xf9, 0x47, 0x6c, 0x49, 0x00, 0x3d, 0x04, 0x2b, 0xfa, 0xfb, 0x29, 0xf5, 0xde, 0x32, 0xcd, 0x80, 0x3c, 0x88, 0xbd, 0x40, 0xbe, 0x76, 0x11, 0x24, 0x0d, 0x00, 0x65, 0x1c, 0xcf, 0x5c, 0x3b, 0xbc, 0x70, 0x40, 0x29, 0xf8, 0x4d, 0xdc, 0x06, 0x31, 0x16, 0xea, 0xa2, 0x6a, 0x36, 0xfc, 0xca, 0x63, 0xf6, 0x6f, 0x5d, 0x48, 0x8e, 0xdf, 0x78, 0x6f, 0x09, 0xe4, 0x41, 0xee, 0xe1, 0x11, 0x41, 0x6b, 0x00, 0x29, 0x8e, 0xfd, 0x27, 0x58, 0xfd, 0x7b, 0xf3, 0x53, 0x71, 0xd8, 0xc3, 0x7c, 0x26, 0xfc, 0x2b, 0xb4, 0xa6, 0xf3, 0x46, 0xc7, 0x92, 0xe1, 0xd2, 0x47, 0xc2, 0xaf, 0x4f, 0x10, 0xa8, 0x7c, 0x55, 0x26, 0x54, 0xbd, 0x69, 0x35, 0xf8, 0x55, 0x0a, 0x45, 0x11, 0x5c, 0x36, 0xc6, 0x20, 0x9d, 0x3e, 0x27, 0xd3, 0xf9, 0xb8, 0x62, 0x13, 0x26, 0x9e, 0x6d, 0xba, 0x9c, 0xe9, 0xec, 0xb7, 0x3d, 0x84, 0xf4, 0x0b, 0x8e, 0x59, 0xde, 0xc3, 0xd6, 0x1f, 0xe6, 0x05, 0x85, 0x96, 0x7d, 0xd5, 0x6d, 0x79, 0xd7, 0xb2, 0x17, 0x84, 0xd4, 0xaf, 0xfa, 0x03, 0x7f, 0xc7, 0x2e, 0x72, 0xa4, 0x06, 0xa1, 0xe3, 0x45, 0x30, 0x75, 0x4a, 0x10, 0xce, 0x1c, 0xa6, 0xc3, 0x18, 0x1e, 0x14, 0xcf, 0x31, 0xd5, 0xe1, 0x88, 0x57, 0x8a, 0xbc, 0x2d, 0x5d, 0x5d, 0x2c, 0x2a, 0x09, 0xaf, 0x51, 0x7c, 0x51, 0x06, 0xcc, 0xa9, 0x2e, 0x68, 0x00, 0x05, 0x1d, 0x40, 0x07, 0x05, 0x56, 0x7a, 0xba, 0xdf, 0x3b, 0x10, 0x38, 0x94, 0xb0, 0xf3, 0x87, 0xeb, 0x74, 0x7a, 0x17, 0xf6, 0x37, 0x00, 0xb4, 0x81, 0x3b, 0x21, 0x8b, 0xb6, 0x25, 0xd6, 0x90, 0x6f, 0x07, 0xbe, 0x54, 0x6e, 0x46, 0x55, 0xe8, 0x17 }, - .ds_encrypted_input_params = { 0x08, 0x02, 0x0e, 0x26, 0xd6, 0x3f, 0xe7, 0x55, 0x75, 0xd8, 0x04, 0x9a, 0x2c, 0xcb, 0x09, 0x7c, 0x36, 0xf3, 0xce, 0xcf, 0x74, 0xaf, 0x6c, 0x4e, 0x9b, 0x96, 0xf8, 0x49, 0xe5, 0xa9, 0x73, 0x00, 0x45, 0xe0, 0xeb, 0x8a, 0x14, 0x61, 0xb3, 0xc9, 0x99, 0x84, 0x27, 0x88, 0x31, 0x54, 0x78, 0x4e, 0x22, 0x73, 0x4f, 0x5e, 0x80, 0x0b, 0xca, 0x84, 0x03, 0x5e, 0x5f, 0x21, 0xa6, 0x60, 0xa2, 0x3d, 0x61, 0x4f, 0xfd, 0x8d, 0xea, 0x0a, 0xef, 0x1f, 0x32, 0xb0, 0x8f, 0xee, 0x4b, 0x5f, 0x37, 0x6d, 0x0b, 0x0a, 0x2f, 0xe2, 0x5c, 0xa4, 0x2a, 0xf6, 0xa4, 0x41, 0xce, 0xd7, 0x0b, 0x4f, 0x66, 0x22, 0x23, 0x5e, 0xfb, 0x05, 0xc6, 0x31, 0x90, 0x4d, 0xbc, 0x39, 0x49, 0xde, 0x70, 0x68, 0x48, 0xb4, 0xc5, 0x5b, 0xaf, 0x9b, 0x73, 0x06, 0x3d, 0x85, 0x4c, 0xcb, 0x61, 0x21, 0x3c, 0x85, 0x09, 0x87, 0xfb, 0x1a, 0x6d, 0xcc, 0x8f, 0x21, 0x71, 0xcf, 0x53, 0x03, 0x7b, 0x02, 0x0b, 0x41, 0xd3, 0x8c, 0x0e, 0xe2, 0xa2, 0x8f, 0x33, 0xc3, 0x41, 0xcf, 0xaf, 0xf2, 0xc6, 0x6a, 0x76, 0xc2, 0x72, 0xe2, 0x8c, 0x10, 0xff, 0x68, 0xbd, 0x07, 0x50, 0x65, 0x2f, 0xf7, 0x2d, 0xfc, 0x3a, 0x78, 0x70, 0xe9, 0x50, 0x29, 0x9a, 0xb4, 0x2d, 0x51, 0x14, 0xb3, 0x81, 0x86, 0x27, 0xd6, 0x1e, 0x34, 0xad, 0x4d, 0x92, 0xfa, 0x1e, 0x94, 0x3c, 0x42, 0xf6, 0x6d, 0x76, 0x87, 0x1e, 0x9a, 0xb6, 0x0b, 0x5f, 0x0b, 0xc5, 0x47, 0xcf, 0x38, 0xb8, 0xd1, 0xc0, 0x21, 0x92, 0xd3, 0x58, 0x9b, 0xb9, 0xd1, 0x32, 0x2c, 0xdf, 0x6c, 0x54, 0x18, 0xcc, 0xdc, 0x92, 0x9b, 0xfc, 0x18, 0xa0, 0x79, 0x84, 0x69, 0x8f, 0xa7, 0x99, 0x4a, 0x18, 0xd4, 0xa9, 0xb4, 0x3f, 0x60, 0x64, 0x94, 0x1b, 0xc5, 0xfd, 0xfe, 0xc8, 0x8d, 0x2e, 0xdc, 0xd2, 0x21, 0xc7, 0xf1, 0x9b, 0xd6, 0x4c, 0xb3, 0x69, 0x67, 0x2d, 0x68, 0x6d, 0x0c, 0xd6, 0x98, 0x40, 0xb8, 0xe5, 0x86, 0x5a, 0x7d, 0x9d, 0x99, 0x9f, 0xf9, 0xa4, 0x2c, 0xc5, 0x25, 0x52, 0x8c, 0xa2, 0xfb, 0x0c, 0x24, 0x4b, 0x4b, 0x24, 0x29, 0xf0, 0x6f, 0x21, 0x7d, 0xc7, 0x6f, 0x8c, 0x4a, 0x5b, 0x6e, 0x2d, 0xab, 0x6e, 0x60, 0x9d, 0x64, 0xd8, 0xb5, 0x63, 0xa8, 0x4e, 0x47, 0x47, 0x73, 0xa4, 0xea, 0x61, 0xe3, 0x0f, 0x94, 0xc8, 0x78, 0x71, 0xcd, 0x25, 0x93, 0x04, 0xf9, 0x72, 0x1b, 0x1b, 0x12, 0x80, 0xd0, 0x8a, 0xb8, 0x1b, 0x57, 0x55, 0x6d, 0x6e, 0xdc, 0x41, 0x84, 0x63, 0xf9, 0x77, 0x6e, 0x73, 0x2a, 0xa3, 0xb2, 0xfa, 0xb8, 0x45, 0x20, 0xcb, 0x9b, 0x1b, 0x21, 0xdb, 0x1a, 0x43, 0xf7, 0xc4, 0xce, 0xda, 0xc3, 0x24, 0x8e, 0x31, 0x76, 0x7a, 0x85, 0xef, 0x45, 0xca, 0xbf, 0xdc, 0xbc, 0x71, 0xaf, 0x1c, 0x40, 0x2c, 0xc3, 0x56, 0x5e, 0x9f, 0x18, 0x92, 0xee, 0x98, 0x3a, 0xe3, 0xd4, 0x71, 0xe5, 0x53, 0x5e, 0xe8, 0xf7, 0x8b, 0x25, 0xc3, 0x94, 0xfb, 0x98, 0xc6, 0x9d, 0x15, 0x3d, 0xd8, 0xcf, 0xd9, 0x85, 0xb8, 0xd5, 0x80, 0x9d, 0x15, 0xe7, 0xfa, 0x61, 0xaa, 0x26, 0x71, 0x58, 0x4b, 0xb3, 0x63, 0x27, 0x31, 0xa0, 0xa8, 0xbb, 0x19, 0x88, 0x05, 0xbe, 0x2a, 0xc1, 0x8f, 0x0e, 0x60, 0x63, 0x14, 0xd3, 0xa2, 0xa4, 0x68, 0xf6, 0xb4, 0x69, 0xdd, 0x5f, 0x77, 0xff, 0x96, 0x5f, 0x91, 0x04, 0xba, 0xe4, 0x4e, 0x72, 0x53, 0x52, 0xf3, 0x3b, 0x9c, 0xca, 0x51, 0xf8, 0x82, 0x60, 0xe5, 0x99, 0x85, 0xad, 0xf9, 0xa8, 0x8d, 0x25, 0xcb, 0x6d, 0xc2, 0x0c, 0x32, 0x2b, 0x89, 0xa9, 0xbe, 0xc0, 0x06, 0xdf, 0x96, 0x64, 0xdc, 0xa9, 0x46, 0xbb, 0x8c, 0xa5, 0x98, 0xfe, 0xf5, 0x9b, 0x26, 0xbf, 0x43, 0xb8, 0x0b, 0x43, 0x3f, 0x26, 0xdf, 0xf1, 0x36, 0x7f, 0xf5, 0x43, 0x47, 0x50, 0xd0, 0xab, 0x9b, 0xb8, 0x61, 0x67, 0xb3, 0xf5, 0xf3, 0xf7, 0x75, 0x2a, 0x3c, 0xfe, 0x8d, 0x8f, 0x3a, 0x55, 0x05, 0x4d, 0xbb, 0x02, 0x59, 0xce, 0xde, 0x2a, 0x4b, 0xd4, 0x81, 0xb4, 0x8d, 0xcf, 0xf4, 0xa9, 0x37, 0x5f, 0xf5, 0xfa, 0xdc, 0xc8, 0x03, 0x9f, 0x5e, 0xfe, 0x57, 0x82, 0xf2, 0x59, 0x6f, 0xaf, 0x92, 0x0b, 0x67, 0x72, 0xd4, 0x79, 0xb6, 0xa9, 0xde, 0xa4, 0x8d, 0x7b, 0xc5, 0xa8, 0x09, 0xa8, 0xe4, 0x70, 0x2c, 0xbe, 0x07, 0x33, 0x11, 0xd7, 0xff, 0xe4, 0x4f, 0x55, 0xb1, 0x21, 0xba, 0x2b, 0x1e, 0x7a, 0x1c, 0x6e, 0x5b, 0x16, 0xcd, 0x0d, 0xe7, 0x9b, 0x2e, 0xdd, 0xfa, 0xbb, 0xf8, 0x92, 0x6e, 0x23, 0x4d, 0xbf, 0xac, 0x9e, 0x3a, 0xcf, 0x16, 0xc8, 0x1a, 0x9c, 0xea, 0x90, 0x2c, 0x36, 0x92, 0x31, 0xb4, 0xd2, 0xdf, 0xde, 0x36, 0x8c, 0x28, 0xd3, 0xb4, 0x0e, 0x8f, 0x2e, 0x86, 0x92, 0x4e, 0x49, 0xfb, 0xb3, 0xf8, 0xd4, 0x46, 0x77, 0x78, 0x2f, 0xfa, 0xf5, 0x11, 0x00, 0xa8, 0xa2, 0xc5, 0xd3, 0x25, 0x53, 0x67, 0x00, 0xf2, 0xe3, 0x61, 0xe4, 0x2b, 0xb8, 0xf3, 0x89, 0x13, 0x54, 0x08, 0x4a, 0x43, 0xa6, 0xe4, 0xea, 0xdb, 0x02, 0xf0, 0xdd, 0xc7, 0x41, 0x02, 0x99, 0x8a, 0x9c, 0x76, 0xf5, 0xe8, 0xf2, 0x4c, 0x79, 0x33, 0xa0, 0x4f, 0xbd, 0x02, 0x3d, 0x75, 0x59, 0x96, 0xb4, 0xa1, 0xd6, 0x60, 0xb3, 0xad, 0x8b, 0xe7, 0x15, 0xc4, 0x74, 0x31, 0xdb, 0xe0, 0x38, 0xb3, 0xd4, 0x8c, 0x53, 0x3a, 0xdd, 0xe5, 0xf3, 0x49, 0xcf, 0xbf, 0x66, 0x93, 0x05, 0x10, 0xe5, 0x6d, 0x57, 0x96, 0x7e, 0xce, 0x99, 0xb3, 0x3d, 0x0a, 0xf8, 0x34, 0xa9, 0xdd, 0x6e, 0x1f, 0x60, 0x16, 0xa9, 0x35, 0x17, 0xb4, 0x0a, 0x10, 0x8b, 0x54, 0xe5, 0x20, 0x0d, 0x70, 0xf9, 0x8f, 0xac, 0x89, 0x04, 0x75, 0xb5, 0xbe, 0x58, 0xc5, 0x46, 0xf4, 0x37, 0x5f, 0xc8, 0x8c, 0x58, 0xfa, 0x93, 0x26, 0x13, 0xf9, 0xad, 0xc0, 0xfe, 0x13, 0x06, 0x11, 0x93, 0x9e, 0xef, 0xaf, 0xf5, 0x7f, 0x5b, 0xbd, 0x45, 0x32, 0xe1, 0x53, 0xbc, 0x94, 0x93, 0x31, 0x36, 0x66, 0x3a, 0x37, 0x8e, 0xcf, 0x91, 0xdd, 0xde, 0x65, 0x2b, 0x69, 0x66, 0x9b, 0x58, 0x97, 0x0e, 0x1d, 0x80, 0xb3, 0xc8, 0xca, 0xdb, 0x15, 0x90, 0x90, 0x23, 0xa1, 0x90, 0x7a, 0x30, 0xed, 0x31, 0x86, 0xca, 0x09, 0x09, 0x2a, 0x32, 0xf1, 0x49, 0xc4, 0xc8, 0x8e, 0x5a, 0x2f, 0x2d, 0xde, 0xf7, 0xba, 0xd8, 0x61, 0x3f, 0xfe, 0xce, 0x46, 0xd8, 0x54, 0x02, 0x1a, 0x95, 0xa4, 0xfd, 0xc6, 0x6d, 0xdb, 0x26, 0xe3, 0xc5, 0xca, 0x92, 0x23, 0x6e, 0xd4, 0x51, 0x10, 0xfc, 0xb9, 0x35, 0x01, 0xf1, 0x7f, 0x01, 0xdc, 0x66, 0x28, 0xef, 0x06, 0x09, 0x4d, 0xbe, 0xf0, 0x60, 0x70, 0x7a, 0x1c, 0xc6, 0xd1, 0xb0, 0xa0, 0xc9, 0xd4, 0xfc, 0x0a, 0x58, 0x4e, 0x6a, 0x6e, 0x63, 0xf8, 0x17, 0x10, 0x0e, 0x9b, 0x64, 0x76, 0x17, 0xe3, 0x22, 0x50, 0x93, 0xa1, 0xb3, 0xce, 0xb3, 0xf2, 0xb3, 0xc7, 0xe8, 0x09, 0xa8, 0xbb, 0x6d, 0x7d, 0xea, 0x68, 0x76, 0xd8, 0xa1, 0x61, 0xaa, 0xc1, 0x4f, 0x34, 0x02, 0x66, 0xf5, 0xb8, 0xe7, 0x46, 0x93, 0x58, 0xb6, 0x26, 0xda, 0x3a, 0x1c, 0xda, 0x63, 0x38, 0xce, 0xe0, 0x55, 0x26, 0x5a, 0x15, 0xda, 0xd6, 0x2a, 0xa1, 0xb6, 0xf7, 0x60, 0x1f, 0xa9, 0x41, 0x87, 0x18, 0xe2, 0xf1, 0x0c, 0x05, 0x2f, 0x1d, 0xc6, 0x07, 0xc9, 0x53, 0x9b, 0x97, 0x18, 0x6a, 0xbe, 0x0e, 0x40, 0xf3, 0x6a, 0xb4, 0xb0, 0x61, 0x5d, 0xde, 0x1e, 0xaf, 0xc0, 0x0d, 0xdd, 0xe2, 0x9c, 0xb5, 0xca, 0x3b, 0xaf, 0x1c, 0x31, 0xd3, 0x90, 0x69, 0x4d, 0x07, 0x99, 0x05, 0xf0, 0x5e, 0x26, 0x08, 0xa4, 0xb7, 0xdd, 0x81, 0x9d, 0x85, 0x55, 0xe8, 0x93, 0x6c, 0xba, 0x27, 0x0d, 0x26, 0x3a, 0x63, 0xd9, 0x2c, 0x4c, 0x9d, 0x03, 0xe2, 0x58, 0x3b, 0xc5, 0x48, 0x60, 0x31, 0x90, 0x81, 0x82, 0x07, 0x7b, 0xaf, 0x33, 0x5b, 0x85, 0xe6, 0xe0, 0x8d, 0x15, 0x5c, 0x69, 0x7a, 0xd8, 0x27, 0x4b, 0xb1, 0x69, 0xfd, 0x8e, 0x9a, 0x9b, 0x87, 0xbd, 0xac, 0xdc, 0xde, 0xf0, 0x39, 0x88, 0xa1, 0x74, 0x01, 0x40, 0x55, 0x33, 0x16, 0x6e, 0xbb, 0xbb, 0xb2, 0x27, 0x9a, 0x21, 0x86, 0xef, 0xeb, 0xc6, 0xab, 0x1f, 0x98, 0xa4, 0xbf, 0x9d, 0x2a, 0x32, 0x68, 0x44, 0x50, 0x9e, 0xb0, 0x32, 0x46, 0xd6, 0x75, 0x38, 0x78, 0xb4, 0xd8, 0x43, 0xaf, 0xe2, 0x27, 0xd5, 0x90, 0xd8, 0x47, 0xbe, 0xdb, 0xd3, 0x0f, 0x2e, 0xbc, 0x5d, 0xea, 0x29, 0x98, 0xb0, 0xee, 0x0d, 0x10, 0x7b, 0xbb, 0x20, 0x01, 0x22, 0xd0, 0xc4, 0x3b, 0xec, 0xdf, 0x62, 0x83, 0xaa, 0xb6, 0x9a, 0xce, 0xaf, 0x57, 0xec, 0x81, 0xa4, 0x7f, 0x8b }, + .ds_message = { 0xd7, 0xa5, 0x4c, 0x4e, 0x2b, 0xfc, 0x3d, 0x04, 0x8d, 0xfd, 0x5f, 0xb8, 0xa4, 0x1a, 0x2c, 0xe1, 0x5d, 0xc4, 0x7d, 0xcb, 0x9e, 0x7a, 0x83, 0xc5, 0x95, 0x45, 0xac, 0x6d, 0xd3, 0xa4, 0x6a, 0x10, 0x0d, 0x00, 0xb5, 0x60, 0x52, 0x72, 0xb9, 0x6e, 0x11, 0x11, 0x3a, 0x43, 0x2b, 0xb5, 0xd2, 0x9f, 0x3f, 0x7b, 0x3a, 0x90, 0xae, 0xa0, 0x01, 0x48, 0xd5, 0x8c, 0x6f, 0xbb, 0xbc, 0x04, 0xcd, 0xb7, 0x19, 0x8d, 0x2f, 0x61, 0x0d, 0xba, 0xb9, 0x01, 0xc5, 0x76, 0x2e, 0x04, 0x9b, 0x32, 0x79, 0x76, 0x48, 0x4e, 0xd9, 0x61, 0xaa, 0x35, 0xd0, 0xb2, 0xe9, 0xf1, 0x8c, 0xfd, 0x13, 0x1d, 0x1e, 0x2e, 0x2b, 0xcf, 0x57, 0xbf, 0x14, 0x09, 0xa3, 0xbf, 0x82, 0x1a, 0xea, 0xd7, 0x09, 0x1d, 0x27, 0x72, 0x3a, 0xdf, 0x0f, 0x9d, 0x1e, 0xbb, 0x67, 0xb8, 0xc7, 0xe4, 0xdf, 0x7d, 0x49, 0x12, 0x93, 0x82, 0x4c, 0xea, 0xcd, 0x58, 0x42, 0xb6, 0x81, 0xbf, 0xbd, 0x4e, 0x56, 0xd5, 0xc0, 0x9f, 0x84, 0x15, 0xca, 0x1b, 0xae, 0xe0, 0xd4, 0xfa, 0xd7, 0xbb, 0x44, 0x09, 0xdd, 0x80, 0x83, 0x21, 0x30, 0xa4, 0x98, 0x8a, 0x5e, 0xe8, 0x1a, 0x57, 0xda, 0x45, 0x0d, 0x40, 0xe9, 0xfd, 0x0f, 0x87, 0x04, 0x07, 0x61, 0xc9, 0x98, 0x22, 0x05, 0xec, 0x56, 0x92, 0xe3, 0xea, 0xfc, 0x32, 0xe8, 0x3d, 0x96, 0xed, 0xa1, 0x51, 0x58, 0x8d, 0x5a, 0x9e, 0x13, 0xfc, 0x24, 0x36, 0xa1, 0x05, 0x94, 0x93, 0x6d, 0x05, 0x60, 0x66, 0xad, 0x3d, 0xec, 0x2d, 0x50, 0xfa, 0x3c, 0xa4, 0x6c, 0x3b, 0x91, 0x32, 0x29, 0xd6, 0xf9, 0x21, 0x7a, 0xdb, 0xa0, 0x5d, 0x34, 0xbc, 0x9a, 0xbe, 0xb5, 0xf9, 0x99, 0xd5, 0xa0, 0x65, 0xa1, 0xb9, 0xba, 0x2f, 0x20, 0x08, 0x3b, 0xc6, 0x86, 0xc0, 0xd5, 0x5e, 0xdd, 0x59, 0x15, 0xc2, 0x29, 0x5c, 0x35, 0xa8, 0x87, 0x92, 0xfe, 0x97, 0x75, 0x96, 0x90, 0x9e, 0x9c, 0x63, 0x75, 0xaf, 0xde, 0x97, 0xba, 0xf2, 0xad, 0x6f, 0x69, 0x9b, 0x9a, 0x0c, 0xbd, 0x20, 0xc8, 0x44, 0x6f, 0x49, 0x34, 0x90, 0x6e, 0x6b, 0x47, 0xd7, 0x79, 0x38, 0xfb, 0x14, 0x85, 0xf5, 0xc3, 0xda, 0xbc, 0x08, 0x8d, 0x81, 0x2c, 0x65, 0x9b, 0x55, 0x37, 0x9f, 0x10, 0x5a, 0xef, 0xf7, 0x92, 0x4c, 0x90, 0x32, 0xb5, 0x10, 0x2e, 0xb9, 0xfa, 0x4c, 0xb5, 0xbd, 0x6d, 0x70, 0x05, 0xad, 0xe4, 0x89, 0x63, 0x89, 0x7c, 0xe0, 0xce, 0xca, 0x7f, 0x81, 0x5c, 0xcc, 0xfd, 0x80, 0xa9, 0xc3, 0xb6, 0x1b, 0xd3, 0x5c, 0x15, 0x62, 0x0c, 0xeb, 0x91, 0x5b, 0x5c, 0x3e, 0xcd, 0x90, 0x85, 0xc2, 0x24, 0x19, 0x8a, 0xb1, 0x57, 0xa1, 0xe0, 0x4c, 0x9d, 0x0d, 0x7d, 0xed, 0x9b, 0x96, 0x03, 0xda, 0x92, 0x06, 0x24, 0x8b }, + .ds_encrypted_input_params = { 0xf4, 0xd5, 0xc6, 0x4b, 0x55, 0xb6, 0x7b, 0xa2, 0xd7, 0x73, 0x24, 0x24, 0x8b, 0xb3, 0xc5, 0xf3, 0x46, 0xb5, 0xdc, 0x09, 0xe5, 0xf0, 0xf5, 0x00, 0xdb, 0xd5, 0x18, 0x06, 0x37, 0x13, 0xbb, 0xc3, 0x94, 0xa4, 0x64, 0x13, 0x88, 0x45, 0x2c, 0x3b, 0xc0, 0x7e, 0x4c, 0xd9, 0x6a, 0x75, 0xe8, 0x9d, 0x05, 0x5c, 0x18, 0x72, 0x33, 0x0f, 0x85, 0x8b, 0xa9, 0x6f, 0x30, 0xa4, 0x0e, 0x4a, 0x82, 0xce, 0xc4, 0x39, 0x5a, 0xd8, 0x62, 0xb4, 0x8e, 0xa3, 0x43, 0x7c, 0xb2, 0xec, 0x36, 0x93, 0xc7, 0x70, 0x34, 0x52, 0x52, 0xf6, 0x68, 0xca, 0x3b, 0x42, 0x98, 0xca, 0x8a, 0xf3, 0x48, 0x66, 0x42, 0x23, 0x24, 0xef, 0x6a, 0x8f, 0x78, 0x31, 0xab, 0x1b, 0x52, 0x91, 0xe6, 0x8f, 0x05, 0xd0, 0x5f, 0x96, 0x92, 0x09, 0xf3, 0xcc, 0x0f, 0xff, 0x9d, 0x8e, 0x05, 0x8c, 0xa6, 0x88, 0x88, 0x0d, 0xb3, 0xe6, 0xa6, 0x99, 0x54, 0x36, 0x06, 0x10, 0xc3, 0xe4, 0xf9, 0xb0, 0xfb, 0x20, 0x9d, 0x7c, 0x6c, 0xc1, 0xa8, 0x57, 0xf4, 0xfa, 0x20, 0xfc, 0x22, 0x49, 0xdd, 0x7d, 0xbf, 0xc8, 0xe7, 0x95, 0x8d, 0xb1, 0x25, 0x4d, 0xd6, 0xd8, 0x0f, 0xa0, 0x7c, 0x4a, 0x03, 0xeb, 0x49, 0x8e, 0x82, 0x91, 0x31, 0x6b, 0x8e, 0xfe, 0xc7, 0xce, 0x18, 0xa2, 0x98, 0xd9, 0xa2, 0xe4, 0xa3, 0x85, 0x37, 0x17, 0xad, 0x5c, 0x8e, 0x13, 0xef, 0xbe, 0xf5, 0x7c, 0x66, 0x95, 0xff, 0x0b, 0xb4, 0x05, 0x99, 0xf2, 0x78, 0xa5, 0x8c, 0xec, 0x94, 0xd5, 0xd2, 0x11, 0xf5, 0x1f, 0xb8, 0xcf, 0x16, 0x07, 0x6a, 0xe9, 0x8d, 0x2e, 0x67, 0x8c, 0x0b, 0xa3, 0x45, 0xad, 0xfb, 0xd8, 0xa0, 0xd7, 0x47, 0x1d, 0x35, 0x9f, 0x42, 0x22, 0xc1, 0x2a, 0xfb, 0x70, 0xbb, 0x29, 0xbe, 0x96, 0x06, 0x7d, 0x8a, 0x07, 0x34, 0x86, 0x28, 0xa5, 0xf8, 0xbd, 0x92, 0x0d, 0x8e, 0xbf, 0xd9, 0x7e, 0x97, 0x13, 0x1f, 0x1c, 0xa1, 0xd8, 0xb3, 0xd6, 0x88, 0x8f, 0xa4, 0x77, 0x76, 0x53, 0x85, 0x64, 0x0f, 0x08, 0x72, 0x17, 0xa8, 0x9d, 0x0f, 0xae, 0x90, 0x93, 0x6a, 0x40, 0xb4, 0xe5, 0x8b, 0x5e, 0x2e, 0x05, 0x16, 0x0f, 0x5c, 0x55, 0xb9, 0x7e, 0x0a, 0x04, 0x98, 0xa7, 0xe2, 0xb5, 0xdd, 0x6b, 0x80, 0xc7, 0x65, 0xff, 0xfb, 0x6e, 0x5e, 0xbe, 0x4c, 0xe6, 0x7f, 0x28, 0xe6, 0x75, 0xe6, 0x59, 0x83, 0x24, 0xa9, 0x2a, 0x99, 0x9d, 0xef, 0x29, 0x43, 0x84, 0x12, 0xb3, 0x39, 0xd7, 0x51, 0x52, 0x0b, 0x65, 0x26, 0x21, 0x1c, 0x94, 0x0f, 0xcc, 0x1d, 0x50, 0x68, 0x8d, 0x76, 0xfc, 0x70, 0x98, 0xb5, 0x4f, 0x19, 0x0a, 0xad, 0x0b, 0xd5, 0x5c, 0x20, 0xa4, 0xb9, 0xc1, 0x40, 0xbe, 0x9e, 0x10, 0xa2, 0xf6, 0x49, 0xed, 0xf7, 0xb0, 0x37, 0x7b, 0x48, 0x10, 0xfb, 0xf0, 0x24, 0x3b, 0xa9, 0x9f, 0xf5, 0xee, 0xa5, 0xb5, 0x5b, 0xa0, 0xac, 0xbf, 0x1f, 0xe7, 0x0f, 0x91, 0x47, 0xbc, 0xe0, 0xe9, 0xe8, 0x3e, 0xef, 0x55, 0x8e, 0xaa, 0xdb, 0xab, 0x5f, 0xee, 0x64, 0x16, 0x77, 0xb4, 0xb2, 0x28, 0xf7, 0xdb, 0xd8, 0xc5, 0x1d, 0x36, 0x1e, 0x6b, 0x54, 0x57, 0xca, 0x7c, 0x5d, 0x68, 0xc4, 0x5b, 0x66, 0x5d, 0x39, 0xe5, 0x30, 0x8f, 0xbb, 0xb2, 0x08, 0x7a, 0xfd, 0xa9, 0x78, 0xec, 0xb3, 0x81, 0xe4, 0xf6, 0x7d, 0xb3, 0xfb, 0xd3, 0x58, 0x5d, 0xd9, 0x0a, 0x6e, 0xc8, 0xc1, 0xb6, 0xaf, 0x2e, 0xac, 0x4a, 0xe1, 0xc3, 0x44, 0x90, 0xa7, 0x37, 0xd9, 0xe7, 0xfe, 0xb3, 0xc8, 0xa9, 0x74, 0xfb, 0xd4, 0xd4, 0x80, 0xe2, 0xb5, 0xa7, 0x3b, 0x8b, 0x82, 0x31, 0x67, 0xe0, 0x1e, 0x56, 0x87, 0x94, 0x5e, 0xac, 0x09, 0x1c, 0x94, 0x3f, 0xf0, 0xda, 0xe3, 0x6f, 0xdd, 0xe3, 0x76, 0x7c, 0x1f, 0x77, 0x04, 0x1a, 0x14, 0x30, 0x85, 0x8b, 0x15, 0x4e, 0xb8, 0xed, 0x9c, 0x89, 0x6c, 0x52, 0x52, 0x69, 0x8c, 0x47, 0x75, 0x11, 0xb1, 0x87, 0x79, 0xe3, 0x3f, 0xe4, 0x3f, 0x34, 0x18, 0x8c, 0x9c, 0xc6, 0xe9, 0xb8, 0xc0, 0xcb, 0xf2, 0x79, 0xce, 0xa3, 0x0f, 0x1b, 0xb4, 0x05, 0xce, 0x0f, 0xac, 0x82, 0xdf, 0x7e, 0x2a, 0xab, 0xc8, 0x9b, 0x18, 0x9c, 0xfd, 0xc1, 0xee, 0x3f, 0x06, 0x0e, 0xba, 0x49, 0xcc, 0xd7, 0x0b, 0x85, 0x61, 0xe6, 0x62, 0x5a, 0x42, 0xf0, 0xc6, 0x0a, 0xb4, 0x56, 0x9f, 0x40, 0xf4, 0x7f, 0xc9, 0xc5, 0xa6, 0x3e, 0x35, 0x41, 0x67, 0x5f, 0x81, 0x4a, 0x24, 0x0c, 0xd2, 0x66, 0xab, 0x45, 0x33, 0xa3, 0xc6, 0x59, 0x0a, 0xe5, 0xf5, 0x29, 0x4c, 0x70, 0xef, 0x28, 0xd0, 0x7d, 0x97, 0x3e, 0x5a, 0xfc, 0xa6, 0xe2, 0xb0, 0x5b, 0xa7, 0x34, 0xb4, 0x39, 0xa7, 0xce, 0xbd, 0xa3, 0x75, 0xba, 0x53, 0x36, 0x81, 0x83, 0xe3, 0xd1, 0x87, 0x7e, 0xce, 0x92, 0x95, 0x47, 0xd3, 0x37, 0x9d, 0xc7, 0x0a, 0x82, 0xe9, 0x20, 0x07, 0xc7, 0x6d, 0x90, 0x73, 0xa7, 0xf3, 0x86, 0x59, 0xf2, 0x98, 0xd4, 0xb6, 0x79, 0xa7, 0x79, 0x52, 0x7c, 0xb0, 0xe2, 0x27, 0x0a, 0xc7, 0xef, 0x96, 0xf9, 0x3f, 0x31, 0xd1, 0x4b, 0x4c, 0x66, 0x98, 0xd1, 0x21, 0xf2, 0xd7, 0xe4, 0x42, 0x81, 0x8d, 0x7a, 0xe5, 0x91, 0x9d, 0x15, 0x7b, 0x7c, 0x02, 0x25, 0x9c, 0x2c, 0xb5, 0x90, 0x9d, 0x17, 0xad, 0xb3, 0x7f, 0x44, 0x5b, 0x9e, 0x1f, 0x37, 0x9b, 0xbe, 0x55, 0x38, 0x9c, 0x67, 0xba, 0x6c, 0x98, 0xf9, 0x54, 0xc4, 0x36, 0xe0, 0xc8, 0x66, 0x48, 0x65, 0x63, 0x40, 0x92, 0x6e, 0xc6, 0x52, 0x91, 0xbe, 0xc3, 0x10, 0x81, 0x16, 0xd6, 0x25, 0x70, 0x0b, 0x9d, 0x45, 0xee, 0x99, 0x48, 0x2c, 0x5f, 0x83, 0xba, 0x97, 0xde, 0xef, 0x39, 0x69, 0xd2, 0xfd, 0xac, 0x78, 0xa7, 0xfc, 0xd7, 0x3d, 0x07, 0x0a, 0x8c, 0xc4, 0x04, 0x54, 0xbd, 0xc0, 0x74, 0x8d, 0xdc, 0x5a, 0x94, 0x2e, 0xf2, 0x98, 0x07, 0x9c, 0x8b, 0x64, 0x55, 0x65, 0xa0, 0xe0, 0x8b, 0x73, 0xbd, 0x43, 0x99, 0xa0, 0x0c, 0xca, 0x7d, 0xf6, 0x09, 0x35, 0x5e, 0xb4, 0x3d, 0x9e, 0x53, 0xfc, 0x86, 0x87, 0x42, 0xf8, 0xf6, 0x72, 0xcd, 0x04, 0xcf, 0xfd, 0xda, 0xc2, 0xdb, 0xe4, 0x46, 0x3a, 0xba, 0x12, 0x4f, 0x31, 0x27, 0x4b, 0xd2, 0xf1, 0xb9, 0x84, 0x5b, 0xde, 0x52, 0xf0, 0xf0, 0x30, 0xea, 0x9d, 0x34, 0x27, 0x8c, 0x6e, 0x24, 0x4b, 0x98, 0xad, 0xf1, 0x1a, 0x2b, 0xf9, 0x86, 0xe6, 0x99, 0x70, 0x11, 0x93, 0xd7, 0x3f, 0xbc, 0xf7, 0x54, 0xca, 0x5c, 0x0f, 0x93, 0xf3, 0x2d, 0xf5, 0x68, 0x94, 0x87, 0x25, 0xe6, 0x99, 0xfb, 0x85, 0x5c, 0xad, 0x03, 0x9c, 0x29, 0x04, 0x42, 0xcd, 0x0a, 0xdd, 0x6d, 0x98, 0x7b, 0x5f, 0xd0, 0xca, 0x3f, 0x15, 0x51, 0x52, 0x5c, 0x86, 0x9f, 0x0d, 0xb3, 0xd2, 0xc6, 0xc4, 0xec, 0x24, 0xa7, 0x7b, 0x44, 0xe2, 0xd7, 0x39, 0xe5, 0xf4, 0xa2, 0xfc, 0xa0, 0xad, 0xf0, 0x6a, 0xc4, 0x18, 0x74, 0x84, 0xed, 0x49, 0x51, 0x96, 0xc5, 0x7b, 0x09, 0x47, 0xe5, 0xdf, 0x9f, 0x1a, 0xa3, 0xb6, 0x5d, 0xee, 0xf8, 0x3a, 0xd3, 0x83, 0x54, 0xd3, 0xf1, 0xeb, 0xbd, 0x0e, 0x25, 0x57, 0xdb, 0xdd, 0x2d, 0x99, 0xa4, 0xdd, 0x1c, 0xe1, 0xf5, 0xf8, 0x05, 0xcc, 0x6e, 0x39, 0x69, 0xc3, 0x68, 0xee, 0x3f, 0xfd, 0x2e, 0x0a, 0xc0, 0x87, 0xcf, 0x32, 0xce, 0xc3, 0x2c, 0x1d, 0x96, 0x8d, 0x21, 0xef, 0xfe, 0x0c, 0xdc, 0xe5, 0x21, 0xa6, 0x40, 0xfb, 0xa6, 0x55, 0x93, 0x94, 0xe8, 0x56, 0x23, 0x17, 0x25, 0x63, 0xf7, 0x7f, 0x7f, 0x6f, 0xc4, 0xf6, 0xc8, 0x74, 0x90, 0x14, 0x77, 0x22, 0x94, 0x43, 0xb5, 0x1f, 0xf7, 0x80, 0x00, 0x84, 0x73, 0x2f, 0x3a, 0xdb, 0x5b, 0xdd, 0x5f, 0xae, 0xf8, 0x06, 0x3a, 0xe1, 0x95, 0x79, 0x2b, 0xa5, 0x89, 0xde, 0x8a, 0x5f, 0x1a, 0xad, 0xfa, 0x08, 0x85, 0x6d, 0x5e, 0x99, 0x9f, 0x47, 0x6d, 0xcb, 0xa2, 0xf8, 0xcb, 0x6c, 0x21, 0x07, 0xc5, 0x3a, 0x5b, 0x38, 0xe1, 0x50, 0x3a, 0xeb, 0xe3, 0xcd, 0xc7, 0x07, 0x9c, 0xa3, 0xb4, 0xa2, 0xb2, 0x4f, 0x65, 0x0a, 0xb3, 0xb7, 0xb3, 0x17, 0x57, 0x46, 0x4d, 0xbb, 0xf1, 0xea, 0x1c, 0x6b, 0x2b, 0x18, 0x01, 0x33, 0x45, 0x8f, 0xaf, 0xb4, 0xca, 0xa6, 0x00, 0x7a, 0xc1, 0xb2, 0xf3, 0xa2, 0xa5, 0x7b, 0x67, 0xdc, 0xe8, 0xab, 0xcc, 0xd9, 0x8e, 0x3a, 0x62, 0x33, 0x14, 0xe1, 0xcf, 0xee, 0x13, 0xc7, 0x11, 0x6e, 0xbd, 0xd8, 0xd3, 0x00, 0x31, 0xff, 0xbb, 0x7f, 0x82, 0x9f, 0x29, 0x3d, 0x33, 0x00, 0x25, 0x6b, 0x43, 0x47, 0x0d, 0x6c, 0x60, 0xba, 0x0e, 0xbb, 0xcd, 0xcc, 0xa0, 0x98, 0x3c, 0x5b, 0xf8, 0x5c, 0x89, 0x27, 0x3d, 0xec, 0xa0, 0x6a, 0xcf, 0xae, 0x25, 0xac }, .ds_key_size = 3072, - .ds_result = { 0x23, 0x54, 0x4f, 0x7e, 0x5b, 0x54, 0x6f, 0xef, 0xc9, 0x9b, 0xb6, 0x35, 0x14, 0xe1, 0xeb, 0x58, 0xf8, 0x7d, 0x0a, 0x94, 0x24, 0x42, 0x87, 0xf0, 0x4a, 0x46, 0xb9, 0xe2, 0x85, 0xb3, 0x79, 0xed, 0x18, 0x66, 0xa5, 0x34, 0x56, 0x48, 0xd8, 0x42, 0x92, 0x06, 0xaf, 0x32, 0xd4, 0xc5, 0xf3, 0x4f, 0x12, 0x40, 0xec, 0x65, 0xe7, 0x8c, 0x9e, 0x5c, 0xd7, 0xb8, 0x69, 0x8d, 0x7a, 0x6c, 0xa0, 0x0d, 0x6f, 0x6b, 0xe8, 0xe1, 0xee, 0x39, 0xad, 0xc5, 0x40, 0x8e, 0x36, 0xd6, 0x45, 0xbe, 0x20, 0xd5, 0x7d, 0x01, 0xa6, 0x1d, 0x21, 0xe8, 0x3a, 0x79, 0x8c, 0x69, 0xc6, 0x93, 0x84, 0x7a, 0xd4, 0x55, 0xaf, 0x65, 0x0e, 0x6e, 0x37, 0xe7, 0x4b, 0x3a, 0xf3, 0x39, 0x11, 0xb5, 0xb4, 0xf8, 0x8d, 0x36, 0x91, 0xc8, 0xc8, 0x63, 0x86, 0xc5, 0x1f, 0x86, 0x65, 0x12, 0xf4, 0x73, 0x65, 0x35, 0x71, 0x53, 0x8f, 0xa4, 0x6c, 0x86, 0xb8, 0xbd, 0xb7, 0x05, 0x6f, 0x64, 0x3b, 0xc7, 0x63, 0x40, 0x5a, 0xb4, 0x09, 0xf5, 0xaa, 0x10, 0xf2, 0xab, 0x4c, 0x2f, 0xdb, 0x78, 0xb3, 0x2c, 0x00, 0x99, 0x99, 0xdc, 0xee, 0x4f, 0xdc, 0x95, 0xfe, 0x25, 0x10, 0x0e, 0x01, 0xcf, 0x98, 0x7e, 0x20, 0xe4, 0x75, 0xb9, 0x63, 0x88, 0x53, 0x3c, 0xd7, 0x65, 0xef, 0xb6, 0xe9, 0x92, 0x0e, 0x1e, 0x43, 0x0f, 0xa9, 0x74, 0x2f, 0xa1, 0xa0, 0xf5, 0xd5, 0x29, 0xaa, 0xc9, 0x08, 0xf2, 0x42, 0x19, 0x49, 0x47, 0x1e, 0x28, 0xc4, 0x31, 0xc0, 0x82, 0x5d, 0x9a, 0x43, 0x8a, 0x6e, 0x7d, 0xc5, 0x51, 0xa1, 0xee, 0xd3, 0xdc, 0x0b, 0x50, 0x69, 0x2f, 0xe8, 0x3b, 0xe9, 0xbf, 0x88, 0x04, 0x9f, 0x55, 0x18, 0xf8, 0xc2, 0x68, 0x7f, 0x98, 0xdc, 0x1b, 0x75, 0x27, 0x6a, 0x95, 0xbc, 0xc6, 0x13, 0xeb, 0xfa, 0xa6, 0x73, 0x9c, 0x92, 0xc1, 0xf6, 0xd7, 0x96, 0x87, 0x19, 0x0c, 0xc1, 0x97, 0x8a, 0x12, 0x05, 0x8f, 0x71, 0xce, 0xa0, 0x9b, 0x17, 0x08, 0x1a, 0x71, 0xfb, 0x7f, 0x49, 0x32, 0x69, 0x7f, 0x86, 0x94, 0x42, 0x8f, 0x47, 0x68, 0x1d, 0x61, 0x6f, 0x11, 0x82, 0x76, 0x25, 0xbe, 0x20, 0xd4, 0xa5, 0xcb, 0xa7, 0x63, 0xae, 0x3b, 0x55, 0x8a, 0xf8, 0xb1, 0x54, 0xe2, 0x97, 0xd0, 0x6b, 0xa5, 0x01, 0x75, 0xe3, 0xa6, 0x1b, 0xe0, 0xfb, 0xb4, 0xba, 0x67, 0xf4, 0xca, 0xcb, 0xd1, 0xb1, 0x4b, 0x2f, 0xdf, 0x51, 0x12, 0xe7, 0x1f, 0xcb, 0x5a, 0xd1, 0x75, 0x72, 0x25, 0x10, 0x5c, 0x72, 0x10, 0xb3, 0x01, 0x1b, 0xf8, 0xdc, 0xbe, 0xda, 0xcb, 0x6a, 0x88, 0xe3, 0xb2, 0xff, 0x47, 0xef, 0xb4, 0x4b, 0x3b, 0x9a, 0x01, 0x54, 0x20, 0x45, 0xda, 0xc3, 0xc0, 0x03, 0xed, 0x68, 0x51, 0xc9, 0x99, 0x3d, 0xff, 0x61, 0x91 }, + .ds_result = { 0x24, 0xca, 0x63, 0x34, 0x14, 0xc6, 0x0e, 0xa5, 0x2f, 0xee, 0xb9, 0xe5, 0x96, 0x1e, 0x48, 0x46, 0x0c, 0x34, 0x81, 0x68, 0x4d, 0x31, 0xbc, 0x42, 0xdb, 0xcb, 0x47, 0x08, 0x42, 0x7d, 0xf2, 0x1f, 0x5b, 0x8e, 0xbd, 0xa3, 0xe4, 0x66, 0x3a, 0x79, 0x35, 0x7a, 0xaa, 0xa9, 0x38, 0x29, 0xb4, 0x87, 0x61, 0x4c, 0xf6, 0xba, 0x14, 0xf1, 0xf8, 0xcd, 0xcd, 0xf8, 0x60, 0x24, 0x45, 0x9f, 0xcb, 0x83, 0x8e, 0xc1, 0xed, 0xee, 0x19, 0x5e, 0x6c, 0x19, 0xbc, 0x9c, 0xa6, 0xf0, 0xac, 0x97, 0x57, 0xba, 0x52, 0x55, 0x83, 0x5f, 0x78, 0x83, 0xe7, 0xb6, 0xfa, 0x91, 0x17, 0xee, 0x97, 0x74, 0x22, 0x12, 0x5b, 0xba, 0x07, 0xa0, 0x40, 0x0b, 0x47, 0x32, 0x9c, 0xdb, 0xdd, 0xa7, 0xcf, 0xeb, 0xb4, 0x00, 0x0f, 0x1d, 0x03, 0x27, 0xca, 0x6c, 0x30, 0x02, 0x82, 0xd4, 0xc9, 0xa4, 0x6f, 0x71, 0xa1, 0x88, 0x6e, 0x9f, 0xc3, 0xf8, 0xbc, 0xe8, 0xdb, 0xd8, 0xf2, 0xb1, 0x63, 0x10, 0x53, 0x50, 0xc2, 0xc8, 0x37, 0x28, 0xd5, 0xcf, 0x03, 0xe8, 0x9e, 0xdf, 0x2d, 0xb7, 0x28, 0x1f, 0xc3, 0xd8, 0xc4, 0xaf, 0xf3, 0xd6, 0x85, 0x86, 0xe5, 0x5d, 0xf3, 0x50, 0x27, 0xf7, 0x69, 0xbd, 0x99, 0xff, 0xde, 0x73, 0x6b, 0x6f, 0x43, 0xe8, 0xf2, 0xef, 0x66, 0xd3, 0x75, 0x53, 0x54, 0xb9, 0xe4, 0xeb, 0xfe, 0x46, 0xa9, 0x96, 0x03, 0xbc, 0x8a, 0x36, 0x69, 0xbe, 0x85, 0xec, 0xed, 0x4f, 0x5a, 0xc5, 0x10, 0xdb, 0xba, 0x20, 0x76, 0x63, 0xff, 0x10, 0x71, 0xcb, 0x56, 0x7e, 0x59, 0xe6, 0x01, 0x5f, 0x61, 0x92, 0xe8, 0xb2, 0x8f, 0x14, 0x42, 0xc5, 0x82, 0x9f, 0x5d, 0x9b, 0x65, 0xfc, 0x91, 0xcc, 0xfa, 0xc4, 0xaf, 0xd0, 0xf0, 0x58, 0xe7, 0x78, 0x9d, 0xaf, 0x02, 0xab, 0x34, 0xc8, 0x05, 0x1f, 0x13, 0x57, 0x03, 0x2f, 0x2a, 0xef, 0x86, 0x93, 0x7a, 0xfa, 0xfa, 0x44, 0x57, 0x37, 0x55, 0x30, 0xdb, 0x0c, 0x6d, 0x1a, 0x26, 0x06, 0x93, 0x07, 0x5b, 0xd5, 0x4d, 0xf0, 0xd2, 0xaa, 0x8e, 0xa7, 0x63, 0x91, 0x55, 0xfc, 0x72, 0xb7, 0x69, 0xd0, 0x9e, 0x4c, 0xb4, 0x49, 0xd9, 0x09, 0xce, 0x4c, 0xef, 0xcc, 0x5d, 0xe3, 0x56, 0x85, 0x8e, 0xa3, 0x63, 0x0c, 0xbb, 0x3d, 0x76, 0xc3, 0x99, 0xf0, 0xd3, 0x48, 0xce, 0x4a, 0x32, 0x73, 0x1e, 0x0a, 0xfc, 0xfe, 0x1f, 0x83, 0x79, 0x41, 0x51, 0x31, 0xcf, 0xb9, 0x17, 0x30, 0xfb, 0x10, 0xfb, 0xfd, 0x8d, 0x70, 0x7e, 0xcc, 0xbf, 0x52, 0x00, 0x16, 0x6c, 0x96, 0xae, 0x6d, 0x95, 0x3a, 0x9d, 0xd2, 0x77, 0xba, 0x24, 0x08, 0x18, 0xe1, 0x7f, 0x12, 0x0d, 0x3e, 0xaf, 0xd3, 0xd5, 0xfe, 0x3b, 0x76, 0xe2, 0xe0, 0xea, 0x95, 0x24, 0x1f, 0x39, 0x0e, 0x94, 0x56 }, #endif - .ds_encrypted_input_params_iv = { 0x95, 0x65, 0x6e, 0x21, 0xdd, 0x34, 0xa4, 0x8d, 0x1f, 0x57, 0xb6, 0x82, 0x59, 0x78, 0x91, 0x71 }, + .ds_encrypted_input_params_iv = { 0x5b, 0x3d, 0xaa, 0xab, 0x53, 0xd4, 0xc3, 0xad, 0x34, 0x87, 0x2b, 0x16, 0xe6, 0x7e, 0x0b, 0x09 }, }, }; + +test_data_ecdh1_mode_t test_data_ecdh1_xts_aes_128 = { + .init_key = { 0xee, 0x89, 0x95, 0xda, 0x3c, 0x8a, 0x43, 0x83, 0xa9, 0x4b, 0x25, 0x5b, 0x04, 0x7e, 0xf1, 0x57, 0xb8, 0xe8, 0x06, 0x45, 0x87, 0x76, 0xee, 0x1b, 0x4e, 0x2e, 0x55, 0xa7, 0x1f, 0x25, 0xe1, 0x94 }, + .k2_info = { 0x8f, 0x96, 0x33, 0x47, 0xe1, 0xa5, 0x57, 0xe9, 0x2a, 0x51, 0xa9, 0xbe, 0x48, 0x84, 0x25, 0x4e, 0x6f, 0x50, 0x1c, 0x45, 0xdb, 0xb6, 0xfa, 0xeb, 0x35, 0xd2, 0x27, 0x91, 0x3f, 0x67, 0x57, 0xd9, 0xcb, 0x55, 0xe4, 0x2b, 0x18, 0x16, 0xe7, 0xce, 0x6c, 0xf2, 0x58, 0x71, 0x17, 0x76, 0x2a, 0x86, 0x05, 0xe7, 0x37, 0x45, 0x71, 0x34, 0xca, 0xaf, 0x60, 0x07, 0xdf, 0xf4, 0xd2, 0xee, 0x3d, 0x4b }, + .plaintext_data = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80 }, + .xts_test_data = { + {.data_size = 32, .data_offset = 0x160000, .ciphertext = {0x96, 0x93, 0x06, 0x97, 0x19, 0xd7, 0xa7, 0xd2, 0xe0, 0x36, 0x11, 0xeb, 0x74, 0x63, 0x48, 0xfb, 0xd5, 0x92, 0x23, 0xfb, 0x34, 0x00, 0xfd, 0x17, 0xbf, 0xb4, 0x8e, 0x11, 0x32, 0x52, 0x99, 0x29}}, + {.data_size = 64, .data_offset = 0x160100, .ciphertext = {0xaf, 0x1a, 0xcd, 0x9b, 0x2f, 0x74, 0x41, 0x2e, 0x83, 0x51, 0xaa, 0x73, 0x47, 0xcc, 0x88, 0x0c, 0x4c, 0x10, 0x7f, 0x34, 0x20, 0xa3, 0x35, 0xbf, 0x40, 0x60, 0xe0, 0x85, 0x7c, 0x02, 0x54, 0x45, 0x9c, 0x0a, 0x41, 0x49, 0xd1, 0x11, 0x40, 0x04, 0x68, 0x4d, 0xdc, 0x83, 0xf4, 0x25, 0xff, 0x19, 0x45, 0xf3, 0xae, 0x30, 0x29, 0x1c, 0xda, 0x05, 0xc4, 0x3f, 0x78, 0xda, 0x49, 0x86, 0xa9, 0xef}}, + {.data_size = 128, .data_offset = 0x160200, .ciphertext = {0x79, 0x57, 0x38, 0x0a, 0x9d, 0xa3, 0xa9, 0x98, 0x93, 0xc9, 0xef, 0xe8, 0x97, 0xdb, 0x1f, 0x6b, 0xfd, 0x73, 0xcd, 0x6b, 0x4e, 0x3b, 0x62, 0x14, 0x0d, 0xc7, 0x1d, 0xcb, 0x49, 0x16, 0x18, 0xf0, 0x05, 0xad, 0x73, 0x90, 0x8b, 0xb8, 0x38, 0x3f, 0xa4, 0x33, 0xc3, 0xe6, 0x33, 0xec, 0xcc, 0xc4, 0xac, 0xe1, 0xda, 0x5a, 0xf9, 0xe9, 0x29, 0x18, 0xf0, 0xdb, 0x64, 0x18, 0x35, 0x10, 0x27, 0xb2, 0xea, 0xda, 0x2d, 0xc5, 0x3b, 0x01, 0x3b, 0xd2, 0xcd, 0x91, 0xf2, 0xe2, 0x9d, 0xd5, 0x07, 0xc7, 0x1a, 0x3f, 0xae, 0xa6, 0xa6, 0x00, 0x88, 0xb3, 0xc0, 0x33, 0xf9, 0x1c, 0xd0, 0xf0, 0x0d, 0xe8, 0x47, 0x49, 0xbd, 0x49, 0x83, 0xb4, 0x2e, 0x80, 0xef, 0x3a, 0x74, 0x6c, 0x46, 0x3f, 0x91, 0xf2, 0xc2, 0x43, 0x73, 0x16, 0x52, 0x7a, 0xc0, 0x40, 0x9b, 0x05, 0xcb, 0xdc, 0xda, 0x44, 0xaf, 0xb7}}, + {.data_size = 16, .data_offset = 0x160300, .ciphertext = {0x0f, 0xdd, 0xdd, 0x4f, 0xa1, 0x69, 0x84, 0xaf, 0xf0, 0xd6, 0x47, 0x17, 0xfd, 0xab, 0xe0, 0xca}}, + {.data_size = 32, .data_offset = 0x160400, .ciphertext = {0x5c, 0x2a, 0x9b, 0x22, 0x37, 0xd9, 0xe3, 0xda, 0x79, 0x57, 0xc7, 0x8d, 0x9d, 0xcd, 0xee, 0x4f, 0xf5, 0xa5, 0x27, 0xa9, 0x22, 0xf4, 0xb0, 0xdc, 0x6c, 0xe6, 0x1a, 0x11, 0x5c, 0x0d, 0xe0, 0x76}}, + } +}; + +test_data_ecdh1_mode_t test_data_ecdh1_hmac = { + .init_key = { 0xee, 0x89, 0x95, 0xda, 0x3c, 0x8a, 0x43, 0x83, 0xa9, 0x4b, 0x25, 0x5b, 0x04, 0x7e, 0xf1, 0x57, 0xb8, 0xe8, 0x06, 0x45, 0x87, 0x76, 0xee, 0x1b, 0x4e, 0x2e, 0x55, 0xa7, 0x1f, 0x25, 0xe1, 0x94 }, + .k2_info = { 0x8f, 0x96, 0x33, 0x47, 0xe1, 0xa5, 0x57, 0xe9, 0x2a, 0x51, 0xa9, 0xbe, 0x48, 0x84, 0x25, 0x4e, 0x6f, 0x50, 0x1c, 0x45, 0xdb, 0xb6, 0xfa, 0xeb, 0x35, 0xd2, 0x27, 0x91, 0x3f, 0x67, 0x57, 0xd9, 0xcb, 0x55, 0xe4, 0x2b, 0x18, 0x16, 0xe7, 0xce, 0x6c, 0xf2, 0x58, 0x71, 0x17, 0x76, 0x2a, 0x86, 0x05, 0xe7, 0x37, 0x45, 0x71, 0x34, 0xca, 0xaf, 0x60, 0x07, 0xdf, 0xf4, 0xd2, 0xee, 0x3d, 0x4b }, + .hmac_test_data = { + .message = { 0x44, 0x65, 0x6c, 0x65, 0x6e, 0x69, 0x74, 0x69, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x70, 0x74, 0x61, 0x73, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6f, 0x20, 0x65, 0x74, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x2e, 0x20, 0x53, 0x65, 0x64, 0x20, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x20, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x20, 0x71, 0x75, 0x69, 0x73, 0x2e, 0x20, 0x50, 0x72, 0x61, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x75, 0x6d, 0x20, 0x63, 0x75, 0x70, 0x69, 0x64, 0x69, 0x74, 0x61, 0x74, 0x65, 0x20, 0x71, 0x75, 0x69, 0x61, 0x20, 0x6e, 0x65, 0x6d, 0x6f, 0x20, 0x65, 0x73, 0x74, 0x2e, 0x20, 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x69, 0x6f, 0x73, 0x61, 0x6d, 0x20, 0x70, 0x61, 0x72, 0x69, 0x61, 0x74, 0x75, 0x72, 0x20, 0x75, 0x74, 0x20, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x20, 0x74, 0x65, 0x6e, 0x65, 0x74, 0x75, 0x72, 0x2e, 0x20, 0x53, 0x75, 0x6e, 0x74, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x20, 0x69, 0x75, 0x72, 0x65, 0x20, 0x61, 0x73, 0x70, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x20, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x61, 0x20, 0x75, 0x74, 0x20, 0x72, 0x65, 0x63, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x61, 0x65, 0x2e, 0x20, 0x55, 0x74, 0x20, 0x71, 0x75, 0x69, 0x62, 0x75, 0x73, 0x64, 0x61, 0x6d, 0x20, 0x6f, 0x63, 0x63, 0x61, 0x65, 0x63, 0x61, 0x74, 0x69, 0x20, 0x75, 0x74, 0x20, 0x71, 0x75, 0x69, 0x20, 0x73, 0x69, 0x74, 0x20, 0x64, 0x69, 0x67, 0x6e, 0x69, 0x73, 0x73, 0x69, 0x6d, 0x6f, 0x73, 0x20, 0x65, 0x61, 0x71, 0x75, 0x65, 0x2e, 0x2e }, + .hmac_result = { 0xe0, 0x52, 0x62, 0xe3, 0x80, 0x5d, 0xb8, 0x57, 0x17, 0x83, 0xa4, 0xac, 0x82, 0xf0, 0x44, 0x33, 0xdb, 0xf4, 0x07, 0xa7, 0x60, 0x86, 0xef, 0xd6, 0x90, 0xdb, 0x25, 0x37, 0xae, 0x15, 0xe4, 0x43 } + } +}; + +test_data_ecdh1_mode_t test_data_ecdh1_ecdsa = { + .init_key = { 0xee, 0x89, 0x95, 0xda, 0x3c, 0x8a, 0x43, 0x83, 0xa9, 0x4b, 0x25, 0x5b, 0x04, 0x7e, 0xf1, 0x57, 0xb8, 0xe8, 0x06, 0x45, 0x87, 0x76, 0xee, 0x1b, 0x4e, 0x2e, 0x55, 0xa7, 0x1f, 0x25, 0xe1, 0x94 }, + .k2_info = { 0x8f, 0x96, 0x33, 0x47, 0xe1, 0xa5, 0x57, 0xe9, 0x2a, 0x51, 0xa9, 0xbe, 0x48, 0x84, 0x25, 0x4e, 0x6f, 0x50, 0x1c, 0x45, 0xdb, 0xb6, 0xfa, 0xeb, 0x35, 0xd2, 0x27, 0x91, 0x3f, 0x67, 0x57, 0xd9, 0xcb, 0x55, 0xe4, 0x2b, 0x18, 0x16, 0xe7, 0xce, 0x6c, 0xf2, 0x58, 0x71, 0x17, 0x76, 0x2a, 0x86, 0x05, 0xe7, 0x37, 0x45, 0x71, 0x34, 0xca, 0xaf, 0x60, 0x07, 0xdf, 0xf4, 0xd2, 0xee, 0x3d, 0x4b }, + .ecdsa_test_data = { + .ecdsa_p256_pubx = { 0xb9, 0x8a, 0xcb, 0xa6, 0x27, 0x61, 0xa8, 0x40, 0x7b, 0xac, 0x3e, 0x92, 0xe3, 0x10, 0x01, 0xad, 0x01, 0x7e, 0xc4, 0x08, 0xd3, 0xec, 0xe6, 0x68, 0x89, 0x40, 0xd0, 0x75, 0x41, 0x2a, 0xd5, 0x3a }, + .ecdsa_p256_puby = { 0x54, 0xc5, 0x39, 0x5b, 0x4e, 0x4c, 0x46, 0x74, 0xa1, 0xa7, 0xd4, 0x78, 0x0b, 0xf2, 0x28, 0xbf, 0x0e, 0x0c, 0xff, 0x55, 0x6e, 0x06, 0xb6, 0x46, 0xa9, 0xc5, 0x07, 0x4e, 0x56, 0x06, 0xbb, 0x1b }, + } +}; diff --git a/components/esp_hal_security/test_apps/crypto/main/key_manager/test_key_manager.c b/components/esp_hal_security/test_apps/crypto/main/key_manager/test_key_manager.c index 95c219cff58..0d0f20e653a 100644 --- a/components/esp_hal_security/test_apps/crypto/main/key_manager/test_key_manager.c +++ b/components/esp_hal_security/test_apps/crypto/main/key_manager/test_key_manager.c @@ -506,6 +506,118 @@ static void key_mgr_test_ds_aes_mode(void) } #endif /* SOC_KEY_MANAGER_DS_KEY_DEPLOY */ +/* ---- ECDH1 deployment helpers ---- + * + * Per-key-type test vectors (k2_info, init_key, expected XTS ciphertext / + * HMAC result / ECDSA-P256 pubkey) are precomputed off-device by + * gen_key_manager_test_cases.py against the same committed k1_64.bin / + * k2.bin / init_key.bin / rand_num.bin used by the AES-mode and ECDH0 + * tests, and emitted as test_data_ecdh1_xts_aes_128 / test_data_ecdh1_hmac + * / test_data_ecdh1_ecdsa instances of test_data_aes_mode_t. That lets the + * AES-mode per-peripheral verifiers (test_xts_aes_key_aes_mode, + * key_mgr_test_hmac_key_aes_mode, test_ecdsa_key_aes_mode) compare HW + * output bitwise against the precomputed expected values without any + * on-device key-derivation. k1*G (the ECDH input the user supplies) is + * shared with the ECDH0 tests via test_data_ecdh0.k1_G[0]. */ + +#if SOC_KEY_MANAGER_HMAC_KEY_DEPLOY +static void key_mgr_test_hmac_ecdh1_mode(void) +{ + static esp_key_mgr_ecdh1_key_config_t key_config; + memcpy(key_config.k2_info, (uint8_t*) test_data_ecdh1_hmac.k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config.k1_G[0], (uint8_t*) test_data_ecdh0.k1_G[0], KEY_MGR_ECDH0_INFO_SIZE); + memcpy(key_config.sw_init_key, (uint8_t*) test_data_ecdh1_hmac.init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config.use_pre_generated_sw_init_key = 1; + key_config.key_type = ESP_KEY_MGR_HMAC_KEY; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh1_mode(&key_config, &key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + + uint8_t hw_mac[32] = { 0 }; + TEST_ASSERT_EQUAL(ESP_OK, hmac_calculate(HMAC_KEY_KM, + test_data_ecdh1_hmac.hmac_test_data.message, + sizeof(test_data_ecdh1_hmac.hmac_test_data.message), + hw_mac)); + TEST_ASSERT_EQUAL_HEX8_ARRAY(test_data_ecdh1_hmac.hmac_test_data.hmac_result, + hw_mac, sizeof(hw_mac)); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} +#endif /* SOC_KEY_MANAGER_HMAC_KEY_DEPLOY */ + +#if SOC_KEY_MANAGER_FE_KEY_DEPLOY && SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_128 +/* Common XTS-AES verify body. Used by both the AES-mode and ECDH1-mode XTS + * tests, which carry their own struct types but share the same plaintext + + * expected-ciphertext layout. */ +static void verify_xts_aes_test_data(const uint8_t *plaintext_data, + const test_xts_data_t *xts_test_data) +{ + const esp_partition_t *partition = get_test_storage_partition(); + ESP_ERROR_CHECK(esp_partition_erase_range(partition, 0, partition->size)); + + uint8_t read_data[128]; + for (int i = 0; i < TEST_COUNT; i++) { + memset(read_data, 0, sizeof(read_data)); + uint32_t address = xts_test_data[i].data_offset; + uint32_t data_size = xts_test_data[i].data_size; + + ESP_ERROR_CHECK(esp_flash_write_encrypted(NULL, address, plaintext_data, data_size)); + ESP_ERROR_CHECK(esp_flash_read(NULL, read_data, address, data_size)); + + TEST_ASSERT_EQUAL_HEX8_ARRAY(xts_test_data[i].ciphertext, read_data, data_size); + } +} + +static void key_mgr_test_xts_aes_128_ecdh1_mode(void) +{ + static esp_key_mgr_ecdh1_key_config_t key_config; + memcpy(key_config.k2_info, (uint8_t*) test_data_ecdh1_xts_aes_128.k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config.k1_G[0], (uint8_t*) test_data_ecdh0.k1_G[0], KEY_MGR_ECDH0_INFO_SIZE); + memcpy(key_config.sw_init_key, (uint8_t*) test_data_ecdh1_xts_aes_128.init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config.use_pre_generated_sw_init_key = 1; + key_config.key_type = ESP_KEY_MGR_FLASH_XTS_AES_KEY; + key_config.key_len = ESP_KEY_MGR_XTS_AES_LEN_128; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh1_mode(&key_config, &key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + verify_xts_aes_test_data(test_data_ecdh1_xts_aes_128.plaintext_data, + test_data_ecdh1_xts_aes_128.xts_test_data); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} +#endif /* SOC_KEY_MANAGER_FE_KEY_DEPLOY && SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_128 */ + +#if SOC_KEY_MANAGER_ECDSA_KEY_DEPLOY +static void key_mgr_test_ecdsa_p256_ecdh1_mode(void) +{ + static esp_key_mgr_ecdh1_key_config_t key_config; + memcpy(key_config.k2_info, (uint8_t*) test_data_ecdh1_ecdsa.k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config.k1_G[0], (uint8_t*) test_data_ecdh0.k1_G[0], KEY_MGR_ECDH0_INFO_SIZE); + memcpy(key_config.sw_init_key, (uint8_t*) test_data_ecdh1_ecdsa.init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config.use_pre_generated_sw_init_key = 1; + key_config.key_type = ESP_KEY_MGR_ECDSA_KEY; + key_config.key_len = ESP_KEY_MGR_ECDSA_LEN_256; + + static esp_key_mgr_key_recovery_info_t key_recovery_info; + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh1_mode(&key_config, &key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(&key_recovery_info)); + +#if SOC_ECDSA_SUPPORT_DETERMINISTIC_MODE + test_ecdsa_key_aes_mode(ECDSA_CURVE_SECP256R1, sha_digest, + test_data_ecdh1_ecdsa.ecdsa_test_data.ecdsa_p256_pubx, + test_data_ecdh1_ecdsa.ecdsa_test_data.ecdsa_p256_puby, + ECDSA_K_TYPE_DETERMINISITIC); +#endif + test_ecdsa_key_aes_mode(ECDSA_CURVE_SECP256R1, sha_digest, + test_data_ecdh1_ecdsa.ecdsa_test_data.ecdsa_p256_pubx, + test_data_ecdh1_ecdsa.ecdsa_test_data.ecdsa_p256_puby, + ECDSA_K_TYPE_TRNG); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info.key_type)); +} +#endif /* SOC_KEY_MANAGER_ECDSA_KEY_DEPLOY */ + TEST_GROUP(key_manager); TEST_SETUP(key_manager) @@ -535,6 +647,11 @@ TEST(key_manager, xts_key_128_ecdh0_deployment) key_mgr_test_xts_aes_128_ecdh0_mode(); } +TEST(key_manager, xts_key_128_ecdh1_deployment) +{ + key_mgr_test_xts_aes_128_ecdh1_mode(); +} + #if CONFIG_CRYPTO_TEST_APP_ENABLE_FPGA_TESTS TEST(key_manager, xts_key_128_random_deployment) { @@ -597,6 +714,11 @@ TEST(key_manager, ecdsa_p256_key_ecdh0_deployment) key_mgr_test_ecdsa_key_ecdh0_mode(ESP_KEY_MGR_ECDSA_LEN_256); } +TEST(key_manager, ecdsa_p256_key_ecdh1_deployment) +{ + key_mgr_test_ecdsa_p256_ecdh1_mode(); +} + TEST(key_manager, ecdsa_p256_key_random_deployment) { key_mgr_test_ecdsa_key_random_mode(ESP_KEY_MGR_ECDSA_LEN_256); @@ -631,6 +753,11 @@ TEST(key_manager, hmac_key_ecdh0_deployment) key_mgr_test_hmac_ecdh0_mode(); } +TEST(key_manager, hmac_key_ecdh1_deployment) +{ + key_mgr_test_hmac_ecdh1_mode(); +} + TEST(key_manager, hmac_key_random_deployment) { key_mgr_test_hmac_random_mode(); @@ -650,6 +777,7 @@ TEST_GROUP_RUNNER(key_manager) #if SOC_KEY_MANAGER_FE_KEY_DEPLOY_XTS_AES_128 RUN_TEST_CASE(key_manager, xts_aes_128_key_aes_deployment); RUN_TEST_CASE(key_manager, xts_key_128_ecdh0_deployment); + RUN_TEST_CASE(key_manager, xts_key_128_ecdh1_deployment); #if CONFIG_CRYPTO_TEST_APP_ENABLE_FPGA_TESTS // This tests expects Flash encryption to be enabled as the test compares the decrypted flash data with the plaintext data RUN_TEST_CASE(key_manager, xts_key_128_random_deployment); @@ -672,6 +800,7 @@ TEST_GROUP_RUNNER(key_manager) RUN_TEST_CASE(key_manager, ecdsa_p256_key_aes_deployment); RUN_TEST_CASE(key_manager, ecdsa_p256_key_ecdh0_deployment); + RUN_TEST_CASE(key_manager, ecdsa_p256_key_ecdh1_deployment); RUN_TEST_CASE(key_manager, ecdsa_p256_key_random_deployment); #if SOC_ECDSA_SUPPORT_CURVE_P384 @@ -684,6 +813,7 @@ TEST_GROUP_RUNNER(key_manager) #if SOC_KEY_MANAGER_HMAC_KEY_DEPLOY RUN_TEST_CASE(key_manager, hmac_key_aes_deployment); RUN_TEST_CASE(key_manager, hmac_key_ecdh0_deployment); + RUN_TEST_CASE(key_manager, hmac_key_ecdh1_deployment); RUN_TEST_CASE(key_manager, hmac_key_random_deployment); #endif /* SOC_KEY_MANAGER_HMAC_KEY_DEPLOY */ diff --git a/components/esp_security/include/esp_key_mgr.h b/components/esp_security/include/esp_key_mgr.h index f54b7cdd33c..72d31163ceb 100644 --- a/components/esp_security/include/esp_key_mgr.h +++ b/components/esp_security/include/esp_key_mgr.h @@ -58,6 +58,24 @@ typedef struct { WORD_ALIGNED_ATTR uint8_t k1_G[2][KEY_MGR_ECDH0_INFO_SIZE]; /*!< K1*G points for ECDH0 deployment */ } esp_key_mgr_ecdh0_key_config_t; +/** + * @brief Configuration for deploying a key in ECDH1 mode + * + * ECDH1 requires the same init_key/k2_info inputs as AES mode plus the + * ECDH k1*G public point(s). Unlike ECDH0, k2*G is computed by the user + * locally and is not read back from the Key Manager. + */ +typedef struct { + esp_key_mgr_key_type_t key_type; /*!< Type of key to deploy */ + esp_key_mgr_key_len_t key_len; /*!< Length of the key */ + bool use_pre_generated_huk_info; /*!< Use pre-generated HUK info if true */ + bool use_pre_generated_sw_init_key; /*!< Use pre-generated software init key if true */ + WORD_ALIGNED_ATTR esp_key_mgr_huk_info_t huk_info; /*!< HUK recovery info */ + WORD_ALIGNED_ATTR uint8_t sw_init_key[KEY_MGR_SW_INIT_KEY_SIZE]; /*!< Software init key */ + WORD_ALIGNED_ATTR uint8_t k2_info[KEY_MGR_K2_INFO_SIZE]; /*!< K2 info for ECDH1 deployment */ + WORD_ALIGNED_ATTR uint8_t k1_G[2][KEY_MGR_ECDH0_INFO_SIZE]; /*!< K1*G points for ECDH1 deployment */ +} esp_key_mgr_ecdh1_key_config_t; + /** * @brief Configuration for deploying a key in Random mode */ @@ -110,6 +128,18 @@ esp_err_t esp_key_mgr_deploy_key_in_aes_mode(const esp_key_mgr_aes_key_config_t */ esp_err_t esp_key_mgr_deploy_key_in_ecdh0_mode(const esp_key_mgr_ecdh0_key_config_t *key_config, esp_key_mgr_key_recovery_info_t *key_info, esp_key_mgr_ecdh0_info_t *ecdh0_key_info); +/** + * @brief Deploy key in ECDH1 deployment mode + * + * @param[in] key_config ECDH1 key configuration + * @param[out] key_info A writable struct of esp_key_mgr_key_recovery_info_t type. + * The recovery key info for the deployed key shall be stored here. + * @return + * - ESP_OK on success + * - ESP_FAIL or relevant error code on failure + */ +esp_err_t esp_key_mgr_deploy_key_in_ecdh1_mode(const esp_key_mgr_ecdh1_key_config_t *key_config, esp_key_mgr_key_recovery_info_t *key_info); + /** * @brief Deploy key in Random deployment mode * diff --git a/components/esp_security/src/esp_key_mgr.c b/components/esp_security/src/esp_key_mgr.c index 405d456d638..914d9b61db6 100644 --- a/components/esp_security/src/esp_key_mgr.c +++ b/components/esp_security/src/esp_key_mgr.c @@ -413,6 +413,10 @@ static esp_err_t key_mgr_deploy_key_aes_mode(aes_deploy_config_t *config) key_mgr_hal_read_public_info(key_recovery_info, KEY_MGR_KEY_RECOVERY_INFO_SIZE); + // Wait till Key Manager deployment is complete + key_mgr_hal_continue(); + key_mgr_wait_for_state(ESP_KEY_MGR_STATE_IDLE); + // Check if key deployment validation should be skipped for this purpose // Primary purposes in multi-stage deployments skip validation after the first stage // because the key is not yet completely deployed. @@ -424,10 +428,6 @@ static esp_err_t key_mgr_deploy_key_aes_mode(aes_deploy_config_t *config) } ESP_LOGD(TAG, "Key deployment valid"); - // Wait till Key Manager deployment is complete - key_mgr_hal_continue(); - key_mgr_wait_for_state(ESP_KEY_MGR_STATE_IDLE); - config->key_info->key_info[key_recovery_info_index].crc = esp_rom_crc32_le(0, key_recovery_info, KEY_MGR_KEY_RECOVERY_INFO_SIZE); config->key_info->key_type = key_type; config->key_info->key_len = key_len; @@ -695,6 +695,10 @@ static esp_err_t key_mgr_deploy_key_ecdh0_mode(ecdh0_deploy_config_t *config) key_mgr_hal_read_public_info(key_recovery_info, KEY_MGR_KEY_RECOVERY_INFO_SIZE); key_mgr_hal_read_assist_info(config->ecdh0_key_info); + // Wait till Key Manager deployment is complete + key_mgr_hal_continue(); + key_mgr_wait_for_state(ESP_KEY_MGR_STATE_IDLE); + // Check if key deployment validation should be skipped for this purpose // Primary purposes in multi-stage deployments skip validation after the first stage // because the key is not yet completely deployed. @@ -706,10 +710,6 @@ static esp_err_t key_mgr_deploy_key_ecdh0_mode(ecdh0_deploy_config_t *config) } ESP_LOGD(TAG, "Key deployment valid"); - // Wait till Key Manager deployment is complete - key_mgr_hal_continue(); - key_mgr_wait_for_state(ESP_KEY_MGR_STATE_IDLE); - config->key_info->key_info[key_recovery_info_index].crc = esp_rom_crc32_le(0, key_recovery_info, KEY_MGR_KEY_RECOVERY_INFO_SIZE); config->key_info->key_type = key_type; config->key_info->key_len = key_len; @@ -774,6 +774,155 @@ cleanup: return esp_ret; } +typedef struct ecdh1_deploy { + esp_key_mgr_key_purpose_t key_purpose; + const uint8_t *k1_G; + const esp_key_mgr_ecdh1_key_config_t *key_config; + esp_key_mgr_key_recovery_info_t *key_info; + bool huk_deployed; +} ecdh1_deploy_config_t; + +static esp_err_t key_mgr_deploy_key_ecdh1_mode(ecdh1_deploy_config_t *config) +{ + esp_err_t esp_ret = ESP_FAIL; + key_mgr_wait_for_state(ESP_KEY_MGR_STATE_IDLE); + + if ((!key_mgr_hal_is_huk_valid()) || (!config->huk_deployed)) { + huk_deploy_config_t huk_deploy_config = { + .use_pre_generated_huk_info = config->key_config->use_pre_generated_huk_info, + .pre_generated_huk_info = &config->key_config->huk_info, + .huk_recovery_info = &config->key_info->huk_info, + }; + + esp_ret = deploy_huk(&huk_deploy_config); + if (esp_ret != ESP_OK) { + return esp_ret; + } + + ESP_LOGD(TAG, "HUK deployed successfully"); + } + + uint8_t key_recovery_info_index = is_multi_stage_key_purpose(config->key_purpose) ? 0 : 1; + + uint8_t *key_recovery_info = config->key_info->key_info[key_recovery_info_index].info; + + // Step 1: Initialization + key_mgr_hal_set_key_generator_mode(ESP_KEY_MGR_KEYGEN_MODE_ECDH1); + + key_mgr_hal_set_key_purpose(config->key_purpose); + + esp_key_mgr_key_type_t key_type = config->key_config->key_type; + esp_key_mgr_key_len_t key_len = config->key_config->key_len; + + if (key_type == ESP_KEY_MGR_FLASH_XTS_AES_KEY || key_type == ESP_KEY_MGR_PSRAM_XTS_AES_KEY) { + key_mgr_hal_set_xts_aes_key_len(key_type, key_len); + } + + if (config->key_config->use_pre_generated_sw_init_key) { + key_mgr_hal_use_sw_init_key(); + } else if (!esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_KM_INIT_KEY, NULL)) { + ESP_LOGE(TAG, "Could not find key with purpose KM_INIT_KEY"); + return ESP_FAIL; + } + + key_mgr_hal_start(); + + // Step 2: Load phase + key_mgr_wait_for_state(ESP_KEY_MGR_STATE_LOAD); + + if (config->key_config->use_pre_generated_sw_init_key) { + key_mgr_hal_write_sw_init_key(config->key_config->sw_init_key, KEY_MGR_SW_INIT_KEY_SIZE); + } + + ESP_LOGD(TAG, "Writing Information into Key Manager Registers"); + key_mgr_hal_write_assist_info(config->key_config->k2_info, KEY_MGR_K2_INFO_SIZE); + + key_mgr_hal_write_public_info(config->k1_G, KEY_MGR_ECDH0_INFO_SIZE); + + key_mgr_hal_continue(); + + // Step 3: Gain phase + key_mgr_wait_for_state(ESP_KEY_MGR_STATE_GAIN); + + key_mgr_hal_read_public_info(key_recovery_info, KEY_MGR_KEY_RECOVERY_INFO_SIZE); + + // Wait till Key Manager deployment is complete + key_mgr_hal_continue(); + key_mgr_wait_for_state(ESP_KEY_MGR_STATE_IDLE); + + // Check if key deployment validation should be skipped for this purpose + // Primary purposes in multi-stage deployments skip validation after the first stage + // because the key is not yet completely deployed. + if (!is_multi_stage_key_purpose(config->key_purpose)) { + if (!key_mgr_hal_is_key_deployment_valid(key_type, key_len)) { + ESP_LOGE(TAG, "Key deployment is not valid"); + return ESP_FAIL; + } + } + ESP_LOGD(TAG, "Key deployment valid"); + + config->key_info->key_info[key_recovery_info_index].crc = esp_rom_crc32_le(0, key_recovery_info, KEY_MGR_KEY_RECOVERY_INFO_SIZE); + config->key_info->key_type = key_type; + config->key_info->key_len = key_len; + config->key_info->key_deployment_mode = ESP_KEY_MGR_KEYGEN_MODE_ECDH1; + config->key_info->magic = KEY_HUK_SECTOR_MAGIC; + + return ESP_OK; +} + +esp_err_t esp_key_mgr_deploy_key_in_ecdh1_mode(const esp_key_mgr_ecdh1_key_config_t *key_config, + esp_key_mgr_key_recovery_info_t *key_info) +{ + if (!key_mgr_ll_is_supported()) { + return ESP_ERR_NOT_SUPPORTED; + } + + if (key_config == NULL || key_info == NULL) { + return ESP_ERR_INVALID_ARG; + } + + ESP_LOGD(TAG, "Key Deployment in ECDH1 mode"); + + ecdh1_deploy_config_t ecdh1_deploy_config = { + .key_config = key_config, + .key_info = key_info, + .k1_G = key_config->k1_G[0], + }; + + ecdh1_deploy_config.key_purpose = get_key_purpose(key_config->key_type, key_config->key_len); + if (ecdh1_deploy_config.key_purpose == ESP_KEY_MGR_KEY_PURPOSE_INVALID) { + ESP_LOGE(TAG, "Invalid key type"); + return ESP_ERR_INVALID_ARG; + } + + esp_key_mgr_acquire_hardware(true); + + esp_err_t esp_ret = key_mgr_deploy_key_ecdh1_mode(&ecdh1_deploy_config); + if (esp_ret != ESP_OK) { + ESP_LOGE(TAG, "Key deployment in ECDH1 mode failed"); + goto cleanup; + } + + ecdh1_deploy_config.huk_deployed = true; + + if (is_multi_stage_key_purpose(ecdh1_deploy_config.key_purpose)) { + ecdh1_deploy_config.key_purpose = get_secondary_key_purpose(ecdh1_deploy_config.key_purpose); + ecdh1_deploy_config.k1_G = key_config->k1_G[1]; + esp_ret = key_mgr_deploy_key_ecdh1_mode(&ecdh1_deploy_config); + if (esp_ret != ESP_OK) { + ESP_LOGE(TAG, "Key deployment in ECDH1 mode failed"); + goto cleanup; + } + } + + // Set the Key Manager Static Register to use own key for the respective key type + key_mgr_hal_set_key_usage(key_config->key_type, ESP_KEY_MGR_USE_OWN_KEY); + +cleanup: + esp_key_mgr_release_hardware(true); + return esp_ret; +} + typedef struct random_deploy { esp_key_mgr_key_purpose_t key_purpose; const esp_key_mgr_random_key_config_t *key_config; @@ -829,6 +978,10 @@ static esp_err_t key_mgr_deploy_key_random_mode(random_deploy_config_t *config) key_mgr_wait_for_state(ESP_KEY_MGR_STATE_GAIN); key_mgr_hal_read_public_info(key_recovery_info, KEY_MGR_KEY_RECOVERY_INFO_SIZE); + // Wait till Key Manager deployment is complete + key_mgr_hal_continue(); + key_mgr_wait_for_state(ESP_KEY_MGR_STATE_IDLE); + // Check if key deployment validation should be skipped for this purpose // Primary purposes in multi-stage deployments skip validation after the first stage // because the key is not yet completely deployed. @@ -840,10 +993,6 @@ static esp_err_t key_mgr_deploy_key_random_mode(random_deploy_config_t *config) } ESP_LOGD(TAG, "Key deployment valid"); - // Wait till Key Manager deployment is complete - key_mgr_hal_continue(); - key_mgr_wait_for_state(ESP_KEY_MGR_STATE_IDLE); - config->key_info->key_info[key_recovery_info_index].crc = esp_rom_crc32_le(0, key_recovery_info, KEY_MGR_KEY_RECOVERY_INFO_SIZE); config->key_info->key_type = key_type; config->key_info->key_len = key_len; diff --git a/components/esp_security/test_apps/crypto_drivers/main/test_key_mgr.c b/components/esp_security/test_apps/crypto_drivers/main/test_key_mgr.c index d516fd8a58a..c0da022b817 100644 --- a/components/esp_security/test_apps/crypto_drivers/main/test_key_mgr.c +++ b/components/esp_security/test_apps/crypto_drivers/main/test_key_mgr.c @@ -226,6 +226,36 @@ TEST_CASE("Key Manager Random mode: XTS-AES-128 key deployment", "[hw_crypto] [k free(key_config); free(key_recovery_info); } + +TEST_CASE("Key Manager ECDH1 mode: XTS-AES-128 key deployment", "[hw_crypto] [key_mgr]") +{ + SKIP_IF_KEY_MGR_NOT_SUPPORTED(); + + esp_key_mgr_ecdh1_key_config_t *key_config = calloc(1, sizeof(esp_key_mgr_ecdh1_key_config_t)); + TEST_ASSERT_NOT_NULL(key_config); + + memcpy(key_config->k2_info, (uint8_t*) k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config->k1_G[0], (uint8_t*) k1_G, KEY_MGR_ECDH0_INFO_SIZE); + memcpy(key_config->sw_init_key, (uint8_t*) init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config->use_pre_generated_sw_init_key = 1; + key_config->key_type = ESP_KEY_MGR_FLASH_XTS_AES_KEY; + key_config->key_len = ESP_KEY_MGR_XTS_AES_LEN_128; + + esp_key_mgr_key_recovery_info_t *key_recovery_info = calloc(1, sizeof(esp_key_mgr_key_recovery_info_t)); + TEST_ASSERT_NOT_NULL(key_recovery_info); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh1_mode(key_config, key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(key_recovery_info)); + /* verify=false: same convention as the ECDH0 case above. The expected + * ciphertext IS derivable (k2 = AES_DEC(k2_info, init_key); deployed key + * = x(k1*k2*G)) but this app doesn't carry the off-device ECC code. + * Bitwise verification lives in the HAL crypto test app. */ + TEST_ASSERT_EQUAL(ESP_OK, test_xts_aes_key(false)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info->key_type)); + + free(key_config); + free(key_recovery_info); +} #endif /* SOC_KEY_MANAGER_FE_KEY_DEPLOY */ #if SOC_KEY_MANAGER_ECDSA_KEY_DEPLOY @@ -333,6 +363,31 @@ TEST_CASE("Key Manager random mode: HMAC key deployment", "[hw_crypto] [key_mgr] free(key_config); free(key_recovery_info); } + +TEST_CASE("Key Manager ECDH1 mode: HMAC key deployment", "[hw_crypto] [key_mgr]") +{ + SKIP_IF_KEY_MGR_NOT_SUPPORTED(); + + esp_key_mgr_ecdh1_key_config_t *key_config = calloc(1, sizeof(esp_key_mgr_ecdh1_key_config_t)); + TEST_ASSERT_NOT_NULL(key_config); + + memcpy(key_config->k2_info, (uint8_t*) k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config->k1_G[0], (uint8_t*) k1_G, KEY_MGR_ECDH0_INFO_SIZE); + memcpy(key_config->sw_init_key, (uint8_t*) init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config->use_pre_generated_sw_init_key = 1; + key_config->key_type = ESP_KEY_MGR_HMAC_KEY; + + esp_key_mgr_key_recovery_info_t *key_recovery_info = calloc(1, sizeof(esp_key_mgr_key_recovery_info_t)); + TEST_ASSERT_NOT_NULL(key_recovery_info); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh1_mode(key_config, key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, test_hmac_key(false)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info->key_type)); + + free(key_config); + free(key_recovery_info); +} #endif /* SOC_KEY_MANAGER_HMAC_KEY_DEPLOY */ #if SOC_KEY_MANAGER_DS_KEY_DEPLOY @@ -434,5 +489,33 @@ TEST_CASE("Key Manager random mode: DS key deployment", "[hw_crypto] [key_mgr]") free(key_config); free(key_recovery_info); } + +TEST_CASE("Key Manager ECDH1 mode: DS key deployment", "[hw_crypto] [key_mgr]") +{ + SKIP_IF_KEY_MGR_NOT_SUPPORTED(); + + esp_key_mgr_ecdh1_key_config_t *key_config = calloc(1, sizeof(esp_key_mgr_ecdh1_key_config_t)); + TEST_ASSERT_NOT_NULL(key_config); + + memcpy(key_config->k2_info, (uint8_t*) k2_info, KEY_MGR_K2_INFO_SIZE); + memcpy(key_config->k1_G[0], (uint8_t*) k1_G, KEY_MGR_ECDH0_INFO_SIZE); + memcpy(key_config->sw_init_key, (uint8_t*) init_key, KEY_MGR_SW_INIT_KEY_SIZE); + key_config->use_pre_generated_sw_init_key = 1; + key_config->key_type = ESP_KEY_MGR_DS_KEY; + + esp_key_mgr_key_recovery_info_t *key_recovery_info = calloc(1, sizeof(esp_key_mgr_key_recovery_info_t)); + TEST_ASSERT_NOT_NULL(key_recovery_info); + + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deploy_key_in_ecdh1_mode(key_config, key_recovery_info)); + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_activate_key(key_recovery_info)); + // Deploy/activate path coverage only. The deployed AES-CBC key for DS + // is x(k1*k2*G); pre-generating the encrypted DS input params would + // require running that key derivation plus the DS-blob AES-CBC step + // off-device, neither of which this app carries. + TEST_ASSERT_EQUAL(ESP_OK, esp_key_mgr_deactivate_key(key_recovery_info->key_type)); + + free(key_config); + free(key_recovery_info); +} #endif /* SOC_KEY_MANAGER_DS_KEY_DEPLOY */ #endif /* SOC_KEY_MANAGER_SUPPORTED */ diff --git a/docs/en/api-reference/peripherals/key_manager.rst b/docs/en/api-reference/peripherals/key_manager.rst index 47c4c89ada4..f3821a62e73 100644 --- a/docs/en/api-reference/peripherals/key_manager.rst +++ b/docs/en/api-reference/peripherals/key_manager.rst @@ -108,16 +108,16 @@ In this mode, a private key is negotiated using Elliptic Curve Diffie-Hellman (E - The deployment process can occur over an untrusted channel. - Intended for high-security provisioning environments. -For detailed information various deployment modes, see **{IDF_TARGET_NAME} Technical Reference Manual** > **Chapter Key Manager** [`PDF <{IDF_TARGET_TRM_EN_URL}>`__] > **Section Key Manager**. +ECDH1 Deploy Mode +^^^^^^^^^^^^^^^^^ -.. ECDH1 Deploy Mode -.. ~~~~~~~~~~~~~~~~~ -.. -.. This mode is similar to ECDH0 Deploy Mode, with additional flexibility for manufacturing workflows. -.. -.. - Supports negotiated key deployment using auxiliary recovery data -.. - Allows updating deployed keys by replacing auxiliary information -.. - Intended for large-scale manufacturing with controlled trust assumptions +This mode is similar to ECDH0 Deploy Mode, with additional flexibility for manufacturing workflows. + +- Supports negotiated key deployment using auxiliary recovery data +- Allows updating deployed keys by replacing auxiliary information +- Intended for large-scale manufacturing with controlled trust assumptions + +For detailed information various deployment modes, see **{IDF_TARGET_NAME} Technical Reference Manual** > **Chapter Key Manager** [`PDF <{IDF_TARGET_TRM_EN_URL}>`__] > **Section Key Manager**. Typical Workflows ----------------- diff --git a/docs/zh_CN/api-reference/peripherals/key_manager.rst b/docs/zh_CN/api-reference/peripherals/key_manager.rst index 7623bec4528..da59ba32f98 100644 --- a/docs/zh_CN/api-reference/peripherals/key_manager.rst +++ b/docs/zh_CN/api-reference/peripherals/key_manager.rst @@ -108,16 +108,16 @@ ECDH0 部署模式 - 部署过程可以通过不受信任的信道进行。 - 适用于高安全性的配置环境。 -有关各种部署模式的详细信息,请参阅 **《{IDF_TARGET_NAME} 技术参考手册》** > **密钥管理器章节** [`PDF <{IDF_TARGET_TRM_EN_URL}>`__] > **密钥管理器小节**。 +ECDH1 部署模式 +^^^^^^^^^^^^^^ -.. ECDH1 Deploy Mode -.. ~~~~~~~~~~~~~~~~~ -.. -.. This mode is similar to ECDH0 Deploy Mode, with additional flexibility for manufacturing workflows. -.. -.. - Supports negotiated key deployment using auxiliary recovery data -.. - Allows updating deployed keys by replacing auxiliary information -.. - Intended for large-scale manufacturing with controlled trust assumptions +此模式类似于 ECDH0 部署模式,但为生产配置流程提供了额外的灵活性。 + +- 支持使用辅助恢复数据进行协商的密钥部署。 +- 允许通过替换辅助信息来更新已部署的密钥。 +- 适用于具有受控信任假设的大规模生产场景。 + +有关各种部署模式的详细信息,请参阅 **《{IDF_TARGET_NAME} 技术参考手册》** > **密钥管理器章节** [`PDF <{IDF_TARGET_TRM_EN_URL}>`__] > **密钥管理器小节**。 典型工作流程 ------------