From 0aefd1b2bf4fd177f091abc46c7c1b610de8a2b2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Jun 2021 13:59:48 +1000 Subject: [PATCH] add handling of old ONS names too --- ts/session/snode_api/SNodeAPI.ts | 38 ++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/ts/session/snode_api/SNodeAPI.ts b/ts/session/snode_api/SNodeAPI.ts index bfc6557fb..8546ef2a6 100644 --- a/ts/session/snode_api/SNodeAPI.ts +++ b/ts/session/snode_api/SNodeAPI.ts @@ -282,6 +282,7 @@ export async function getSessionIDForOnsName(onsNameCase: string) { throw new Error('ONSresolve:Failed to resolve ONS'); } let parsedBody; + try { parsedBody = JSON.parse(result.body); } catch (e) { @@ -297,8 +298,38 @@ export async function getSessionIDForOnsName(onsNameCase: string) { const isArgon2Based = !Boolean(intermediate?.nonce); const ciphertext = fromHexToArray(hexEncodedCipherText); + let sessionIDAsData: Uint8Array; + let nonce: Uint8Array; + let key: Uint8Array; + if (isArgon2Based) { - return ''; + // Handle old Argon2-based encryption used before HF16 + const salt = new Uint8Array(sodium.crypto_pwhash_SALTBYTES); + nonce = new Uint8Array(sodium.crypto_secretbox_NONCEBYTES); + try { + const keyHex = sodium.crypto_pwhash( + sodium.crypto_secretbox_KEYBYTES, + onsNameLowerCase, + salt, + sodium.crypto_pwhash_OPSLIMIT_MODERATE, + sodium.crypto_pwhash_MEMLIMIT_MODERATE, + sodium.crypto_pwhash_ALG_ARGON2ID13, + 'hex' + ); + if (!keyHex) { + throw new Error('ONSresolve: key invalid argon2'); + } + key = fromHexToArray(keyHex); + } catch (e) { + throw new Error('ONSresolve: Hashing failed'); + } + + sessionIDAsData = sodium.crypto_secretbox_open_easy(ciphertext, nonce, key); + if (!sessionIDAsData) { + throw new Error('ONSresolve: Decryption failed'); + } + + return toHex(sessionIDAsData); } // not argon2Based @@ -306,9 +337,8 @@ export async function getSessionIDForOnsName(onsNameCase: string) { if (!hexEncodedNonce) { throw new Error('ONSresolve: No hexEncodedNonce'); } - const nonce = fromHexToArray(hexEncodedNonce); + nonce = fromHexToArray(hexEncodedNonce); - let key; try { key = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, nameAsData, nameHash); if (!key) { @@ -319,7 +349,7 @@ export async function getSessionIDForOnsName(onsNameCase: string) { throw new Error('ONSresolve: Hashing failed'); } - const sessionIDAsData = sodium.crypto_aead_xchacha20poly1305_ietf_decrypt( + sessionIDAsData = sodium.crypto_aead_xchacha20poly1305_ietf_decrypt( null, ciphertext, null,