From f491883b6e703e5efaa4aedd84769302bc466860 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Thu, 14 Oct 2021 09:16:04 -0300
Subject: [PATCH] Add a simple RandomIdManager to generate and validate random
 IDs

---
 .../mailbox/core/system/RandomIdManager.kt    | 29 +++++++++++++++++++
 .../core/system/RandomIdManagerTest.kt        | 20 +++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt
 create mode 100644 mailbox-core/src/test/java/org/briarproject/mailbox/core/system/RandomIdManagerTest.kt

diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt
new file mode 100644
index 00000000..15bcaa4c
--- /dev/null
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/system/RandomIdManager.kt
@@ -0,0 +1,29 @@
+package org.briarproject.mailbox.core.system
+
+import java.security.SecureRandom
+import javax.inject.Inject
+
+private const val ID_SIZE = 32
+private const val ID_HEX_SIZE = ID_SIZE * 2
+
+class RandomIdManager @Inject constructor() {
+
+    private val secureRandom = SecureRandom()
+    private val idRegex = Regex("[a-f0-9]{64}")
+
+    fun getNewRandomId(): String {
+        val idBytes = ByteArray(ID_SIZE)
+        secureRandom.nextBytes(idBytes)
+        return idBytes.toHex()
+    }
+
+    fun isValidRandomId(id: String): Boolean {
+        if (id.length != ID_HEX_SIZE) return false
+        return idRegex.matches(id)
+    }
+
+}
+
+fun ByteArray.toHex(): String = joinToString(separator = "") { eachByte ->
+    "%02x".format(eachByte)
+}
diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/system/RandomIdManagerTest.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/system/RandomIdManagerTest.kt
new file mode 100644
index 00000000..8542cfcf
--- /dev/null
+++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/system/RandomIdManagerTest.kt
@@ -0,0 +1,20 @@
+package org.briarproject.mailbox.core.system
+
+import org.junit.jupiter.api.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+class RandomIdManagerTest {
+
+    private val randomIdManager = RandomIdManager()
+
+    @Test
+    fun `generated IDs are considered valid`() {
+        for (i in 0..23) {
+            val id = randomIdManager.getNewRandomId()
+            assertEquals(64, id.length)
+            assertTrue(randomIdManager.isValidRandomId(id))
+        }
+    }
+
+}
-- 
GitLab