diff options
| author | gennyble <gen@nyble.dev> | 2026-09-25 03:56:11 -0500 |
|---|---|---|
| committer | gennyble <gen@nyble.dev> | 2026-09-25 03:56:11 -0500 |
| commit | ba592de54cd3dce52eb2096dabbe748107f5db2b (patch) | |
| tree | 4a23377e9788630e09c669e9ed18aecd27673ee7 /knowing/src/id.rs | |
| parent | f4d8e8d03c1b80d5c59ee85631d5a78048892a32 (diff) | |
splorm auth
Diffstat (limited to 'knowing/src/id.rs')
| -rw-r--r-- | knowing/src/id.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/knowing/src/id.rs b/knowing/src/id.rs new file mode 100644 index 0000000..e990c76 --- /dev/null +++ b/knowing/src/id.rs @@ -0,0 +1,31 @@ +use smallrand::{ChaCha12, DefaultEntropy, Rng}; +use somethings::auth::Base58Id; + +const BASE58: &'static [u8] = b"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + +pub trait RandomId { + fn rand() -> Self; +} + +impl<const N: usize> RandomId for Base58Id<N> { + fn rand() -> Self { + unsafe { Self::new_unchecked(random_base58()) } + } +} + +/// Random Base58 string, `count` characters long, using OsRng which is assumed +/// to be secure +/// > assumed that system always provides high-quality cryptographically secure random data +fn random_base58<const N: usize>() -> [u8; N] { + let mut buffer = [0u8; N]; + + // Explicitly using ChaCha12 here because StdRng is not garunteed to be + // cryptographically secure + let mut entropy = DefaultEntropy::new(); + let mut rng = ChaCha12::from_entropy(&mut entropy); + buffer + .iter_mut() + .for_each(|b| *b = BASE58[rng.range(0..BASE58.len())]); + + buffer +} |
