@hazae41/ledger
Version:
Private and supply-chain hardened Ledger controller for TypeScript
1 lines • 6.98 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../src/mods/hid/index.ts"],"sourcesContent":["import { Opaque, Readable, Writable } from \"@hazae41/binary\"\nimport { Cursor } from \"@hazae41/cursor\"\n\nexport class InvalidHidTagError extends Error {\n readonly #class = InvalidHidTagError\n readonly name = this.#class.name\n\n constructor(\n readonly tag: number\n ) {\n super(`Invalid HID tag ${tag}`)\n }\n\n}\n\nexport class HidFrame<T extends Writable> {\n readonly #class = HidFrame\n\n static readonly tag = 0x05 as const\n\n constructor(\n readonly channel: number,\n readonly fragment: T,\n readonly index: number,\n ) { }\n\n sizeOrThrow() {\n return 2 + 1 + 2 + this.fragment.sizeOrThrow()\n }\n\n writeOrThrow(cursor: Cursor) {\n cursor.writeUint16OrThrow(this.channel)\n cursor.writeUint8OrThrow(this.#class.tag)\n cursor.writeUint16OrThrow(this.index)\n this.fragment.writeOrThrow(cursor)\n }\n\n static readOrThrow(cursor: Cursor): HidFrame<Opaque> {\n const channel = cursor.readUint16OrThrow()\n const tag = cursor.readUint8OrThrow()\n\n if (tag !== this.tag)\n throw new InvalidHidTagError(tag)\n\n const index = cursor.readUint16OrThrow()\n const bytes = cursor.readAndCopyOrThrow(cursor.remaining)\n const fragment = new Opaque(bytes)\n\n return new HidFrame(channel, fragment, index)\n }\n\n static *splitOrThrow(channel: number, bytes: Uint8Array) {\n const chunks = new Cursor(bytes).splitOrThrow(59)\n\n let chunk = chunks.next()\n\n for (let i = 0; !chunk.done; chunk = chunks.next(), i++)\n yield new HidFrame(channel, new Opaque(chunk.value), i)\n\n return chunk.value\n }\n\n static async unsplitOrThrow(channel: number, generator: AsyncGenerator<HidFrame<Opaque>, never, unknown>) {\n const first = await generator.next()\n\n if (first.done)\n return first.value\n\n const frames = Readable.readFromBytesOrThrow(HidContainer, first.value.fragment.bytes)\n\n const bytes = new Uint8Array(frames.length)\n const cursor = new Cursor(bytes)\n\n cursor.writeOrThrow(frames.fragment.bytes.slice(0, cursor.remaining))\n\n if (!cursor.remaining)\n return cursor.bytes\n\n let frame = await generator.next()\n\n for (; !frame.done; frame = await generator.next()) {\n cursor.writeOrThrow(frame.value.fragment.bytes.slice(0, cursor.remaining))\n\n if (!cursor.remaining)\n return cursor.bytes\n\n continue\n }\n\n return frame.value\n }\n\n}\n\nexport class HidContainer<T extends Writable> {\n\n constructor(\n readonly length: number,\n readonly fragment: T,\n ) { }\n\n static newOrThrow<T extends Writable>(fragment: T): HidContainer<T> {\n return new HidContainer(fragment.sizeOrThrow(), fragment)\n }\n\n sizeOrThrow() {\n return Math.ceil((2 + this.length) / 59) * 59\n }\n\n writeOrThrow(cursor: Cursor) {\n cursor.writeUint16OrThrow(this.length)\n this.fragment.writeOrThrow(cursor)\n cursor.fillOrThrow(0, cursor.remaining)\n }\n\n static readOrThrow(cursor: Cursor): HidContainer<Opaque> {\n const length = cursor.readUint16OrThrow()\n const bytes = cursor.readAndCopyOrThrow(cursor.remaining)\n const fragment = new Opaque(bytes)\n\n return new HidContainer(length, fragment)\n }\n}"],"names":[],"mappings":"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"}