aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/dev/msfjarvis/aps/util
diff options
context:
space:
mode:
authorHarsh Shandilya <me@msfjarvis.dev>2021-02-15 13:05:09 +0530
committerGitHub <noreply@github.com>2021-02-15 13:05:09 +0530
commit051d455c9f68d7edbc75abbc8d9293dd34d1d250 (patch)
tree2354ee3cf44c1bf09c97a3cabee3b37b0f717ef3 /app/src/main/java/dev/msfjarvis/aps/util
parent7fbe4be71143e0d57a14d19f66496213d8248b1d (diff)
downloadHardenedPass-051d455c9f68d7edbc75abbc8d9293dd34d1d250.tar.gz
HardenedPass-051d455c9f68d7edbc75abbc8d9293dd34d1d250.zip
Add tests for GPG identifier parsing (#1319)
Diffstat (limited to 'app/src/main/java/dev/msfjarvis/aps/util')
-rw-r--r--app/src/main/java/dev/msfjarvis/aps/util/crypto/GpgIdentifier.kt38
1 files changed, 38 insertions, 0 deletions
diff --git a/app/src/main/java/dev/msfjarvis/aps/util/crypto/GpgIdentifier.kt b/app/src/main/java/dev/msfjarvis/aps/util/crypto/GpgIdentifier.kt
new file mode 100644
index 00000000..51b3b76b
--- /dev/null
+++ b/app/src/main/java/dev/msfjarvis/aps/util/crypto/GpgIdentifier.kt
@@ -0,0 +1,38 @@
+package dev.msfjarvis.aps.util.crypto
+
+import me.msfjarvis.openpgpktx.util.OpenPgpUtils
+
+sealed class GpgIdentifier {
+ data class KeyId(val id: Long) : GpgIdentifier()
+ data class UserId(val email: String) : GpgIdentifier()
+
+ companion object {
+ @OptIn(ExperimentalUnsignedTypes::class)
+ fun fromString(identifier: String): GpgIdentifier? {
+ if (identifier.isEmpty()) return null
+ // Match long key IDs:
+ // FF22334455667788 or 0xFF22334455667788
+ val maybeLongKeyId = identifier.removePrefix("0x").takeIf {
+ it.matches("[a-fA-F0-9]{16}".toRegex())
+ }
+ if (maybeLongKeyId != null) {
+ val keyId = maybeLongKeyId.toULong(16)
+ return KeyId(keyId.toLong())
+ }
+
+ // Match fingerprints:
+ // FF223344556677889900112233445566778899 or 0xFF223344556677889900112233445566778899
+ val maybeFingerprint = identifier.removePrefix("0x").takeIf {
+ it.matches("[a-fA-F0-9]{40}".toRegex())
+ }
+ if (maybeFingerprint != null) {
+ // Truncating to the long key ID is not a security issue since OpenKeychain only accepts
+ // non-ambiguous key IDs.
+ val keyId = maybeFingerprint.takeLast(16).toULong(16)
+ return KeyId(keyId.toLong())
+ }
+
+ return OpenPgpUtils.splitUserId(identifier).email?.let { UserId(it) }
+ }
+ }
+}