From fe1a895e6bd0d4847a039547deee0cf00497a286 Mon Sep 17 00:00:00 2001 From: Robyn MacCallum Date: Mon, 10 Oct 2022 13:07:12 -0400 Subject: [PATCH] [SG-720] Trim c null characters getting padded at end of messages (#3724) * Trim everything at the end of decrypted payload before parsing * Clarify comment * Use char code check for nulls * Extract trim code to function * make char codes constants --- .../services/nativeMessageHandler.service.ts | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/apps/desktop/src/services/nativeMessageHandler.service.ts b/apps/desktop/src/services/nativeMessageHandler.service.ts index 916bd86bc89..5787e407343 100644 --- a/apps/desktop/src/services/nativeMessageHandler.service.ts +++ b/apps/desktop/src/services/nativeMessageHandler.service.ts @@ -182,12 +182,25 @@ export class NativeMessageHandlerService { this.ddgSharedSecret = SymmetricCryptoKey.fromJSON({ keyB64: storedKey }); } - return JSON.parse( - await this.cryptoService.decryptToUtf8( + try { + let decryptedResult = await this.cryptoService.decryptToUtf8( message.encryptedCommand as EncString, this.ddgSharedSecret - ) - ); + ); + + decryptedResult = this.trimNullCharsFromMessage(decryptedResult); + + return JSON.parse(decryptedResult); + } catch { + this.sendResponse({ + messageId: message.messageId, + version: NativeMessagingVersion.Latest, + payload: { + error: "cannot-decrypt", + }, + }); + return; + } } private async sendEncryptedResponse( @@ -218,4 +231,23 @@ export class NativeMessageHandlerService { private sendResponse(response: EncryptedMessageResponse | UnencryptedMessageResponse) { ipcRenderer.send("nativeMessagingReply", response); } + + // Trim all null bytes padded at the end of messages. This happens with C encryption libraries. + private trimNullCharsFromMessage(message: string): string { + const charNull = 0; + const charRightCurlyBrace = 125; + const charRightBracket = 93; + + for (let i = message.length - 1; i >= 0; i--) { + if (message.charCodeAt(i) === charNull) { + message = message.substring(0, message.length - 1); + } else if ( + message.charCodeAt(i) === charRightCurlyBrace || + message.charCodeAt(i) === charRightBracket + ) { + break; + } + } + return message; + } }