about summary refs log tree commit diff
path: root/knowing/src/id.rs
diff options
context:
space:
mode:
authorgennyble <gen@nyble.dev>2026-09-25 03:56:11 -0500
committergennyble <gen@nyble.dev>2026-09-25 03:56:11 -0500
commitba592de54cd3dce52eb2096dabbe748107f5db2b (patch)
tree4a23377e9788630e09c669e9ed18aecd27673ee7 /knowing/src/id.rs
parentf4d8e8d03c1b80d5c59ee85631d5a78048892a32 (diff)
splorm auth
Diffstat (limited to 'knowing/src/id.rs')
-rw-r--r--knowing/src/id.rs31
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
+}