README.kimi.md

# 项目分析报告:Guomi

## 📌 项目概述

**Guomi** 是一个 Elixir 语言实现的**国密算法库**,基于 Erlang/OTP `:crypto` 模块能力构建。

| 属性 | 值 |
|------|------|
| **项目名** | guomi |
| **版本** | 0.1.0 |
| **语言** | Elixir (~> 1.14) |
| **许可证** | MIT |
| **依赖** | 仅 `ex_doc`(开发文档)|

---

## 📁 项目结构

```
guomi/
├── lib/
│   ├── guomi.ex      # 主模块(外观模式,当前为空壳)
│   ├── sm2.ex        # SM2 非对称加密算法(签名/验签)
│   ├── sm3.ex        # SM3 哈希算法
│   └── sm4.ex        # SM4 对称加密算法(ECB/CBC模式)
├── test/
│   ├── sm2_test.exs  # SM2 测试(19个测试用例)
│   ├── sm3_test.exs  # SM3 测试(10个测试用例)
│   ├── sm4_test.exs  # SM4 测试(19个测试用例)
│   └── test_helper.exs
├── mix.exs           # 项目配置
└── README.md         # 中文文档
```

---

## 🔐 算法实现详情

### 1. SM3 - 哈希算法 (`lib/sm3.ex`)

| 功能 | 状态 | 说明 |
|------|------|------|
| `hash/1` | ✅ | 返回 32 字节二进制哈希 |
| `hash_hex/1` | ✅ | 返回 64 字符小写十六进制字符串 |
| `supported?/0` | ✅ | 运行时检测 SM3 可用性 |

**特点**:
- 支持 `binary()` 和 `iodata()` 输入
- 完全依赖 Erlang `:crypto.hash(:sm3, data)`

---

### 2. SM4 - 对称加密 (`lib/sm4.ex`)

| 功能 | 状态 | 说明 |
|------|------|------|
| ECB 模式 | ✅ | `encrypt/3`, `decrypt/3` |
| CBC 模式 | ✅ | `encrypt_cbc/4`, `decrypt_cbc/4` |
| PKCS7 填充 | ✅ | 默认填充方式 |
| 无填充 | ✅ | `padding: :none` |
| `supported?/0` | ✅ | 检测 SM4 可用性 |

**技术规格**:
- 密钥长度:16 字节(128位)
- 块大小:16 字节(128位)
- IV 长度:16 字节(CBC模式)

---

### 3. SM2 - 非对称加密 (`lib/sm2.ex`)

| 功能 | 状态 | 说明 |
|------|------|------|
| 密钥对生成 | ✅ | `generate_keypair/0` |
| 签名 | ✅ | `sign/2` |
| 验签 | ✅ | `verify/3` |
| 加密 | ❌ | 返回 `{:error, :unsupported}` |
| 解密 | ❌ | 返回 `{:error, :unsupported}` |
| `supported?/0` | ✅ | 检测 SM2 曲线和 SM3 支持 |

**技术规格**:
- 曲线:`:sm2`
- 私钥长度:32 字节
- 公钥长度:65 字节(未压缩格式,首字节 0x04)
- 签名长度:64 字节

---

## ✅ 测试覆盖

| 模块 | 测试数 | 覆盖率 |
|------|--------|--------|
| SM2 | 19 个 | 签名验签、边界条件、错误处理 |
| SM3 | 10 个 | 标准向量、边界条件、中文字符 |
| SM4 | 19 个 | ECB/CBC 模式、填充、大数据量 |

**测试特点**:
- 使用 `async: true` 并行执行
- 对不支持的环境优雅降级(`{:error, :unsupported}`)
- 包含官方标准测试向量

---

## 🏗️ 架构设计

```
┌─────────────────────────────────────────┐
│           Guomi (外观模块)              │
├─────────────┬─────────────┬─────────────┤
│   SM2       │    SM3      │    SM4      │
│  非对称加密  │   哈希算法   │  对称加密   │
├─────────────┴─────────────┴─────────────┤
│       Erlang/OTP :crypto 模块           │
├─────────────────────────────────────────┤
│         OpenSSL 3.0+ (底层)             │
└─────────────────────────────────────────┘
```

---

## ⚠️ 注意事项

1. **运行时依赖**:算法可用性取决于 Erlang/OTP 和 OpenSSL 版本
   - 推荐:OTP 24+ 和 OpenSSL 3.0+

2. **SM2 加密限制**:当前实现仅支持签名验签,加解密功能未实现

3. **错误处理**:所有 API 使用 `{:ok, result} | {:error, reason}` 元组返回格式

---

## 🚀 使用示例

```elixir
# SM3 哈希
Guomi.SM3.hash_hex("abc")
#=> "66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0"

# SM4 加密
key = Base.decode16!("0123456789ABCDEFFEDCBA9876543210", case: :mixed)
{:ok, cipher} = Guomi.SM4.encrypt("secret data", key)
{:ok, plain} = Guomi.SM4.decrypt(cipher, key)

# SM2 签名
{:ok, sk, pk} = Guomi.SM2.generate_keypair()
{:ok, sig} = Guomi.SM2.sign("message", sk)
{:ok, true} = Guomi.SM2.verify("message", sig, pk)
```

---

## 📊 代码统计

| 文件 | 行数 | 说明 |
|------|------|------|
| `lib/guomi.ex` | 5 | 空壳外观模块 |
| `lib/sm2.ex` | 85 | SM2 实现 |
| `lib/sm3.ex` | 24 | SM3 实现 |
| `lib/sm4.ex` | 149 | SM4 实现 |
| `test/sm2_test.exs` | 161 | SM2 测试 |
| `test/sm3_test.exs` | 61 | SM3 测试 |
| `test/sm4_test.exs` | 137 | SM4 测试 |

**总计**:约 622 行代码(含测试)

---

*分析报告生成时间:2026-03-23*