Skip to main content

shadow_crypt_shell/encryption/
nonce.rs

1use rand::{rand_core::TryRng, rngs::SysRng};
2
3use crate::errors::{WorkflowError, WorkflowResult};
4
5pub fn generate_nonce() -> WorkflowResult<[u8; 24]> {
6    let mut buffer = [0u8; 24];
7    SysRng
8        .try_fill_bytes(&mut buffer)
9        .map_err(|e| WorkflowError::NonceGeneration(format!("Failed to generate nonce: {}", e)))?;
10
11    Ok(buffer)
12}
13
14/// Random prefix for the v3 content stream nonces (the per-chunk counter and
15/// final flag fill the remaining nonce bytes).
16pub fn generate_nonce_prefix() -> WorkflowResult<[u8; 16]> {
17    let mut buffer = [0u8; 16];
18    SysRng.try_fill_bytes(&mut buffer).map_err(|e| {
19        WorkflowError::NonceGeneration(format!("Failed to generate nonce prefix: {}", e))
20    })?;
21
22    Ok(buffer)
23}
24
25#[cfg(test)]
26mod tests {
27    use super::generate_nonce;
28
29    #[test]
30    fn test_generate_nonce_length() {
31        let nonce = generate_nonce().expect("Failed to generate nonce");
32        assert_eq!(nonce.len(), 24);
33    }
34}