Exposes decryption crashing because it is used by Notification Services to check which account can decrypt a GiftWrap.

This commit is contained in:
Vitor Pamplona
2024-08-27 17:43:12 -04:00
parent f7237b5666
commit 931081c5e7
2 changed files with 61 additions and 61 deletions
@@ -20,7 +20,6 @@
*/ */
package com.vitorpamplona.quartz.crypto.nip44 package com.vitorpamplona.quartz.crypto.nip44
import android.util.Log
import com.vitorpamplona.quartz.crypto.nip04.Nip04 import com.vitorpamplona.quartz.crypto.nip04.Nip04
import com.vitorpamplona.quartz.events.Event import com.vitorpamplona.quartz.events.Event
import fr.acinq.secp256k1.Secp256k1 import fr.acinq.secp256k1.Secp256k1
@@ -85,42 +84,41 @@ class Nip44(
json: String, json: String,
privateKey: ByteArray, privateKey: ByteArray,
pubKey: ByteArray, pubKey: ByteArray,
): String? = ): String? {
try { val info = Event.mapper.readValue(json, EncryptedInfoString::class.java)
val info = Event.mapper.readValue(json, EncryptedInfoString::class.java)
when (info.v) { return when (info.v) {
Nip04.EncryptedInfo.V -> { Nip04.EncryptedInfo.V -> {
val encryptedInfo = val encryptedInfo =
Nip04.EncryptedInfo( Nip04.EncryptedInfo(
ciphertext = Base64.getDecoder().decode(info.ciphertext), ciphertext = Base64.getDecoder().decode(info.ciphertext),
nonce = Base64.getDecoder().decode(info.nonce), nonce = Base64.getDecoder().decode(info.nonce),
) )
nip04.decrypt(encryptedInfo, privateKey, pubKey) nip04.decrypt(encryptedInfo, privateKey, pubKey)
}
Nip44v1.EncryptedInfo.V -> {
val encryptedInfo =
Nip44v1.EncryptedInfo(
ciphertext = Base64.getDecoder().decode(info.ciphertext),
nonce = Base64.getDecoder().decode(info.nonce),
)
v1.decrypt(encryptedInfo, privateKey, pubKey)
}
Nip44v2.EncryptedInfo.V -> {
val encryptedInfo =
Nip44v2.EncryptedInfo(
ciphertext = Base64.getDecoder().decode(info.ciphertext),
nonce = Base64.getDecoder().decode(info.nonce),
mac = Base64.getDecoder().decode(info.mac),
)
v2.decrypt(encryptedInfo, privateKey, pubKey)
}
else -> null
} }
} catch (e: Exception) {
Log.e("CryptoUtils", "NIP44: Unable to find version and decrypt $json", e) Nip44v1.EncryptedInfo.V -> {
null val encryptedInfo =
Nip44v1.EncryptedInfo(
ciphertext = Base64.getDecoder().decode(info.ciphertext),
nonce = Base64.getDecoder().decode(info.nonce),
)
v1.decrypt(encryptedInfo, privateKey, pubKey)
}
Nip44v2.EncryptedInfo.V -> {
val encryptedInfo =
Nip44v2.EncryptedInfo(
ciphertext = Base64.getDecoder().decode(info.ciphertext),
nonce = Base64.getDecoder().decode(info.nonce),
mac = Base64.getDecoder().decode(info.mac),
)
v2.decrypt(encryptedInfo, privateKey, pubKey)
}
else -> null
} }
}
fun decryptNIP44FromBase64( fun decryptNIP44FromBase64(
payload: String, payload: String,
@@ -129,18 +127,13 @@ class Nip44(
): String? { ): String? {
if (payload.isEmpty()) return null if (payload.isEmpty()) return null
return try { val byteArray = Base64.getDecoder().decode(payload)
val byteArray = Base64.getDecoder().decode(payload)
when (byteArray[0].toInt()) { return when (byteArray[0].toInt()) {
Nip04.EncryptedInfo.V -> nip04.decrypt(payload, privateKey, pubKey) Nip04.EncryptedInfo.V -> nip04.decrypt(payload, privateKey, pubKey)
Nip44v1.EncryptedInfo.V -> v1.decrypt(payload, privateKey, pubKey) Nip44v1.EncryptedInfo.V -> v1.decrypt(payload, privateKey, pubKey)
Nip44v2.EncryptedInfo.V -> v2.decrypt(payload, privateKey, pubKey) Nip44v2.EncryptedInfo.V -> v2.decrypt(payload, privateKey, pubKey)
else -> null else -> null
}
} catch (e: Exception) {
Log.e("CryptoUtils", "NIP44: Unable to find version and decrypt $payload", e)
null
} }
} }
} }
@@ -72,27 +72,34 @@ class GiftWrapEvent(
onReady: (Event) -> Unit, onReady: (Event) -> Unit,
) = unwrap(signer, onReady) ) = unwrap(signer, onReady)
fun unwrapThrowing(
signer: NostrSigner,
onReady: (Event) -> Unit,
) {
plainContent(signer) { giftStr ->
val gift =
try {
fromJson(giftStr)
} catch (e: Exception) {
Log.w("GiftWrapEvent", "Couldn't Parse the content " + this.toNostrUri() + " " + giftStr)
return@plainContent
}
if (gift is WrappedEvent) {
gift.host = HostStub(this.id, this.pubKey, this.kind)
}
innerEventId = gift.id
onReady(gift)
}
}
fun unwrap( fun unwrap(
signer: NostrSigner, signer: NostrSigner,
onReady: (Event) -> Unit, onReady: (Event) -> Unit,
) { ) {
try { try {
plainContent(signer) { giftStr -> unwrapThrowing(signer, onReady)
val gift =
try {
fromJson(giftStr)
} catch (e: Exception) {
Log.w("GiftWrapEvent", "Couldn't Parse the content " + this.toNostrUri() + " " + giftStr)
return@plainContent
}
if (gift is WrappedEvent) {
gift.host = HostStub(this.id, this.pubKey, this.kind)
}
innerEventId = gift.id
onReady(gift)
}
} catch (e: Exception) { } catch (e: Exception) {
Log.w("GiftWrapEvent", "Couldn't Decrypt the content " + this.toNostrUri()) Log.w("GiftWrapEvent", "Couldn't Decrypt the content " + this.toNostrUri())
} }