#证书 #签名验证 #x509 #公钥 #算法 #标识符 #ecdsa

无 std x509-verify

基于算法标识符验证 X.509 签名的纯 Rust 库

12 个不稳定版本 (3 个重大更改)

0.4.6 2024年6月1日
0.4.5 2024年1月8日
0.4.4 2023年11月19日
0.4.0 2023年10月29日
0.1.1 2023年10月25日

#1042 in 加密学

Download history 34/week @ 2024-05-02 32/week @ 2024-05-09 24/week @ 2024-05-16 30/week @ 2024-05-23 215/week @ 2024-05-30 62/week @ 2024-06-06 47/week @ 2024-06-13 13/week @ 2024-06-20 15/week @ 2024-06-27 35/week @ 2024-07-04 24/week @ 2024-07-11 28/week @ 2024-07-18 189/week @ 2024-07-25 215/week @ 2024-08-01 89/week @ 2024-08-08 129/week @ 2024-08-15

每月下载量 624

Apache-2.0 OR MIT

50KB
922

x509-verify

这是一个纯 Rust 实现,无需标准库的 X.509 验证库。它使用了 RustCryptoX.509 格式DSARSAECDSA 实现。以及 dalekEd25519 版本。

该库的目的是提供一种通用方法来验证常见的 X.509 算法标识符。它旨在抽象掉 X.509 结构内签名的一些验证细节。例如

  • 提取证书的公钥并将其映射到相应的密钥容器
  • 提取签名的原始消息并运行它通过相应的摘要算法
  • 提取签名字节并将它们结构化为标识算法所需的形式

该库大量依赖底层算法的外部实现。这些算法都将作为可选功能包含,以便用户可以选择与他们用例相关的任何内容。

安全警告

该库的一些功能处于早期实验阶段。请自行承担风险使用。

当前支持

DSA

  • DSA_WITH_SHA_1
  • DSA_WITH_SHA_224
  • DSA_WITH_SHA_256

EdDSA

  • ED25519

RSA

  • MD_2_WITH_RSA_ENCRYPTION
  • MD_5_WITH_RSA_ENCRYPTION
  • SHA_1_WITH_RSA_ENCRYPTION
  • SHA_224_WITH_RSA_ENCRYPTION
  • SHA_256_WITH_RSA_ENCRYPTION
  • SHA_384_WITH_RSA_ENCRYPTION
  • SHA_512_WITH_RSA_ENCRYPTION

ECDSA

  • ECDSA_WITH_SHA_224
  • ECDSA_WITH_SHA_256
  • ECDSA_WITH_SHA_384
  • ECDSA_WITH_SHA_512

EC 曲线

验证

#[cfg(all(feature = "rsa", feature = "sha2"))]
{
    use der::{DecodePem, Encode};
    use std::fs;
    use x509_cert::Certificate;
    use x509_verify::{Signature, VerifyInfo, VerifyingKey};

    // Self-signed certificate
    let cert = fs::read_to_string("testdata/rsa2048-sha256-crt.pem").unwrap();
    let cert = Certificate::from_pem(&cert).unwrap();

    let verify_info = VerifyInfo::new(
        cert.tbs_certificate
            .to_der()
            .unwrap()
            .into(),
        Signature::new(
            &cert.signature_algorithm,
            cert.signature
                .as_bytes()
                .unwrap(),
        ),
    );

    let key: VerifyingKey = cert
        .tbs_certificate
        .subject_public_key_info
        .try_into()
        .unwrap();

    // Keeps ownership
    key.verify(&verify_info).unwrap();

    // Throws away ownership
    key.verify(verify_info).unwrap();
}

x509 功能

#[cfg(all(feature = "rsa", feature = "sha2", feature = "x509", feature = "pem"))]
{
    use der::{Decode, DecodePem, Encode};
    use std::{io::Read, fs};
    use x509_verify::{
        x509_cert::{crl::CertificateList, Certificate},
        x509_ocsp::{BasicOcspResponse, OcspResponse, OcspResponseStatus},
        VerifyingKey,
    };

    // CA-signed certificate

    let ca = fs::read_to_string("testdata/digicert-ca.pem").unwrap();
    let ca = Certificate::from_pem(&ca).unwrap();

    let cert = fs::read_to_string("testdata/amazon-crt.pem").unwrap();
    let cert = Certificate::from_pem(&cert).unwrap();

    let key = VerifyingKey::try_from(&ca).unwrap();
    key.verify(&cert).unwrap();

    // CA-signed CRL

    let ca = fs::read_to_string("testdata/GoodCACert.pem").unwrap();
    let ca = Certificate::from_pem(&ca).unwrap();

    let crl = fs::read("testdata/GoodCACRL.crl").unwrap();
    let crl = CertificateList::from_der(&crl).unwrap();

    let key = VerifyingKey::try_from(&ca).unwrap();
    key.verify(&crl).unwrap();

    // CA-signed OCSP response

    let ca = fs::read_to_string("testdata/digicert-ca.pem").unwrap();
    let ca = Certificate::from_pem(&ca).unwrap();

    let res = fs::read("testdata/ocsp-amazon-resp.der").unwrap();
    let res = OcspResponse::from_der(&res).unwrap();
    assert_eq!(res.response_status, OcspResponseStatus::Successful);
    let res = BasicOcspResponse::from_der(
        res.response_bytes
            .unwrap()
            .response
            .as_bytes(),
    )
    .unwrap();

    let key = VerifyingKey::try_from(&ca).unwrap();
    key.verify(&res).unwrap();
}

可选功能

功能 默认 描述
md2 MD-2 摘要
md5 MD-5 摘要
sha1 SHA-1 摘要
sha2 ✔️ SHA-2 摘要
dsa DSA 签名
rsa ✔️ RSA 签名
k256 ✔️ secp256k1 ECDSA 签名
p192 secp192r1 ECDSA 签名
p224 secp224r1 ECDSA 签名
p256 ✔️ secp256r1 ECDSA 签名
p384 ✔️ secp384r1 ECDSA 签名
ecdsa k256, p192, p224, p256, 和 p384
ed25519 ✔️ Ed25519 签名
x509 启用 X.509 结构转换
pem DecodePem 特性添加到 X.509 重新导入
std

许可证

由您决定

依赖项

~8.5MB
~168K SLoC