cryptnox-sdk-esp32 1.0.0
ESP32 SDK for Cryptnox Hardware Wallet
Loading...
Searching...
No Matches
test_cw_secure_channel.cpp File Reference
#include "unity.h"
#include "CW_SecureChannel.h"
#include "CW_Defs.h"
#include "CW_Utils.h"
#include "CW_Platform.h"
#include "esp32_crypto_provider.h"
#include <string.h>
#include <stdio.h>
Include dependency graph for test_cw_secure_channel.cpp:

Go to the source code of this file.

Classes

class  MockLogger
class  MockPlatform
struct  MockScriptEntry
class  ScriptedMockNfcTransport
class  ReflectiveMockNfcTransport

Macros

#define SC_AES_BLOCK_BYTES   (16U)
#define SC_AES_KEY_BYTES   (32U)
#define SC_EC_COORD_BYTES   (32U)
#define SC_EC_PUBKEY_BYTES   (64U)
#define SC_CERT_MARKER_BYTES   (1U)
#define SC_CERT_NONCE_BYTES   (8U)
#define SC_CERT_KEY65_BYTES   (65U)
#define SC_CERT_TOTAL_BYTES   (74U)
#define SC_CERT_KEY_OFFSET   (SC_CERT_MARKER_BYTES + SC_CERT_NONCE_BYTES)
#define SC_SW_BYTES   (2U)
#define SC_SELECT_RESP_BYTES   (26U)
#define SC_GET_CERT_RESP_BYTES   (148U)
#define SC_OPEN_SC_RESP_BYTES   (34U)
#define SC_MUTUAL_AUTH_RESP_BYTES   (66U)
#define SC_SALT_BYTES   (32U)
#define SC_IV_BYTES   (16U)
#define SC_SHA512_OUT_BYTES   (64U)
#define SC_APDU_HEADER_LEN   (4U)
#define SC_APDU_LC_OFFSET   (4U)
#define SC_APDU_MAC_OFFSET   (5U) /* header[4] + Lc[1] */
#define SC_APDU_MAC_BYTES   (16U)
#define SC_CARD_RESP_PAYLOAD_BYTES   (4U)
#define SC_CARD_RESP_TOTAL_BYTES   (SC_CARD_RESP_PAYLOAD_BYTES + SC_SW_BYTES)
#define MOCK_MAX_SCRIPTS   (8U)
#define MOCK_MAX_RESP_BYTES   (255U)
#define MOCK_UART_BAUD_RATE   (115200UL)

Functions

 TEST_CASE ("checkStatusWord: SW 0x9000 returns true", "[secure_channel]")
 TEST_CASE ("checkStatusWord: SW mismatch returns false", "[secure_channel]")
 TEST_CASE ("checkStatusWord: response shorter than 2 bytes returns false", "[secure_channel]")
 TEST_CASE ("extractCardEphemeralKey: extracts 64-byte key from synthetic certificate", "[secure_channel]")
 TEST_CASE ("extractCardEphemeralKey: null cert pointer returns false", "[secure_channel]")
 TEST_CASE ("selectApdu: succeeds when transport returns SW 0x9000", "[secure_channel]")
 TEST_CASE ("selectApdu: fails when transport returns error SW", "[secure_channel]")
 TEST_CASE ("getCardCertificate: extracts 146 certificate bytes from mock response", "[secure_channel]")
 TEST_CASE ("openSecureChannel: extracts 32-byte salt from mock response", "[secure_channel]")
 TEST_CASE ("mutuallyAuthenticate: sets session IV to first 16 bytes of mock response", "[secure_channel]")
 TEST_CASE ("key derivation: ECDH + SHA-512 split yields distinct Kenc and Kmac", "[secure_channel]")
 TEST_CASE ("aesCbcEncrypt/aesCbcDecrypt: round-trip via reflective mock returns card payload", "[secure_channel]")

Variables

static const uint8_t K_CARD_EPHEMERAL_PUB [SC_EC_PUBKEY_BYTES]
static const uint8_t K_TEST_KENC [SC_AES_KEY_BYTES]
static const uint8_t K_TEST_KMAC [SC_AES_KEY_BYTES]
static const uint8_t K_CARD_RESP_PLAINTEXT [SC_CARD_RESP_TOTAL_BYTES]
static ESP32CryptoProvider s_crypto
static MockLogger s_logger
static MockPlatform s_platform
static ScriptedMockNfcTransport s_scriptedTransport
static ReflectiveMockNfcTransport s_reflectiveTransport

Macro Definition Documentation

◆ MOCK_MAX_RESP_BYTES

#define MOCK_MAX_RESP_BYTES   (255U)

Definition at line 53 of file test_cw_secure_channel.cpp.

◆ MOCK_MAX_SCRIPTS

#define MOCK_MAX_SCRIPTS   (8U)

Definition at line 52 of file test_cw_secure_channel.cpp.

Referenced by ScriptedMockNfcTransport::addScript().

◆ MOCK_UART_BAUD_RATE

#define MOCK_UART_BAUD_RATE   (115200UL)

Definition at line 54 of file test_cw_secure_channel.cpp.

Referenced by MockLogger::begin().

◆ SC_AES_BLOCK_BYTES

#define SC_AES_BLOCK_BYTES   (16U)

Definition at line 19 of file test_cw_secure_channel.cpp.

Referenced by ReflectiveMockNfcTransport::sendAPDU().

◆ SC_AES_KEY_BYTES

#define SC_AES_KEY_BYTES   (32U)

Definition at line 20 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE(), TEST_CASE(), and TEST_CASE().

◆ SC_APDU_HEADER_LEN

#define SC_APDU_HEADER_LEN   (4U)

Definition at line 42 of file test_cw_secure_channel.cpp.

◆ SC_APDU_LC_OFFSET

#define SC_APDU_LC_OFFSET   (4U)

Definition at line 43 of file test_cw_secure_channel.cpp.

◆ SC_APDU_MAC_BYTES

#define SC_APDU_MAC_BYTES   (16U)

Definition at line 45 of file test_cw_secure_channel.cpp.

Referenced by ReflectiveMockNfcTransport::sendAPDU().

◆ SC_APDU_MAC_OFFSET

#define SC_APDU_MAC_OFFSET   (5U) /* header[4] + Lc[1] */

Definition at line 44 of file test_cw_secure_channel.cpp.

Referenced by ReflectiveMockNfcTransport::sendAPDU().

◆ SC_CARD_RESP_PAYLOAD_BYTES

#define SC_CARD_RESP_PAYLOAD_BYTES   (4U)

Definition at line 48 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_CARD_RESP_TOTAL_BYTES

#define SC_CARD_RESP_TOTAL_BYTES   (SC_CARD_RESP_PAYLOAD_BYTES + SC_SW_BYTES)

Definition at line 49 of file test_cw_secure_channel.cpp.

◆ SC_CERT_KEY65_BYTES

#define SC_CERT_KEY65_BYTES   (65U)

Definition at line 27 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_CERT_KEY_OFFSET

#define SC_CERT_KEY_OFFSET   (SC_CERT_MARKER_BYTES + SC_CERT_NONCE_BYTES)

Definition at line 29 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_CERT_MARKER_BYTES

#define SC_CERT_MARKER_BYTES   (1U)

Definition at line 25 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_CERT_NONCE_BYTES

#define SC_CERT_NONCE_BYTES   (8U)

Definition at line 26 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_CERT_TOTAL_BYTES

#define SC_CERT_TOTAL_BYTES   (74U)

Definition at line 28 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_EC_COORD_BYTES

#define SC_EC_COORD_BYTES   (32U)

Definition at line 21 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE(), TEST_CASE(), and TEST_CASE().

◆ SC_EC_PUBKEY_BYTES

#define SC_EC_PUBKEY_BYTES   (64U)

Definition at line 22 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), and TEST_CASE().

◆ SC_GET_CERT_RESP_BYTES

#define SC_GET_CERT_RESP_BYTES   (148U)

Definition at line 34 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_IV_BYTES

#define SC_IV_BYTES   (16U)

Definition at line 38 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE(), and TEST_CASE().

◆ SC_MUTUAL_AUTH_RESP_BYTES

#define SC_MUTUAL_AUTH_RESP_BYTES   (66U)

Definition at line 36 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE(), and TEST_CASE().

◆ SC_OPEN_SC_RESP_BYTES

#define SC_OPEN_SC_RESP_BYTES   (34U)

Definition at line 35 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_SALT_BYTES

#define SC_SALT_BYTES   (32U)

Definition at line 37 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE(), TEST_CASE(), and TEST_CASE().

◆ SC_SELECT_RESP_BYTES

#define SC_SELECT_RESP_BYTES   (26U)

Definition at line 33 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE(), and TEST_CASE().

◆ SC_SHA512_OUT_BYTES

#define SC_SHA512_OUT_BYTES   (64U)

Definition at line 39 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ SC_SW_BYTES

#define SC_SW_BYTES   (2U)

Definition at line 32 of file test_cw_secure_channel.cpp.

Referenced by ReflectiveMockNfcTransport::sendAPDU().

Function Documentation

◆ TEST_CASE() [1/12]

TEST_CASE ( "aesCbcEncrypt/aesCbcDecrypt: round-trip via reflective mock returns card payload" ,
"" [secure_channel] )

◆ TEST_CASE() [2/12]

TEST_CASE ( "checkStatusWord: response shorter than 2 bytes returns false" ,
"" [secure_channel] )

Definition at line 350 of file test_cw_secure_channel.cpp.

References s_crypto, s_logger, s_platform, and s_scriptedTransport.

◆ TEST_CASE() [3/12]

TEST_CASE ( "checkStatusWord: SW 0x9000 returns true" ,
"" [secure_channel] )

Definition at line 324 of file test_cw_secure_channel.cpp.

References s_crypto, s_logger, s_platform, and s_scriptedTransport.

◆ TEST_CASE() [4/12]

TEST_CASE ( "checkStatusWord: SW mismatch returns false" ,
"" [secure_channel] )

Definition at line 337 of file test_cw_secure_channel.cpp.

References s_crypto, s_logger, s_platform, and s_scriptedTransport.

◆ TEST_CASE() [5/12]

TEST_CASE ( "extractCardEphemeralKey: extracts 64-byte key from synthetic certificate" ,
"" [secure_channel] )

◆ TEST_CASE() [6/12]

TEST_CASE ( "extractCardEphemeralKey: null cert pointer returns false" ,
"" [secure_channel] )

◆ TEST_CASE() [7/12]

TEST_CASE ( "getCardCertificate: extracts 146 certificate bytes from mock response" ,
"" [secure_channel] )

◆ TEST_CASE() [8/12]

TEST_CASE ( "key derivation: ECDH + SHA-512 split yields distinct Kenc and Kmac" ,
"" [secure_channel] )

◆ TEST_CASE() [9/12]

TEST_CASE ( "mutuallyAuthenticate: sets session IV to first 16 bytes of mock response" ,
"" [secure_channel] )

◆ TEST_CASE() [10/12]

TEST_CASE ( "openSecureChannel: extracts 32-byte salt from mock response" ,
"" [secure_channel] )

◆ TEST_CASE() [11/12]

TEST_CASE ( "selectApdu: fails when transport returns error SW" ,
"" [secure_channel] )

◆ TEST_CASE() [12/12]

TEST_CASE ( "selectApdu: succeeds when transport returns SW 0x9000" ,
"" [secure_channel] )

Variable Documentation

◆ K_CARD_EPHEMERAL_PUB

const uint8_t K_CARD_EPHEMERAL_PUB[SC_EC_PUBKEY_BYTES]
static
Initial value:
= {
0x60U, 0xfeU, 0xd4U, 0xbaU, 0x25U, 0x5aU, 0x9dU, 0x31U,
0xc9U, 0x61U, 0xebU, 0x74U, 0xc6U, 0x35U, 0x6dU, 0x68U,
0xc0U, 0x49U, 0xb8U, 0x92U, 0x3bU, 0x61U, 0xfaU, 0x6cU,
0xe6U, 0x69U, 0x62U, 0x2eU, 0x60U, 0xf2U, 0x9fU, 0xb6U,
0x79U, 0x03U, 0xfeU, 0x10U, 0x08U, 0xb8U, 0xbcU, 0x99U,
0xa4U, 0x1aU, 0xe9U, 0xe9U, 0x56U, 0x28U, 0xbcU, 0x64U,
0xf2U, 0xf1U, 0xb2U, 0x0cU, 0x2dU, 0x7eU, 0x9fU, 0x51U,
0x77U, 0xa3U, 0xc2U, 0x94U, 0xd4U, 0x46U, 0x22U, 0x99U
}

Definition at line 59 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ K_CARD_RESP_PLAINTEXT

const uint8_t K_CARD_RESP_PLAINTEXT[SC_CARD_RESP_TOTAL_BYTES]
static
Initial value:
= {
0xdeU, 0xadU, 0xbeU, 0xefU, 0x90U, 0x00U
}

Definition at line 88 of file test_cw_secure_channel.cpp.

Referenced by ReflectiveMockNfcTransport::sendAPDU(), and TEST_CASE().

◆ K_TEST_KENC

const uint8_t K_TEST_KENC[SC_AES_KEY_BYTES]
static
Initial value:
= {
0x60U, 0x3dU, 0xebU, 0x10U, 0x15U, 0xcaU, 0x71U, 0xbeU,
0x2bU, 0x73U, 0xaeU, 0xf0U, 0x85U, 0x7dU, 0x77U, 0x81U,
0x1fU, 0x35U, 0x2cU, 0x07U, 0x3bU, 0x61U, 0x08U, 0xd7U,
0x2dU, 0x98U, 0x10U, 0xa3U, 0x09U, 0x14U, 0xdfU, 0xf4U
}

Definition at line 74 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ K_TEST_KMAC

const uint8_t K_TEST_KMAC[SC_AES_KEY_BYTES]
static
Initial value:
= {
0x00U, 0x01U, 0x02U, 0x03U, 0x04U, 0x05U, 0x06U, 0x07U,
0x08U, 0x09U, 0x0aU, 0x0bU, 0x0cU, 0x0dU, 0x0eU, 0x0fU,
0x10U, 0x11U, 0x12U, 0x13U, 0x14U, 0x15U, 0x16U, 0x17U,
0x18U, 0x19U, 0x1aU, 0x1bU, 0x1cU, 0x1dU, 0x1eU, 0x1fU
}

Definition at line 80 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ s_crypto

◆ s_logger

◆ s_platform

◆ s_reflectiveTransport

ReflectiveMockNfcTransport s_reflectiveTransport
static

Definition at line 318 of file test_cw_secure_channel.cpp.

Referenced by TEST_CASE().

◆ s_scriptedTransport