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}