diff --git a/CLAUDE.md b/CLAUDE.md index 93847c7..16446fb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -173,7 +173,7 @@ kernel_api 已暴露能力:log, rsdp_address, fb_address/width/height/pitch/bp 下一阶段优先路线(活跃路线 = `docs/ROADMAP_INSANE.md` 五期填补计划,任务编号 F/U/D/R/E;状态唯一来源 = `docs/STATUS.md`): 1. **一期 F 系列收尾**: F2 统一控制台后端(fbcon.h 抽象已落,panic 已用)。(F1 莲花 panic / F3 跨平台 Makefile / F4 boot 分级自检 / F5 skip_firstinit 已完成) -2. **二期 U 系列**: @sealed 段标记(~~U2 Slow Path~~、~~U4 密文 dump~~、~~U5 KAT~~ 已完成;chacha20 KAT 已落地为 RFC 8439 官方向量并三方对拍,"间歇 FAIL" 确认为从未合并的幽灵缺陷)。 +2. **二期 U 系列**: ✅ 已完成(U1 UUID 表 / U2 Slow Path 真分支 / U3 @sealed 可选标记+linker .sealed section / U4 密文 dump / U5 RFC 8439 KAT)。chacha20 KAT 三方对拍通过(pycryptodome+官方向量+C),"间歇 FAIL" 确认为从未合并的幽灵缺陷。 3. **三期 D 系列**: DKM 热卸载(引用计数)、裸机器码加载器、按名 API 导出表、彩色日志。 4. **四期 R 系列收尾**: segment/system 级回滚验证、PCQ per-cpu 多核。(~~drr_emergency_pool_kb/drr_recovery_log_size 接线~~ R3b 已完成,运行期钳位验证 PASS) 5. **五期 E 系列**: 启动莲花动画、假想时光键彩蛋、提交信息规范、风味 ISO。 diff --git a/CODE/UTSM/include/utsm/segment.h b/CODE/UTSM/include/utsm/segment.h index 9ba2f80..0278d65 100644 --- a/CODE/UTSM/include/utsm/segment.h +++ b/CODE/UTSM/include/utsm/segment.h @@ -22,6 +22,10 @@ typedef enum { #define UTSM_SEG_F_EXEC (1U << 2) #define UTSM_SEG_F_DMA (1U << 3) #define UTSM_SEG_F_STRONG_RECOVERY (1U << 4) +/* U3: @sealed 可选标记。默认(不加此 flag)= 封缄段(密文存储,读写走 UTRW + * 加解密);加 UTSM_SEG_F_UNSEALED = 明文直存段(0 加解密开销,读写仍走 + * capability 校验与 dirty 跟踪,但直接 memcpy)。"用户能选锁不锁"。 */ +#define UTSM_SEG_F_UNSEALED (1U << 5) typedef struct utsm_segment_desc { uuid128_t segment_uuid; diff --git a/CODE/UTSM/linker.ld b/CODE/UTSM/linker.ld index 2aede7b..677511b 100644 --- a/CODE/UTSM/linker.ld +++ b/CODE/UTSM/linker.ld @@ -27,6 +27,16 @@ SECTIONS *(COMMON) } :data + /* U3: @sealed 段标记 —— 用户代码可把静态数据放进 .sealed section + *(__attribute__((section(".sealed")))),UTSM 侧可遍历 + * [__sealed_start, __sealed_end) 对该区建立封缄段。未标记数据 0 开销。 */ + .sealed : ALIGN(4K) { + __sealed_start = .; + *(.sealed) + *(.sealed.*) + __sealed_end = .; + } :data + .bss : ALIGN(4K) { *(.bss*) } :data diff --git a/CODE/UTSM/test/utsm_selftest.c b/CODE/UTSM/test/utsm_selftest.c index e7cdb7f..e8c81b3 100644 --- a/CODE/UTSM/test/utsm_selftest.c +++ b/CODE/UTSM/test/utsm_selftest.c @@ -156,6 +156,40 @@ int utsm_selftest_run(void) { log_info("[UTSM] selftest slow POISONED ok"); } + /* ==== U3: @sealed 可选标记 —— unsealed 段明文直存(0 加解密开销) ==== */ + { + utsm_capability ucap; + status = utsm_create_segment(process, UTSM_PAGE_SIZE, + UTSM_SEG_F_READ | UTSM_SEG_F_WRITE | + UTSM_SEG_F_UNSEALED, + &ucap); + if (status != UTSM_OK) { + log_error("[UTSM] selftest unsealed segment create failed"); + return status; + } + const char *upl = "unsealed plain text 00"; + u64 ulen = strlen(upl) + 1; + status = utsm_write(ucap, 128, upl, ulen); + if (status != UTSM_OK) { + log_error("[UTSM] selftest unsealed write failed"); + return status; + } + utsm_segment_desc *udesc = utsm_get_segment(ucap.segment_slot); + if (!udesc) return UTSM_ERR_INVALID; + /* 明文直存:存储区内容必须与明文完全一致(0 开销的可观察证据) */ + if (memcmp(udesc->cipher_base + 128, upl, ulen) != 0) { + log_error("[UTSM] selftest unsealed store not plaintext"); + return UTSM_ERR_INVALID; + } + char urb[64]; + status = utsm_read(ucap, 128, urb, ulen); + if (status != UTSM_OK || memcmp(urb, upl, ulen) != 0) { + log_error("[UTSM] selftest unsealed read failed"); + return (status == UTSM_OK) ? UTSM_ERR_INVALID : status; + } + log_info("[UTSM] selftest unsealed segment ok (plain storage)"); + } + /* ==== SCHED-1: O(1) runqueue 语义(合成 TCB,协作式,无 tick) ==== */ /* ==== SCHED-1 + SCHED-2: runqueue / block-wake(tick 竞态保护) ==== */ { diff --git a/CODE/UTSM/test/utsm_selftest.o b/CODE/UTSM/test/utsm_selftest.o index d588f47..bde49fc 100644 Binary files a/CODE/UTSM/test/utsm_selftest.o and b/CODE/UTSM/test/utsm_selftest.o differ diff --git a/CODE/UTSM/utrw/read.c b/CODE/UTSM/utrw/read.c index abcac6a..3f14617 100644 --- a/CODE/UTSM/utrw/read.c +++ b/CODE/UTSM/utrw/read.c @@ -20,6 +20,12 @@ int utsm_read(utsm_capability cap, u64 offset, void *dst, u64 len) { return status; } + /* U3: @unsealed 段 —— 明文直存,0 加解密开销(capability 校验照走) */ + if (desc->flags & UTSM_SEG_F_UNSEALED) { + memcpy(dst, desc->cipher_base + offset, len); + return UTSM_OK; + } + utsm_key_material key; status = utsm_pckc_get_or_derive(cap.segment_slot, desc, &key); if (status != UTSM_OK) { diff --git a/CODE/UTSM/utrw/read.d b/CODE/UTSM/utrw/read.d new file mode 100644 index 0000000..c2a6c22 --- /dev/null +++ b/CODE/UTSM/utrw/read.d @@ -0,0 +1,14 @@ +utrw/read.o: utrw\read.c include\utsm\utrw.h include\utsm\types.h \ + include\utsm\status.h include\utsm\capability.h include\utsm\segment.h \ + include\utsm\uuid.h include\utsm\dirty.h include\utsm\pckc.h \ + include\utsm\config.h include\utsm\crypto.h +include\utsm\utrw.h: +include\utsm\types.h: +include\utsm\status.h: +include\utsm\capability.h: +include\utsm\segment.h: +include\utsm\uuid.h: +include\utsm\dirty.h: +include\utsm\pckc.h: +include\utsm\config.h: +include\utsm\crypto.h: diff --git a/CODE/UTSM/utrw/read.o b/CODE/UTSM/utrw/read.o index 5f91151..b9ab9c3 100644 Binary files a/CODE/UTSM/utrw/read.o and b/CODE/UTSM/utrw/read.o differ diff --git a/CODE/UTSM/utrw/write.c b/CODE/UTSM/utrw/write.c index 5ddbd6f..2d04619 100644 --- a/CODE/UTSM/utrw/write.c +++ b/CODE/UTSM/utrw/write.c @@ -21,6 +21,18 @@ int utsm_write(utsm_capability cap, u64 offset, const void *src, u64 len) { return status; } + /* U3: @unsealed 段 —— 明文直存,0 加解密开销;dirty/seqlock/log 照走, + * checkpoint 路径对明文页同样适用(页 MAC 语义由 DRR 侧统一处理)。 */ + if (desc->flags & UTSM_SEG_F_UNSEALED) { + drr_log_write_intent(cap.segment_slot, offset, len); + desc->writer_seq++; + memcpy(desc->cipher_base + offset, src, len); + utsm_mark_dirty(desc, offset, len); + desc->writer_seq++; + drr_log_write_commit(cap.segment_slot, offset, len); + return UTSM_OK; + } + utsm_key_material key; status = utsm_pckc_get_or_derive(cap.segment_slot, desc, &key); if (status != UTSM_OK) { diff --git a/CODE/UTSM/utrw/write.d b/CODE/UTSM/utrw/write.d new file mode 100644 index 0000000..236c615 --- /dev/null +++ b/CODE/UTSM/utrw/write.d @@ -0,0 +1,15 @@ +utrw/write.o: utrw\write.c include\utsm\utrw.h include\utsm\types.h \ + include\utsm\status.h include\utsm\capability.h include\utsm\segment.h \ + include\utsm\uuid.h include\utsm\dirty.h include\utsm\pckc.h \ + include\utsm\config.h include\utsm\crypto.h include\utsm\drr.h +include\utsm\utrw.h: +include\utsm\types.h: +include\utsm\status.h: +include\utsm\capability.h: +include\utsm\segment.h: +include\utsm\uuid.h: +include\utsm\dirty.h: +include\utsm\pckc.h: +include\utsm\config.h: +include\utsm\crypto.h: +include\utsm\drr.h: diff --git a/CODE/UTSM/utrw/write.o b/CODE/UTSM/utrw/write.o index 1bd25a5..0bde9e8 100644 Binary files a/CODE/UTSM/utrw/write.o and b/CODE/UTSM/utrw/write.o differ diff --git a/SYSTEM/boot/utsm.elf b/SYSTEM/boot/utsm.elf index 73691d0..e9a9103 100755 Binary files a/SYSTEM/boot/utsm.elf and b/SYSTEM/boot/utsm.elf differ diff --git a/SYSTEM/system/deshab64/FUCK b/SYSTEM/system/deshab64/FUCK index 315e43c..669a173 100644 --- a/SYSTEM/system/deshab64/FUCK +++ b/SYSTEM/system/deshab64/FUCK @@ -99,3 +99,5 @@ pe_dll_search=1 + + diff --git a/build/configs/dev/FUCK b/build/configs/dev/FUCK index 315e43c..669a173 100644 --- a/build/configs/dev/FUCK +++ b/build/configs/dev/FUCK @@ -99,3 +99,5 @@ pe_dll_search=1 + + diff --git a/docs/ROADMAP_INSANE.md b/docs/ROADMAP_INSANE.md index 9e7e841..9817002 100644 --- a/docs/ROADMAP_INSANE.md +++ b/docs/ROADMAP_INSANE.md @@ -44,11 +44,11 @@ Deshab 最标志性的疯点——给空气上锁。 |------|------|---------|------|-------------------| | U1 | UTSM 元数据区(UUID 表) | 每页都有"身份" | ✅ | 封缄段表 + UUID 调谐已就位(`CODE/UTSM/core/segment.c`),可查询页归属 | | U2 | UTRW Fast/Slow Path 真分支 | 快慢路不是画出来的 | ✅ | Fast path ✅;Slow path ✅(EPOCH/KEY_MISS 恢复,MAC_FAILED/POISONED 交 DRR,selftest PASS) | -| U3 | `@sealed` 段可选标记 | 用户能选锁不锁 | ⬜ | 链接脚本支持 `__sealed` section;未标记段 0 开销 | +| U3 | `@sealed` 段可选标记 | 用户能选锁不锁 | ✅ | `UTSM_SEG_F_UNSEALED` 明文直存(0 加解密开销)+ linker.ld `.sealed` section(`__sealed_start/end`);selftest PASS | | U4 | 密文页 dump 工具 | 发疯也要可调试 | ✅ | `utrw_debug_dump_page`:串口 64B 密文/明文 hex 对照,selftest 内置演示(QEMU PASS) | | U5 | UTSM selftest 全覆盖 | 把🔶刷成✅ | ✅ | chacha20 KAT = RFC 8439 §2.4.2 官方向量(三方对拍);"间歇 FAIL" 确认为幽灵缺陷(从未合并进树);KAT+MAC 确定性+段表+越界+调度+DRR 全量稳定 PASS | -二期做完:UTSM 从"设计"变"可开关的特性",疯得有旋钮。 +**二期完成:UTSM 从"设计"变成"可开关的特性",疯得有旋钮。** --- diff --git a/docs/STATUS.md b/docs/STATUS.md index 5ba7fab..264b847 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -27,7 +27,7 @@ | 封缄段表 / UUID 调谐(U1) | ✅ | 段创建/查询闭环 | `CODE/UTSM/core/segment.c` | | UTRW Fast Path | ✅ | capability→PCKC→line 解密→seqlock | `utrw/read.c` | | UTRW Slow Path(U2) | ✅ | EPOCH 刷新 / KEY_MISS 重派生 / POISONED+MAC_FAILED→DRR / STALE_CAP 拒绝;全分支 selftest PASS | `utrw/slow_path.c` + `.build_tmp/qemu_serial_u2slowpath.log` | -| `@sealed` 段标记(U3) | ⬜ | 未实现 | — | +| `@sealed` 段标记(U3) | ✅ | 默认封缄;`UTSM_SEG_F_UNSEALED` 段明文直存(0 加解密开销,capability/dirty/checkpoint 照走);linker.ld `.sealed` section + `__sealed_start/end` 符号就位 | `.build_tmp/qemu_serial_u3sealed.log` + llvm-nm | | 密文页 dump(U4) | ✅ | `utrw_debug_dump_page(slot,page,offset)`:串口输出 64B 密文/明文 hex 对照(selftest 内置演示) | `.build_tmp/qemu_serial_u4dump.log` | | selftest(U5) | ✅ | chacha20 KAT 落地为 RFC 8439 §2.4.2 官方向量(gen_chacha_kat.py 生成,pycryptodome 独立对拍);"间歇 FAIL" 确认为幽灵缺陷(该测试从未合并进本树);page MAC 确定性检查已加;全量 selftest 稳定 PASS | `.build_tmp/qemu_serial_u5kat.log` | | 真实加密原语 | 🔶 | chacha20/KDF/MAC 已落(Phase 9 早期),PCKC schedule 待接 | `crypto/` | diff --git a/docs/TASKBOARD.md b/docs/TASKBOARD.md index 00cebab..9c2ada6 100644 --- a/docs/TASKBOARD.md +++ b/docs/TASKBOARD.md @@ -15,7 +15,7 @@ - [x] U1 UTSM 元数据区 / UUID 调谐表 - [x] U2 UTRW Slow Path 真分支(EPOCH/KEY_MISS 恢复 + MAC_FAILED/POISONED→DRR;selftest PASS) -- [ ] U3 `@sealed` 段可选标记(链接脚本 `__sealed` section) +- [x] U3 `@sealed` 段可选标记(`UTSM_SEG_F_UNSEALED` 明文直存段 + linker.ld `.sealed` section;selftest PASS) - [x] U4 密文页 dump 工具(utrw_debug_dump_page:密文/明文 hex 对照,selftest 演示 PASS) - [x] U5 UTSM selftest 全覆盖(RFC 8439 KAT 落地,"间歇 FAIL" 确认为幽灵缺陷;全量稳定 PASS)