1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use toad_macros::rfc_7252_doc;

#[doc = rfc_7252_doc!("5.3.1")]
#[derive(Copy, Clone, Hash, PartialEq, PartialOrd, Debug, Eq, Ord)]
pub struct Token(pub tinyvec::ArrayVec<[u8; 8]>);

impl Token {
  /// Take an arbitrary-length sequence of bytes and turn it into an opaque message token
  ///
  /// Currently uses the BLAKE2 hashing algorithm, but this may change in the future.
  ///
  /// ```
  /// use toad_msg::Token;
  ///
  /// let my_token = Token::opaque(&[0, 1, 2]);
  /// ```
  pub fn opaque(data: &[u8]) -> Token {
    use blake2::digest::consts::U8;
    use blake2::{Blake2b, Digest};

    let mut digest = Blake2b::<U8>::new();
    digest.update(data);
    Token(Into::<[u8; 8]>::into(digest.finalize()).into())
  }

  /// Convert a reference to a Token to a byte slice
  pub fn as_bytes(&self) -> &[u8] {
    &self.0
  }
}