use base64::engine::{Engine, general_purpose::STANDARD as base64};
#[cfg(feature = "aws-lc-rs")]
use aws_lc_rs::digest::{Context, SHA1_FOR_LEGACY_USE_ONLY};
#[cfg(feature = "ring")]
use ring::digest::{Context, SHA1_FOR_LEGACY_USE_ONLY};
use crate::ws::error::UpgradeError;
const WS_ACCEPT_GUID: &[u8] = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
pub struct Base64EncodedDigest([u8; 28]);
pub fn sha1(input: &[u8]) -> Result<Base64EncodedDigest, UpgradeError> {
let mut hasher = Context::new(&SHA1_FOR_LEGACY_USE_ONLY);
let mut buf = [0; 28];
if input.is_ascii() {
hasher.update(input);
hasher.update(WS_ACCEPT_GUID);
if base64.encode_slice(hasher.finish(), &mut buf).is_ok() {
return Ok(Base64EncodedDigest(buf));
}
}
Err(UpgradeError::Other)
}
impl Base64EncodedDigest {
#[inline]
pub fn as_str(&self) -> Result<&str, UpgradeError> {
str::from_utf8(&self.0).or(Err(UpgradeError::Other))
}
}