1#[cfg(feature = "decrypting")]
2mod local;
3#[cfg(feature = "pie-wrap")]
4mod pie_wrap;
5#[cfg(feature = "pke")]
6mod pke;
7#[cfg(feature = "verifying")]
8mod public;
9#[cfg(feature = "pbkw")]
10mod pw_wrap;
11
12use paseto_core::version;
13
14pub struct V3;
15
16#[cfg(feature = "signing")]
17#[derive(Clone)]
18pub struct SecretKey(p384::ecdsa::SigningKey);
19#[cfg(feature = "verifying")]
20#[derive(Clone)]
21pub struct PublicKey(p384::ecdsa::VerifyingKey);
22
23#[cfg(feature = "decrypting")]
24#[derive(Clone)]
25pub struct LocalKey([u8; 32]);
26
27impl version::Version for V3 {
28 const HEADER: &'static str = "v3";
29 const PASERK_HEADER: &'static str = "k3";
30}
31
32#[cfg(feature = "id")]
33impl paseto_core::paserk::IdVersion for V3 {
34 fn hash_key(key_header: &'static str, key_data: &[u8]) -> [u8; 33] {
35 use sha2::{Digest, Sha384};
36
37 let mut ctx = Sha384::new();
38 ctx.update(b"k3");
39 ctx.update(key_header.as_bytes());
40 ctx.update(key_data);
41 let hash = ctx.finalize();
42 assert_eq!(hash.len(), 48);
43
44 hash[..33].try_into().unwrap()
45 }
46}