steam-crypto-rs 0.1.2

Steam encryption and cryptographic utilities (AES-256-CBC, RSA-OAEP, HMAC-IV) for the Steam protocol.
Documentation
//! Session key management.

use rand::RngCore;

/// Steam session key for encryption.
#[derive(Clone)]
pub struct SessionKey {
    /// The 32-byte session key.
    key: [u8; 32],
}

impl SessionKey {
    /// Generate a new random session key.
    pub fn generate() -> Self {
        let mut key = [0u8; 32];
        rand::rng().fill_bytes(&mut key);
        Self { key }
    }

    /// Create a session key from existing bytes.
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
        if bytes.len() != 32 {
            return None;
        }
        let mut key = [0u8; 32];
        key.copy_from_slice(bytes);
        Some(Self { key })
    }

    /// Get the session key as bytes.
    pub fn as_bytes(&self) -> &[u8; 32] {
        &self.key
    }

    /// Get the first 16 bytes for AES encryption.
    pub fn aes_key(&self) -> &[u8] {
        &self.key[..16]
    }

    /// Get the HMAC key portion.
    pub fn hmac_key(&self) -> &[u8] {
        &self.key[16..]
    }
}

impl std::fmt::Debug for SessionKey {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "SessionKey([REDACTED])")
    }
}