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 在 密码学 中
2,337 每月下载量
用于 36 个 crate(直接使用 18 个)
280KB
6K SLoC
遵循 RFC 7515 和 RFC 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