UNPKG

libnexa-ts

Version:

A pure and powerful Nexa SDK library.

66 lines (52 loc) 2 kB
import type { IDigitalSignature, IPrivateKey, IPublicKey, ISignature } from "../common/interfaces"; import type { EndianType } from "../common/types"; import BufferUtils from "../utils/buffer.utils"; import ValidationUtils from "../utils/validation.utils"; import BN from "./bn.extension"; import Signature from "./signature"; export default abstract class DigitalSignature implements IDigitalSignature { hashbuf!: Uint8Array; endian?: EndianType; privkey!: IPrivateKey; pubkey!: IPublicKey; sig?: ISignature; verified?: boolean; constructor(obj?: Partial<IDigitalSignature>) { if (obj) { this.set(obj); } } protected set(obj: Partial<IDigitalSignature>): this { this.hashbuf = obj.hashbuf || this.hashbuf; this.endian = obj.endian || this.endian; this.privkey = obj.privkey || this.privkey; this.pubkey = obj.pubkey || (this.privkey ? this.privkey.publicKey : this.pubkey); this.sig = obj.sig || this.sig; this.verified = obj.verified || this.verified; return this; } protected abstract _findSignature(d: BN, e: BN): Partial<ISignature>; public abstract sigError(): boolean | string; public sign(): this { let hashbuf = this.hashbuf; let privkey = this.privkey; let d = privkey.bn; ValidationUtils.validateState(hashbuf != null && privkey != null && d != null, 'invalid parameters'); ValidationUtils.validateState(BufferUtils.isBuffer(hashbuf) && hashbuf.length === 32, 'hashbuf must be a 32 byte buffer'); let e = BN.fromBuffer(hashbuf, this.endian ? { endian: this.endian } : undefined); let obj = this._findSignature(d, e); obj.compressed = this.pubkey!.compressed; this.sig = new Signature(obj); return this; } public verify(): this { this.verified = !this.sigError(); return this; } public toPublicKey(): IPublicKey { return this.privkey.toPublicKey(); } public privkey2pubkey(): void { this.pubkey = this.privkey.toPublicKey(); } }