# swsdp **Repository Path**: snoware/swsdp ## Basic Information - **Project Name**: swsdp - **Description**: 用于部署,更新,授权等的覆盖软件全生命周期的协议解决方案 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-29 - **Last Updated**: 2026-08-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SWE-SDP / BamZap — 流式更新与软件分发协议 协议名可与 **BamZap** 混用:SWE-SDP 是协议名,BamZap 是实现与产品名。 - 参考:(gitee.com/snoware/bamzap) - 许可:MulanPSL-2.0 - 配置格式:**SML**(深度使用,在使用中拓展) ## 定位 面向**个人 / 小开发主体**的软件分发:存储与数据分离、便于部署与开发, 同时可灵活拓展并广泛部署。覆盖软件全生命周期(分发、更新、可选的反馈与授权)。 ## 分层 只有**跨包 / 跨领域可复用**的才独立成 crate,其余留在协议本体内。 | crate | 职责 | 可复用性 | |---|---|---| | `swcas` | 内容寻址存储 + 内容定义分块(CDC) | 跨领域(任何去重/增量场景) | | `swsig` | 国密 SM2/SM3 签名 + deny-by-default 信任库 | 跨领域(任何签名/信任场景) | | `swsdp` | 协议本体:对象池、ref、流式更新、部署 | 仅本协议 | ## 关键设计决策 ### 为什么用 CDC 而非固定分块 固定分块下,在文件开头插入**一个字节**会让所有后续块边界整体偏移, 整份文件在内容寻址存储里全部失效,跨版本去重完全失效。 CDC 用内容决定切点,局部修改只影响相邻少数块,其余块哈希不变、可直接复用—— 这是「两版本间只传差异块」的基础。测试 `fixed_size_chunking_would_lose_everything` 用对照实验证明了这一点(固定分块相同块数 = 0,CDC > 0)。 ### 为什么用 Gear hash 而非 Rabin 初版用 Rabin(多项式 `h*BASE+b`),但移除滑出窗口的字节需要权重项 `BASE^(W-1)`,而 `257^15 ≈ 2^121` **放不进 u64**:debug 下直接溢出报错, release 下静默回绕导致切点漂移(更隐蔽)。 Gear hash(FastCDC 所用)只有移位与加法:`h = (h<<1) + GEAR[b]`,天然不溢出。 `GEAR` 表用固定种子的 splitmix64 **编译期**生成,保证跨平台切点一致 ——否则同一文件在不同机器上切点不同,去重失效。 ### 为什么签名绑定 domain 若直接签数据,同一个 `(pub, data, sig)` 可在任何上下文复用。 把 domain 前缀进待签消息后,签名只在声明的域内有效。 测试 `domain_is_bound_to_signature` 覆盖了这一点。 ### 为什么 deny-by-default 信任库为空时**不放行任何内容**,而非放行未知来源。 默认失败是安全的,默认放行不是。且**先验信任再验签**—— 对不受信的密钥不必浪费算力,也避免对未知来源内容做密码学运算。 ### 为什么向国标靠齐 签名用 **SM2**(GB/T 32918)+ 摘要用 **SM3**(GB/T 32905), 实现用 `libsmx`(纯 Rust / no_std / 常量时间),与 resender 保持栈一致。 ### 传输层可插拔 协议本体不绑定具体传输。本地存储只要求实现 `ObjectStore` trait (`put` / `get` / `contains` / `len` / `ids`);远程后端按 feature 启用 (`https` / `fs`),不启用则零网络依赖。 ## 服务端形态(方案 A:静态对象空间) 分发端采用**静态文件服务器**形态(Caddy / nginx 即可,无服务端代码): 对象按内容寻址路径暴露,引用为签名 SML 文件,客户端按差量拉取缺失块。 安全由协议层保证(内容哈希自证 + 引用验签),服务器无状态、零运维。 设计文档:[docs/static-object-space.md](docs/static-object-space.md) ```text objects// 内容寻址对象(只增不改) refs/.sml 签名引用(更新时覆盖) version.sml 更新检查文件(可选) ``` ## 状态 | crate | 测试 | 说明 | |---|---|---| | `swcas` | 8 passed | CDC 分块、去重、重建、差量计算 | | `swsig` | 8 passed | SM2 签名/验签、domain 绑定、信任库 | | `swsdp` | 设计中 | 对象池、ref、流式更新、声明式部署 | ```bash cargo test -p swcas -p swsig ```