crypery
描述
crypery 是纯 C/CPP 网络协议栈,由四个模块组成:TLS 1.2/1.3 密码库、OpenSSL 兼容 SSL 封装层、HTTPS 服务器与 HTTPS 客户端。
- 所有密码算法从零实现 - 无外部密码库。唯一的可选依赖是用于 gzip 压缩的 zlib(可用 HTTP_NO_GZIP 标志禁用)。
- 可移植 - 运行于 Windows(MinGW、Winsock)与类 Unix 系统(BSD 套接字、pthreads)。
- 完整流程:从底层密码学(AES-GCM、RSA、ECDH)到现成的 HTTP 服务器与 HTTP 客户端。
使用的模块
tls
基础密码层。纯 C/CPP 实现的 TLS 1.2 与 TLS 1.3 协议,内置原语集:
- AES-128-GCM 对称加密;
- SHA-256 哈希、HMAC-SHA256 MAC、HKDF-SHA256 密钥导出;
- 非对称密码学:RSA-2048(PKCS#1 v1.5 与 RSASSA-PSS 签名)、P-256(secp256r1)与 X25519 曲线的 ECDH;
- 自签名 X.509 证书(DER/PEM)的生成与解析,包括 PEM 文件加载;
- TLS 连接上下文:握手(客户端/服务器、版本自动选择)、应用数据加解密、SNI、对端证书验证、close_notify;
- 线程安全:随机数生成(xorshift128)受锁保护,可在线程池中并行握手。
ssl
内置 TLS 实现之上的 OpenSSL 兼容 API 层,为 OpenSSL 编写的代码无需修改即可工作:
- 与 OpenSSL 兼容的上下文与连接类型;
- 从 PEM 文件加载证书与私钥、校验密钥与证书匹配;
- 服务器与客户端握手(TLS 1.2/1.3);
- 套接字上的加密输入输出;
- 可调超时:I/O 操作、完整握手、TLS 记录写入等待、分片包组装;
- 对端证书验证模式;
- 平台适配:Windows 上 Winsock,POSIX 上 BSD 套接字。
http
基于内置 TLS 栈的自包含 HTTP/1.1 服务器库:
- 按方法与路径的请求路由与自定义处理函数;
- 从根目录提供静态文件,带 MIME 类型识别;
- gzip 压缩:提供预压缩 .gz 文件与通过 zlib 的实时压缩(可用 HTTP_NO_GZIP 禁用);
- WebSocket(RFC 6455):连接升级、帧读写(文本、二进制、close、ping/pong);
- Server-Sent Events(SSE);
- query 字符串解析(URL 解码)与 multipart/form-data(包括文件上传);
- 安全:防 path traversal、屏蔽敏感路径(.git、.env、config* 等)、按域名列表校验 Host 头、请求体与请求头大小限制;
- 带环形连接队列的工作线程池、阻塞 accept 循环;
- 按首字节自动识别 TLS/HTTP(0x16 → TLS,否则返回 426 的 HTTP);
- 统计:按状态码类别的请求计数、uptime、req/s;
- 自有平台适配(套接字、字符串、线程、互斥锁、事件)- 模块不依赖外部 compat 头文件。
url
基于内置 TLS 栈的自包含 HTTP/HTTPS 客户端库:
- 绝对 URL 解析:http/https、显式端口、userinfo、片段、IPv6 字面量;
- HTTP/1.1 请求(GET、POST、HEAD 等),自定义请求头、请求体、Content-Type、Range;
- 响应读取:状态行、请求头、按 Content-Length 的请求体、分块传输编码或读至 EOF;
- 重定向处理(301/302/303/307/308),RFC 7231 方法语义与跳转次数限制;
- multipart/form-data 请求体组装(字段与文件、boundary 生成、按扩展名识别 MIME);
- 传输层:DNS 解析、带超时的连接、TLS 握手(SNI、跳过证书验证选项)、缓冲输入输出;
- 遵循 curl 约定的错误码;
- 通过回调的可选详细日志(可用 URL_NO_LOG 禁用)。
技术
- 语言:纯 C/CPP,无外部依赖(zlib - 可选)
- 协议:TLS 1.2、TLS 1.3、HTTP/1.1、HTTPS、WebSocket(RFC 6455)、SSE、分块传输编码
- 密码学:AES-128-GCM、SHA-256、HMAC-SHA256、HKDF-SHA256、RSA-2048(PKCS#1 v1.5、RSASSA-PSS)、ECDH P-256(secp256r1)、X25519、X.509(DER/PEM)、SHA-1(仅用于 WebSocket 握手)
- 网络层:Winsock2(Windows)/ BSD 套接字(POSIX)、select() 超时、SO_RCVTIMEO、DNS 用 getaddrinfo
- 线程:WinAPI 线程(Windows)/ pthreads(POSIX)、工作线程池、临界区/互斥锁、自动重置事件
- 压缩:经 zlib 的 gzip(可选)
- API 兼容:OpenSSL(SSL_CTX/SSL)与 curl(url_*)
- 许可证:GNU AGPL v3(Affero GPL)