This commit is contained in:
ryanzhao 2021-05-28 11:22:06 +10:00
parent a66d2c97e0
commit c0d4dd741c
2 changed files with 11 additions and 10 deletions

View File

@ -19,6 +19,7 @@ import kotlinx.android.synthetic.main.activity_create_private_chat.tabLayout
import kotlinx.android.synthetic.main.activity_create_private_chat.viewPager import kotlinx.android.synthetic.main.activity_create_private_chat.viewPager
import kotlinx.android.synthetic.main.fragment_enter_public_key.* import kotlinx.android.synthetic.main.fragment_enter_public_key.*
import network.loki.messenger.R import network.loki.messenger.R
import nl.komponents.kovenant.ui.failUi
import org.session.libsession.snode.SnodeAPI import org.session.libsession.snode.SnodeAPI
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
import org.thoughtcrime.securesms.conversation.ConversationActivity import org.thoughtcrime.securesms.conversation.ConversationActivity
@ -29,6 +30,7 @@ import org.thoughtcrime.securesms.loki.fragments.ScanQRCodeWrapperFragment
import org.thoughtcrime.securesms.loki.fragments.ScanQRCodeWrapperFragmentDelegate import org.thoughtcrime.securesms.loki.fragments.ScanQRCodeWrapperFragmentDelegate
import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.Recipient
import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsession.utilities.Util
import org.session.libsignal.utilities.PublicKeyValidation import org.session.libsignal.utilities.PublicKeyValidation
@ -83,7 +85,7 @@ class CreatePrivateChatActivity : PassphraseRequiredActionBarActivity(), ScanQRC
} }
fun createPrivateChatIfPossible(onsNameOrPublicKey: String) { fun createPrivateChatIfPossible(onsNameOrPublicKey: String) {
if (!PublicKeyValidation.isValid(onsNameOrPublicKey)) { if (PublicKeyValidation.isValid(onsNameOrPublicKey)) {
createPrivateChat(onsNameOrPublicKey) createPrivateChat(onsNameOrPublicKey)
} else { } else {
// This could be an ONS name // This could be an ONS name
@ -91,7 +93,7 @@ class CreatePrivateChatActivity : PassphraseRequiredActionBarActivity(), ScanQRC
SnodeAPI.getSessionIDFor(onsNameOrPublicKey).success { hexEncodedPublicKey -> SnodeAPI.getSessionIDFor(onsNameOrPublicKey).success { hexEncodedPublicKey ->
hideLoader() hideLoader()
this.createPrivateChat(hexEncodedPublicKey) this.createPrivateChat(hexEncodedPublicKey)
}.fail { exception -> }.failUi { exception ->
hideLoader() hideLoader()
var message = "Please check the Session ID or ONS name and try again." var message = "Please check the Session ID or ONS name and try again."
exception.localizedMessage?.let { exception.localizedMessage?.let {

View File

@ -182,7 +182,7 @@ object SnodeAPI {
"endpoint" to "ons_resolve", "endpoint" to "ons_resolve",
"params" to mapOf( "type" to 0, "name_hash" to base64EncodedNameHash ) "params" to mapOf( "type" to 0, "name_hash" to base64EncodedNameHash )
) )
val promises = (0..validationCount).map { val promises = (1..validationCount).map {
getRandomSnode().bind { snode -> getRandomSnode().bind { snode ->
invoke(Snode.Method.OxenDaemonRPCCall, snode, null, parameters) invoke(Snode.Method.OxenDaemonRPCCall, snode, null, parameters)
} }
@ -193,26 +193,25 @@ object SnodeAPI {
val intermediate = json["result"] as? Map<*, *> val intermediate = json["result"] as? Map<*, *>
val hexEncodedCiphertext = intermediate?.get("encrypted_value") as? String val hexEncodedCiphertext = intermediate?.get("encrypted_value") as? String
if (hexEncodedCiphertext != null) { if (hexEncodedCiphertext != null) {
val ciphertext = Hex.fromStringCondensed(hexEncodedCiphertext)
val isArgon2Based = (intermediate["nonce"] == null) val isArgon2Based = (intermediate["nonce"] == null)
if (isArgon2Based) { if (isArgon2Based) {
// Handle old Argon2-based encryption used before HF16 // Handle old Argon2-based encryption used before HF16
val salt = ByteArray(PwHash.SALTBYTES) val salt = ByteArray(PwHash.SALTBYTES)
val key: String val key: ByteArray
val nonce = ByteArray(SecretBox.NONCEBYTES) val nonce = ByteArray(SecretBox.NONCEBYTES)
val sessionID: String val sessionIDAsData = ByteArray(sessionIDByteCount)
try { try {
key = sodium.cryptoPwHash(onsName, SecretBox.KEYBYTES, salt, PwHash.OPSLIMIT_MODERATE, PwHash.MEMLIMIT_MODERATE, PwHash.Alg.PWHASH_ALG_ARGON2ID13) key = Key.fromHexString(sodium.cryptoPwHash(onsName, SecretBox.KEYBYTES, salt, PwHash.OPSLIMIT_MODERATE, PwHash.MEMLIMIT_MODERATE, PwHash.Alg.PWHASH_ALG_ARGON2ID13)).asBytes
} catch (e: SodiumException) { } catch (e: SodiumException) {
deferred.reject(Error.HashingFailed) deferred.reject(Error.HashingFailed)
return@success return@success
} }
try { if (!sodium.cryptoSecretBoxOpenEasy(sessionIDAsData, ciphertext, ciphertext.size.toLong(), nonce, key)) {
sessionID = sodium.cryptoSecretBoxOpenEasy(hexEncodedCiphertext, nonce, Key.fromHexString(key))
} catch (e: SodiumException) {
deferred.reject(Error.DecryptionFailed) deferred.reject(Error.DecryptionFailed)
return@success return@success
} }
sessionIDs.add(sessionID) sessionIDs.add(Hex.toStringCondensed(sessionIDAsData))
} else { } else {
val hexEncodedNonce = intermediate["nonce"] as? String val hexEncodedNonce = intermediate["nonce"] as? String
if (hexEncodedNonce == null) { if (hexEncodedNonce == null) {