#证书 #数字 #绿色 #解析器 #欧盟 #covid-19 #读取

bin+lib greenpass

Rust 包用于解析欧盟 COVID-19 数字绿色证书

2 个不稳定版本

0.2.0 2022 年 1 月 28 日
0.1.0 2021 年 7 月 3 日

#1654密码学

21 每月下载次数

MPL-2.0 许可证

45KB
1K SLoC

Crate dependency status Build

greenpass

一个 Rust 包,用于解析欧盟 COVID-19 数字绿色证书,并提供一个简单的工具以格式化的方式导出证书。

基于欧盟发布的《数字绿色证书 JSON 规范》和《数字绿色证书技术规范》(JSON 规范技术规范)。未实现加密签名的验证。请不要将此代码用于非教育目的的证书验证。

用法

此包能够加载 Base45 编码的 DGC 有效载荷。它不支持直接解析条形码,但可以与 ZBar 一起使用,从图像中读取数字绿色证书

$ greenpass <(zbarimg -q pass.png | sed s/QR-Code://)
EU Digital COVID Certificate

Issued by: AT
Created at: 2021-07-02 23:58:57 UTC
Expires at: 2022-07-02 23:58:57 UTC

Pass#0:
    Cert version 1.2.1
    Emitted to: Gabriele Musterfrau-Gößinger
    Standardized Name: GABRIELE MUSTERFRAU<GOESSINGER
    Date of birth: 1998-02-26

    Vaccination data:
        Cert ID: URN:UVCI:01:AT:10807843F94AEE0EE5093FBC254BD813#B
        Disease: 840539006
        Issuer: Ministry of Health, Austria
        Country: AT
        Vaccination date: 2021-02-18
        Doses administered: 1/2
        Product ID: EU/1/20/1528
        Market Authorization ID: ORG-100030215
        Vaccine/Prophylaxis ID: 1119349007

上面的证书是虚构的,并使用 此工具生成。

从代码解析证书

此包也可以用作库

let vac_hc = HealthCert {
    some_issuer: Some("AT".into()),
    created: Utc.ymd(2021, 07, 02).and_hms(23, 58, 57),
    expires: Utc.ymd(2022, 07, 02).and_hms(23, 58, 57),
    passes: vec![GreenPass {
        date_of_birth: "1998-02-26".into(),
        surname: "Musterfrau-Gößinger".into(),
        givenname: "Gabriele".into(),
        std_surname: "MUSTERFRAU<GOESSINGER".into(),
        std_givenname: "GABRIELE".into(),
        ver: "1.2.1".into(),
        entries: vec![CertInfo::Vaccine(Vaccine {
            cert_id: "URN:UVCI:01:AT:10807843F94AEE0EE5093FBC254BD813#B".into(),
            country: "AT".into(),
            date: NaiveDate::from_ymd(2021, 02, 18),
            disease: "840539006".into(),
            dose_number: 1,
            dose_total: 2,
            issuer: "Ministry of Health, Austria".into(),
            market_auth: "ORG-100030215".into(),
            product: "EU/1/20/1528".into(),
            prophylaxis_kind: "1119349007".into(),
        })],
    }],
};

let buf_str = std::fs::read_to_str("vac_base45.txt")?;
let hc_parsed = greenpass::parse(&buf_str)?;

assert_eq!(hc_parsed, vac_hc);

模糊测试

要运行模糊测试器,需要 cargo-fuzz

cargo安装 cargo-fuzz

然后进行基本的模糊测试活动

cargo+nightly fuzz run greenpass_parse

cargo-fuzz 的更多选项请参阅其文档。

依赖项

~4.5MB
~83K SLoC