Unverified Commit 51540bcd authored by Nugine's avatar Nugine
Browse files

s3s: utils: small refactor

parent 7d8b23a3
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -4,19 +4,28 @@ use super::AmzDate;

use crate::http::OrderedHeaders;
use crate::utils::from_ascii;
use crate::utils::hex_bytes32;
use crate::utils::hmac_sha256;
use crate::utils::stable_sort_by_first;

use std::mem::MaybeUninit;

use hex_simd::{AsOut, AsciiCase};
use hyper::body::Bytes;
use hyper::Method;
use sha2::{Digest, Sha256};
use smallvec::SmallVec;

/// `f(hex(src))`
fn hex_bytes32<R>(src: &[u8; 32], f: impl FnOnce(&str) -> R) -> R {
    let buf: &mut [_] = &mut [MaybeUninit::uninit(); 64];
    let ans = hex_simd::encode_as_str(src.as_ref(), buf.as_out(), AsciiCase::Lower);
    f(ans)
}

/// `f(hex(sha256(data)))`
fn hex_sha256<R>(data: &[u8], f: impl FnOnce(&str) -> R) -> R {
    let src = Sha256::digest(data);
    hex_bytes32(src, f)
    hex_bytes32(src.as_ref(), f)
}

/// `f(hex(sha256(chunk)))`
@@ -26,7 +35,7 @@ fn hex_sha256_chunk<R>(chunk: &[Bytes], f: impl FnOnce(&str) -> R) -> R {
        chunk.iter().for_each(|data| h.update(data));
        h.finalize()
    };
    hex_bytes32(src, f)
    hex_bytes32(src.as_ref(), f)
}

fn hex(data: impl AsRef<[u8]>) -> String {
+4 −14
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@ use crate::dto::{Timestamp, TimestampFormat};

use std::fmt::Write;
use std::future::Future;
use std::mem::MaybeUninit;
use std::pin::Pin;

use arrayvec::{ArrayString, ArrayVec};
@@ -134,30 +133,21 @@ pub mod parser {
}

/// `hmac_sha1(key, data)`
pub fn hmac_sha1(key: impl AsRef<[u8]>, data: impl AsRef<[u8]>) -> impl AsRef<[u8]> {
pub fn hmac_sha1(key: impl AsRef<[u8]>, data: impl AsRef<[u8]>) -> [u8; 20] {
    use hmac::{Hmac, Mac};
    use sha1::Sha1;

    let mut m = <Hmac<Sha1>>::new_from_slice(key.as_ref()).unwrap();
    m.update(data.as_ref());
    m.finalize().into_bytes()
    m.finalize().into_bytes().into()
}

/// `hmac_sha256(key, data)`
pub fn hmac_sha256(key: impl AsRef<[u8]>, data: impl AsRef<[u8]>) -> impl AsRef<[u8]> {
pub fn hmac_sha256(key: impl AsRef<[u8]>, data: impl AsRef<[u8]>) -> [u8; 32] {
    use hmac::{Hmac, Mac};
    use sha2::Sha256;

    let mut m = <Hmac<Sha256>>::new_from_slice(key.as_ref()).unwrap();
    m.update(data.as_ref());
    m.finalize().into_bytes()
}

/// `f(hex(src))`
pub fn hex_bytes32<R>(src: impl AsRef<[u8]>, f: impl FnOnce(&str) -> R) -> R {
    use hex_simd::{AsOut, AsciiCase};

    let buf: &mut [_] = &mut [MaybeUninit::uninit(); 64];
    let ans = hex_simd::encode_as_str(src.as_ref(), buf.as_out(), AsciiCase::Lower);
    f(ans)
    m.finalize().into_bytes().into()
}