4 个版本

0.2.1 2024 年 8 月 1 日
0.2.0 2024 年 7 月 26 日
0.1.1 2023 年 9 月 25 日
0.1.0 2022 年 12 月 15 日

#1075密码学

Download history • Rust 包仓库 746/week @ 2024-04-28 • Rust 包仓库 891/week @ 2024-05-05 • Rust 包仓库 674/week @ 2024-05-12 • Rust 包仓库 531/week @ 2024-05-19 • Rust 包仓库 398/week @ 2024-05-26 • Rust 包仓库 614/week @ 2024-06-02 • Rust 包仓库 427/week @ 2024-06-09 • Rust 包仓库 551/week @ 2024-06-16 • Rust 包仓库 604/week @ 2024-06-23 • Rust 包仓库 443/week @ 2024-06-30 • Rust 包仓库 558/week @ 2024-07-07 • Rust 包仓库 342/week @ 2024-07-14 • Rust 包仓库 365/week @ 2024-07-21 • Rust 包仓库 696/week @ 2024-07-28 • Rust 包仓库 496/week @ 2024-08-04 • Rust 包仓库 767/week @ 2024-08-11 • Rust 包仓库

2,337 每月下载量
用于 36 个 crate(直接使用 18 个)

Apache-2.0 和可能 GPL-3.0

280KB
6K SLoC

遵循 RFC 7515RFC 7797(未编码有效负载选项)的 JSON Web Signature (JWS) 实现。

用法

解码与验证

使用 CompactJWS::verify 解码 JWS。

use serde_json::json;
use ssi_jwk::JWK;
use ssi_jws::CompactJWSStr;

let jws = CompactJWSStr::new(b"eyJhbGciOiJFUzI1NiJ9.cGF5bG9hZA.LW6XkHmgfNnb2CA-2qdeMVGpekAoxRNsAHoeLpnton3QMaQ3dMj-5G9SlP8dHj7cHf2HtRPdy6-9LbxYKvumKw").unwrap();

let jwk: JWK = json!({
    "kty": "EC",
    "use": "sig",
    "crv": "P-256",
    "x": "dxdB360AJqJFYhdctoKZD_a_P6vLGAxtEVaCLnyraXQ",
    "y": "iH6o0l5AECsfRuEw2Eghbrp-6Fob3j98-1Cbe1YOmwM",
    "alg": "ES256"
}).try_into().unwrap();

assert!(jws.verify(&jwk).await.unwrap().is_ok());

内部,CompactJWS::verify 使用 CompactJWS::to_decoded 解码 JWS,然后使用 DecodedJWS::verify 验证签名。

let decoded_jws = jws.to_decoded().unwrap();
let verifiable_jws = decoded_jws.into_verifiable().await.unwrap();
assert_eq!(verifiable_jws.verify(&jwk).await.unwrap().is_ok());

您可以使用此方法在验证之前解码有效负载(例如使用 DecodedJWS::try_map)以便与签名一起验证。

签名

使用 JWSPayload::sign 方法将有效负载签名成一个紧凑的 JWS。

use serde_json::json;
use ssi_jwk::JWK;
use ssi_jws::JWSPayload;

let jwk: JWK = json!({
    "kty": "EC",
    "d": "3KSLs0_obYeQXfEI9I3BBH5y7aOm028bEx3rW6i5UN4",
    "use": "sig",
    "crv": "P-256",
    "x": "dxdB360AJqJFYhdctoKZD_a_P6vLGAxtEVaCLnyraXQ",
    "y": "iH6o0l5AECsfRuEw2Eghbrp-6Fob3j98-1Cbe1YOmwM",
    "alg": "ES256"
}).try_into().unwrap();

let jwt = "payload".sign(&jwk).await.unwrap();
assert_eq!(jwt, "eyJhbGciOiJFUzI1NiJ9.cGF5bG9hZA.LW6XkHmgfNnb2CA-2qdeMVGpekAoxRNsAHoeLpnton3QMaQ3dMj-5G9SlP8dHj7cHf2HtRPdy6-9LbxYKvumKw")

依赖项

~23–40MB
~666K SLoC