sk_v4_genesis never wiped its seed or its read-back; sk_v4_drive_arrived
never wiped the proxy's seed after her login; sk_v4_real_zuse_arrived wiped
the seed only on a match. (The logged-in Zuse's own key stays in g_zuse_seed,
by design.)
Option 1: the three use one buffer the identity module owns, g_seeds (seed,
then its read-back), and sk_v4_drive_arrived -- which every drive goes through,
and which alone calls the other two -- runs the drive's handling (now
handle_drive()) and then wipes it, whichever way it went.
sk_v4_identity_seeds() lets the host tests read it.
kernel/tests/test_sk_v4_identity.c, 10 checks, through the real drive-arrival
path: a fake xHCI controller marks a slot attach-pending, the identity code's
idle beat handles it, the real gpt.c reads the stick's table from the RAM disk;
the block layer, signatures, key mint, marker and console faked. Genesis; a
genesis not read back; the proxy logging in; a real Zuse named, then her stick
logging in. Against the code before the wipe: 5 failures (every case's seeds
left). Now: 0. The harness gains fake_disk_bind. Built for amd64, aarch64,
riscv64. #176 done with 2bac2ac8 (the mint).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RzZgrf7V7Zk2iczBXDRbm
46 lines
1.8 KiB
C
46 lines
1.8 KiB
C
/* SPDX-License-Identifier: LicenseRef-Starship-1.0
|
|
* Copyright (c) 2023-2026 Robert A. James
|
|
*/
|
|
/* fakes.h -- what a kernel unit calls, faked on the host: the console (captured), the RNG
|
|
* (deterministic), and a RAM disk whose reads or writes fail at chosen 1 KiB blocks
|
|
* (docs/v4.0.0/plans/2026-11-12-kernel-host-tests.md).
|
|
*/
|
|
#ifndef KERNEL_TESTS_FAKES_H
|
|
#define KERNEL_TESTS_FAKES_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include "blkio.h"
|
|
|
|
/* The console: every console_println/console_puts line, in order. */
|
|
void fake_console_reset(void);
|
|
int fake_console_said(const char *text); /* 1 if some line contains `text` */
|
|
unsigned fake_console_lines(void);
|
|
const char *fake_console_line(unsigned i);
|
|
|
|
/* The RNG: a fixed sequence, so a test's GUIDs are the same every run; fake_rng_fail makes
|
|
* rng_get_bytes return -1 (no backend). */
|
|
void fake_rng_reset(void);
|
|
void fake_rng_fail(int fail);
|
|
|
|
/* A RAM disk of `blocks` 1 KiB blocks (512-byte sectors, so 2 per block). A read or write of a
|
|
* block in its fail lists returns BLKIO_EIO and changes nothing; every write is counted. */
|
|
#define FAKE_DISK_MAX_FAULTS 8
|
|
typedef struct {
|
|
uint8_t *bytes;
|
|
uint32_t blocks;
|
|
uint32_t fail_read[FAKE_DISK_MAX_FAULTS], n_fail_read;
|
|
uint32_t fail_write[FAKE_DISK_MAX_FAULTS], n_fail_write;
|
|
unsigned writes, flushes;
|
|
int fail_flush;
|
|
} fake_disk;
|
|
|
|
int fake_disk_open(blkio_dev_t *dev, fake_disk *d, uint32_t blocks); /* zeroed; BLKIO_OK */
|
|
int fake_disk_bind(blkio_dev_t *dev, fake_disk *d); /* open another handle on d */
|
|
void fake_disk_free(fake_disk *d);
|
|
void fake_disk_fail_read(fake_disk *d, uint32_t block);
|
|
void fake_disk_fail_write(fake_disk *d, uint32_t block);
|
|
uint8_t *fake_disk_sector(fake_disk *d, uint64_t lba); /* a 512-byte sector */
|
|
|
|
#endif
|