@ledgerhq/devices 6.20.2 → 6.24.2-monorepo.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -0
- package/CHANGELOG.md +19 -0
- package/jest.config.ts +6 -0
- package/lib/ble/receiveAPDU.d.ts +0 -0
- package/lib/ble/receiveAPDU.d.ts.map +0 -0
- package/lib/ble/receiveAPDU.js +0 -0
- package/lib/ble/receiveAPDU.js.map +0 -0
- package/lib/ble/sendAPDU.d.ts +0 -0
- package/lib/ble/sendAPDU.d.ts.map +0 -0
- package/lib/ble/sendAPDU.js +0 -0
- package/lib/ble/sendAPDU.js.map +0 -0
- package/lib/hid-framing.d.ts +0 -0
- package/lib/hid-framing.d.ts.map +0 -0
- package/lib/hid-framing.js +0 -0
- package/lib/hid-framing.js.map +0 -0
- package/lib/index.d.ts +0 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/scrambling.d.ts +0 -0
- package/lib/scrambling.d.ts.map +0 -0
- package/lib/scrambling.js +0 -0
- package/lib/scrambling.js.map +0 -0
- package/lib-es/ble/receiveAPDU.d.ts +0 -0
- package/lib-es/ble/receiveAPDU.d.ts.map +0 -0
- package/lib-es/ble/receiveAPDU.js +0 -0
- package/lib-es/ble/receiveAPDU.js.map +0 -0
- package/lib-es/ble/sendAPDU.d.ts +0 -0
- package/lib-es/ble/sendAPDU.d.ts.map +0 -0
- package/lib-es/ble/sendAPDU.js +0 -0
- package/lib-es/ble/sendAPDU.js.map +0 -0
- package/lib-es/hid-framing.d.ts +0 -0
- package/lib-es/hid-framing.d.ts.map +0 -0
- package/lib-es/hid-framing.js +0 -0
- package/lib-es/hid-framing.js.map +0 -0
- package/lib-es/index.d.ts +0 -0
- package/lib-es/index.d.ts.map +1 -1
- package/lib-es/index.js +1 -1
- package/lib-es/index.js.map +1 -1
- package/lib-es/scrambling.d.ts +0 -0
- package/lib-es/scrambling.d.ts.map +0 -0
- package/lib-es/scrambling.js +0 -0
- package/lib-es/scrambling.js.map +0 -0
- package/package.json +9 -9
- package/src/index.ts +0 -1
- package/tests/{identifyTargetId.test.js → identifyTargetId.test.ts} +0 -1
- package/lib/ble/receiveAPDU.js.flow +0 -82
- package/lib/ble/sendAPDU.js.flow +0 -71
- package/lib/hid-framing.js.flow +0 -89
- package/lib/index.js.flow +0 -178
- package/lib/scrambling.js.flow +0 -10
- package/lib-es/ble/receiveAPDU.js.flow +0 -82
- package/lib-es/ble/sendAPDU.js.flow +0 -71
- package/lib-es/hid-framing.js.flow +0 -89
- package/lib-es/index.js.flow +0 -178
- package/lib-es/scrambling.js.flow +0 -10
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
[34m@ledgerhq/devices:build: [0mcache hit, replaying output [2m67c1c186127fdaab[0m
|
|
2
|
+
[34m@ledgerhq/devices:build: [0m
|
|
3
|
+
[34m@ledgerhq/devices:build: [0m> @ledgerhq/devices@6.24.2-monorepo.1 build /Users/valmeida/projects/live/ledger-live/libs/ledgerjs/packages/devices
|
|
4
|
+
[34m@ledgerhq/devices:build: [0m> bash ../../script/build.sh
|
|
5
|
+
[34m@ledgerhq/devices:build: [0m
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @ledgerhq/devices
|
|
2
|
+
|
|
3
|
+
## 6.24.2-monorepo.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 1b6fec9db: monorepo prelease 2
|
|
8
|
+
- Updated dependencies [1b6fec9db]
|
|
9
|
+
- @ledgerhq/errors@6.10.1-monorepo.1
|
|
10
|
+
- @ledgerhq/logs@6.10.1-monorepo.1
|
|
11
|
+
|
|
12
|
+
## 6.24.2-monorepo.0
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- test prerelease
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
- @ledgerhq/errors@6.10.1-monorepo.0
|
|
19
|
+
- @ledgerhq/logs@6.10.1-monorepo.0
|
package/jest.config.ts
ADDED
package/lib/ble/receiveAPDU.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/lib/ble/receiveAPDU.js
CHANGED
|
File without changes
|
|
File without changes
|
package/lib/ble/sendAPDU.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/lib/ble/sendAPDU.js
CHANGED
|
File without changes
|
package/lib/ble/sendAPDU.js.map
CHANGED
|
File without changes
|
package/lib/hid-framing.d.ts
CHANGED
|
File without changes
|
package/lib/hid-framing.d.ts.map
CHANGED
|
File without changes
|
package/lib/hid-framing.js
CHANGED
|
File without changes
|
package/lib/hid-framing.js.map
CHANGED
|
File without changes
|
package/lib/index.d.ts
CHANGED
|
File without changes
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,aAAa,IAAO,CAAC;AAClC,eAAO,MAAM,KAAK,IAAO,CAAC;AAC1B,eAAO,MAAM,MAAM,IAAO,CAAC;AAC3B,eAAO,MAAM,QAAQ,KAAO,CAAC;AAE7B,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAuED;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,cAAc,OAAQ,aAAa,KAAG,WAIlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aACjB,MAAM,KACf,WAAW,GAAG,IAAI,GAAG,SAMvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,iBACjB,MAAM,KACnB,WAAW,GAAG,IAAI,GAAG,SAMvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,gBACjB,MAAM,KAClB,WAAW,GAAG,IAAI,GAAG,SAOvB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,aAAa,IAAO,CAAC;AAClC,eAAO,MAAM,KAAK,IAAO,CAAC;AAC1B,eAAO,MAAM,MAAM,IAAO,CAAC;AAC3B,eAAO,MAAM,QAAQ,KAAO,CAAC;AAE7B,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAuED;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,cAAc,OAAQ,aAAa,KAAG,WAIlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aACjB,MAAM,KACf,WAAW,GAAG,IAAI,GAAG,SAMvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,iBACjB,MAAM,KACnB,WAAW,GAAG,IAAI,GAAG,SAMvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,gBACjB,MAAM,KAClB,WAAW,GAAG,IAAI,GAAG,SAOvB,CAAC;AAsBF;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAO,MAAM,EAAuB,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,sBAAsB,SAC3B,MAAM,KACX,cAAc,GAAG,SAAmD,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,aAAa,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,YAAY,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,aAAa,CAAC,EAAE;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,EAAE,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
package/lib/index.js
CHANGED
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,kDAA4B;AAE5B;;;;;;;;;;;;;;GAcG;AACU,QAAA,YAAY,GAAG,IAAI,CAAC;AACpB,QAAA,aAAa,GAAG,IAAI,CAAC;AACrB,QAAA,KAAK,GAAG,IAAI,CAAC;AACb,QAAA,MAAM,GAAG,IAAI,CAAC;AACd,QAAA,QAAQ,GAAG,IAAI,CAAC;AAE7B,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,gCAAe,CAAA;IACf,kCAAiB,CAAA;IACjB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAKxB;AAED,IAAM,OAAO;IACX,GAAC,aAAa,CAAC,IAAI,IAAG;QACpB,EAAE,EAAE,aAAa,CAAC,IAAI;QACtB,WAAW,EAAE,aAAa;QAC1B,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,MAAM;QAC1B,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,GAAG,GAAG,IAAI;QACtB,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;QAC/B,YAAY,EAAE,UAAC,eAAuB,IAAa,OAAA,CAAC,GAAG,IAAI,EAAR,CAAQ;KAC5D;IACD,GAAC,aAAa,CAAC,KAAK,IAAG;QACrB,EAAE,EAAE,aAAa,CAAC,KAAK;QACvB,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,MAAM;QAC1B,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,GAAG,GAAG,IAAI;QACtB,KAAK,EAAE,CAAC,UAAU,CAAC;QACnB,YAAY,EAAE,UAAC,eAAuB;;YACpC,OAAA,mBAAM,CAAC,EAAE,CAAC,MAAA,mBAAM,CAAC,MAAM,CAAC,eAAe,CAAC,mCAAI,EAAE,EAAE,OAAO,CAAC;gBACtD,CAAC,CAAC,CAAC,GAAG,IAAI;gBACV,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;SAAA;KACf;IACD,GAAC,aAAa,CAAC,MAAM,IAAG;QACtB,EAAE,EAAE,aAAa,CAAC,MAAM;QACxB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/scrambling.d.ts
CHANGED
|
File without changes
|
package/lib/scrambling.d.ts.map
CHANGED
|
File without changes
|
package/lib/scrambling.js
CHANGED
|
File without changes
|
package/lib/scrambling.js.map
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/lib-es/ble/sendAPDU.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/lib-es/ble/sendAPDU.js
CHANGED
|
File without changes
|
|
File without changes
|
package/lib-es/hid-framing.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/lib-es/hid-framing.js
CHANGED
|
File without changes
|
|
File without changes
|
package/lib-es/index.d.ts
CHANGED
|
File without changes
|
package/lib-es/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,aAAa,IAAO,CAAC;AAClC,eAAO,MAAM,KAAK,IAAO,CAAC;AAC1B,eAAO,MAAM,MAAM,IAAO,CAAC;AAC3B,eAAO,MAAM,QAAQ,KAAO,CAAC;AAE7B,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAuED;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,cAAc,OAAQ,aAAa,KAAG,WAIlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aACjB,MAAM,KACf,WAAW,GAAG,IAAI,GAAG,SAMvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,iBACjB,MAAM,KACnB,WAAW,GAAG,IAAI,GAAG,SAMvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,gBACjB,MAAM,KAClB,WAAW,GAAG,IAAI,GAAG,SAOvB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,aAAa,IAAO,CAAC;AAClC,eAAO,MAAM,KAAK,IAAO,CAAC;AAC1B,eAAO,MAAM,MAAM,IAAO,CAAC;AAC3B,eAAO,MAAM,QAAQ,KAAO,CAAC;AAE7B,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAuED;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,cAAc,OAAQ,aAAa,KAAG,WAIlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aACjB,MAAM,KACf,WAAW,GAAG,IAAI,GAAG,SAMvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,iBACjB,MAAM,KACnB,WAAW,GAAG,IAAI,GAAG,SAMvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,gBACjB,MAAM,KAClB,WAAW,GAAG,IAAI,GAAG,SAOvB,CAAC;AAsBF;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAO,MAAM,EAAuB,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,sBAAsB,SAC3B,MAAM,KACX,cAAc,GAAG,SAAmD,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,aAAa,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,YAAY,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,aAAa,CAAC,EAAE;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,EAAE,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
package/lib-es/index.js
CHANGED
package/lib-es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,IAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,IAAM,aAAa,GAAG,IAAI,CAAC;AAClC,MAAM,CAAC,IAAM,KAAK,GAAG,IAAI,CAAC;AAC1B,MAAM,CAAC,IAAM,MAAM,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,IAAM,QAAQ,GAAG,IAAI,CAAC;AAE7B,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,gCAAe,CAAA;IACf,kCAAiB,CAAA;IACjB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED,IAAM,OAAO;IACX,GAAC,aAAa,CAAC,IAAI,IAAG;QACpB,EAAE,EAAE,aAAa,CAAC,IAAI;QACtB,WAAW,EAAE,aAAa;QAC1B,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,MAAM;QAC1B,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,GAAG,GAAG,IAAI;QACtB,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;QAC/B,YAAY,EAAE,UAAC,eAAuB,IAAa,OAAA,CAAC,GAAG,IAAI,EAAR,CAAQ;KAC5D;IACD,GAAC,aAAa,CAAC,KAAK,IAAG;QACrB,EAAE,EAAE,aAAa,CAAC,KAAK;QACvB,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,MAAM;QAC1B,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,GAAG,GAAG,IAAI;QACtB,KAAK,EAAE,CAAC,UAAU,CAAC;QACnB,YAAY,EAAE,UAAC,eAAuB;;YACpC,OAAA,MAAM,CAAC,EAAE,CAAC,MAAA,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,mCAAI,EAAE,EAAE,OAAO,CAAC;gBACtD,CAAC,CAAC,CAAC,GAAG,IAAI;gBACV,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;SAAA;KACf;IACD,GAAC,aAAa,CAAC,MAAM,IAAG;QACtB,EAAE,EAAE,aAAa,CAAC,MAAM;QACxB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib-es/scrambling.d.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/lib-es/scrambling.js
CHANGED
|
File without changes
|
package/lib-es/scrambling.js.map
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/devices",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.24.2-monorepo.1",
|
|
4
4
|
"description": "Ledger devices",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger"
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
"module": "lib-es/index.js",
|
|
21
21
|
"types": "lib/index.d.ts",
|
|
22
22
|
"license": "Apache-2.0",
|
|
23
|
-
"devDependencies": {
|
|
24
|
-
"@types/semver": "^7.3.9"
|
|
25
|
-
},
|
|
26
23
|
"dependencies": {
|
|
27
|
-
"@ledgerhq/errors": "^6.10.
|
|
28
|
-
"@ledgerhq/logs": "^6.10.
|
|
24
|
+
"@ledgerhq/errors": "^6.10.1-monorepo.1",
|
|
25
|
+
"@ledgerhq/logs": "^6.10.1-monorepo.1",
|
|
29
26
|
"rxjs": "6",
|
|
30
27
|
"semver": "^7.3.5"
|
|
31
28
|
},
|
|
29
|
+
"gitHead": "dd0dea64b58e5a9125c8a422dcffd29e5ef6abec",
|
|
32
30
|
"scripts": {
|
|
33
31
|
"clean": "bash ../../script/clean.sh",
|
|
34
32
|
"build": "bash ../../script/build.sh",
|
|
35
33
|
"watch": "bash ../../script/watch.sh",
|
|
36
|
-
"doc": "bash ../../script/doc.sh"
|
|
34
|
+
"doc": "bash ../../script/doc.sh",
|
|
35
|
+
"lint": "eslint ./src --no-error-on-unmatched-pattern --ext .ts,.tsx",
|
|
36
|
+
"test": "jest"
|
|
37
37
|
},
|
|
38
|
-
"
|
|
39
|
-
}
|
|
38
|
+
"readme": "<img src=\"https://user-images.githubusercontent.com/211411/34776833-6f1ef4da-f618-11e7-8b13-f0697901d6a8.png\" height=\"100\" />\n\n## @ledgerhq/devices\n\nLogic for all Ledger devices.\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n* [createHIDframing](#createhidframing)\n * [Parameters](#parameters)\n* [IIGenericHID](#iigenerichid)\n* [ledgerUSBVendorId](#ledgerusbvendorid)\n* [getDeviceModel](#getdevicemodel)\n * [Parameters](#parameters-1)\n* [identifyTargetId](#identifytargetid)\n * [Parameters](#parameters-2)\n* [identifyUSBProductId](#identifyusbproductid)\n * [Parameters](#parameters-3)\n* [getBluetoothServiceUuids](#getbluetoothserviceuuids)\n* [getInfosForServiceUuid](#getinfosforserviceuuid)\n * [Parameters](#parameters-4)\n* [DeviceModel](#devicemodel)\n* [BluetoothInfos](#bluetoothinfos)\n\n### createHIDframing\n\n#### Parameters\n\n* `channel` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** \n* `packetSize` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** \n\n### IIGenericHID\n\nThe USB product IDs will be defined as MMII, encoding a model (MM) and an interface bitfield (II)\n\n* Model\n\nLedger Nano S : 0x10\nLedger Blue : 0x00\nLedger Nano X : 0x40\n\n* Interface support bitfield\n\nGeneric HID : 0x01\nKeyboard HID : 0x02\nU2F : 0x04\nCCID : 0x08\nWebUSB : 0x10\n\nType: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)\n\n### ledgerUSBVendorId\n\nType: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)\n\n### getDeviceModel\n\n#### Parameters\n\n* `id` **DeviceModelId** \n\nReturns **[DeviceModel](#devicemodel)** \n\n### identifyTargetId\n\nGiven a `targetId`, return the deviceModel associated to it,\nbased on the first two bytes.\n\n#### Parameters\n\n* `targetId` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** \n\nReturns **([DeviceModel](#devicemodel) | null | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))** \n\n### identifyUSBProductId\n\n#### Parameters\n\n* `usbProductId` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** \n\nReturns **([DeviceModel](#devicemodel) | null | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))** \n\n### getBluetoothServiceUuids\n\nReturns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>** \n\n### getInfosForServiceUuid\n\n#### Parameters\n\n* `uuid` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** \n\nReturns **([BluetoothInfos](#bluetoothinfos) | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))** \n\n### DeviceModel\n\n### BluetoothInfos\n"
|
|
39
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -155,7 +155,6 @@ const serviceUuidToInfos: Record<string, BluetoothInfos> = {};
|
|
|
155
155
|
for (const id in devices) {
|
|
156
156
|
const deviceModel = devices[id];
|
|
157
157
|
const { bluetoothSpec } = deviceModel;
|
|
158
|
-
|
|
159
158
|
if (bluetoothSpec) {
|
|
160
159
|
for (let i = 0; i < bluetoothSpec.length; i++) {
|
|
161
160
|
const spec = bluetoothSpec[i];
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { TransportError, DisconnectedDevice } from "@ledgerhq/errors";
|
|
4
|
-
import { Observable } from "rxjs";
|
|
5
|
-
import { log } from "@ledgerhq/logs";
|
|
6
|
-
|
|
7
|
-
const TagId = 0x05;
|
|
8
|
-
|
|
9
|
-
// operator that transform the input raw stream into one apdu response and finishes
|
|
10
|
-
export const receiveAPDU = (
|
|
11
|
-
rawStream: Observable<Buffer>
|
|
12
|
-
): Observable<Buffer> =>
|
|
13
|
-
Observable.create((o) => {
|
|
14
|
-
let notifiedIndex = 0;
|
|
15
|
-
let notifiedDataLength = 0;
|
|
16
|
-
let notifiedData = Buffer.alloc(0);
|
|
17
|
-
|
|
18
|
-
const sub = rawStream.subscribe({
|
|
19
|
-
complete: () => {
|
|
20
|
-
o.error(new DisconnectedDevice());
|
|
21
|
-
sub.unsubscribe();
|
|
22
|
-
},
|
|
23
|
-
error: (e) => {
|
|
24
|
-
log("ble-error", "in receiveAPDU " + String(e));
|
|
25
|
-
o.error(e);
|
|
26
|
-
sub.unsubscribe();
|
|
27
|
-
},
|
|
28
|
-
next: (value) => {
|
|
29
|
-
const tag = value.readUInt8(0);
|
|
30
|
-
const index = value.readUInt16BE(1);
|
|
31
|
-
let data = value.slice(3);
|
|
32
|
-
|
|
33
|
-
if (tag !== TagId) {
|
|
34
|
-
o.error(
|
|
35
|
-
new TransportError("Invalid tag " + tag.toString(16), "InvalidTag")
|
|
36
|
-
);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (notifiedIndex !== index) {
|
|
41
|
-
o.error(
|
|
42
|
-
new TransportError(
|
|
43
|
-
"BLE: Invalid sequence number. discontinued chunk. Received " +
|
|
44
|
-
index +
|
|
45
|
-
" but expected " +
|
|
46
|
-
notifiedIndex,
|
|
47
|
-
"InvalidSequence"
|
|
48
|
-
)
|
|
49
|
-
);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (index === 0) {
|
|
54
|
-
notifiedDataLength = data.readUInt16BE(0);
|
|
55
|
-
data = data.slice(2);
|
|
56
|
-
}
|
|
57
|
-
notifiedIndex++;
|
|
58
|
-
notifiedData = Buffer.concat([notifiedData, data]);
|
|
59
|
-
if (notifiedData.length > notifiedDataLength) {
|
|
60
|
-
o.error(
|
|
61
|
-
new TransportError(
|
|
62
|
-
"BLE: received too much data. discontinued chunk. Received " +
|
|
63
|
-
notifiedData.length +
|
|
64
|
-
" but expected " +
|
|
65
|
-
notifiedDataLength,
|
|
66
|
-
"BLETooMuchData"
|
|
67
|
-
)
|
|
68
|
-
);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (notifiedData.length === notifiedDataLength) {
|
|
72
|
-
o.next(notifiedData);
|
|
73
|
-
o.complete();
|
|
74
|
-
sub.unsubscribe();
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
return () => {
|
|
80
|
-
sub.unsubscribe();
|
|
81
|
-
};
|
|
82
|
-
});
|
package/lib/ble/sendAPDU.js.flow
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { Observable } from "rxjs";
|
|
4
|
-
import { log } from "@ledgerhq/logs";
|
|
5
|
-
|
|
6
|
-
const TagId = 0x05;
|
|
7
|
-
|
|
8
|
-
function chunkBuffer(
|
|
9
|
-
buffer: Buffer,
|
|
10
|
-
sizeForIndex: (number) => number
|
|
11
|
-
): Array<Buffer> {
|
|
12
|
-
const chunks = [];
|
|
13
|
-
for (
|
|
14
|
-
let i = 0, size = sizeForIndex(0);
|
|
15
|
-
i < buffer.length;
|
|
16
|
-
i += size, size = sizeForIndex(i)
|
|
17
|
-
) {
|
|
18
|
-
chunks.push(buffer.slice(i, i + size));
|
|
19
|
-
}
|
|
20
|
-
return chunks;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export const sendAPDU = (
|
|
24
|
-
write: (Buffer) => Promise<void>,
|
|
25
|
-
apdu: Buffer,
|
|
26
|
-
mtuSize: number
|
|
27
|
-
): Observable<void> => {
|
|
28
|
-
const chunks = chunkBuffer(apdu, (i) => mtuSize - (i === 0 ? 5 : 3)).map(
|
|
29
|
-
(buffer, i) => {
|
|
30
|
-
const head = Buffer.alloc(i === 0 ? 5 : 3);
|
|
31
|
-
head.writeUInt8(TagId, 0);
|
|
32
|
-
head.writeUInt16BE(i, 1);
|
|
33
|
-
if (i === 0) {
|
|
34
|
-
head.writeUInt16BE(apdu.length, 3);
|
|
35
|
-
}
|
|
36
|
-
return Buffer.concat([head, buffer]);
|
|
37
|
-
}
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
return Observable.create((o) => {
|
|
41
|
-
let terminated = false;
|
|
42
|
-
|
|
43
|
-
async function main() {
|
|
44
|
-
for (const chunk of chunks) {
|
|
45
|
-
if (terminated) return;
|
|
46
|
-
await write(chunk);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
main().then(
|
|
51
|
-
() => {
|
|
52
|
-
terminated = true;
|
|
53
|
-
o.complete();
|
|
54
|
-
},
|
|
55
|
-
(e) => {
|
|
56
|
-
terminated = true;
|
|
57
|
-
log("ble-error", "sendAPDU failure " + String(e));
|
|
58
|
-
o.error(e);
|
|
59
|
-
}
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
const unsubscribe = () => {
|
|
63
|
-
if (!terminated) {
|
|
64
|
-
log("ble-verbose", "sendAPDU interruption");
|
|
65
|
-
terminated = true;
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
return unsubscribe;
|
|
70
|
-
});
|
|
71
|
-
};
|
package/lib/hid-framing.js.flow
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { TransportError } from "@ledgerhq/errors";
|
|
4
|
-
|
|
5
|
-
export type ResponseAcc = ?{
|
|
6
|
-
data: Buffer,
|
|
7
|
-
dataLength: number,
|
|
8
|
-
sequence: number,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const Tag = 0x05;
|
|
12
|
-
|
|
13
|
-
function asUInt16BE(value) {
|
|
14
|
-
const b = Buffer.alloc(2);
|
|
15
|
-
b.writeUInt16BE(value, 0);
|
|
16
|
-
return b;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const initialAcc = {
|
|
20
|
-
data: Buffer.alloc(0),
|
|
21
|
-
dataLength: 0,
|
|
22
|
-
sequence: 0,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
*
|
|
27
|
-
*/
|
|
28
|
-
const createHIDframing = (channel: number, packetSize: number) => {
|
|
29
|
-
return {
|
|
30
|
-
makeBlocks(apdu: Buffer): Buffer[] {
|
|
31
|
-
let data = Buffer.concat([asUInt16BE(apdu.length), apdu]);
|
|
32
|
-
const blockSize = packetSize - 5;
|
|
33
|
-
const nbBlocks = Math.ceil(data.length / blockSize);
|
|
34
|
-
data = Buffer.concat([
|
|
35
|
-
data, // fill data with padding
|
|
36
|
-
Buffer.alloc(nbBlocks * blockSize - data.length + 1).fill(0),
|
|
37
|
-
]);
|
|
38
|
-
|
|
39
|
-
const blocks = [];
|
|
40
|
-
for (let i = 0; i < nbBlocks; i++) {
|
|
41
|
-
const head = Buffer.alloc(5);
|
|
42
|
-
head.writeUInt16BE(channel, 0);
|
|
43
|
-
head.writeUInt8(Tag, 2);
|
|
44
|
-
head.writeUInt16BE(i, 3);
|
|
45
|
-
const chunk = data.slice(i * blockSize, (i + 1) * blockSize);
|
|
46
|
-
blocks.push(Buffer.concat([head, chunk]));
|
|
47
|
-
}
|
|
48
|
-
return blocks;
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
reduceResponse(acc: ResponseAcc, chunk: Buffer): ResponseAcc {
|
|
52
|
-
let { data, dataLength, sequence } = acc || initialAcc;
|
|
53
|
-
|
|
54
|
-
if (chunk.readUInt16BE(0) !== channel) {
|
|
55
|
-
throw new TransportError("Invalid channel", "InvalidChannel");
|
|
56
|
-
}
|
|
57
|
-
if (chunk.readUInt8(2) !== Tag) {
|
|
58
|
-
throw new TransportError("Invalid tag", "InvalidTag");
|
|
59
|
-
}
|
|
60
|
-
if (chunk.readUInt16BE(3) !== sequence) {
|
|
61
|
-
throw new TransportError("Invalid sequence", "InvalidSequence");
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (!acc) {
|
|
65
|
-
dataLength = chunk.readUInt16BE(5);
|
|
66
|
-
}
|
|
67
|
-
sequence++;
|
|
68
|
-
const chunkData = chunk.slice(acc ? 5 : 7);
|
|
69
|
-
data = Buffer.concat([data, chunkData]);
|
|
70
|
-
if (data.length > dataLength) {
|
|
71
|
-
data = data.slice(0, dataLength);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
data,
|
|
76
|
-
dataLength,
|
|
77
|
-
sequence,
|
|
78
|
-
};
|
|
79
|
-
},
|
|
80
|
-
|
|
81
|
-
getReducedResult(acc: ResponseAcc): ?Buffer {
|
|
82
|
-
if (acc && acc.dataLength === acc.data.length) {
|
|
83
|
-
return acc.data;
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
export default createHIDframing;
|
package/lib/index.js.flow
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import semver from "semver";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The USB product IDs will be defined as MMII, encoding a model (MM) and an interface bitfield (II)
|
|
7
|
-
*
|
|
8
|
-
** Model
|
|
9
|
-
* Ledger Nano S : 0x10
|
|
10
|
-
* Ledger Blue : 0x00
|
|
11
|
-
* Ledger Nano X : 0x40
|
|
12
|
-
*
|
|
13
|
-
** Interface support bitfield
|
|
14
|
-
* Generic HID : 0x01
|
|
15
|
-
* Keyboard HID : 0x02
|
|
16
|
-
* U2F : 0x04
|
|
17
|
-
* CCID : 0x08
|
|
18
|
-
* WebUSB : 0x10
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
export const IIGenericHID = 0x01;
|
|
22
|
-
export const IIKeyboardHID = 0x02;
|
|
23
|
-
export const IIU2F = 0x04;
|
|
24
|
-
export const IICCID = 0x08;
|
|
25
|
-
export const IIWebUSB = 0x10;
|
|
26
|
-
|
|
27
|
-
const devices = {
|
|
28
|
-
blue: {
|
|
29
|
-
id: "blue",
|
|
30
|
-
productName: "Ledger Blue",
|
|
31
|
-
productIdMM: 0x00,
|
|
32
|
-
legacyUsbProductId: 0x0000,
|
|
33
|
-
usbOnly: true,
|
|
34
|
-
memorySize: 480 * 1024,
|
|
35
|
-
blockSize: 4 * 1024,
|
|
36
|
-
getBlockSize: (_firwareVersion: string): number => 4 * 1024,
|
|
37
|
-
},
|
|
38
|
-
nanoS: {
|
|
39
|
-
id: "nanoS",
|
|
40
|
-
productName: "Ledger Nano S",
|
|
41
|
-
productIdMM: 0x10,
|
|
42
|
-
legacyUsbProductId: 0x0001,
|
|
43
|
-
usbOnly: true,
|
|
44
|
-
memorySize: 320 * 1024,
|
|
45
|
-
blockSize: 4 * 1024,
|
|
46
|
-
getBlockSize: (firmwareVersion: string): number =>
|
|
47
|
-
semver.lt(semver.coerce(firmwareVersion), "2.0.0") ? 4 * 1024 : 2 * 1024,
|
|
48
|
-
},
|
|
49
|
-
nanoX: {
|
|
50
|
-
id: "nanoX",
|
|
51
|
-
productName: "Ledger Nano X",
|
|
52
|
-
productIdMM: 0x40,
|
|
53
|
-
legacyUsbProductId: 0x0004,
|
|
54
|
-
usbOnly: false,
|
|
55
|
-
memorySize: 2 * 1024 * 1024,
|
|
56
|
-
blockSize: 4 * 1024,
|
|
57
|
-
getBlockSize: (_firwareVersion: string): number => 4 * 1024,
|
|
58
|
-
bluetoothSpec: [
|
|
59
|
-
{
|
|
60
|
-
// this is the legacy one (prototype version). we will eventually drop it.
|
|
61
|
-
serviceUuid: "d973f2e0-b19e-11e2-9e96-0800200c9a66",
|
|
62
|
-
notifyUuid: "d973f2e1-b19e-11e2-9e96-0800200c9a66",
|
|
63
|
-
writeUuid: "d973f2e2-b19e-11e2-9e96-0800200c9a66",
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
serviceUuid: "13d63400-2c97-0004-0000-4c6564676572",
|
|
67
|
-
notifyUuid: "13d63400-2c97-0004-0001-4c6564676572",
|
|
68
|
-
writeUuid: "13d63400-2c97-0004-0002-4c6564676572",
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const productMap = {
|
|
75
|
-
Blue: "blue",
|
|
76
|
-
"Nano S": "nanoS",
|
|
77
|
-
"Nano X": "nanoX",
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// $FlowFixMe
|
|
81
|
-
const devicesList: DeviceModel[] = Object.values(devices);
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
*
|
|
85
|
-
*/
|
|
86
|
-
export const ledgerUSBVendorId = 0x2c97;
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
*
|
|
90
|
-
*/
|
|
91
|
-
export const getDeviceModel = (id: DeviceModelId): DeviceModel => {
|
|
92
|
-
const info = devices[id];
|
|
93
|
-
if (!info) throw new Error("device '" + id + "' does not exist");
|
|
94
|
-
return info;
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
*
|
|
99
|
-
*/
|
|
100
|
-
export const identifyUSBProductId = (usbProductId: number): ?DeviceModel => {
|
|
101
|
-
const legacy = devicesList.find((d) => d.legacyUsbProductId === usbProductId);
|
|
102
|
-
if (legacy) return legacy;
|
|
103
|
-
|
|
104
|
-
const mm = usbProductId >> 8;
|
|
105
|
-
const deviceModel = devicesList.find((d) => d.productIdMM === mm);
|
|
106
|
-
return deviceModel;
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
export const identifyProductName = (productName: string): ?DeviceModel => {
|
|
110
|
-
const productId = productMap[productName];
|
|
111
|
-
const deviceModel = devicesList.find((d) => d.id === productId);
|
|
112
|
-
|
|
113
|
-
return deviceModel;
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
const bluetoothServices: string[] = [];
|
|
117
|
-
const serviceUuidToInfos: {
|
|
118
|
-
[_: string]: BluetoothInfos,
|
|
119
|
-
} = {};
|
|
120
|
-
|
|
121
|
-
for (let id in devices) {
|
|
122
|
-
const deviceModel = devices[id];
|
|
123
|
-
const { bluetoothSpec } = deviceModel;
|
|
124
|
-
if (bluetoothSpec) {
|
|
125
|
-
for (let i = 0; i < bluetoothSpec.length; i++) {
|
|
126
|
-
const spec = bluetoothSpec[i];
|
|
127
|
-
bluetoothServices.push(spec.serviceUuid);
|
|
128
|
-
serviceUuidToInfos[spec.serviceUuid] = serviceUuidToInfos[
|
|
129
|
-
spec.serviceUuid.replace(/-/g, "")
|
|
130
|
-
] = { deviceModel, ...spec };
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
*
|
|
137
|
-
*/
|
|
138
|
-
export const getBluetoothServiceUuids = () => bluetoothServices;
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
*
|
|
142
|
-
*/
|
|
143
|
-
export const getInfosForServiceUuid = (uuid: string): ?BluetoothInfos =>
|
|
144
|
-
serviceUuidToInfos[uuid.toLowerCase()];
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
*
|
|
148
|
-
*/
|
|
149
|
-
export type DeviceModelId = $Keys<typeof devices>;
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
*
|
|
153
|
-
*/
|
|
154
|
-
export type DeviceModel = {
|
|
155
|
-
id: DeviceModelId,
|
|
156
|
-
productName: string,
|
|
157
|
-
productIdMM: number,
|
|
158
|
-
legacyUsbProductId: number,
|
|
159
|
-
usbOnly: boolean,
|
|
160
|
-
memorySize: number,
|
|
161
|
-
// blockSize: number, // THIS FIELD IS DEPRECATED, use getBlockSize
|
|
162
|
-
getBlockSize: (firmwareVersion: string) => number,
|
|
163
|
-
bluetoothSpec?: Array<{
|
|
164
|
-
serviceUuid: string,
|
|
165
|
-
writeUuid: string,
|
|
166
|
-
notifyUuid: string,
|
|
167
|
-
}>,
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
*
|
|
172
|
-
*/
|
|
173
|
-
export type BluetoothInfos = {
|
|
174
|
-
deviceModel: DeviceModel,
|
|
175
|
-
serviceUuid: string,
|
|
176
|
-
writeUuid: string,
|
|
177
|
-
notifyUuid: string,
|
|
178
|
-
};
|
package/lib/scrambling.js.flow
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
export function wrapApdu(apdu: Buffer, key: Buffer) {
|
|
4
|
-
if (apdu.length === 0) return apdu;
|
|
5
|
-
const result = Buffer.alloc(apdu.length);
|
|
6
|
-
for (let i = 0; i < apdu.length; i++) {
|
|
7
|
-
result[i] = apdu[i] ^ key[i % key.length];
|
|
8
|
-
}
|
|
9
|
-
return result;
|
|
10
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { TransportError, DisconnectedDevice } from "@ledgerhq/errors";
|
|
4
|
-
import { Observable } from "rxjs";
|
|
5
|
-
import { log } from "@ledgerhq/logs";
|
|
6
|
-
|
|
7
|
-
const TagId = 0x05;
|
|
8
|
-
|
|
9
|
-
// operator that transform the input raw stream into one apdu response and finishes
|
|
10
|
-
export const receiveAPDU = (
|
|
11
|
-
rawStream: Observable<Buffer>
|
|
12
|
-
): Observable<Buffer> =>
|
|
13
|
-
Observable.create((o) => {
|
|
14
|
-
let notifiedIndex = 0;
|
|
15
|
-
let notifiedDataLength = 0;
|
|
16
|
-
let notifiedData = Buffer.alloc(0);
|
|
17
|
-
|
|
18
|
-
const sub = rawStream.subscribe({
|
|
19
|
-
complete: () => {
|
|
20
|
-
o.error(new DisconnectedDevice());
|
|
21
|
-
sub.unsubscribe();
|
|
22
|
-
},
|
|
23
|
-
error: (e) => {
|
|
24
|
-
log("ble-error", "in receiveAPDU " + String(e));
|
|
25
|
-
o.error(e);
|
|
26
|
-
sub.unsubscribe();
|
|
27
|
-
},
|
|
28
|
-
next: (value) => {
|
|
29
|
-
const tag = value.readUInt8(0);
|
|
30
|
-
const index = value.readUInt16BE(1);
|
|
31
|
-
let data = value.slice(3);
|
|
32
|
-
|
|
33
|
-
if (tag !== TagId) {
|
|
34
|
-
o.error(
|
|
35
|
-
new TransportError("Invalid tag " + tag.toString(16), "InvalidTag")
|
|
36
|
-
);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (notifiedIndex !== index) {
|
|
41
|
-
o.error(
|
|
42
|
-
new TransportError(
|
|
43
|
-
"BLE: Invalid sequence number. discontinued chunk. Received " +
|
|
44
|
-
index +
|
|
45
|
-
" but expected " +
|
|
46
|
-
notifiedIndex,
|
|
47
|
-
"InvalidSequence"
|
|
48
|
-
)
|
|
49
|
-
);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (index === 0) {
|
|
54
|
-
notifiedDataLength = data.readUInt16BE(0);
|
|
55
|
-
data = data.slice(2);
|
|
56
|
-
}
|
|
57
|
-
notifiedIndex++;
|
|
58
|
-
notifiedData = Buffer.concat([notifiedData, data]);
|
|
59
|
-
if (notifiedData.length > notifiedDataLength) {
|
|
60
|
-
o.error(
|
|
61
|
-
new TransportError(
|
|
62
|
-
"BLE: received too much data. discontinued chunk. Received " +
|
|
63
|
-
notifiedData.length +
|
|
64
|
-
" but expected " +
|
|
65
|
-
notifiedDataLength,
|
|
66
|
-
"BLETooMuchData"
|
|
67
|
-
)
|
|
68
|
-
);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (notifiedData.length === notifiedDataLength) {
|
|
72
|
-
o.next(notifiedData);
|
|
73
|
-
o.complete();
|
|
74
|
-
sub.unsubscribe();
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
return () => {
|
|
80
|
-
sub.unsubscribe();
|
|
81
|
-
};
|
|
82
|
-
});
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { Observable } from "rxjs";
|
|
4
|
-
import { log } from "@ledgerhq/logs";
|
|
5
|
-
|
|
6
|
-
const TagId = 0x05;
|
|
7
|
-
|
|
8
|
-
function chunkBuffer(
|
|
9
|
-
buffer: Buffer,
|
|
10
|
-
sizeForIndex: (number) => number
|
|
11
|
-
): Array<Buffer> {
|
|
12
|
-
const chunks = [];
|
|
13
|
-
for (
|
|
14
|
-
let i = 0, size = sizeForIndex(0);
|
|
15
|
-
i < buffer.length;
|
|
16
|
-
i += size, size = sizeForIndex(i)
|
|
17
|
-
) {
|
|
18
|
-
chunks.push(buffer.slice(i, i + size));
|
|
19
|
-
}
|
|
20
|
-
return chunks;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export const sendAPDU = (
|
|
24
|
-
write: (Buffer) => Promise<void>,
|
|
25
|
-
apdu: Buffer,
|
|
26
|
-
mtuSize: number
|
|
27
|
-
): Observable<void> => {
|
|
28
|
-
const chunks = chunkBuffer(apdu, (i) => mtuSize - (i === 0 ? 5 : 3)).map(
|
|
29
|
-
(buffer, i) => {
|
|
30
|
-
const head = Buffer.alloc(i === 0 ? 5 : 3);
|
|
31
|
-
head.writeUInt8(TagId, 0);
|
|
32
|
-
head.writeUInt16BE(i, 1);
|
|
33
|
-
if (i === 0) {
|
|
34
|
-
head.writeUInt16BE(apdu.length, 3);
|
|
35
|
-
}
|
|
36
|
-
return Buffer.concat([head, buffer]);
|
|
37
|
-
}
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
return Observable.create((o) => {
|
|
41
|
-
let terminated = false;
|
|
42
|
-
|
|
43
|
-
async function main() {
|
|
44
|
-
for (const chunk of chunks) {
|
|
45
|
-
if (terminated) return;
|
|
46
|
-
await write(chunk);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
main().then(
|
|
51
|
-
() => {
|
|
52
|
-
terminated = true;
|
|
53
|
-
o.complete();
|
|
54
|
-
},
|
|
55
|
-
(e) => {
|
|
56
|
-
terminated = true;
|
|
57
|
-
log("ble-error", "sendAPDU failure " + String(e));
|
|
58
|
-
o.error(e);
|
|
59
|
-
}
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
const unsubscribe = () => {
|
|
63
|
-
if (!terminated) {
|
|
64
|
-
log("ble-verbose", "sendAPDU interruption");
|
|
65
|
-
terminated = true;
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
return unsubscribe;
|
|
70
|
-
});
|
|
71
|
-
};
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { TransportError } from "@ledgerhq/errors";
|
|
4
|
-
|
|
5
|
-
export type ResponseAcc = ?{
|
|
6
|
-
data: Buffer,
|
|
7
|
-
dataLength: number,
|
|
8
|
-
sequence: number,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const Tag = 0x05;
|
|
12
|
-
|
|
13
|
-
function asUInt16BE(value) {
|
|
14
|
-
const b = Buffer.alloc(2);
|
|
15
|
-
b.writeUInt16BE(value, 0);
|
|
16
|
-
return b;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const initialAcc = {
|
|
20
|
-
data: Buffer.alloc(0),
|
|
21
|
-
dataLength: 0,
|
|
22
|
-
sequence: 0,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
*
|
|
27
|
-
*/
|
|
28
|
-
const createHIDframing = (channel: number, packetSize: number) => {
|
|
29
|
-
return {
|
|
30
|
-
makeBlocks(apdu: Buffer): Buffer[] {
|
|
31
|
-
let data = Buffer.concat([asUInt16BE(apdu.length), apdu]);
|
|
32
|
-
const blockSize = packetSize - 5;
|
|
33
|
-
const nbBlocks = Math.ceil(data.length / blockSize);
|
|
34
|
-
data = Buffer.concat([
|
|
35
|
-
data, // fill data with padding
|
|
36
|
-
Buffer.alloc(nbBlocks * blockSize - data.length + 1).fill(0),
|
|
37
|
-
]);
|
|
38
|
-
|
|
39
|
-
const blocks = [];
|
|
40
|
-
for (let i = 0; i < nbBlocks; i++) {
|
|
41
|
-
const head = Buffer.alloc(5);
|
|
42
|
-
head.writeUInt16BE(channel, 0);
|
|
43
|
-
head.writeUInt8(Tag, 2);
|
|
44
|
-
head.writeUInt16BE(i, 3);
|
|
45
|
-
const chunk = data.slice(i * blockSize, (i + 1) * blockSize);
|
|
46
|
-
blocks.push(Buffer.concat([head, chunk]));
|
|
47
|
-
}
|
|
48
|
-
return blocks;
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
reduceResponse(acc: ResponseAcc, chunk: Buffer): ResponseAcc {
|
|
52
|
-
let { data, dataLength, sequence } = acc || initialAcc;
|
|
53
|
-
|
|
54
|
-
if (chunk.readUInt16BE(0) !== channel) {
|
|
55
|
-
throw new TransportError("Invalid channel", "InvalidChannel");
|
|
56
|
-
}
|
|
57
|
-
if (chunk.readUInt8(2) !== Tag) {
|
|
58
|
-
throw new TransportError("Invalid tag", "InvalidTag");
|
|
59
|
-
}
|
|
60
|
-
if (chunk.readUInt16BE(3) !== sequence) {
|
|
61
|
-
throw new TransportError("Invalid sequence", "InvalidSequence");
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (!acc) {
|
|
65
|
-
dataLength = chunk.readUInt16BE(5);
|
|
66
|
-
}
|
|
67
|
-
sequence++;
|
|
68
|
-
const chunkData = chunk.slice(acc ? 5 : 7);
|
|
69
|
-
data = Buffer.concat([data, chunkData]);
|
|
70
|
-
if (data.length > dataLength) {
|
|
71
|
-
data = data.slice(0, dataLength);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
data,
|
|
76
|
-
dataLength,
|
|
77
|
-
sequence,
|
|
78
|
-
};
|
|
79
|
-
},
|
|
80
|
-
|
|
81
|
-
getReducedResult(acc: ResponseAcc): ?Buffer {
|
|
82
|
-
if (acc && acc.dataLength === acc.data.length) {
|
|
83
|
-
return acc.data;
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
export default createHIDframing;
|
package/lib-es/index.js.flow
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import semver from "semver";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The USB product IDs will be defined as MMII, encoding a model (MM) and an interface bitfield (II)
|
|
7
|
-
*
|
|
8
|
-
** Model
|
|
9
|
-
* Ledger Nano S : 0x10
|
|
10
|
-
* Ledger Blue : 0x00
|
|
11
|
-
* Ledger Nano X : 0x40
|
|
12
|
-
*
|
|
13
|
-
** Interface support bitfield
|
|
14
|
-
* Generic HID : 0x01
|
|
15
|
-
* Keyboard HID : 0x02
|
|
16
|
-
* U2F : 0x04
|
|
17
|
-
* CCID : 0x08
|
|
18
|
-
* WebUSB : 0x10
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
export const IIGenericHID = 0x01;
|
|
22
|
-
export const IIKeyboardHID = 0x02;
|
|
23
|
-
export const IIU2F = 0x04;
|
|
24
|
-
export const IICCID = 0x08;
|
|
25
|
-
export const IIWebUSB = 0x10;
|
|
26
|
-
|
|
27
|
-
const devices = {
|
|
28
|
-
blue: {
|
|
29
|
-
id: "blue",
|
|
30
|
-
productName: "Ledger Blue",
|
|
31
|
-
productIdMM: 0x00,
|
|
32
|
-
legacyUsbProductId: 0x0000,
|
|
33
|
-
usbOnly: true,
|
|
34
|
-
memorySize: 480 * 1024,
|
|
35
|
-
blockSize: 4 * 1024,
|
|
36
|
-
getBlockSize: (_firwareVersion: string): number => 4 * 1024,
|
|
37
|
-
},
|
|
38
|
-
nanoS: {
|
|
39
|
-
id: "nanoS",
|
|
40
|
-
productName: "Ledger Nano S",
|
|
41
|
-
productIdMM: 0x10,
|
|
42
|
-
legacyUsbProductId: 0x0001,
|
|
43
|
-
usbOnly: true,
|
|
44
|
-
memorySize: 320 * 1024,
|
|
45
|
-
blockSize: 4 * 1024,
|
|
46
|
-
getBlockSize: (firmwareVersion: string): number =>
|
|
47
|
-
semver.lt(semver.coerce(firmwareVersion), "2.0.0") ? 4 * 1024 : 2 * 1024,
|
|
48
|
-
},
|
|
49
|
-
nanoX: {
|
|
50
|
-
id: "nanoX",
|
|
51
|
-
productName: "Ledger Nano X",
|
|
52
|
-
productIdMM: 0x40,
|
|
53
|
-
legacyUsbProductId: 0x0004,
|
|
54
|
-
usbOnly: false,
|
|
55
|
-
memorySize: 2 * 1024 * 1024,
|
|
56
|
-
blockSize: 4 * 1024,
|
|
57
|
-
getBlockSize: (_firwareVersion: string): number => 4 * 1024,
|
|
58
|
-
bluetoothSpec: [
|
|
59
|
-
{
|
|
60
|
-
// this is the legacy one (prototype version). we will eventually drop it.
|
|
61
|
-
serviceUuid: "d973f2e0-b19e-11e2-9e96-0800200c9a66",
|
|
62
|
-
notifyUuid: "d973f2e1-b19e-11e2-9e96-0800200c9a66",
|
|
63
|
-
writeUuid: "d973f2e2-b19e-11e2-9e96-0800200c9a66",
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
serviceUuid: "13d63400-2c97-0004-0000-4c6564676572",
|
|
67
|
-
notifyUuid: "13d63400-2c97-0004-0001-4c6564676572",
|
|
68
|
-
writeUuid: "13d63400-2c97-0004-0002-4c6564676572",
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const productMap = {
|
|
75
|
-
Blue: "blue",
|
|
76
|
-
"Nano S": "nanoS",
|
|
77
|
-
"Nano X": "nanoX",
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// $FlowFixMe
|
|
81
|
-
const devicesList: DeviceModel[] = Object.values(devices);
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
*
|
|
85
|
-
*/
|
|
86
|
-
export const ledgerUSBVendorId = 0x2c97;
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
*
|
|
90
|
-
*/
|
|
91
|
-
export const getDeviceModel = (id: DeviceModelId): DeviceModel => {
|
|
92
|
-
const info = devices[id];
|
|
93
|
-
if (!info) throw new Error("device '" + id + "' does not exist");
|
|
94
|
-
return info;
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
*
|
|
99
|
-
*/
|
|
100
|
-
export const identifyUSBProductId = (usbProductId: number): ?DeviceModel => {
|
|
101
|
-
const legacy = devicesList.find((d) => d.legacyUsbProductId === usbProductId);
|
|
102
|
-
if (legacy) return legacy;
|
|
103
|
-
|
|
104
|
-
const mm = usbProductId >> 8;
|
|
105
|
-
const deviceModel = devicesList.find((d) => d.productIdMM === mm);
|
|
106
|
-
return deviceModel;
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
export const identifyProductName = (productName: string): ?DeviceModel => {
|
|
110
|
-
const productId = productMap[productName];
|
|
111
|
-
const deviceModel = devicesList.find((d) => d.id === productId);
|
|
112
|
-
|
|
113
|
-
return deviceModel;
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
const bluetoothServices: string[] = [];
|
|
117
|
-
const serviceUuidToInfos: {
|
|
118
|
-
[_: string]: BluetoothInfos,
|
|
119
|
-
} = {};
|
|
120
|
-
|
|
121
|
-
for (let id in devices) {
|
|
122
|
-
const deviceModel = devices[id];
|
|
123
|
-
const { bluetoothSpec } = deviceModel;
|
|
124
|
-
if (bluetoothSpec) {
|
|
125
|
-
for (let i = 0; i < bluetoothSpec.length; i++) {
|
|
126
|
-
const spec = bluetoothSpec[i];
|
|
127
|
-
bluetoothServices.push(spec.serviceUuid);
|
|
128
|
-
serviceUuidToInfos[spec.serviceUuid] = serviceUuidToInfos[
|
|
129
|
-
spec.serviceUuid.replace(/-/g, "")
|
|
130
|
-
] = { deviceModel, ...spec };
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
*
|
|
137
|
-
*/
|
|
138
|
-
export const getBluetoothServiceUuids = () => bluetoothServices;
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
*
|
|
142
|
-
*/
|
|
143
|
-
export const getInfosForServiceUuid = (uuid: string): ?BluetoothInfos =>
|
|
144
|
-
serviceUuidToInfos[uuid.toLowerCase()];
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
*
|
|
148
|
-
*/
|
|
149
|
-
export type DeviceModelId = $Keys<typeof devices>;
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
*
|
|
153
|
-
*/
|
|
154
|
-
export type DeviceModel = {
|
|
155
|
-
id: DeviceModelId,
|
|
156
|
-
productName: string,
|
|
157
|
-
productIdMM: number,
|
|
158
|
-
legacyUsbProductId: number,
|
|
159
|
-
usbOnly: boolean,
|
|
160
|
-
memorySize: number,
|
|
161
|
-
// blockSize: number, // THIS FIELD IS DEPRECATED, use getBlockSize
|
|
162
|
-
getBlockSize: (firmwareVersion: string) => number,
|
|
163
|
-
bluetoothSpec?: Array<{
|
|
164
|
-
serviceUuid: string,
|
|
165
|
-
writeUuid: string,
|
|
166
|
-
notifyUuid: string,
|
|
167
|
-
}>,
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
*
|
|
172
|
-
*/
|
|
173
|
-
export type BluetoothInfos = {
|
|
174
|
-
deviceModel: DeviceModel,
|
|
175
|
-
serviceUuid: string,
|
|
176
|
-
writeUuid: string,
|
|
177
|
-
notifyUuid: string,
|
|
178
|
-
};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
export function wrapApdu(apdu: Buffer, key: Buffer) {
|
|
4
|
-
if (apdu.length === 0) return apdu;
|
|
5
|
-
const result = Buffer.alloc(apdu.length);
|
|
6
|
-
for (let i = 0; i < apdu.length; i++) {
|
|
7
|
-
result[i] = apdu[i] ^ key[i % key.length];
|
|
8
|
-
}
|
|
9
|
-
return result;
|
|
10
|
-
}
|