UNPKG

js-moi-signer

Version:

This package enables users to sign and verify messages in their applications.

96 lines (82 loc) 2.75 kB
import { ErrorCode, ErrorUtils, hexToBytes } from "js-moi-utils"; import { ISignature } from "../types"; export default class Signature implements ISignature { private prefix: Uint8Array; private digest: Uint8Array; private extraData: Uint8Array; private name: string constructor(prefix?: Uint8Array, digest?: Uint8Array, extraData?: Uint8Array, signatureName?: string) { this.prefix = prefix; this.digest = digest; this.extraData = extraData; this.name = signatureName } public unmarshall(signature: Uint8Array | String) { let sig: Uint8Array; if (typeof signature === "string") { sig = hexToBytes(signature) } else { sig = signature as Uint8Array } const sigLen = sig[1]; this.prefix = sig.subarray(0, 2); this.digest = sig.subarray(2, 2 + sigLen); this.extraData = sig.subarray(2 + sigLen); this.name = this.getSignatureName(sig[0]); } public Digest(): Uint8Array { return this.digest; } /** * getSigByte * * Retrieves the signature byte of the signature prefix. * * @returns The signature byte as a number. * @throws Error if the signature byte is invalid. */ public getSigByte(): number { if (typeof this.prefix[0] !== "number") { ErrorUtils.throwError( "Invalid signature byte.", ErrorCode.INVALID_SIGNATURE ) } return this.prefix[0]; } /** * getName * * Retrieves the name of the signature algorithm. * * @returns The name of the signature algorithm as a string. */ public getName(): string { return this.name; } public Extra(): Uint8Array { return this.extraData; } public serialize(): Uint8Array { if (this.name === "") { ErrorUtils.throwError("Signature is not initialized", ErrorCode.NOT_INITIALIZED); } const finalSigBytesWithoutExtra = new Uint8Array([...this.prefix, ...this.digest]); const finalSigBytes = new Uint8Array([...finalSigBytesWithoutExtra, ...this.extraData]); return finalSigBytes; } /** * getSignatureName * * Retrieves the name of the signature algorithm based on the given signature index. * * @param sigIndex - The signature index used to determine the signature algorithm name. * @returns The name of the signature algorithm as a string. */ private getSignatureName(sigIndex: number): string { switch (sigIndex) { case 1: return "ECDSA_S256"; default: return ""; } } }