1 // Copyright 2021 Ian Jackson and contributors to Hippotat
2 // SPDX-License-Identifier: AGPL-3.0-or-later
3 // There is NO WARRANTY.
8 impl<T> T where T: Debug {
9 fn to_debug(&self) -> String { format!("{:?}", self) }
13 impl<T,E> Result<T,E> where AE: From<E> {
14 fn dcontext<D:Debug>(self, d: D) -> anyhow::Result<T> {
15 self.map_err(|e| AE::from(e)).with_context(|| d.to_debug())
19 use sha2::Digest as _;
21 type HmacH = sha2::Sha256;
22 const HMAC_L: usize = 32;
25 fn token_hmac(key: &[u8], message: &[u8]) -> [u8; HMAC_L] {
27 let mut padded = [0; HMAC_L];
28 if key.len() > HMAC_L {
29 padded = HmacH::digest(key).into();
31 padded[0.. key.len()].copy_from_slice(key);
35 let mut ikey = key; for k in &mut ikey { *k ^= 0x36; }
36 let mut okey = key; for k in &mut okey { *k ^= 0x5C; }