5 个版本

0.2.0 2024 年 4 月 23 日
0.1.3 2024 年 1 月 30 日
0.1.2 2024 年 1 月 10 日
0.1.1 2024 年 1 月 10 日
0.1.0 2024 年 1 月 10 日

#387 in 加密学

Download history 148/week @ 2024-04-23 8/week @ 2024-04-30 2/week @ 2024-05-28 3/week @ 2024-06-04 37/week @ 2024-07-02

309 每月下载量
用于 rustls-symcrypt

MIT/Apache

225KB
5.5K SLoC

SymCrypt Rust 包装器

此包提供了对开源加密库 SymCrypt 的友好且自然的 Rust 包装器。

此包依赖于 symcrypt-sys,它使用 bindgen 创建 Rust/C FFI 绑定。

注意:从版本 0.2.0 开始,仅支持 Windows AMD64Azure Linux,对其他 Linux 发行版(如 Ubuntu)提供部分支持。

快速入门指南

Windows

SymCrypt 发布页面 下载对应 CPU 架构的 symcrypt.dllsymcrypt.lib,并将它们放置在您的计算机上的一个可访问位置。

设置所需的 SYMCRYPT_LIB_PATH 环境变量。您可以使用以下命令完成此操作

setxSYMCRYPT_LIB_PATH "<your-path-to-symcrypt-lib-folder>"

在运行时,Windows 将处理查找所有必需的 dll,以运行目标程序,包括我们的 symcrypt.dll 文件。

以下是两个推荐选项,以确保在运行时 Windows 可以找到您的 symcrypt.dll,更多信息请参阅 动态链接库搜索顺序

  1. symcrypt.dll 放在与您的输出 .exe 文件相同的文件夹中。如果您正在进行开发(而非发布),常见的路径将是:C:\your-project\target\debug\
  2. 永久地将 symcrypt.dll 路径添加到您的系统 PATH 环境变量中。这样做将确保任何使用 SymCrypt crate 的项目都能访问到 symcrypt.lib

有关更多信息,请参阅 rust-symcrypt 页面上的 INSTALL.md 文件。

Linux

SymCrypt 发布页面下载与您对应的 CPU 架构对应的所有 libsymcrypt.so* 文件。

目前通过软件包管理器支持 DebianUbuntu,但现在您必须将 libsymcrypt.so* 文件放入链接器加载路径。这种方式在不同的发行版之间会有所不同。在大多数发行版中,它通过环境变量 $LD_LIBRARY_PATH

来设置。

如果您通过 Azure Linux 使用 tdnf install symcrypt,则已提供软件包管理器支持。

有关更多信息,请参阅 rust-symcrypt 页面上的 INSTALL.md 文件。

注意:这个路径可能因您的 Linux 发行版而异。目标是放置 libsymcrypt.so* 文件,以便您的 Linux 发行版在构建/运行时可以找到所需的库。

支持的 API

哈希

  • Sha256 ( 状态/无状态 )
  • Sha384 ( 状态/无状态 )

HMAC

  • HmacSha256 ( 状态/无状态 )
  • HmacSha384 ( 状态/无状态 )

GCM

  • 加密 ( 原地 )
  • 解密 ( 原地 )

ChaCha

  • 加密 ( 原地 )
  • 解密 ( 原地 )

ECDH

  • ECDH 秘密协议

用法

每个文件都附带单元测试,展示了如何使用每个函数。其中包含一些示例代码,用于执行无状态的 Sha256 哈希。必须在调用底层的 symcrypt 代码之前运行 symcrypt_init()

注意:此代码片段还使用了 hex crate。

说明

将 symcrypt 添加到您的 Cargo.toml 文件中。

[dependencies]
symcrypt = "0.2.0"
hex = "0.4.3"

在您的代码中包含 symcrypt

use symcrypt::hash::sha256; 
use symcrypt::symcrypt_init();
use hex;
fn main() {
    symcrpyt_init();
    let data = hex::decode("641ec2cf711e").unwrap();
    let expected: &str = "cfdbd6c9acf9842ce04e8e6a0421838f858559cf22d2ea8a38bd07d5e4692233";

    let result = sha256(&data);
    assert_eq!(hex::encode(result), expected);
}

依赖项

~52KB