toad_msg/msg/
token.rs

1use toad_macros::rfc_7252_doc;
2
3#[doc = rfc_7252_doc!("5.3.1")]
4#[derive(Copy, Clone, Hash, PartialEq, PartialOrd, Debug, Eq, Ord)]
5pub struct Token(pub tinyvec::ArrayVec<[u8; 8]>);
6
7impl Token {
8  /// Take an arbitrary-length sequence of bytes and turn it into an opaque message token
9  ///
10  /// Currently uses the BLAKE2 hashing algorithm, but this may change in the future.
11  ///
12  /// ```
13  /// use toad_msg::Token;
14  ///
15  /// let my_token = Token::opaque(&[0, 1, 2]);
16  /// ```
17  pub fn opaque(data: &[u8]) -> Token {
18    use blake2::digest::consts::U8;
19    use blake2::{Blake2b, Digest};
20
21    let mut digest = Blake2b::<U8>::new();
22    digest.update(data);
23    Token(Into::<[u8; 8]>::into(digest.finalize()).into())
24  }
25
26  /// Convert a reference to a Token to a byte slice
27  pub fn as_bytes(&self) -> &[u8] {
28    &self.0
29  }
30}