#json #jose #jws #specification #web #data #javascript-object

jose-jws

Pure Rust implementation of the JSON Web Signature (JWS) component of the Javascript Object Signing and Encryption (JOSE) specification as described in RFC7515

4 releases

0.1.2 Aug 21, 2023
0.1.1 Aug 19, 2023
0.1.0 May 21, 2023
0.0.0 Sep 5, 2022

#2728 in Cryptography

Download history 113/week @ 2024-06-13 155/week @ 2024-06-20 101/week @ 2024-06-27 78/week @ 2024-07-04 21/week @ 2024-07-11 40/week @ 2024-07-18 38/week @ 2024-07-25 49/week @ 2024-08-01 28/week @ 2024-08-08 56/week @ 2024-08-15 38/week @ 2024-08-22 36/week @ 2024-08-29 45/week @ 2024-09-05 127/week @ 2024-09-12 59/week @ 2024-09-19 30/week @ 2024-09-26

265 downloads per month
Used in jls

Apache-2.0 OR MIT

95KB
2K SLoC

RustCrypto: JOSE JWS

Crate Docs Build Status Apache2/MIT licensed Rust Version Project Chat

Pure Rust implementation of the JSON Web Signature (JWS) component of the Javascript Object Signing and Encryption (JOSE) specification as described in RFC7515.

JSON Web Signatures are a way of sharing unencrypted data in a way that the sender can be verified. A JWS has the following contents:

  • A verifyable payload
  • One or more signatures including:
    • An optional unprotected header (nonverifyable) containing hints about the algorithm
    • An optional protected header (verifyable using the signature)
    • A signature

A client can use the information provided in a JWS to verify the integrity of the data, meaning the client can be sure that the data did come from the intended sender.

use jose_jws::{Jws, Signature};

let jws_json = serde_json::json!({
    "payload": "SGVsbG8gd29ybGQh",
    "signatures": [
        {
            "protected": "eyJhbGciOiJSUzI1NiJ9",
            "header": {
                "kid": "2010-12-29"
            },
            "signature": "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOi\
            Zj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYN\
            X4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0Gar\
            ZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh\
            6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQ\
            Ge77Rw"
        },
        {
            "protected": "eyJhbGciOiJFUzI1NiJ9",
            "header": {
                "kid": "e9bc097a-ce51-4036-9562-d2ade882db0d"
            },
            "signature": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djx\
            La8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
        }
    ]
});

let Jws::General(jws) = serde_json::from_value(jws_json).unwrap() else {
    panic!("couldn't deserialize JWS");
};

assert_eq!(jws.signatures.len(), 2);

let payload = jws.payload.unwrap();
let payload_str = core::str::from_utf8(&payload).unwrap();

assert_eq!(payload_str, "Hello world!")

Documentation

Minimum Supported Rust Version

This crate requires Rust 1.65 at a minimum.

We may change the MSRV in the future, but it will be accompanied by a minor version bump.

License

Licensed under either of:

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~0.9–1.8MB
~37K SLoC