A better Rust ATProto crate
at main 685 B view raw
1use base64::Engine; 2use base64::engine::general_purpose::URL_SAFE_NO_PAD; 3use jacquard_common::CowStr; 4use p256::ecdsa::{Signature, SigningKey, signature::Signer}; 5 6use super::{Header, jwt::Claims}; 7 8pub fn create_signed_jwt( 9 key: SigningKey, 10 header: Header, 11 claims: Claims, 12) -> serde_json::Result<CowStr<'static>> { 13 let header = URL_SAFE_NO_PAD.encode(serde_json::to_string(&header)?); 14 let payload = URL_SAFE_NO_PAD.encode(serde_json::to_string(&claims)?); 15 let signature: Signature = key.sign(format!("{header}.{payload}").as_bytes()); 16 Ok(format!( 17 "{header}.{payload}.{}", 18 URL_SAFE_NO_PAD.encode(signature.to_bytes()) 19 ) 20 .into()) 21}