UNPKG

jadets

Version:
1 lines 34.5 kB
{"version":3,"sources":["../src/transport/SerialTransport.ts","../src/transport/TCPTransport.ts","../src/interfaces/JadeInterface.ts","../src/utils/getFingerPrint.ts","../src/utils/hexToBytes.ts","../src/utils/base64ToBytes.ts","../src/utils/bytesToBase64.ts","../src/Jade.ts"],"sourcesContent":["// transport/SerialTransport.ts\nimport { EventEmitter } from 'events';\nimport { SerialPortOptions, JadeTransport } from \"../types\";\nimport { encode, decode } from 'cbor2';\n\nexport class SerialTransport extends EventEmitter implements JadeTransport {\n private options: SerialPortOptions;\n private port: any | null = null;\n private reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n private receivedBuffer: Uint8Array = new Uint8Array(0);\n\n constructor(options: SerialPortOptions) {\n super();\n this.options = options;\n }\n\n drain(): void {\n this.receivedBuffer = new Uint8Array(0);\n }\n\n async connect(): Promise<void> {\n try {\n const serial = (navigator as any).serial;\n if (!serial) {\n throw new Error('Web Serial API is not supported in this browser.');\n }\n\n const ports: any[] = await serial.getPorts();\n if (ports.length === 0) {\n this.port = await serial.requestPort();\n } else {\n this.port = ports[0];\n }\n\n if (!this.port) {\n throw new Error('No serial port selected.');\n }\n\n await this.port.open({ baudRate: this.options.baudRate || 115200,\n\t\t\t\t\t\t\t bufferSize: this.options.bufferSize || 4 * 1024 });\n this.reader = this.port.readable?.getReader() || null;\n if (this.reader) {\n this.readLoop();\n }\n } catch (error) {\n console.error('[WebSerialPort] Failed to connect:', error);\n throw error;\n }\n }\n\n private async readLoop(): Promise<void> {\n if (!this.reader) return;\n\n try {\n while (true) {\n const { value, done } = await this.reader.read();\n if (done) {\n break;\n }\n if (value) {\n this.receivedBuffer = this.concatBuffers(this.receivedBuffer, value);\n this.processReceivedData();\n }\n }\n } catch (error) {\n console.error('[WebSerialPort] Read error:', error);\n } finally {\n if (this.reader) {\n this.reader.releaseLock();\n this.reader = null;\n }\n }\n }\n\n private processReceivedData(): void {\n let index = 1;\n while (index <= this.receivedBuffer.length) {\n try {\n const sliceToTry = this.receivedBuffer.slice(0, index);\n const decoded = decode(sliceToTry);\n if (\n decoded &&\n typeof decoded === 'object' &&\n (('error' in decoded) ||\n ('result' in decoded) ||\n ('log' in decoded) ||\n ('method' in decoded))\n ) {\n this.emit('message', decoded);\n }\n this.receivedBuffer = this.receivedBuffer.slice(index);\n index = 1;\n } catch (error: any) {\n if (\n error.message &&\n (error.message.includes('Offset is outside') ||\n error.message.includes('Insufficient data') ||\n error.message.includes('Unexpected end of stream'))\n ) {\n index++;\n if (index > this.receivedBuffer.length) {\n break;\n }\n } else {\n console.error('[WebSerialPort] CBOR decode error:', error);\n this.receivedBuffer = new Uint8Array(0);\n break;\n }\n }\n }\n }\n\n private concatBuffers(a: Uint8Array, b: Uint8Array): Uint8Array {\n const result = new Uint8Array(a.length + b.length);\n result.set(a);\n result.set(b, a.length);\n return result;\n }\n\n async disconnect(): Promise<void> {\n try {\n if (this.reader) {\n await this.reader.cancel();\n }\n if (this.port) {\n await this.port.close();\n }\n this.port = null;\n this.reader = null;\n } catch (error) {\n console.error('[WebSerialPort] Error during disconnect:', error);\n }\n }\n\n async sendMessage(message: any): Promise<void> {\n try {\n if (!this.port || !this.port.writable) {\n throw new Error('Port not available');\n }\n const encoded = encode(message);\n const writer = this.port.writable.getWriter();\n await writer.write(encoded);\n writer.releaseLock();\n } catch (error) {\n console.error('[WebSerialPort] Failed to send message:', error);\n throw error;\n }\n }\n\n onMessage(callback: (message: any) => void): void {\n this.on('message', callback);\n }\n}\n\n","// src/transport/TCPTransport.ts\nimport { EventEmitter } from 'events';\nimport net from 'net';\nimport { encode, decode } from 'cbor2';\nimport { JadeTransport } from '../types';\n\nexport class TCPTransport extends EventEmitter implements JadeTransport {\n private socket: net.Socket | null = null;\n private recvBuffer = Buffer.alloc(0);\n\n constructor(private host: string, private port: number) {\n super();\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.socket = new net.Socket();\n this.socket.once('error', reject);\n this.socket.connect(this.port, this.host, () => {\n this.socket!\n .on('data', this.onData.bind(this))\n .on('error', (err) => this.emit('error', err))\n .on('close', () => this.emit('disconnect'));\n resolve();\n });\n });\n }\n\n async disconnect(): Promise<void> {\n if (!this.socket) return;\n return new Promise((resolve) => {\n this.socket!.end(() => {\n this.socket = null;\n resolve();\n });\n });\n }\n\n async sendMessage(msg: any): Promise<void> {\n if (!this.socket) throw new Error('Not connected');\n const chunk = encode(msg);\n this.socket.write(chunk);\n }\n\n onMessage(callback: (msg: any) => void): void {\n this.on('message', callback);\n }\n\n private onData(data: Buffer) {\n // 1) Accumulate incoming bytes\n this.recvBuffer = Buffer.concat([this.recvBuffer, data]);\n\n // 2) Try to decode as many top-level CBOR items as we can\n while (this.recvBuffer.length > 0) {\n try {\n // decode returns the first full CBOR object in the buffer\n const obj = decode(this.recvBuffer);\n\n // emit it\n this.emit('message', obj);\n\n // figure out how many bytes that object consumed\n const consumed = encode(obj).length;\n\n // drop those bytes and loop to decode next\n this.recvBuffer = this.recvBuffer.slice(consumed);\n } catch (e: any) {\n // if it's \"Insufficient data\", we just break and wait for more bytes\n if (e.message.includes('Insufficient data') || e.message.includes('Unexpected end of stream')) {\n break;\n }\n // otherwise it's a real error — emit and clear buffer\n this.emit('error', e);\n this.recvBuffer = Buffer.alloc(0);\n break;\n }\n }\n }\n}\n\n","// interface/JadeInterface.ts\nimport cbor from \"cbor2\";\nimport { JadeTransport, IJadeInterface, RPCRequest, RPCResponse } from \"../types\";\n\nexport class JadeInterface implements IJadeInterface {\n constructor(private transport: JadeTransport) {}\n\n async connect() {\n await this.transport.connect();\n }\n\n async disconnect() {\n await this.transport.disconnect();\n }\n\n buildRequest(id: string, method: string, params?: any): RPCRequest {\n return { id, method, params };\n }\n\n /**\n * Makes an RPC call and handles extended data responses automatically\n */\n async makeRPCCall(request: RPCRequest, long_timeout: boolean = false): Promise<RPCResponse> {\n if (!request.id || request.id.length > 16) {\n throw new Error('Request id must be non-empty and less than 16 characters');\n }\n if (!request.method || request.method.length > 32) {\n throw new Error('Request method must be non-empty and less than 32 characters');\n }\n\n await this.transport.sendMessage(request);\n \n const initialResponse = await this.waitForResponse(request.id, long_timeout);\n \n if (this.isExtendedDataResponse(initialResponse)) {\n return await this.handleExtendedDataResponse(initialResponse, request.id, long_timeout);\n }\n \n return initialResponse;\n }\n\n /**\n * Waits for a single response message\n */\n private async waitForResponse(requestId: string, long_timeout: boolean): Promise<RPCResponse> {\n return new Promise<RPCResponse>((resolve, reject) => {\n const onResponse = (msg: RPCResponse) => {\n if (msg && msg.id === requestId) {\n this.transport.removeListener('message', onResponse);\n if (timeoutId) clearTimeout(timeoutId);\n resolve(msg);\n }\n };\n\n this.transport.onMessage(onResponse);\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (!long_timeout) {\n timeoutId = setTimeout(() => {\n this.transport.removeListener('message', onResponse);\n reject(new Error('RPC call timed out'));\n }, 5000);\n }\n });\n }\n\n /**\n * Checks if a response indicates extended data\n */\n private isExtendedDataResponse(response: RPCResponse): boolean {\n return response.seqnum !== undefined && \n response.seqlen !== undefined && \n response.seqnum < response.seqlen;\n }\n\n /**\n * Handles extended data responses by collecting all chunks\n */\n private async handleExtendedDataResponse(\n initialResponse: RPCResponse, \n requestId: string, \n long_timeout: boolean\n ): Promise<RPCResponse> {\n const chunks: RPCResponse[] = [initialResponse];\n const totalChunks = initialResponse.seqlen!;\n \n console.log(`Receiving extended data: chunk ${initialResponse.seqnum! + 1}/${totalChunks}`);\n\n for (let expectedSeqnum = initialResponse.seqnum! + 1; expectedSeqnum < totalChunks; expectedSeqnum++) {\n const extendedRequest: RPCRequest = {\n id: requestId,\n method: 'get_extended_data',\n params: { seqnum: expectedSeqnum }\n };\n\n await this.transport.sendMessage(extendedRequest);\n const chunkResponse = await this.waitForResponse(requestId, long_timeout);\n\n if (chunkResponse.seqnum !== expectedSeqnum) {\n throw new Error(`Expected chunk ${expectedSeqnum}, got ${chunkResponse.seqnum}`);\n }\n if (chunkResponse.seqlen !== totalChunks) {\n throw new Error(`Inconsistent seqlen: expected ${totalChunks}, got ${chunkResponse.seqlen}`);\n }\n\n chunks.push(chunkResponse);\n console.log(`Received extended data chunk: ${expectedSeqnum + 1}/${totalChunks}`);\n }\n\n return this.reassembleExtendedData(chunks);\n }\n\n /**\n * Reassembles chunks into a complete response\n */\n private reassembleExtendedData(chunks: RPCResponse[]): RPCResponse {\n chunks.sort((a, b) => (a.seqnum || 0) - (b.seqnum || 0));\n\n const completeResponse: RPCResponse = {\n id: chunks[0].id,\n error: chunks[0].error\n };\n\n if (completeResponse.error) {\n return completeResponse;\n }\n\n completeResponse.result = this.mergeChunkData(chunks);\n\n console.log(`Extended data reassembly complete: ${chunks.length} chunks processed`);\n return completeResponse;\n }\n\n private mergeChunkData(chunks: RPCResponse[]): any {\n const firstResult = chunks[0].result;\n\n if (firstResult instanceof Uint8Array) {\n const totalLength = chunks.reduce((sum, chunk) => {\n const chunkData = chunk.result as Uint8Array;\n return sum + chunkData.length;\n }, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n \n for (const chunk of chunks) {\n const chunkData = chunk.result as Uint8Array;\n merged.set(chunkData, offset);\n offset += chunkData.length;\n }\n \n return merged;\n }\n\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(firstResult)) {\n return Buffer.concat(chunks.map(chunk => chunk.result as Buffer));\n }\n\n if (Array.isArray(firstResult)) {\n return chunks.reduce((merged, chunk) => {\n return merged.concat(chunk.result);\n }, []);\n }\n\n if (typeof firstResult === 'string') {\n return chunks.map(chunk => chunk.result).join('');\n }\n\n if (typeof firstResult === 'object' && firstResult !== null) {\n return chunks.reduce((merged, chunk) => {\n return { ...merged, ...chunk.result };\n }, {});\n }\n\n console.warn('Unknown data type for extended data merge, returning first chunk');\n return firstResult;\n }\n}\n","// src/utils/getFingerprint.ts\nimport * as ecc from 'tiny-secp256k1'\nimport BIP32Factory, { BIP32Interface } from 'bip32'\nimport { Buffer } from 'buffer';\n\nconst bip32 = BIP32Factory(ecc)\n\ntype NetworkType = BIP32Interface['network']\n\nconst MAINNET_BIP32: NetworkType = {\n wif: 0x80,\n bip32: {\n public: 0x0488b21e, // “xpub”\n private: 0x0488ade4, // “xprv”\n },\n messagePrefix: '\\x18Bitcoin Signed Message:\\n',\n bech32: 'bc',\n pubKeyHash: 0x00,\n scriptHash: 0x05,\n}\n\n// Testnet parameters (tpub / tprv = 0x043587cf / 0x04358394)\nconst TESTNET_BIP32: NetworkType = {\n wif: 0xef,\n bip32: {\n public: 0x043587cf, // “tpub”\n private: 0x04358394, // “tprv”\n },\n messagePrefix: '\\x18Bitcoin Signed Message:\\n',\n bech32: 'tb',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n}\n\nexport function getFingerprintFromXpub(xpub: string, networkType: string): string | null {\n\ttry {\n\n\t\tconst network: NetworkType = networkType === 'testnet' ? TESTNET_BIP32 : MAINNET_BIP32\n\t\tconst node: BIP32Interface = bip32.fromBase58(xpub, network)\n\t\treturn Buffer.from(node.fingerprint).toString('hex')\n\t} catch (err) {\n\t\tconsole.error('Error getting fingerprint:', err)\n\t\treturn null\n\t}\n}\n\n","\n\nexport function hexToBytes(hex: string): Uint8Array {\n if (hex.length % 2 !== 0) {\n throw new Error('hex string must have even length');\n }\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n","\nexport function base64ToBytes(b64: string): Uint8Array {\n return Uint8Array.from(Buffer.from(b64, 'base64'));\n}\n","export function bytesToBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString('base64');\n}\n","//Jade.ts\nimport { IJadeInterface, IJade, SignerDescriptor, MultisigSummary, RegisteredMultisig, ReceiveOptions, MultisigDescriptor, RegisterMultisigParams } from './types';\n\nimport { getFingerprintFromXpub } from './utils' \n\nimport { randomBytes } from 'crypto';\n\nexport class Jade implements IJade {\n\n\tconstructor(private iface: IJadeInterface) {}\n\n\tasync connect() { return this.iface.connect(); }\n\tasync disconnect() { return this.iface.disconnect(); }\n\n\n\tprivate async _jadeRpc(\n\t\tmethod: string,\n\t\tparams?: any,\n\t\tid?: string,\n\t\tlong_timeout: boolean = false,\n\t\t\thttp_request_fn?: (params: any) => Promise<{ body: any }>\n\t): Promise<any> {\n\t\tconst requestId = id || Math.floor(Math.random() * 1000000).toString();\n\t\tconst request = this.iface.buildRequest(requestId, method, params);\n\t\tconst reply = await this.iface.makeRPCCall(request, long_timeout);\n\n\t\tif (reply.error) {\n\t\t\tthrow new Error(`RPC Error ${reply.error.code}: ${reply.error.message}`);\n\t\t}\n\t\tif (reply.result &&\n\t\t\ttypeof reply.result === 'object' &&\n\t\t\t\t'http_request' in reply.result) {\n\n\t\t\tif (!http_request_fn) {\n\t\t\t\tthrow new Error('HTTP request function not provided');\n\t\t\t}\n\n\t\t\tconst httpRequest = reply.result['http_request'];\n\t\t\tconst httpResponse = await http_request_fn(httpRequest['params']);\n\t\t\treturn this._jadeRpc(\n\t\t\t\thttpRequest['on-reply'],\n\t\t\t\thttpResponse['body'],\n\t\t\t\tundefined,\n\t\t\t\tlong_timeout,\n\t\t\t\thttp_request_fn\n\t\t\t);\n\t\t}\n\n\t\treturn reply.result;\n\t}\n\n\tasync cleanReset(): Promise<boolean> {\n\t\treturn this._jadeRpc('debug_clean_reset');\n\t}\n\n\tasync ping(): Promise<0|1|2> {\n\t\treturn this._jadeRpc(\"ping\"); \n\t}\n\n\tasync getVersionInfo(nonblocking: boolean = false): Promise<any> {\n\t\tconst params = nonblocking ? { nonblocking: true } : undefined;\n\t\treturn this._jadeRpc('get_version_info', params);\n\t}\n\tasync setMnemonic(\n\t\tmnemonic: string,\n\t\tpassphrase?: string,\n\t\ttemporaryWallet = false\n\t): Promise<boolean> {\n\t\tconst params: Record<string, any> = { mnemonic, temporary_wallet: temporaryWallet };\n\t\tif (passphrase !== undefined) {\n\t\t\tparams.passphrase = passphrase;\n\t\t}\n\t\treturn this._jadeRpc('debug_set_mnemonic', params);\n\t}\n\n\tasync authUser(\n\t\tnetwork: string,\n\t\thttp_request_fn?: (params: any) => Promise<{ body: any }>,\n\t\t\tepoch?: number\n\t): Promise<boolean> {\n\t\tif (typeof network !== 'string' || network.length === 0) {\n\t\t\tthrow new Error('authUser: \"network\" must be a non-empty string');\n\t\t}\n\t\tconst computedEpoch = epoch !== undefined ? epoch : Math.floor(Date.now() / 1000);\n\t\tconst params = {\n\t\t\tnetwork,\n\t\t\tepoch: computedEpoch\n\t\t};\n\t\treturn this._jadeRpc('auth_user', params, undefined, true, http_request_fn);\n\t}\n\n\tasync addEntropy(entropy: Uint8Array): Promise<boolean> {\n\t\tconst params = {entropy}\n\t\treturn this._jadeRpc('add_entropy', params);\n\t}\n\n\tasync logout(): Promise<boolean> {\n\t\treturn this._jadeRpc('logout');\n\t}\n\n\tasync getXpub(network: string, path: number[]): Promise<string> {\n\t\tconst params = { network, path };\n\t\treturn this._jadeRpc('get_xpub', params);\n\t}\n\n\tasync setEpoch(epoch?: number): Promise<boolean> {\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst params = { epoch: epoch !== undefined ? epoch : now };\n\t\treturn this._jadeRpc('set_epoch', params);\n\t}\n\n\tasync registerMultisig(\n\t\tnetwork: string,\n\t\tmultisigName: string | undefined,\n\t\tdescriptor: MultisigDescriptor\n\t): Promise<boolean> {\n\t\tlet mname = multisigName;\n\n\t\tif (mname === undefined) {\n\t\t\tmname = \"jade\" + randomBytes(4).toString(\"hex\");\n\t\t}\n\n\t\tconst params: RegisterMultisigParams = {\n\t\t\tnetwork,\n\t\t\tmultisig_name: mname,\n\t\t\tdescriptor,\n\t\t};\n\t\treturn this._jadeRpc('register_multisig', params, undefined, true);\n\t}\n\n\tasync getRegisteredMultisigs(): Promise<Record<string, MultisigSummary>> {\n\t\treturn this._jadeRpc(\"get_registered_multisigs\");\n\t}\n\n\tasync getMultiSigName(\n\t\tnetwork: string,\n\t\ttarget: MultisigDescriptor\n\t): Promise<string|undefined> {\n\t\tconst summaries = await this.getRegisteredMultisigs();\n\n\t\tfor (const [name, sum] of Object.entries(summaries)) {\n\t\t\tif (\n\t\t\t\tsum.variant !== target.variant ||\n\t\t\t\tsum.sorted !== target.sorted ||\n\t\t\tsum.threshold !== target.threshold ||\n\t\tsum.num_signers !== target.signers.length\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst full = await this.getRegisteredMultisig(name, false);\n\t\t\tconst desc = full.descriptor;\n\n\t\t\tconst normalize = (o: any) =>\n\t\t\tnew Uint8Array(Object.values(o.fingerprint as Record<string, number>));\n\n\t\t\tconst match = desc.signers.length === target.signers.length\n\t\t\t&& desc.signers.every((s, i) => {\n\t\t\t\tconst t = target.signers[i];\n\t\t\t\tconst sf = normalize(s);\n\t\t\t\tconst tf = t.fingerprint;\n\n\t\t\t\tif (sf.length !== tf.length\n\t\t\t\t\t|| sf.some((b, idx) => b !== tf[idx])\n\t\t\t\t ) return false;\n\n\t\t\t\t if (s.xpub !== t.xpub) return false;\n\n\t\t\t\t if (s.derivation.length !== t.derivation.length\n\t\t\t\t\t || s.derivation.some((v, idx) => v !== t.derivation[idx])\n\t\t\t\t\t ) return false;\n\n\t\t\t\t\t return true;\n\t\t\t});\n\n\t\t\tif (match) {\n\t\t\t\treturn name;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\n\tasync getRegisteredMultisig(name: string, asFile: boolean = false): Promise<RegisteredMultisig> {\n\t\tconst params = {'multisig_name': name,\n\t\t\t\t\t\t'as_file': asFile};\n\t\treturn this._jadeRpc('get_registered_multisig', params);\n\t}\n\n\n\tasync getReceiveAddress(\n\t\tnetwork: string,\n\t\topts: ReceiveOptions\n\t): Promise<string> {\n\t\tconst params: any = { network };\n\n\t\tif (opts.path) params.path = opts.path;\n\t\tif (opts.paths) params.paths = opts.paths;\n\t\tif (opts.multisigName) params.multisig_name = opts.multisigName;\n\t\tif (opts.descriptorName) params.descriptor_name = opts.descriptorName;\n\t\tif (opts.variant) params.variant = opts.variant;\n\t\tif (opts.recoveryXpub) params.recovery_xpub = opts.recoveryXpub;\n\t\tif (opts.csvBlocks) params.csv_blocks = opts.csvBlocks;\n\t\tif (opts.confidential) params.confidential = opts.confidential;\n\n\t\treturn this._jadeRpc(\"get_receive_address\", params);\n\t}\n\n\tasync signMessage(\n\t\tpath: number[],\n\t\tmessage: string,\n\t\tuseAeSignatures?: boolean,\n\t\taeHostCommitment?: Uint8Array,\n\t\taeHostEntropy?: Uint8Array\n\t): Promise<Uint8Array | [Uint8Array, Uint8Array]> {\n\t\tif (useAeSignatures) {\n\t\t\t\tthrow new Error('ae sig not implemented');\n\t\t} else {\n\t\t\tconst params = {'path': path, 'message': message }\n\t\t\treturn this._jadeRpc('sign_message', params, undefined, true);\n\t\t}\n\n\t}\n\n\tasync signPSBT(network: string, psbt: Uint8Array): Promise<Uint8Array> {\n\t\tconst params = {'network': network, 'psbt': psbt};\n\t\treturn this._jadeRpc('sign_psbt', params, undefined, true);\n\t}\n\n\tasync getMasterFingerPrint(network: string): Promise<null | string>{\n\t\tconst xpub = await this.getXpub(network, [])\n\t\treturn getFingerprintFromXpub(xpub, network)\n\n\t}\n\n}\n\n\n"],"mappings":"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","names":["EventEmitter","encode","decode","EventEmitter","encode","decode","Buffer"]}