311 lines
9.4 KiB
C
Executable File
311 lines
9.4 KiB
C
Executable File
/* stsafe_test.c
|
|
*
|
|
* STSAFE-A120 test program for wolfSSL integration
|
|
*
|
|
* Copyright (C) 2006-2026 wolfSSL Inc.
|
|
*
|
|
* This file is part of wolfSSL. (formerly known as CyaSSL)
|
|
*
|
|
* wolfSSL is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* wolfSSL is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
|
|
/* Include STSELib */
|
|
#include "stselib.h"
|
|
|
|
/* STSAFE-A120 default I2C bus */
|
|
#define STSAFE_A120_I2C_BUS 1
|
|
|
|
/* Test result tracking */
|
|
static int tests_passed = 0;
|
|
static int tests_failed = 0;
|
|
|
|
#define TEST_PASS(msg) do { printf("[PASS] %s\n", msg); tests_passed++; } while(0)
|
|
#define TEST_FAIL(msg) do { printf("[FAIL] %s\n", msg); tests_failed++; } while(0)
|
|
|
|
/* STSAFE device handler */
|
|
static stse_Handler_t stsafe_handler;
|
|
|
|
/*--------------------- Test: Echo Command --------------------------- */
|
|
static int test_echo(void)
|
|
{
|
|
stse_ReturnCode_t ret;
|
|
uint8_t echo_data[] = {0x01, 0x02, 0x03, 0x04, 0x05};
|
|
uint8_t response[sizeof(echo_data)];
|
|
|
|
printf("\nTest: Echo Command\n");
|
|
printf(" Sending %zu bytes...\n", sizeof(echo_data));
|
|
|
|
memset(response, 0, sizeof(response));
|
|
ret = stse_device_echo(&stsafe_handler, echo_data, response, sizeof(echo_data));
|
|
|
|
if (ret != STSE_OK) {
|
|
printf(" Error: stse_device_echo returned 0x%04X\n", ret);
|
|
TEST_FAIL("Echo command failed");
|
|
return -1;
|
|
}
|
|
|
|
if (memcmp(echo_data, response, sizeof(echo_data)) != 0) {
|
|
printf(" Error: Response data mismatch\n");
|
|
printf(" Expected: ");
|
|
for (size_t i = 0; i < sizeof(echo_data); i++) printf("%02X ", echo_data[i]);
|
|
printf("\n Got: ");
|
|
for (size_t i = 0; i < sizeof(response); i++) printf("%02X ", response[i]);
|
|
printf("\n");
|
|
TEST_FAIL("Echo data mismatch");
|
|
return -1;
|
|
}
|
|
|
|
printf(" Echo response matches!\n");
|
|
TEST_PASS("Echo command");
|
|
return 0;
|
|
}
|
|
|
|
/*--------------------- Test: Random Number Generation --------------------------- */
|
|
static int test_random(void)
|
|
{
|
|
stse_ReturnCode_t ret;
|
|
uint8_t random_data[32];
|
|
int all_zeros = 1;
|
|
|
|
printf("\nTest: Random Number Generation\n");
|
|
printf(" Requesting 32 random bytes...\n");
|
|
|
|
memset(random_data, 0, sizeof(random_data));
|
|
|
|
ret = stse_generate_random(&stsafe_handler, random_data, sizeof(random_data));
|
|
|
|
if (ret != STSE_OK) {
|
|
printf(" Error: stse_generate_random returned 0x%04X\n", ret);
|
|
TEST_FAIL("Random generation failed");
|
|
return -1;
|
|
}
|
|
|
|
/* Check that data is not all zeros */
|
|
for (size_t i = 0; i < sizeof(random_data); i++) {
|
|
if (random_data[i] != 0) {
|
|
all_zeros = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (all_zeros) {
|
|
printf(" Error: Random data is all zeros\n");
|
|
TEST_FAIL("Random data is all zeros");
|
|
return -1;
|
|
}
|
|
|
|
printf(" Random data: ");
|
|
for (size_t i = 0; i < 16; i++) {
|
|
printf("%02X ", random_data[i]);
|
|
}
|
|
printf("...\n");
|
|
|
|
TEST_PASS("Random number generation");
|
|
return 0;
|
|
}
|
|
|
|
/*--------------------- Test: ECC Key Generation (P-256) --------------------------- */
|
|
static int test_ecc_keygen_p256(void)
|
|
{
|
|
stse_ReturnCode_t ret;
|
|
uint8_t public_key[64]; /* P-256 public key: 32 bytes X + 32 bytes Y */
|
|
uint8_t slot = 1; /* Key slot 1 */
|
|
stse_ecc_key_type_t key_type = STSE_ECC_KT_NIST_P_256;
|
|
|
|
printf("\nTest: ECC Key Generation (P-256)\n");
|
|
|
|
memset(public_key, 0, sizeof(public_key));
|
|
|
|
/* usage_limit = 255 for limited use */
|
|
ret = stse_generate_ecc_key_pair(&stsafe_handler,
|
|
slot,
|
|
key_type,
|
|
255, /* usage_limit */
|
|
public_key);
|
|
|
|
if (ret != STSE_OK) {
|
|
printf(" Error: stse_generate_ecc_key_pair returned 0x%04X\n", ret);
|
|
TEST_FAIL("ECC P-256 key generation failed");
|
|
return -1;
|
|
}
|
|
|
|
printf(" Public Key X: ");
|
|
for (int i = 0; i < 8; i++) {
|
|
printf("%02X", public_key[i]);
|
|
}
|
|
printf("...\n");
|
|
|
|
printf(" Public Key Y: ");
|
|
for (int i = 32; i < 40; i++) {
|
|
printf("%02X", public_key[i]);
|
|
}
|
|
printf("...\n");
|
|
|
|
TEST_PASS("ECC P-256 key generation");
|
|
return 0;
|
|
}
|
|
|
|
/*--------------------- Test: ECDSA Sign (P-256) --------------------------- */
|
|
static int test_ecdsa_sign_p256(void)
|
|
{
|
|
stse_ReturnCode_t ret;
|
|
uint8_t digest[32]; /* SHA-256 digest */
|
|
uint8_t signature[64]; /* P-256 signature: 32 bytes R + 32 bytes S */
|
|
uint8_t public_key[64];
|
|
uint8_t slot = 2; /* Key slot 2 for signing test */
|
|
stse_ecc_key_type_t key_type = STSE_ECC_KT_NIST_P_256;
|
|
|
|
printf("\nTest: ECDSA Sign (P-256)\n");
|
|
|
|
/* Create a test digest */
|
|
memset(digest, 0xAB, sizeof(digest));
|
|
memset(signature, 0, sizeof(signature));
|
|
memset(public_key, 0, sizeof(public_key));
|
|
|
|
/* First generate a key pair */
|
|
ret = stse_generate_ecc_key_pair(&stsafe_handler,
|
|
slot,
|
|
key_type,
|
|
255, /* usage_limit */
|
|
public_key);
|
|
if (ret != STSE_OK) {
|
|
printf(" Error: Key generation failed with 0x%04X\n", ret);
|
|
TEST_FAIL("ECDSA sign - key generation failed");
|
|
return -1;
|
|
}
|
|
printf(" Key pair generated.\n");
|
|
|
|
/* Sign the digest */
|
|
ret = stse_ecc_generate_signature(&stsafe_handler,
|
|
slot,
|
|
key_type,
|
|
digest, sizeof(digest),
|
|
signature);
|
|
|
|
if (ret != STSE_OK) {
|
|
printf(" Error: stse_ecc_generate_signature returned 0x%04X\n", ret);
|
|
TEST_FAIL("ECDSA P-256 sign failed");
|
|
return -1;
|
|
}
|
|
|
|
printf(" Signature R: ");
|
|
for (int i = 0; i < 8; i++) {
|
|
printf("%02X", signature[i]);
|
|
}
|
|
printf("...\n");
|
|
|
|
printf(" Signature S: ");
|
|
for (int i = 32; i < 40; i++) {
|
|
printf("%02X", signature[i]);
|
|
}
|
|
printf("...\n");
|
|
|
|
TEST_PASS("ECDSA P-256 sign");
|
|
return 0;
|
|
}
|
|
|
|
/*--------------------- Test: ECC Key Generation (P-384) --------------------------- */
|
|
static int test_ecc_keygen_p384(void)
|
|
{
|
|
stse_ReturnCode_t ret;
|
|
uint8_t public_key[96]; /* P-384 public key: 48 bytes X + 48 bytes Y */
|
|
uint8_t slot = 3; /* Key slot 3 for P-384 */
|
|
stse_ecc_key_type_t key_type = STSE_ECC_KT_NIST_P_384;
|
|
|
|
printf("\nTest: ECC Key Generation (P-384)\n");
|
|
|
|
memset(public_key, 0, sizeof(public_key));
|
|
|
|
ret = stse_generate_ecc_key_pair(&stsafe_handler,
|
|
slot,
|
|
key_type,
|
|
255, /* usage_limit */
|
|
public_key);
|
|
|
|
if (ret != STSE_OK) {
|
|
printf(" Error: stse_generate_ecc_key_pair returned 0x%04X\n", ret);
|
|
TEST_FAIL("ECC P-384 key generation failed");
|
|
return -1;
|
|
}
|
|
|
|
printf(" Public Key X: ");
|
|
for (int i = 0; i < 8; i++) {
|
|
printf("%02X", public_key[i]);
|
|
}
|
|
printf("...\n");
|
|
|
|
printf(" Public Key Y: ");
|
|
for (int i = 48; i < 56; i++) {
|
|
printf("%02X", public_key[i]);
|
|
}
|
|
printf("...\n");
|
|
|
|
TEST_PASS("ECC P-384 key generation");
|
|
return 0;
|
|
}
|
|
|
|
/*--------------------- Main --------------------------- */
|
|
int main(int argc, char *argv[])
|
|
{
|
|
stse_ReturnCode_t ret;
|
|
|
|
(void)argc;
|
|
(void)argv;
|
|
|
|
printf("================================================\n");
|
|
printf("STSAFE-A120 Test Suite for wolfSSL Integration\n");
|
|
printf("================================================\n");
|
|
|
|
/* Initialize STSAFE handler with defaults */
|
|
printf("\nInitializing STSAFE handler...\n");
|
|
ret = stse_set_default_handler_value(&stsafe_handler);
|
|
if (ret != STSE_OK) {
|
|
printf("Error: stse_set_default_handler_value failed: 0x%04X\n", ret);
|
|
return 1;
|
|
}
|
|
|
|
/* Configure for STSAFE-A120 on I2C bus 1 */
|
|
stsafe_handler.device_type = STSAFE_A120;
|
|
stsafe_handler.io.busID = STSAFE_A120_I2C_BUS;
|
|
stsafe_handler.io.BusSpeed = 100; /* 100 kHz for reliability */
|
|
|
|
printf("Initializing STSAFE-A120 device on I2C bus %d...\n", STSAFE_A120_I2C_BUS);
|
|
ret = stse_init(&stsafe_handler);
|
|
if (ret != STSE_OK) {
|
|
printf("Error: stse_init failed: 0x%04X\n", ret);
|
|
return 1;
|
|
}
|
|
printf("STSAFE-A120 initialized successfully.\n");
|
|
|
|
/* Run tests */
|
|
test_echo();
|
|
test_random();
|
|
test_ecc_keygen_p256();
|
|
test_ecdsa_sign_p256();
|
|
test_ecc_keygen_p384();
|
|
|
|
/* Print summary */
|
|
printf("\n================================================\n");
|
|
printf("Test Summary: %d passed, %d failed\n", tests_passed, tests_failed);
|
|
printf("================================================\n");
|
|
|
|
return (tests_failed > 0) ? 1 : 0;
|
|
}
|