344f86b07f
- SE050 モノトニックカウンタ使用 - リプレイ防止用タイムスタンプ - テスト実装済み
104 lines
2.9 KiB
C
104 lines
2.9 KiB
C
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include "se050_tai64n_hw.h"
|
|
|
|
/* Mock SE050 API functions */
|
|
int Se05x_API_ReadCounter(void *session, uint32_t obj_id, uint32_t *counter)
|
|
{
|
|
(void)obj_id;
|
|
if (session) {
|
|
mock_session_t *s = (mock_session_t*)session;
|
|
*counter = s->counter;
|
|
} else {
|
|
*counter = 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int Se05x_API_IncrementCounter(void *session, uint32_t obj_id)
|
|
{
|
|
(void)session;
|
|
(void)obj_id;
|
|
return 0;
|
|
}
|
|
|
|
static void print_hex(const char *label, const uint8_t *buf, size_t len)
|
|
{
|
|
printf("%s: ", label);
|
|
for (size_t i = 0; i < len; i++) printf("%02x", buf[i]);
|
|
printf("\n");
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
uint8_t tai64n[12];
|
|
uint32_t counter;
|
|
uint8_t current[12];
|
|
int passed = 0;
|
|
|
|
printf("SE050 Hardware TAI64N Test Suite\n");
|
|
printf("==================================\n\n");
|
|
|
|
printf("Test 1: Read Counter\n");
|
|
mock_session_t session = { .counter = 1234567890UL };
|
|
if (se050_tai64n_hw_read_counter(&session, &counter) == 0) {
|
|
printf("Counter: %u (0x%08x)\n", counter, counter);
|
|
printf("[PASS]\n\n"); passed++;
|
|
} else {
|
|
printf("[FAIL]\n\n");
|
|
}
|
|
|
|
printf("Test 2: TAI64N Now\n");
|
|
if (se050_tai64n_hw_now(&session, tai64n) == 0) {
|
|
print_hex("TAI64N", tai64n, 12);
|
|
printf("[PASS]\n\n"); passed++;
|
|
} else {
|
|
printf("[FAIL]\n\n");
|
|
}
|
|
|
|
printf("Test 3: Increment Counter\n");
|
|
uint32_t before = session.counter;
|
|
if (se050_tai64n_hw_increment(&session) == 0) {
|
|
printf("Before: %u, After: %u\n", before, session.counter);
|
|
printf("[PASS]\n\n"); passed++;
|
|
} else {
|
|
printf("[FAIL]\n\n");
|
|
}
|
|
|
|
printf("Test 4: Window Check\n");
|
|
se050_tai64n_hw_now(&session, tai64n);
|
|
se050_tai64n_hw_now(&session, current);
|
|
int result = se050_tai64n_hw_check_window(tai64n, current, 60);
|
|
printf("Window check (60s): %s\n",
|
|
result == 1 ? "PASS (within window)" : "FAIL");
|
|
if (result == 1) {
|
|
printf("[PASS]\n\n"); passed++;
|
|
} else {
|
|
printf("[FAIL]\n\n");
|
|
}
|
|
|
|
printf("Test 5: Replay Detection\n");
|
|
uint8_t old_timestamp[12];
|
|
session.counter = 1000000000UL; /* Reset to old value (1 second) */
|
|
se050_tai64n_hw_now(&session, old_timestamp);
|
|
|
|
session.counter = 1060000000UL; /* 60 seconds later */
|
|
se050_tai64n_hw_now(&session, current);
|
|
|
|
result = se050_tai64n_hw_check_window(old_timestamp, current, 30);
|
|
printf("Old timestamp (60s old), window=30s: %s\n",
|
|
result == 0 ? "REJECTED (expired)" : "ACCEPTED");
|
|
if (result == 0) {
|
|
printf("[PASS] Replay correctly detected\n\n"); passed++;
|
|
} else {
|
|
printf("[FAIL]\n\n");
|
|
}
|
|
|
|
printf("==================================\n");
|
|
printf("Passed: %d/5\n", passed);
|
|
printf("==================================\n");
|
|
|
|
return (passed == 5) ? 0 : 1;
|
|
}
|