paseto_core/
pae.rs

1//! Pre-auth encoding
2//!
3//! <https://github.com/paseto-standard/paseto-spec/blob/master/docs/01-Protocol-Versions/Common.md#authentication-padding>
4
5pub use crate::encodings::WriteBytes;
6
7/// Encode the pieces using the pre-auth-encoding scheme.
8pub fn pre_auth_encode<const N: usize>(pieces: [&[&[u8]]; N], mut out: impl WriteBytes) {
9    let len = N as u64;
10    out.write(&len.to_le_bytes());
11    for piece in pieces {
12        let len: u64 = piece.iter().map(|x| x.len() as u64).sum();
13        out.write(&len.to_le_bytes());
14        for x in piece {
15            out.write(x);
16        }
17    }
18}
19
20#[cfg(test)]
21mod tests {
22    use std::vec::Vec;
23
24    fn pae_vec<const N: usize>(pieces: [&[&[u8]]; N]) -> Vec<u8> {
25        let mut vec = Vec::new();
26        super::pre_auth_encode(pieces, &mut vec);
27        vec
28    }
29
30    #[test]
31    fn test() {
32        let v = pae_vec([]);
33        assert_eq!(v, b"\x00\x00\x00\x00\x00\x00\x00\x00");
34
35        let v = pae_vec([&[b""]]);
36        assert_eq!(
37            v,
38            b"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
39        );
40
41        let v = pae_vec([&[b"test"]]);
42        assert_eq!(
43            v,
44            b"\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00test"
45        );
46    }
47}