Skip to main content

steam_crypto/
session_key.rs

1//! Session key management.
2
3use rand::RngCore;
4
5/// Steam session key for encryption.
6#[derive(Clone)]
7pub struct SessionKey {
8    /// The 32-byte session key.
9    key: [u8; 32],
10}
11
12impl SessionKey {
13    /// Generate a new random session key.
14    pub fn generate() -> Self {
15        let mut key = [0u8; 32];
16        rand::rng().fill_bytes(&mut key);
17        Self { key }
18    }
19
20    /// Create a session key from existing bytes.
21    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
22        if bytes.len() != 32 {
23            return None;
24        }
25        let mut key = [0u8; 32];
26        key.copy_from_slice(bytes);
27        Some(Self { key })
28    }
29
30    /// Get the session key as bytes.
31    pub fn as_bytes(&self) -> &[u8; 32] {
32        &self.key
33    }
34
35    /// Get the first 16 bytes for AES encryption.
36    pub fn aes_key(&self) -> &[u8] {
37        &self.key[..16]
38    }
39
40    /// Get the HMAC key portion.
41    pub fn hmac_key(&self) -> &[u8] {
42        &self.key[16..]
43    }
44}
45
46impl std::fmt::Debug for SessionKey {
47    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48        write!(f, "SessionKey([REDACTED])")
49    }
50}