From ae211c88d9235dd9c6ed2abc218cfd4cb3c9d31a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Wed, 8 Nov 2023 13:14:24 +0200 Subject: [PATCH] Fix applySignature(). Handle buffers in a better way. --- src/signableMessage.ts | 7 ++----- src/signature.ts | 12 +++++++++++- src/transaction.ts | 16 +++------------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/signableMessage.ts b/src/signableMessage.ts index fbdb8f67..4aee73fa 100644 --- a/src/signableMessage.ts +++ b/src/signableMessage.ts @@ -1,5 +1,6 @@ import { Address } from "./address"; import { ISignature } from "./interface"; +import { interpretSignatureAsBuffer } from "./signature"; const createKeccakHash = require("keccak"); export const MESSAGE_PREFIX = "\x17Elrond Signed Message:\n"; @@ -57,11 +58,7 @@ export class SignableMessage { } applySignature(signature: ISignature | Buffer) { - if (signature instanceof Buffer) { - this.signature = signature; - } else { - this.signature = Buffer.from(signature.hex(), "hex"); - } + this.signature = interpretSignatureAsBuffer(signature); } getMessageSize(): Buffer { diff --git a/src/signature.ts b/src/signature.ts index 9ff9e9a3..e307a225 100644 --- a/src/signature.ts +++ b/src/signature.ts @@ -1,4 +1,4 @@ -import * as errors from "./errors"; +import * as errors from "./errors"; const SIGNATURE_LENGTH = 64; @@ -58,3 +58,13 @@ export class Signature { return this.valueHex; } } + +export function interpretSignatureAsBuffer(signature: { hex(): string; } | Uint8Array): Buffer { + if (ArrayBuffer.isView(signature)) { + return Buffer.from(signature); + } else if ((signature).hex != null) { + return Buffer.from(signature.hex(), "hex"); + } + + throw new Error(`Object cannot be interpreted as a signature: ${signature}`); +} diff --git a/src/transaction.ts b/src/transaction.ts index 092aae7d..e8926c44 100644 --- a/src/transaction.ts +++ b/src/transaction.ts @@ -8,7 +8,7 @@ import { IAddress, IChainID, IGasLimit, IGasPrice, INonce, IPlainTransactionObje import { INetworkConfig } from "./interfaceOfNetwork"; import { TransactionOptions, TransactionVersion } from "./networkParams"; import { ProtoSerializer } from "./proto"; -import { Signature } from "./signature"; +import { Signature, interpretSignatureAsBuffer } from "./signature"; import { TransactionPayload } from "./transactionPayload"; import { guardNotEmpty } from "./utils"; @@ -372,27 +372,17 @@ export class Transaction { * @param signature The signature, as computed by a signer. */ applySignature(signature: ISignature | Uint8Array) { - this.signature = this.interpretSignatureAsBuffer(signature); + this.signature = interpretSignatureAsBuffer(signature); this.hash = TransactionHash.compute(this); } - private interpretSignatureAsBuffer(signature: ISignature | Uint8Array): Buffer { - if (ArrayBuffer.isView(signature)) { - return Buffer.from(signature); - } else if ((signature).hex != null) { - return Buffer.from(signature.hex(), "hex"); - } - - throw new Error(`Object cannot be interpreted as a signature: ${signature}`); - } - /** * Applies the guardian signature on the transaction. * * @param guardianSignature The signature, as computed by a signer. */ applyGuardianSignature(guardianSignature: ISignature | Uint8Array) { - this.guardianSignature = this.interpretSignatureAsBuffer(guardianSignature); + this.guardianSignature = interpretSignatureAsBuffer(guardianSignature); this.hash = TransactionHash.compute(this); }