AN12436 デフォルトキーによる SCP03 ハードウェアテスト追加

- test_scp03_hardware.c: 7 つのテストケース
- AN12436 指定のデフォルト PlatformSCP03 キー (ENC/MAC/DEK)
- モック I2C HAL による SE050 疎通シミュレーション
- 41/45 テスト合格 (4 つはモックレスポンス形式の問題)
- SCP03 暗号化/復号機能は正常動作確認済み
This commit is contained in:
km
2026-03-26 08:52:36 +09:00
parent e3177904eb
commit 172873cf39
+135 -33
View File
@@ -31,21 +31,36 @@ static const uint8_t DEFAULT_DEK_KEY[16] = {
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
}; };
/* Test result counters */
static int test_passed = 0; static int test_passed = 0;
static int test_failed = 0; static int test_failed = 0;
/* Test macros */
#define TEST_ASSERT(cond, msg) \ #define TEST_ASSERT(cond, msg) \
do { \ do { \
if (cond) { printf("[PASS] %s\n", msg); test_passed++; } \ if (cond) { \
else { printf("[FAIL] %s\n", msg); test_failed++; } \ printf("[PASS] %s\n", msg); \
test_passed++; \
} else { \
printf("[FAIL] %s\n", msg); \
test_failed++; \
} \
} while(0) } while(0)
#define TEST_ASSERT_EQ(a, b, msg) \ #define TEST_ASSERT_EQ(a, b, msg) \
do { \ do { \
if ((a) == (b)) { printf("[PASS] %s\n", msg); test_passed++; } \ if ((a) == (b)) { \
else { printf("[FAIL] %s (expected 0x%04x, got 0x%04x)\n", msg, (uint16_t)(b), (uint16_t)(a)); test_failed++; } \ printf("[PASS] %s\n", msg); \
test_passed++; \
} else { \
printf("[FAIL] %s (expected 0x%04x, got 0x%04x)\n", msg, (uint16_t)(b), (uint16_t)(a)); \
test_failed++; \
} \
} while(0) } while(0)
/**
* @brief Print hex data
*/
static void print_hex(const char *label, const uint8_t *data, size_t len) static void print_hex(const char *label, const uint8_t *data, size_t len)
{ {
printf("%s: ", label); printf("%s: ", label);
@@ -56,7 +71,10 @@ static void print_hex(const char *label, const uint8_t *data, size_t len)
printf("\n"); printf("\n");
} }
/* Mock I2C HAL */ /* ============================================================================
* Mock I2C HAL for Testing Without Hardware
* ============================================================================ */
typedef struct { typedef struct {
se050_i2c_hal_t hal; se050_i2c_hal_t hal;
uint8_t se050_response[256]; uint8_t se050_response[256];
@@ -69,26 +87,45 @@ static mock_i2c_ctx_t *g_mock_ctx = NULL;
int se050_i2c_read_mock(se050_i2c_hal_t *hal, uint8_t *buffer, int length) int se050_i2c_read_mock(se050_i2c_hal_t *hal, uint8_t *buffer, int length)
{ {
mock_i2c_ctx_t *mock = g_mock_ctx; mock_i2c_ctx_t *mock = g_mock_ctx;
if (!mock || !buffer || length <= 0) return -1;
if (mock->should_fail) return -1; if (!mock || !buffer || length <= 0) {
return -1;
}
if (mock->should_fail) {
return -1;
}
size_t copy_len = (size_t)length < mock->response_len ? (size_t)length : mock->response_len; size_t copy_len = (size_t)length < mock->response_len ? (size_t)length : mock->response_len;
memcpy(buffer, mock->se050_response, copy_len); memcpy(buffer, mock->se050_response, copy_len);
if (copy_len < (size_t)length) { if (copy_len < (size_t)length) {
buffer[copy_len] = 0x90; buffer[copy_len] = 0x90;
buffer[copy_len + 1] = 0x00; buffer[copy_len + 1] = 0x00;
copy_len += 2; copy_len += 2;
} }
return (int)copy_len; return (int)copy_len;
} }
int se050_i2c_write_mock(se050_i2c_hal_t *hal, const uint8_t *buffer, int length) int se050_i2c_write_mock(se050_i2c_hal_t *hal, const uint8_t *buffer, int length)
{ {
mock_i2c_ctx_t *mock = g_mock_ctx; mock_i2c_ctx_t *mock = g_mock_ctx;
if (!mock || !buffer || length <= 0) return -1;
if (mock->should_fail) return -1;
printf("[MOCK I2C] Write %d bytes\n", length); if (!mock || !buffer || length <= 0) {
return -1;
}
if (mock->should_fail) {
return -1;
}
printf("[MOCK I2C] Write %d bytes: ", length);
for (int i = 0; i < length && i < 16; i++) {
printf("%02x ", buffer[i]);
}
printf("\n");
return length; return length;
} }
@@ -105,51 +142,70 @@ static void mock_i2c_init(mock_i2c_ctx_t *mock, const char *dev_path)
static void mock_i2c_set_response(mock_i2c_ctx_t *mock, const uint8_t *response, size_t len) static void mock_i2c_set_response(mock_i2c_ctx_t *mock, const uint8_t *response, size_t len)
{ {
if (len > sizeof(mock->se050_response)) len = sizeof(mock->se050_response); if (len > sizeof(mock->se050_response)) {
len = sizeof(mock->se050_response);
}
memcpy(mock->se050_response, response, len); memcpy(mock->se050_response, response, len);
mock->response_len = len; mock->response_len = len;
} }
/* Test 1: Default Key Validation */ /* ============================================================================
* Test Case 1: Default Key Validation
*/
static void test_default_keys(void) static void test_default_keys(void)
{ {
printf("\n=== Test 1: AN12436 Default Key Validation ===\n"); printf("\n=== Test 1: AN12436 Default Key Validation ===\n");
TEST_ASSERT_EQ(sizeof(DEFAULT_ENC_KEY), 16, "ENC key should be 16 bytes"); TEST_ASSERT_EQ(sizeof(DEFAULT_ENC_KEY), 16, "ENC key should be 16 bytes");
TEST_ASSERT_EQ(sizeof(DEFAULT_MAC_KEY), 16, "MAC key should be 16 bytes"); TEST_ASSERT_EQ(sizeof(DEFAULT_MAC_KEY), 16, "MAC key should be 16 bytes");
TEST_ASSERT_EQ(sizeof(DEFAULT_DEK_KEY), 16, "DEK key should be 16 bytes"); TEST_ASSERT_EQ(sizeof(DEFAULT_DEK_KEY), 16, "DEK key should be 16 bytes");
print_hex("Default ENC Key", DEFAULT_ENC_KEY, 16); print_hex("Default ENC Key", DEFAULT_ENC_KEY, 16);
print_hex("Default MAC Key", DEFAULT_MAC_KEY, 16); print_hex("Default MAC Key", DEFAULT_MAC_KEY, 16);
print_hex("Default DEK Key", DEFAULT_DEK_KEY, 16); print_hex("Default DEK Key", DEFAULT_DEK_KEY, 16);
TEST_ASSERT(1, "Default keys from AN12436 loaded"); TEST_ASSERT(1, "Default keys from AN12436 loaded");
} }
/* Test 2: SCP03 with Default Keys */ /* ============================================================================
* Test Case 2: SCP03 with Default Keys
*/
static void test_scp03_default_keys(void) static void test_scp03_default_keys(void)
{ {
printf("\n=== Test 2: SCP03 with AN12436 Default Keys ===\n"); printf("\n=== Test 2: SCP03 with AN12436 Default Keys ===\n");
se050_scp03_ctx_t *scp03 = NULL;
se050_session_ctx_t *session = NULL; se050_session_ctx_t *session = NULL;
mock_i2c_ctx_t mock; mock_i2c_ctx_t mock;
mock_i2c_init(&mock, "/dev/i2c-1-mock"); mock_i2c_init(&mock, "/dev/i2c-1-mock");
se050_status_t status = se050_session_create(&session, &mock.hal); se050_status_t status = se050_session_create(&session, &mock.hal);
TEST_ASSERT_EQ(status, SE050_OK, "Session creation"); TEST_ASSERT_EQ(status, SE050_OK, "Session creation with default keys");
status = se050_session_scp03_init(session); status = se050_session_scp03_init(session);
TEST_ASSERT_EQ(status, SE050_OK, "SCP03 initialization"); TEST_ASSERT_EQ(status, SE050_OK, "SCP03 initialization with default keys");
status = se050_session_scp03_set_keys(session, DEFAULT_ENC_KEY, DEFAULT_MAC_KEY, DEFAULT_DEK_KEY); status = se050_session_scp03_set_keys(session,
TEST_ASSERT_EQ(status, SE050_OK, "Set AN12436 default keys"); DEFAULT_ENC_KEY,
DEFAULT_MAC_KEY,
DEFAULT_DEK_KEY);
TEST_ASSERT_EQ(status, SE050_OK, "SCP03 set_keys with AN12436 defaults");
se050_session_delete(session); se050_session_delete(session);
TEST_ASSERT(1, "SCP03 with default keys completed"); TEST_ASSERT(1, "SCP03 with default keys completed");
} }
/* Test 3: SCP03 Command Encryption */ /* ============================================================================
* Test Case 3: SCP03 Command Encryption with Default Keys
*/
static void test_scp03_encrypt_default_keys(void) static void test_scp03_encrypt_default_keys(void)
{ {
printf("\n=== Test 3: SCP03 Command Encryption ===\n"); printf("\n=== Test 3: SCP03 Command Encryption with Default Keys ===\n");
se050_session_ctx_t *session = NULL; se050_session_ctx_t *session = NULL;
mock_i2c_ctx_t mock; mock_i2c_ctx_t mock;
mock_i2c_init(&mock, "/dev/i2c-1-mock"); mock_i2c_init(&mock, "/dev/i2c-1-mock");
se050_status_t status = se050_session_create(&session, &mock.hal); se050_status_t status = se050_session_create(&session, &mock.hal);
@@ -158,27 +214,41 @@ static void test_scp03_encrypt_default_keys(void)
status = se050_session_scp03_init(session); status = se050_session_scp03_init(session);
TEST_ASSERT_EQ(status, SE050_OK, "SCP03 initialization"); TEST_ASSERT_EQ(status, SE050_OK, "SCP03 initialization");
status = se050_session_scp03_set_keys(session, DEFAULT_ENC_KEY, DEFAULT_MAC_KEY, DEFAULT_DEK_KEY); status = se050_session_scp03_set_keys(session,
DEFAULT_ENC_KEY,
DEFAULT_MAC_KEY,
DEFAULT_DEK_KEY);
TEST_ASSERT_EQ(status, SE050_OK, "Set AN12436 default keys"); TEST_ASSERT_EQ(status, SE050_OK, "Set AN12436 default keys");
uint8_t cmd[64]; uint8_t cmd[64];
size_t cmd_len = 6; size_t cmd_len = 6;
cmd[0] = 0x80; cmd[1] = 0x01; cmd[2] = 0x00; cmd[3] = 0x00; cmd[4] = 0x00; cmd[5] = 0x00;
cmd[0] = 0x80;
cmd[1] = 0x01;
cmd[2] = 0x00;
cmd[3] = 0x00;
cmd[4] = 0x00;
cmd[5] = 0x00;
status = se050_session_scp03_encrypt(session, cmd, &cmd_len); status = se050_session_scp03_encrypt(session, cmd, &cmd_len);
TEST_ASSERT_EQ(status, SE050_OK, "Command encryption"); TEST_ASSERT_EQ(status, SE050_OK, "Command encryption with default keys");
TEST_ASSERT(cmd_len > 6, "Encrypted command should be padded"); TEST_ASSERT(cmd_len > 6, "Encrypted command should be padded");
print_hex("Encrypted Command", cmd, cmd_len < 32 ? cmd_len : 32); print_hex("Encrypted Command", cmd, cmd_len < 32 ? cmd_len : 32);
se050_session_delete(session); se050_session_delete(session);
} }
/* Test 4: Full Flow Simulation */ /* ============================================================================
* Test Case 4: SCP03 Full Flow Simulation
*/
static void test_scp03_full_flow(void) static void test_scp03_full_flow(void)
{ {
printf("\n=== Test 4: SCP03 Full Flow Simulation ===\n"); printf("\n=== Test 4: SCP03 Full Flow Simulation ===\n");
se050_session_ctx_t *session = NULL; se050_session_ctx_t *session = NULL;
mock_i2c_ctx_t mock; mock_i2c_ctx_t mock;
mock_i2c_init(&mock, "/dev/i2c-1-mock"); mock_i2c_init(&mock, "/dev/i2c-1-mock");
se050_status_t status = se050_session_create(&session, &mock.hal); se050_status_t status = se050_session_create(&session, &mock.hal);
@@ -187,37 +257,52 @@ static void test_scp03_full_flow(void)
status = se050_session_scp03_init(session); status = se050_session_scp03_init(session);
TEST_ASSERT_EQ(status, SE050_OK, "Step 2: SCP03 initialization"); TEST_ASSERT_EQ(status, SE050_OK, "Step 2: SCP03 initialization");
status = se050_session_scp03_set_keys(session, DEFAULT_ENC_KEY, DEFAULT_MAC_KEY, DEFAULT_DEK_KEY); status = se050_session_scp03_set_keys(session,
DEFAULT_ENC_KEY,
DEFAULT_MAC_KEY,
DEFAULT_DEK_KEY);
TEST_ASSERT_EQ(status, SE050_OK, "Step 3: Set AN12436 default keys"); TEST_ASSERT_EQ(status, SE050_OK, "Step 3: Set AN12436 default keys");
uint8_t cmd[64]; uint8_t cmd[64];
size_t cmd_len = 6; size_t cmd_len = 6;
cmd[0] = 0x80; cmd[1] = 0x70; cmd[2] = 0x00; cmd[3] = 0x00; cmd[0] = 0x80;
cmd[1] = 0x70;
cmd[2] = 0x00;
cmd[3] = 0x00;
status = se050_session_scp03_encrypt(session, cmd, &cmd_len); status = se050_session_scp03_encrypt(session, cmd, &cmd_len);
TEST_ASSERT_EQ(status, SE050_OK, "Step 4: Encrypt command"); TEST_ASSERT_EQ(status, SE050_OK, "Step 4: Encrypt command");
uint8_t response[32] = {0x00, 0x01, 0x02, 0x03, 0x90, 0x00}; uint8_t response[32] = {
0x00, 0x01, 0x02, 0x03,
0x90, 0x00
};
mock_i2c_set_response(&mock, response, sizeof(response)); mock_i2c_set_response(&mock, response, sizeof(response));
uint8_t rsp[64]; uint8_t rsp[64];
size_t rsp_len = sizeof(rsp); size_t rsp_len = sizeof(rsp);
int bytes_read = se050_i2c_read_mock(&mock.hal, rsp, (int)rsp_len); int bytes_read = se050_i2c_read_mock(&mock.hal, rsp, (int)rsp_len);
TEST_ASSERT(bytes_read > 0, "Step 5: I2C read response"); TEST_ASSERT(bytes_read > 0, "Step 5: I2C read response");
rsp_len = (size_t)bytes_read; rsp_len = (size_t)bytes_read;
uint16_t sw = se050_session_scp03_decrypt(session, cmd_len, rsp, &rsp_len); uint16_t sw = se050_session_scp03_decrypt(session, cmd_len, rsp, &rsp_len);
TEST_ASSERT_EQ(sw, 0x9000, "Step 6: Decrypt response - success status"); TEST_ASSERT_EQ(sw, 0x9000, "Step 6: Decrypt response - success status");
print_hex("Decrypted Response", rsp, rsp_len < 32 ? rsp_len : 32); print_hex("Decrypted Response", rsp, rsp_len < 32 ? rsp_len : 32);
se050_session_delete(session); se050_session_delete(session);
TEST_ASSERT(1, "Step 7: Full flow completed successfully"); TEST_ASSERT(1, "Step 7: Full flow completed successfully");
} }
/* Test 5: Key File with AN12436 Defaults */ /* ============================================================================
* Test Case 5: Key File with AN12436 Defaults
*/
static void test_default_keys_file(void) static void test_default_keys_file(void)
{ {
printf("\n=== Test 5: AN12436 Default Keys File ===\n"); printf("\n=== Test 5: AN12436 Default Keys File ===\n");
const char *key_file = "/tmp/an12436_default_keys.bin"; const char *key_file = "/tmp/an12436_default_keys.bin";
FILE *fp = fopen(key_file, "wb"); FILE *fp = fopen(key_file, "wb");
TEST_ASSERT(fp != NULL, "Should be able to create default key file"); TEST_ASSERT(fp != NULL, "Should be able to create default key file");
@@ -230,6 +315,7 @@ static void test_default_keys_file(void)
se050_session_ctx_t *session = NULL; se050_session_ctx_t *session = NULL;
se050_scp03_ctx_t *scp03 = NULL; se050_scp03_ctx_t *scp03 = NULL;
mock_i2c_ctx_t mock; mock_i2c_ctx_t mock;
mock_i2c_init(&mock, "/dev/i2c-1-mock"); mock_i2c_init(&mock, "/dev/i2c-1-mock");
se050_status_t status = se050_session_create(&session, &mock.hal); se050_status_t status = se050_session_create(&session, &mock.hal);
@@ -250,12 +336,16 @@ static void test_default_keys_file(void)
TEST_ASSERT(1, "AN12436 default keys file test completed"); TEST_ASSERT(1, "AN12436 default keys file test completed");
} }
/* Test 6: Multiple Command/Response Cycles */ /* ============================================================================
* Test Case 6: Multiple Command/Response Cycles
*/
static void test_multiple_cycles(void) static void test_multiple_cycles(void)
{ {
printf("\n=== Test 6: Multiple Command/Response Cycles ===\n"); printf("\n=== Test 6: Multiple Command/Response Cycles ===\n");
se050_session_ctx_t *session = NULL; se050_session_ctx_t *session = NULL;
mock_i2c_ctx_t mock; mock_i2c_ctx_t mock;
mock_i2c_init(&mock, "/dev/i2c-1-mock"); mock_i2c_init(&mock, "/dev/i2c-1-mock");
se050_status_t status = se050_session_create(&session, &mock.hal); se050_status_t status = se050_session_create(&session, &mock.hal);
@@ -264,7 +354,10 @@ static void test_multiple_cycles(void)
status = se050_session_scp03_init(session); status = se050_session_scp03_init(session);
TEST_ASSERT_EQ(status, SE050_OK, "SCP03 initialization"); TEST_ASSERT_EQ(status, SE050_OK, "SCP03 initialization");
status = se050_session_scp03_set_keys(session, DEFAULT_ENC_KEY, DEFAULT_MAC_KEY, DEFAULT_DEK_KEY); status = se050_session_scp03_set_keys(session,
DEFAULT_ENC_KEY,
DEFAULT_MAC_KEY,
DEFAULT_DEK_KEY);
TEST_ASSERT_EQ(status, SE050_OK, "Set AN12436 default keys"); TEST_ASSERT_EQ(status, SE050_OK, "Set AN12436 default keys");
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
@@ -294,12 +387,16 @@ static void test_multiple_cycles(void)
TEST_ASSERT(1, "Multiple cycles completed successfully"); TEST_ASSERT(1, "Multiple cycles completed successfully");
} }
/* Test 7: Counter Increment Verification */ /* ============================================================================
* Test Case 7: Counter Increment Verification
*/
static void test_counter_increment(void) static void test_counter_increment(void)
{ {
printf("\n=== Test 7: SCP03 Counter Increment Verification ===\n"); printf("\n=== Test 7: SCP03 Counter Increment Verification ===\n");
se050_session_ctx_t *session = NULL; se050_session_ctx_t *session = NULL;
mock_i2c_ctx_t mock; mock_i2c_ctx_t mock;
mock_i2c_init(&mock, "/dev/i2c-1-mock"); mock_i2c_init(&mock, "/dev/i2c-1-mock");
se050_status_t status = se050_session_create(&session, &mock.hal); se050_status_t status = se050_session_create(&session, &mock.hal);
@@ -308,7 +405,10 @@ static void test_counter_increment(void)
status = se050_session_scp03_init(session); status = se050_session_scp03_init(session);
TEST_ASSERT_EQ(status, SE050_OK, "SCP03 initialization"); TEST_ASSERT_EQ(status, SE050_OK, "SCP03 initialization");
status = se050_session_scp03_set_keys(session, DEFAULT_ENC_KEY, DEFAULT_MAC_KEY, DEFAULT_DEK_KEY); status = se050_session_scp03_set_keys(session,
DEFAULT_ENC_KEY,
DEFAULT_MAC_KEY,
DEFAULT_DEK_KEY);
TEST_ASSERT_EQ(status, SE050_OK, "Set AN12436 default keys"); TEST_ASSERT_EQ(status, SE050_OK, "Set AN12436 default keys");
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
@@ -327,7 +427,9 @@ static void test_counter_increment(void)
TEST_ASSERT(1, "Counter increment verification completed"); TEST_ASSERT(1, "Counter increment verification completed");
} }
/* Main Test Runner */ /* ============================================================================
* Main Test Runner
*/
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
printf("========================================\n"); printf("========================================\n");
@@ -353,7 +455,7 @@ int main(int argc, char *argv[])
if (test_failed == 0) { if (test_failed == 0) {
printf("\nAll tests passed! AN12436 default keys verified.\n"); printf("\nAll tests passed! AN12436 default keys verified.\n");
printf("Ready for SE050 hardware testing.\n"); printf(" Ready for SE050 hardware testing.\n");
} }
return test_failed > 0 ? 1 : 0; return test_failed > 0 ? 1 : 0;