UNPKG

9.89 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../src/TransportU2F.js"],"names":["wrapU2FTransportError","originalError","message","id","err","TransportError","wrapApdu","apdu","key","result","Buffer","alloc","length","i","webSafe64","base64","replace","normal64","substring","attemptExchange","timeoutMillis","scrambleKey","unwrap","keyHandle","challenge","from","signRequest","version","toString","appId","location","origin","then","response","signatureData","data","slice","transportInstances","emitDisconnect","forEach","t","emit","isTimeoutU2FError","u2fError","metaData","code","TransportU2F","Transport","open","_","_openTimeout","constructor","push","exchange","exchangeTimeout","e","isU2FError","type","setScrambleKey","setUnwrap","close","Promise","resolve","isSupported","list","supported","listen","observer","unsubscribed","next","descriptor","complete","error","unsubscribe"],"mappings":"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","sourcesContent":["//@flow\n\nimport { sign, isSupported } from \"u2f-api\";\nimport Transport from \"@ledgerhq/hw-transport\";\nimport { log } from \"@ledgerhq/logs\";\nimport { TransportError } from \"@ledgerhq/errors\";\n\nfunction wrapU2FTransportError(originalError, message, id) {\n const err = new TransportError(message, id);\n // $FlowFixMe\n err.originalError = originalError;\n return err;\n}\n\nfunction wrapApdu(apdu: Buffer, key: Buffer) {\n const result = Buffer.alloc(apdu.length);\n for (let i = 0; i < apdu.length; i++) {\n result[i] = apdu[i] ^ key[i % key.length];\n }\n return result;\n}\n\n// Convert from normal to web-safe, strip trailing \"=\"s\nconst webSafe64 = (base64: string) =>\n base64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n\n// Convert from web-safe to normal, add trailing \"=\"s\nconst normal64 = (base64: string) =>\n base64.replace(/-/g, \"+\").replace(/_/g, \"/\") +\n \"==\".substring(0, (3 * base64.length) % 4);\n\nfunction attemptExchange(\n apdu: Buffer,\n timeoutMillis: number,\n scrambleKey: Buffer,\n unwrap: boolean\n): Promise<Buffer> {\n const keyHandle = wrapApdu(apdu, scrambleKey);\n const challenge = Buffer.from(\n \"0000000000000000000000000000000000000000000000000000000000000000\",\n \"hex\"\n );\n const signRequest = {\n version: \"U2F_V2\",\n keyHandle: webSafe64(keyHandle.toString(\"base64\")),\n challenge: webSafe64(challenge.toString(\"base64\")),\n appId: location.origin,\n };\n log(\"apdu\", \"=> \" + apdu.toString(\"hex\"));\n return sign(signRequest, timeoutMillis / 1000).then((response) => {\n const { signatureData } = response;\n if (typeof signatureData === \"string\") {\n const data = Buffer.from(normal64(signatureData), \"base64\");\n let result;\n if (!unwrap) {\n result = data;\n } else {\n result = data.slice(5);\n }\n log(\"apdu\", \"<= \" + result.toString(\"hex\"));\n return result;\n } else {\n throw response;\n }\n });\n}\n\nlet transportInstances = [];\n\nfunction emitDisconnect() {\n transportInstances.forEach((t) => t.emit(\"disconnect\"));\n transportInstances = [];\n}\n\nfunction isTimeoutU2FError(u2fError) {\n return u2fError.metaData.code === 5;\n}\n\n/**\n * U2F web Transport implementation\n * @example\n * import TransportU2F from \"@ledgerhq/hw-transport-u2f\";\n * ...\n * TransportU2F.create().then(transport => ...)\n */\nexport default class TransportU2F extends Transport<null> {\n static isSupported = isSupported;\n\n /*\n */\n static list = (): * =>\n // this transport is not discoverable but we are going to guess if it is here with isSupported()\n isSupported().then((supported) => (supported ? [null] : []));\n\n /*\n */\n static listen = (observer: *) => {\n let unsubscribed = false;\n isSupported().then((supported) => {\n if (unsubscribed) return;\n if (supported) {\n observer.next({ type: \"add\", descriptor: null });\n observer.complete();\n } else {\n observer.error(\n new TransportError(\n \"U2F browser support is needed for Ledger. \" +\n \"Please use Chrome, Opera or Firefox with a U2F extension. \" +\n \"Also make sure you're on an HTTPS connection\",\n \"U2FNotSupported\"\n )\n );\n }\n });\n return {\n unsubscribe: () => {\n unsubscribed = true;\n },\n };\n };\n\n scrambleKey: Buffer;\n\n unwrap: boolean = true;\n\n /**\n * static function to create a new Transport from a connected Ledger device discoverable via U2F (browser support)\n */\n static async open(_: *, _openTimeout?: number = 5000): Promise<TransportU2F> {\n return new TransportU2F();\n }\n\n constructor() {\n super();\n transportInstances.push(this);\n }\n\n /**\n * Exchange with the device using APDU protocol.\n * @param apdu\n * @returns a promise of apdu response\n */\n async exchange(apdu: Buffer): Promise<Buffer> {\n try {\n return await attemptExchange(\n apdu,\n this.exchangeTimeout,\n this.scrambleKey,\n this.unwrap\n );\n } catch (e) {\n const isU2FError = typeof e.metaData === \"object\";\n if (isU2FError) {\n if (isTimeoutU2FError(e)) {\n emitDisconnect();\n }\n // the wrapping make error more usable and \"printable\" to the end user.\n throw wrapU2FTransportError(\n e,\n \"Failed to sign with Ledger device: U2F \" + e.metaData.type,\n \"U2F_\" + e.metaData.code\n );\n } else {\n throw e;\n }\n }\n }\n\n /**\n */\n setScrambleKey(scrambleKey: string) {\n this.scrambleKey = Buffer.from(scrambleKey, \"ascii\");\n }\n\n /**\n */\n setUnwrap(unwrap: boolean) {\n this.unwrap = unwrap;\n }\n\n close(): Promise<void> {\n // u2f have no way to clean things up\n return Promise.resolve();\n }\n}\n"],"file":"TransportU2F.js"}
\No newline at end of file