@ledgerhq/ledger-key-ring-protocol 0.5.1-fix-build-number-pre.0

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.
Files changed (179) hide show
  1. package/.eslintrc.js +33 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/CHANGELOG.md +299 -0
  4. package/LICENSE.txt +21 -0
  5. package/README.md +3 -0
  6. package/jest.config.js +13 -0
  7. package/lib/HWDeviceProvider.d.ts +25 -0
  8. package/lib/HWDeviceProvider.d.ts.map +1 -0
  9. package/lib/HWDeviceProvider.js +88 -0
  10. package/lib/HWDeviceProvider.js.map +1 -0
  11. package/lib/api.d.ts +77 -0
  12. package/lib/api.d.ts.map +1 -0
  13. package/lib/api.js +150 -0
  14. package/lib/api.js.map +1 -0
  15. package/lib/auth.d.ts +3 -0
  16. package/lib/auth.d.ts.map +1 -0
  17. package/lib/auth.js +79 -0
  18. package/lib/auth.js.map +1 -0
  19. package/lib/errors.d.ts +40 -0
  20. package/lib/errors.d.ts.map +1 -0
  21. package/lib/errors.js +18 -0
  22. package/lib/errors.js.map +1 -0
  23. package/lib/index.d.ts +6 -0
  24. package/lib/index.d.ts.map +1 -0
  25. package/lib/index.js +17 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/mockSdk.d.ts +22 -0
  28. package/lib/mockSdk.d.ts.map +1 -0
  29. package/lib/mockSdk.js +208 -0
  30. package/lib/mockSdk.js.map +1 -0
  31. package/lib/qrcode/cipher.d.ts +12 -0
  32. package/lib/qrcode/cipher.d.ts.map +1 -0
  33. package/lib/qrcode/cipher.js +52 -0
  34. package/lib/qrcode/cipher.js.map +1 -0
  35. package/lib/qrcode/cipher.test.d.ts +2 -0
  36. package/lib/qrcode/cipher.test.d.ts.map +1 -0
  37. package/lib/qrcode/cipher.test.js +31 -0
  38. package/lib/qrcode/cipher.test.js.map +1 -0
  39. package/lib/qrcode/index.d.ts +70 -0
  40. package/lib/qrcode/index.d.ts.map +1 -0
  41. package/lib/qrcode/index.js +309 -0
  42. package/lib/qrcode/index.js.map +1 -0
  43. package/lib/qrcode/index.test.d.ts +2 -0
  44. package/lib/qrcode/index.test.d.ts.map +1 -0
  45. package/lib/qrcode/index.test.js +131 -0
  46. package/lib/qrcode/index.test.js.map +1 -0
  47. package/lib/qrcode/types.d.ts +69 -0
  48. package/lib/qrcode/types.d.ts.map +1 -0
  49. package/lib/qrcode/types.js +3 -0
  50. package/lib/qrcode/types.js.map +1 -0
  51. package/lib/sdk.d.ts +31 -0
  52. package/lib/sdk.d.ts.map +1 -0
  53. package/lib/sdk.js +380 -0
  54. package/lib/sdk.js.map +1 -0
  55. package/lib/store.d.ts +71 -0
  56. package/lib/store.d.ts.map +1 -0
  57. package/lib/store.js +62 -0
  58. package/lib/store.js.map +1 -0
  59. package/lib/types.d.ts +181 -0
  60. package/lib/types.d.ts.map +1 -0
  61. package/lib/types.js +10 -0
  62. package/lib/types.js.map +1 -0
  63. package/lib-es/HWDeviceProvider.d.ts +25 -0
  64. package/lib-es/HWDeviceProvider.d.ts.map +1 -0
  65. package/lib-es/HWDeviceProvider.js +81 -0
  66. package/lib-es/HWDeviceProvider.js.map +1 -0
  67. package/lib-es/api.d.ts +77 -0
  68. package/lib-es/api.d.ts.map +1 -0
  69. package/lib-es/api.js +145 -0
  70. package/lib-es/api.js.map +1 -0
  71. package/lib-es/auth.d.ts +3 -0
  72. package/lib-es/auth.d.ts.map +1 -0
  73. package/lib-es/auth.js +75 -0
  74. package/lib-es/auth.js.map +1 -0
  75. package/lib-es/errors.d.ts +40 -0
  76. package/lib-es/errors.d.ts.map +1 -0
  77. package/lib-es/errors.js +15 -0
  78. package/lib-es/errors.js.map +1 -0
  79. package/lib-es/index.d.ts +6 -0
  80. package/lib-es/index.d.ts.map +1 -0
  81. package/lib-es/index.js +13 -0
  82. package/lib-es/index.js.map +1 -0
  83. package/lib-es/mockSdk.d.ts +22 -0
  84. package/lib-es/mockSdk.d.ts.map +1 -0
  85. package/lib-es/mockSdk.js +201 -0
  86. package/lib-es/mockSdk.js.map +1 -0
  87. package/lib-es/qrcode/cipher.d.ts +12 -0
  88. package/lib-es/qrcode/cipher.d.ts.map +1 -0
  89. package/lib-es/qrcode/cipher.js +44 -0
  90. package/lib-es/qrcode/cipher.js.map +1 -0
  91. package/lib-es/qrcode/cipher.test.d.ts +2 -0
  92. package/lib-es/qrcode/cipher.test.d.ts.map +1 -0
  93. package/lib-es/qrcode/cipher.test.js +29 -0
  94. package/lib-es/qrcode/cipher.test.js.map +1 -0
  95. package/lib-es/qrcode/index.d.ts +70 -0
  96. package/lib-es/qrcode/index.d.ts.map +1 -0
  97. package/lib-es/qrcode/index.js +301 -0
  98. package/lib-es/qrcode/index.js.map +1 -0
  99. package/lib-es/qrcode/index.test.d.ts +2 -0
  100. package/lib-es/qrcode/index.test.d.ts.map +1 -0
  101. package/lib-es/qrcode/index.test.js +126 -0
  102. package/lib-es/qrcode/index.test.js.map +1 -0
  103. package/lib-es/qrcode/types.d.ts +69 -0
  104. package/lib-es/qrcode/types.d.ts.map +1 -0
  105. package/lib-es/qrcode/types.js +2 -0
  106. package/lib-es/qrcode/types.js.map +1 -0
  107. package/lib-es/sdk.d.ts +31 -0
  108. package/lib-es/sdk.d.ts.map +1 -0
  109. package/lib-es/sdk.js +371 -0
  110. package/lib-es/sdk.js.map +1 -0
  111. package/lib-es/store.d.ts +71 -0
  112. package/lib-es/store.d.ts.map +1 -0
  113. package/lib-es/store.js +51 -0
  114. package/lib-es/store.js.map +1 -0
  115. package/lib-es/types.d.ts +181 -0
  116. package/lib-es/types.d.ts.map +1 -0
  117. package/lib-es/types.js +7 -0
  118. package/lib-es/types.js.map +1 -0
  119. package/mocks/scenarios/addSameMemberMultipleTimes.json +426 -0
  120. package/mocks/scenarios/create2trustchainInARow.json +616 -0
  121. package/mocks/scenarios/getOrCreateTransactionCases.json +591 -0
  122. package/mocks/scenarios/member3implicitlyAdded.json +648 -0
  123. package/mocks/scenarios/membersManySelfAdd.json +1427 -0
  124. package/mocks/scenarios/randomMemberTryToDestroy.json +371 -0
  125. package/mocks/scenarios/removeMemberWithTheWrongSeed.json +510 -0
  126. package/mocks/scenarios/removedMemberEjectedOnDeletedTrustchain.json +481 -0
  127. package/mocks/scenarios/removedMemberEjectedOnGetMembers.json +648 -0
  128. package/mocks/scenarios/removedMemberEjectedOnRestore.json +648 -0
  129. package/mocks/scenarios/removingAMemberCreatesAnInteraction.json +593 -0
  130. package/mocks/scenarios/removingYourselfIsForbidden.json +397 -0
  131. package/mocks/scenarios/success.json +978 -0
  132. package/mocks/scenarios/tokenExpires.json +371 -0
  133. package/mocks/scenarios/twoAddMembersFollowedByDeviceAdd.json +705 -0
  134. package/mocks/scenarios/userRefusesAuth.json +40 -0
  135. package/mocks/scenarios/userRefusesRemoveMember.json +542 -0
  136. package/package.json +91 -0
  137. package/scripts/README.md +15 -0
  138. package/scripts/e2e.ts +57 -0
  139. package/src/HWDeviceProvider.ts +105 -0
  140. package/src/__tests__/integration/mock.sdk.test.ts +47 -0
  141. package/src/__tests__/integration/sdk.test.ts +20 -0
  142. package/src/__tests__/tsconfig.json +8 -0
  143. package/src/__tests__/unit/sdk.test.ts +236 -0
  144. package/src/api.ts +202 -0
  145. package/src/auth.ts +81 -0
  146. package/src/errors.ts +18 -0
  147. package/src/index.ts +20 -0
  148. package/src/mockSdk.ts +253 -0
  149. package/src/qrcode/cipher.test.ts +30 -0
  150. package/src/qrcode/cipher.ts +61 -0
  151. package/src/qrcode/index.test.ts +138 -0
  152. package/src/qrcode/index.ts +394 -0
  153. package/src/qrcode/types.ts +70 -0
  154. package/src/sdk.ts +542 -0
  155. package/src/store.ts +99 -0
  156. package/src/types.ts +242 -0
  157. package/tests/scenarios/_template.ts +18 -0
  158. package/tests/scenarios/addSameMemberMultipleTimes.ts +20 -0
  159. package/tests/scenarios/create2trustchainInARow.ts +14 -0
  160. package/tests/scenarios/getOrCreateTransactionCases.ts +74 -0
  161. package/tests/scenarios/member3implicitlyAdded.ts +51 -0
  162. package/tests/scenarios/membersManySelfAdd.ts +18 -0
  163. package/tests/scenarios/randomMemberTryToDestroy.ts +23 -0
  164. package/tests/scenarios/removeMemberWithTheWrongSeed.ts +28 -0
  165. package/tests/scenarios/removedMemberEjectedOnDeletedTrustchain.ts +31 -0
  166. package/tests/scenarios/removedMemberEjectedOnGetMembers.ts +29 -0
  167. package/tests/scenarios/removedMemberEjectedOnRestore.ts +31 -0
  168. package/tests/scenarios/removingAMemberCreatesAnInteraction.ts +42 -0
  169. package/tests/scenarios/removingYourselfIsForbidden.ts +11 -0
  170. package/tests/scenarios/success.ts +94 -0
  171. package/tests/scenarios/tokenExpires.ts +20 -0
  172. package/tests/scenarios/twoAddMembersFollowedByDeviceAdd.ts +49 -0
  173. package/tests/scenarios/userRefusesAuth.ts +28 -0
  174. package/tests/scenarios/userRefusesRemoveMember.ts +66 -0
  175. package/tests/test-helpers/recordTrustchainSdkTests.ts +178 -0
  176. package/tests/test-helpers/replayTrustchainSdkTests.ts +141 -0
  177. package/tests/test-helpers/types.ts +45 -0
  178. package/tests/tsconfig.json +8 -0
  179. package/tsconfig.json +15 -0
package/lib-es/auth.js ADDED
@@ -0,0 +1,75 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { LedgerAPI4xx } from "@ledgerhq/errors";
11
+ import { log } from "@ledgerhq/logs";
12
+ import { TrustchainNotAllowed, TrustchainOutdated } from "./errors";
13
+ export function genericWithJWT(job_1, initialJWT_1, auth_1, refreshAuth_1) {
14
+ return __awaiter(this, arguments, void 0, function* (job, initialJWT, auth, refreshAuth, policy = "cache") {
15
+ function refresh(jwt) {
16
+ return refreshAuth(jwt).catch(e => {
17
+ log("trustchain", "JWT refresh failed, reauthenticating", e);
18
+ const { hasExpired, isNotPermitted, isTrustchainOutdated } = networkCheckJwtExpiration(e);
19
+ if (isNotPermitted) {
20
+ throw new TrustchainNotAllowed();
21
+ }
22
+ if (isTrustchainOutdated) {
23
+ throw new TrustchainOutdated();
24
+ }
25
+ if (hasExpired) {
26
+ return auth();
27
+ }
28
+ throw e;
29
+ });
30
+ }
31
+ // initial jwt depending on the policy
32
+ let jwt = policy === "no-cache" || !initialJWT
33
+ ? yield auth()
34
+ : policy === "refresh"
35
+ ? yield refresh(initialJWT)
36
+ : initialJWT;
37
+ return job(jwt).catch((e) => __awaiter(this, void 0, void 0, function* () {
38
+ // JWT expiration handling: if the function fails, we will recover a valid jwt accordingly to spec. https://ledgerhq.atlassian.net/wiki/spaces/BE/pages/4207083687/TCH+Usage+documentation#JWT-expiration-handling
39
+ const { hasExpired, canBeRefreshed, isNotPermitted, isTrustchainOutdated } = networkCheckJwtExpiration(e);
40
+ if (isNotPermitted) {
41
+ throw new TrustchainNotAllowed();
42
+ }
43
+ if (isTrustchainOutdated) {
44
+ throw new TrustchainOutdated();
45
+ }
46
+ if (hasExpired) {
47
+ log("trustchain", "JWT expired -> " + (canBeRefreshed ? "refreshing" : "reauthenticating"));
48
+ jwt = yield (jwt && canBeRefreshed ? refresh(jwt) : auth());
49
+ return job(jwt);
50
+ }
51
+ throw e;
52
+ }));
53
+ });
54
+ }
55
+ function networkCheckJwtExpiration(error) {
56
+ let hasExpired = false;
57
+ let canBeRefreshed = false;
58
+ let isNotPermitted = false;
59
+ let isTrustchainOutdated = false;
60
+ // this assume live-network is used and we adapt to its error's format
61
+ if (error instanceof LedgerAPI4xx) {
62
+ if (error.message.includes("JWT is expired")) {
63
+ hasExpired = true;
64
+ canBeRefreshed = error.message.includes("/refresh");
65
+ }
66
+ else if (error.message.includes("JWT contains no permission")) {
67
+ isNotPermitted = true;
68
+ }
69
+ else if (error.message.includes("path does not match")) {
70
+ isTrustchainOutdated = true;
71
+ }
72
+ }
73
+ return { hasExpired, canBeRefreshed, isNotPermitted, isTrustchainOutdated };
74
+ }
75
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export declare const ScannedOldImportQrCode: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
2
+ [key: string]: unknown;
3
+ }>;
4
+ export declare const ScannedNewImportQrCode: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
5
+ [key: string]: unknown;
6
+ }>;
7
+ export declare const ScannedInvalidQrCode: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
8
+ [key: string]: unknown;
9
+ }>;
10
+ export declare const InvalidDigitsError: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
11
+ [key: string]: unknown;
12
+ }>;
13
+ export declare const InvalidEncryptionKeyError: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
14
+ [key: string]: unknown;
15
+ }>;
16
+ export declare const TrustchainEjected: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
17
+ [key: string]: unknown;
18
+ }>;
19
+ export declare const TrustchainNotAllowed: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
20
+ [key: string]: unknown;
21
+ }>;
22
+ export declare const TrustchainOutdated: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
23
+ [key: string]: unknown;
24
+ }>;
25
+ export declare const TrustchainNotFound: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
26
+ [key: string]: unknown;
27
+ }>;
28
+ export declare const NoTrustchainInitialized: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
29
+ [key: string]: unknown;
30
+ }>;
31
+ export declare const TrustchainAlreadyInitialized: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
32
+ [key: string]: unknown;
33
+ }>;
34
+ export declare const TrustchainAlreadyInitializedWithOtherSeed: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
35
+ [key: string]: unknown;
36
+ }>;
37
+ export declare const QRCodeWSClosed: import("@ledgerhq/errors/lib/helpers").LedgerErrorConstructor<{
38
+ time: number;
39
+ }>;
40
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB;;EAAmD,CAAC;AACvF,eAAO,MAAM,sBAAsB;;EAAmD,CAAC;AACvF,eAAO,MAAM,oBAAoB;;EAAiD,CAAC;AACnF,eAAO,MAAM,kBAAkB;;EAA+C,CAAC;AAC/E,eAAO,MAAM,yBAAyB;;EAAsD,CAAC;AAC7F,eAAO,MAAM,iBAAiB;;EAA8C,CAAC;AAC7E,eAAO,MAAM,oBAAoB;;EAAiD,CAAC;AACnF,eAAO,MAAM,kBAAkB;;EAA+C,CAAC;AAC/E,eAAO,MAAM,kBAAkB;;EAA+C,CAAC;AAC/E,eAAO,MAAM,uBAAuB;;EAAoD,CAAC;AACzF,eAAO,MAAM,4BAA4B;;EAAyD,CAAC;AACnG,eAAO,MAAM,yCAAyC;;EAErD,CAAC;AAEF,eAAO,MAAM,cAAc;UAAkC,MAAM;EAAqB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { createCustomErrorClass } from "@ledgerhq/errors";
2
+ export const ScannedOldImportQrCode = createCustomErrorClass("ScannedOldImportQrCode");
3
+ export const ScannedNewImportQrCode = createCustomErrorClass("ScannedNewImportQrCode");
4
+ export const ScannedInvalidQrCode = createCustomErrorClass("ScannedInvalidQrCode");
5
+ export const InvalidDigitsError = createCustomErrorClass("InvalidDigitsError");
6
+ export const InvalidEncryptionKeyError = createCustomErrorClass("InvalidEncryptionKeyError");
7
+ export const TrustchainEjected = createCustomErrorClass("TrustchainEjected");
8
+ export const TrustchainNotAllowed = createCustomErrorClass("TrustchainNotAllowed");
9
+ export const TrustchainOutdated = createCustomErrorClass("TrustchainOutdated");
10
+ export const TrustchainNotFound = createCustomErrorClass("TrustchainNotFound");
11
+ export const NoTrustchainInitialized = createCustomErrorClass("NoTrustchainInitialized");
12
+ export const TrustchainAlreadyInitialized = createCustomErrorClass("TrustchainAlreadyInitialized");
13
+ export const TrustchainAlreadyInitializedWithOtherSeed = createCustomErrorClass("TrustchainAlreadyInitializedWithOtherSeed");
14
+ export const QRCodeWSClosed = createCustomErrorClass("QRCodeWSClosed");
15
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,wBAAwB,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,wBAAwB,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;AACnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC,2BAA2B,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;AACnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,sBAAsB,CAAC,yBAAyB,CAAC,CAAC;AACzF,MAAM,CAAC,MAAM,4BAA4B,GAAG,sBAAsB,CAAC,8BAA8B,CAAC,CAAC;AACnG,MAAM,CAAC,MAAM,yCAAyC,GAAG,sBAAsB,CAC7E,2CAA2C,CAC5C,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,sBAAsB,CAAmB,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { TrustchainSDKContext, TrustchainSDK, TrustchainLifecycle, WithDevice } from "./types";
2
+ /**
3
+ * Get an implementation of a TrustchainSDK
4
+ */
5
+ export declare const getSdk: (isMockEnv: boolean, context: TrustchainSDKContext, withDevice: WithDevice, lifecycle?: TrustchainLifecycle) => TrustchainSDK;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE/F;;GAEG;AACH,eAAO,MAAM,MAAM,cACN,OAAO,WACT,oBAAoB,cACjB,UAAU,cACV,mBAAmB,KAC9B,aAMF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { HWDeviceProvider } from "./HWDeviceProvider";
2
+ import { SDK } from "./sdk";
3
+ import { MockSDK } from "./mockSdk";
4
+ /**
5
+ * Get an implementation of a TrustchainSDK
6
+ */
7
+ export const getSdk = (isMockEnv, context, withDevice, lifecycle) => {
8
+ if (isMockEnv) {
9
+ return new MockSDK(context, lifecycle);
10
+ }
11
+ return new SDK(context, new HWDeviceProvider(context.apiBaseUrl, withDevice), lifecycle);
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,SAAkB,EAClB,OAA6B,EAC7B,UAAsB,EACtB,SAA+B,EAChB,EAAE;IACjB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;AAC3F,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { JWT, MemberCredentials, Trustchain, TrustchainDeviceCallbacks, TrustchainLifecycle, TrustchainMember, TrustchainResult, TrustchainSDK, TrustchainSDKContext } from "./types";
2
+ export declare class MockSDK implements TrustchainSDK {
3
+ private context;
4
+ private lifecyle?;
5
+ private api;
6
+ constructor(context: TrustchainSDKContext, lifecyle?: TrustchainLifecycle);
7
+ private deviceJwtAcquired;
8
+ private _id;
9
+ initMemberCredentials(): Promise<MemberCredentials>;
10
+ withAuth<T>(trustchain: Trustchain, memberCredentials: MemberCredentials, job: (jwt: JWT) => Promise<T>): Promise<T>;
11
+ getOrCreateTrustchain(deviceId: string, memberCredentials: MemberCredentials, callbacks?: TrustchainDeviceCallbacks): Promise<TrustchainResult>;
12
+ refreshAuth(jwt: JWT): Promise<JWT>;
13
+ restoreTrustchain(trustchain: Trustchain, memberCredentials: MemberCredentials): Promise<Trustchain>;
14
+ getMembers(trustchain: Trustchain, memberCredentials: MemberCredentials): Promise<TrustchainMember[]>;
15
+ removeMember(deviceId: string, trustchain: Trustchain, memberCredentials: MemberCredentials, member: TrustchainMember, callbacks?: TrustchainDeviceCallbacks): Promise<Trustchain>;
16
+ destroyTrustchain(trustchain: Trustchain, memberCredentials: MemberCredentials): Promise<void>;
17
+ addMember(trustchain: Trustchain, memberCredentials: MemberCredentials, member: TrustchainMember): Promise<void>;
18
+ encryptUserData(trustchain: Trustchain, input: Uint8Array): Promise<Uint8Array>;
19
+ decryptUserData(trustchain: Trustchain, data: Uint8Array): Promise<Uint8Array>;
20
+ invalidateJwt(): void;
21
+ }
22
+ //# sourceMappingURL=mockSdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockSdk.d.ts","sourceRoot":"","sources":["../src/mockSdk.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,iBAAiB,EACjB,UAAU,EACV,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAEhB,aAAa,EACb,oBAAoB,EACrB,MAAM,SAAS,CAAC;AA+CjB,qBAAa,OAAQ,YAAW,aAAa;IAC3C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAC,CAAsB;IACvC,OAAO,CAAC,GAAG,CAA4B;gBAE3B,OAAO,EAAE,oBAAoB,EAAE,QAAQ,CAAC,EAAE,mBAAmB;IAMzE,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,GAAG,CAAK;IAChB,qBAAqB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAQnD,QAAQ,CAAC,CAAC,EACR,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAMP,qBAAqB,CACzB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,CAAC,EAAE,yBAAyB,GACpC,OAAO,CAAC,gBAAgB,CAAC;IAqCtB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAInC,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,GACnC,OAAO,CAAC,UAAU,CAAC;IAWhB,UAAU,CACd,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,GACnC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQxB,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,gBAAgB,EACxB,SAAS,CAAC,EAAE,yBAAyB,GACpC,OAAO,CAAC,UAAU,CAAC;IA8ChB,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,GACnC,OAAO,CAAC,IAAI,CAAC;IAQhB,SAAS,CACP,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC;IAYhB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAK/E,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAK9E,aAAa,IAAI,IAAI;CAGtB"}
@@ -0,0 +1,201 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { TrustchainResultType, } from "./types";
11
+ import { Permissions } from "@ledgerhq/hw-ledger-key-ring-protocol";
12
+ import { TrustchainEjected } from "./errors";
13
+ import getApi from "./api";
14
+ const mockedLiveCredentialsPrivateKey = "mock-private-key";
15
+ function assertTrustchain(trustchain) {
16
+ if (!trustchain.rootId.startsWith("mock-root-id")) {
17
+ throw new Error("in mock context, trustchain must be the mocked trustchain");
18
+ }
19
+ }
20
+ function assertLiveCredentials(memberCredentials) {
21
+ if (!memberCredentials.privatekey.startsWith(mockedLiveCredentialsPrivateKey)) {
22
+ throw new Error("in mock context, memberCredentials must be the mocked memberCredentials");
23
+ }
24
+ }
25
+ function assertAllowedPermissions(trustchainId, memberId) {
26
+ const members = trustchainMembers.get(trustchainId) || [];
27
+ const member = members.find(m => m.id === memberId);
28
+ if (!member) {
29
+ throw new TrustchainEjected();
30
+ }
31
+ }
32
+ const mockedLiveJWT = {
33
+ accessToken: "mock-live-jwt",
34
+ permissions: {},
35
+ };
36
+ // global states in memory
37
+ const trustchains = new Map();
38
+ const trustchainMembers = new Map();
39
+ /**
40
+ * to mock the encryption/decryption, we just xor the data with 0xff
41
+ */
42
+ const applyXor = (a) => {
43
+ const b = new Uint8Array(a.length);
44
+ for (let i = 0; i < a.length; i++) {
45
+ b[i] = a[i] ^ 0xff;
46
+ }
47
+ return b;
48
+ };
49
+ export class MockSDK {
50
+ constructor(context, lifecyle) {
51
+ this.deviceJwtAcquired = false;
52
+ this._id = 1;
53
+ this.context = context;
54
+ this.lifecyle = lifecyle;
55
+ this.api = getApi(context.apiBaseUrl);
56
+ }
57
+ initMemberCredentials() {
58
+ const id = this._id++;
59
+ return Promise.resolve({
60
+ privatekey: "mock-private-key-" + this.context.name + "-" + id,
61
+ pubkey: "mock-pub-key-" + this.context.name + "-" + id,
62
+ });
63
+ }
64
+ withAuth(trustchain, memberCredentials, job) {
65
+ assertTrustchain(trustchain);
66
+ assertLiveCredentials(memberCredentials);
67
+ return job(mockedLiveJWT);
68
+ }
69
+ getOrCreateTrustchain(deviceId, memberCredentials, callbacks) {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ var _a, _b, _c, _d;
72
+ this.invalidateJwt();
73
+ assertLiveCredentials(memberCredentials);
74
+ let type = trustchains.has("mock-root-id")
75
+ ? TrustchainResultType.restored
76
+ : TrustchainResultType.created;
77
+ const trustchain = trustchains.get("mock-root-id") || {
78
+ rootId: "mock-root-id",
79
+ walletSyncEncryptionKey: "mock-wallet-sync-encryption-key",
80
+ applicationPath: "m/0'/16'/0'",
81
+ };
82
+ trustchains.set(trustchain.rootId, trustchain);
83
+ if (!this.deviceJwtAcquired) {
84
+ (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onStartRequestUserInteraction) === null || _a === void 0 ? void 0 : _a.call(callbacks);
85
+ this.deviceJwtAcquired = true; // simulate device auth interaction
86
+ (_b = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onEndRequestUserInteraction) === null || _b === void 0 ? void 0 : _b.call(callbacks);
87
+ }
88
+ const currentMembers = trustchainMembers.get(trustchain.rootId) || [];
89
+ // add itself if not yet here
90
+ if (!currentMembers.some(m => m.id === memberCredentials.pubkey)) {
91
+ if (type === TrustchainResultType.restored)
92
+ type = TrustchainResultType.updated;
93
+ (_c = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onStartRequestUserInteraction) === null || _c === void 0 ? void 0 : _c.call(callbacks);
94
+ // simulate device add interaction
95
+ (_d = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onEndRequestUserInteraction) === null || _d === void 0 ? void 0 : _d.call(callbacks);
96
+ currentMembers.push({
97
+ id: memberCredentials.pubkey,
98
+ name: this.context.name,
99
+ permissions: Permissions.OWNER,
100
+ });
101
+ trustchainMembers.set(trustchain.rootId, currentMembers);
102
+ }
103
+ return Promise.resolve({ type, trustchain });
104
+ });
105
+ }
106
+ refreshAuth(jwt) {
107
+ return __awaiter(this, void 0, void 0, function* () {
108
+ return jwt;
109
+ });
110
+ }
111
+ restoreTrustchain(trustchain, memberCredentials) {
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ assertTrustchain(trustchain);
114
+ assertLiveCredentials(memberCredentials);
115
+ assertAllowedPermissions(trustchain.rootId, memberCredentials.pubkey);
116
+ const latest = trustchains.get(trustchain.rootId);
117
+ if (!latest) {
118
+ throw new Error("trustchain not found");
119
+ }
120
+ return Promise.resolve(latest);
121
+ });
122
+ }
123
+ getMembers(trustchain, memberCredentials) {
124
+ return __awaiter(this, void 0, void 0, function* () {
125
+ assertTrustchain(trustchain);
126
+ assertLiveCredentials(memberCredentials);
127
+ assertAllowedPermissions(trustchain.rootId, memberCredentials.pubkey);
128
+ const currentMembers = trustchainMembers.get(trustchain.rootId) || [];
129
+ return Promise.resolve([...currentMembers]);
130
+ });
131
+ }
132
+ removeMember(deviceId, trustchain, memberCredentials, member, callbacks) {
133
+ return __awaiter(this, void 0, void 0, function* () {
134
+ var _a, _b, _c, _d, _e, _f, _g;
135
+ this.invalidateJwt();
136
+ assertTrustchain(trustchain);
137
+ assertLiveCredentials(memberCredentials);
138
+ assertAllowedPermissions(trustchain.rootId, memberCredentials.pubkey);
139
+ if (member.id === memberCredentials.pubkey) {
140
+ throw new Error("cannot remove self");
141
+ }
142
+ const afterRotation = yield ((_a = this.lifecyle) === null || _a === void 0 ? void 0 : _a.onTrustchainRotation(this, trustchain, memberCredentials));
143
+ if (!this.deviceJwtAcquired) {
144
+ (_b = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onStartRequestUserInteraction) === null || _b === void 0 ? void 0 : _b.call(callbacks);
145
+ this.deviceJwtAcquired = true; // simulate device auth interaction
146
+ (_c = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onEndRequestUserInteraction) === null || _c === void 0 ? void 0 : _c.call(callbacks);
147
+ }
148
+ (_d = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onStartRequestUserInteraction) === null || _d === void 0 ? void 0 : _d.call(callbacks);
149
+ // simulate device interaction
150
+ (_e = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onEndRequestUserInteraction) === null || _e === void 0 ? void 0 : _e.call(callbacks);
151
+ (_f = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onStartRequestUserInteraction) === null || _f === void 0 ? void 0 : _f.call(callbacks);
152
+ // simulate device interaction
153
+ (_g = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onEndRequestUserInteraction) === null || _g === void 0 ? void 0 : _g.call(callbacks);
154
+ const currentMembers = (trustchainMembers.get(trustchain.rootId) || []).filter(m => m.id !== member.id);
155
+ trustchainMembers.set(trustchain.rootId, currentMembers);
156
+ // we extract the index part to increment it and recreate a path
157
+ const index = 1 + parseInt(trustchain.applicationPath.split("/")[3].split("'")[0]);
158
+ const newTrustchain = {
159
+ rootId: trustchain.rootId,
160
+ walletSyncEncryptionKey: "mock-wallet-sync-encryption-key-" + index,
161
+ applicationPath: "m/0'/16'/" + index + "'",
162
+ };
163
+ trustchains.set(newTrustchain.rootId, newTrustchain);
164
+ if (afterRotation)
165
+ yield afterRotation(newTrustchain);
166
+ return Promise.resolve(newTrustchain);
167
+ });
168
+ }
169
+ destroyTrustchain(trustchain, memberCredentials) {
170
+ return __awaiter(this, void 0, void 0, function* () {
171
+ assertTrustchain(trustchain);
172
+ assertLiveCredentials(memberCredentials);
173
+ trustchains.delete(trustchain.rootId);
174
+ trustchainMembers.delete(trustchain.rootId);
175
+ return;
176
+ });
177
+ }
178
+ addMember(trustchain, memberCredentials, member) {
179
+ assertTrustchain(trustchain);
180
+ assertLiveCredentials(memberCredentials);
181
+ const currentMembers = trustchainMembers.get(trustchain.rootId) || [];
182
+ if (currentMembers.find(m => m.id === member.id)) {
183
+ return Promise.resolve();
184
+ }
185
+ currentMembers.push(member);
186
+ trustchainMembers.set(trustchain.rootId, currentMembers);
187
+ return Promise.resolve();
188
+ }
189
+ encryptUserData(trustchain, input) {
190
+ assertTrustchain(trustchain);
191
+ return Promise.resolve(applyXor(input));
192
+ }
193
+ decryptUserData(trustchain, data) {
194
+ assertTrustchain(trustchain);
195
+ return Promise.resolve(applyXor(data));
196
+ }
197
+ invalidateJwt() {
198
+ this.deviceJwtAcquired = false;
199
+ }
200
+ }
201
+ //# sourceMappingURL=mockSdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockSdk.js","sourceRoot":"","sources":["../src/mockSdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { DecryptedPayload, Encrypted, ExtractEncryptedPayloads, Message } from "./types";
2
+ export type Cipher = {
3
+ encrypt: (obj: object) => string;
4
+ decrypt: (data: string) => object;
5
+ };
6
+ export type MessageCipher = {
7
+ encryptMessagePayload: <P extends ExtractEncryptedPayloads<Message>>(payload: P) => Encrypted<P>;
8
+ decryptMessage: <M extends Message>(message: M) => DecryptedPayload<M>;
9
+ };
10
+ export declare function makeCipher(sessionEncryptionKey: Uint8Array): Cipher;
11
+ export declare function makeMessageCipher(cipher: Cipher): MessageCipher;
12
+ //# sourceMappingURL=cipher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cipher.d.ts","sourceRoot":"","sources":["../../src/qrcode/cipher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzF,MAAM,MAAM,MAAM,GAAG;IACnB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,qBAAqB,EAAE,CAAC,CAAC,SAAS,wBAAwB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;IACjG,cAAc,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC;CACxE,CAAC;AAEF,wBAAgB,UAAU,CAAC,oBAAoB,EAAE,UAAU,GAAG,MAAM,CA0BnE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAiB/D"}
@@ -0,0 +1,44 @@
1
+ import Base64 from "base64-js";
2
+ import { crypto } from "@ledgerhq/hw-ledger-key-ring-protocol";
3
+ import { InvalidEncryptionKeyError } from "../errors";
4
+ export function makeCipher(sessionEncryptionKey) {
5
+ function encrypt(obj) {
6
+ const plaintext = JSON.stringify(obj);
7
+ const data = new TextEncoder().encode(plaintext);
8
+ const nonce = crypto.randomBytes(16);
9
+ const ciphertext = crypto.encrypt(sessionEncryptionKey, nonce, data);
10
+ const blob = new Uint8Array(nonce.length + ciphertext.length);
11
+ blob.set(nonce);
12
+ blob.set(ciphertext, nonce.length);
13
+ return Base64.fromByteArray(blob);
14
+ }
15
+ function decrypt(data) {
16
+ const blob = Base64.toByteArray(data);
17
+ const nonce = blob.slice(0, 16);
18
+ const ciphertext = blob.slice(16);
19
+ try {
20
+ const plaintext = crypto.decrypt(sessionEncryptionKey, nonce, ciphertext);
21
+ const text = new TextDecoder().decode(plaintext);
22
+ return JSON.parse(text);
23
+ }
24
+ catch (e) {
25
+ throw new InvalidEncryptionKeyError("data can't be decrypted");
26
+ }
27
+ }
28
+ return { encrypt, decrypt };
29
+ }
30
+ export function makeMessageCipher(cipher) {
31
+ function encryptMessagePayload(payload) {
32
+ const encrypted = cipher.encrypt(payload);
33
+ return { encrypted };
34
+ }
35
+ function decryptMessage(message) {
36
+ if (message.message === "InitiateHandshake" || message.message === "Failure") {
37
+ throw new Error(message.message + " is not encrypted");
38
+ }
39
+ const decrypted = cipher.decrypt(message.payload.encrypted);
40
+ return decrypted;
41
+ }
42
+ return { encryptMessagePayload, decryptMessage };
43
+ }
44
+ //# sourceMappingURL=cipher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cipher.js","sourceRoot":"","sources":["../../src/qrcode/cipher.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAYtD,MAAM,UAAU,UAAU,CAAC,oBAAgC;IACzD,SAAS,OAAO,CAAC,GAAW;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,OAAO,CAAC,IAAY;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,yBAAyB,CAAC,yBAAyB,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,SAAS,qBAAqB,CAC5B,OAAU;QAEV,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAED,SAAS,cAAc,CAAoB,OAAU;QACnD,IAAI,OAAO,CAAC,OAAO,KAAK,mBAAmB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,mBAAmB,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAwB,CAAC;QACnF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cipher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cipher.test.d.ts","sourceRoot":"","sources":["../../src/qrcode/cipher.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { crypto } from "@ledgerhq/hw-ledger-key-ring-protocol";
2
+ import { makeCipher } from "./cipher";
3
+ import { InvalidEncryptionKeyError } from "../errors";
4
+ describe("makeCipher", () => {
5
+ it("should encrypt and decrypt correctly", () => {
6
+ const ephemeralKey = crypto.randomKeypair();
7
+ const candidate = crypto.randomKeypair();
8
+ const sessionEncryptionKey = crypto.ecdh(ephemeralKey, candidate.publicKey);
9
+ const cipher = makeCipher(sessionEncryptionKey);
10
+ const plaintext = { message: "Hello, World!" };
11
+ const encrypted = cipher.encrypt(plaintext);
12
+ expect(typeof encrypted).toBe("string");
13
+ const decrypted = cipher.decrypt(encrypted);
14
+ expect(decrypted).toEqual(plaintext);
15
+ });
16
+ it("should throw InvalidEncryptionKeyError if key changes", () => {
17
+ const ephemeralKey = crypto.randomKeypair();
18
+ const candidate = crypto.randomKeypair();
19
+ const sessionEncryptionKey = crypto.ecdh(ephemeralKey, candidate.publicKey);
20
+ const cipher = makeCipher(sessionEncryptionKey);
21
+ const plaintext = { message: "Hello, World!" };
22
+ const encrypted = cipher.encrypt(plaintext);
23
+ const ephemeralKey2 = crypto.randomKeypair();
24
+ const otherSessionEncryptionKey = crypto.ecdh(ephemeralKey2, candidate.publicKey);
25
+ const cipher2 = makeCipher(otherSessionEncryptionKey);
26
+ expect(() => cipher2.decrypt(encrypted)).toThrow(InvalidEncryptionKeyError);
27
+ });
28
+ });
29
+ //# sourceMappingURL=cipher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cipher.test.js","sourceRoot":"","sources":["../../src/qrcode/cipher.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEtD,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,yBAAyB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { MemberCredentials, Trustchain, TrustchainMember } from "../types";
2
+ /**
3
+ * establish a channel to be able to add a member to the trustchain after displaying the QR Code
4
+ * @returns a promise that resolves when this is done
5
+ */
6
+ export declare function createQRCodeHostInstance({ trustchainApiBaseUrl, onDisplayQRCode, onDisplayDigits, addMember, memberCredentials, memberName, initialTrustchainId, }: {
7
+ /**
8
+ * the base URL of the trustchain API
9
+ */
10
+ trustchainApiBaseUrl: string;
11
+ /**
12
+ * this function will need to display a UI to show the QR Code
13
+ */
14
+ onDisplayQRCode: (url: string) => void;
15
+ /**
16
+ * this function will need to display a UI to show the digits
17
+ */
18
+ onDisplayDigits: (digits: string) => void;
19
+ /**
20
+ * this function will need to using the TrustchainSDK (and use sdk.addMember)
21
+ */
22
+ addMember: (member: TrustchainMember) => Promise<Trustchain>;
23
+ /**
24
+ * the client credentials of the instance (given by TrustchainSDK)
25
+ */
26
+ memberCredentials: MemberCredentials;
27
+ /**
28
+ * the name of the member
29
+ */
30
+ memberName: string;
31
+ /**
32
+ * if the member already has a trustchain, this will be defined
33
+ */
34
+ initialTrustchainId?: string;
35
+ }): Promise<Trustchain | void>;
36
+ /**
37
+ * establish a channel to be able to add myself to the trustchain after scanning the QR Code
38
+ * @returns a promise that resolves a Trustchain when this is done
39
+ */
40
+ export declare function createQRCodeCandidateInstance({ memberCredentials, memberName, addMember, initialTrustchainId, scannedUrl, onRequestQRCodeInput, }: {
41
+ /**
42
+ * the client credentials of the instance (given by TrustchainSDK)
43
+ */
44
+ memberCredentials: MemberCredentials;
45
+ /**
46
+ * the name of the member
47
+ */
48
+ memberName: string;
49
+ /**
50
+ * if the member already has a trustchain, this will be defined
51
+ */
52
+ initialTrustchainId?: string;
53
+ /**
54
+ * this function will need to using the TrustchainSDK (and use sdk.addMember)
55
+ */
56
+ addMember: (member: TrustchainMember) => Promise<Trustchain>;
57
+ /**
58
+ * the scanned URL that contains the host public key
59
+ */
60
+ scannedUrl: string;
61
+ /**
62
+ * this function will need to display a UI to ask the user to input the digits
63
+ * and then call the callback with the digits
64
+ */
65
+ onRequestQRCodeInput: (config: {
66
+ digits: number;
67
+ connected: boolean;
68
+ }, callback: (digits: string) => void) => void;
69
+ }): Promise<Trustchain | void>;
70
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/qrcode/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA8F3E;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,EAC7C,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,mBAAmB,GACpB,EAAE;IACD;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;OAEG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D;;OAEG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAsF7B;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CAAC,EAClD,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,UAAU,EACV,oBAAoB,GACrB,EAAE;IACD;;OAEG;IACH,iBAAiB,EAAE,iBAAiB,CAAC;IACrC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,oBAAoB,EAAE,CACpB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;KACpB,EACD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,KAC/B,IAAI,CAAC;CACX,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6E7B"}