summaryrefslogtreecommitdiff
path: root/crypto-pgp/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'crypto-pgp/src/main')
-rw-r--r--crypto-pgp/src/main/AndroidManifest.xml6
-rw-r--r--crypto-pgp/src/main/kotlin/dev/msfjarvis/aps/data/crypto/GopenpgpCryptoHandler.kt49
2 files changed, 55 insertions, 0 deletions
diff --git a/crypto-pgp/src/main/AndroidManifest.xml b/crypto-pgp/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..f72b702d
--- /dev/null
+++ b/crypto-pgp/src/main/AndroidManifest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
+ ~ SPDX-License-Identifier: LGPL-3.0-only WITH LGPL-3.0-linking-exception
+ -->
+
+<manifest package="dev.msfjarvis.aps.cryptopgp"></manifest>
diff --git a/crypto-pgp/src/main/kotlin/dev/msfjarvis/aps/data/crypto/GopenpgpCryptoHandler.kt b/crypto-pgp/src/main/kotlin/dev/msfjarvis/aps/data/crypto/GopenpgpCryptoHandler.kt
new file mode 100644
index 00000000..5d14b160
--- /dev/null
+++ b/crypto-pgp/src/main/kotlin/dev/msfjarvis/aps/data/crypto/GopenpgpCryptoHandler.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+package dev.msfjarvis.aps.data.crypto
+
+import com.proton.Gopenpgp.crypto.Crypto
+import com.proton.Gopenpgp.helper.Helper
+import javax.inject.Inject
+
+/** Gopenpgp backed implementation of [CryptoHandler]. */
+public class GopenpgpCryptoHandler @Inject constructor() : CryptoHandler {
+
+ /**
+ * Decrypt the given [ciphertext] using the given PGP [privateKey] and corresponding [passphrase].
+ */
+ override fun decrypt(
+ privateKey: String,
+ passphrase: ByteArray,
+ ciphertext: ByteArray,
+ ): ByteArray {
+ // Decode the incoming cipher into a string and try to guess if it's armored.
+ val cipherString = ciphertext.decodeToString()
+ val isArmor = cipherString.startsWith("-----BEGIN PGP MESSAGE-----")
+ val message =
+ if (isArmor) {
+ Crypto.newPGPMessageFromArmored(cipherString)
+ } else {
+ Crypto.newPGPMessage(ciphertext)
+ }
+ return Helper.decryptBinaryMessageArmored(
+ privateKey,
+ passphrase,
+ message.armored,
+ )
+ }
+
+ override fun encrypt(publicKey: String, plaintext: ByteArray): ByteArray {
+ return Helper.encryptBinaryMessage(
+ publicKey,
+ plaintext,
+ )
+ }
+
+ override fun canHandle(fileName: String): Boolean {
+ return fileName.split('.').last() == "gpg"
+ }
+}