@turnkey/core 1.0.0-beta.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 (149) hide show
  1. package/LICENSE +201 -0
  2. package/README.MD +5 -0
  3. package/dist/__clients__/core.d.ts +1010 -0
  4. package/dist/__clients__/core.d.ts.map +1 -0
  5. package/dist/__clients__/core.js +2358 -0
  6. package/dist/__clients__/core.js.map +1 -0
  7. package/dist/__clients__/core.mjs +2356 -0
  8. package/dist/__clients__/core.mjs.map +1 -0
  9. package/dist/__generated__/sdk-client-base.d.ts +211 -0
  10. package/dist/__generated__/sdk-client-base.d.ts.map +1 -0
  11. package/dist/__generated__/sdk-client-base.js +3219 -0
  12. package/dist/__generated__/sdk-client-base.js.map +1 -0
  13. package/dist/__generated__/sdk-client-base.mjs +3217 -0
  14. package/dist/__generated__/sdk-client-base.mjs.map +1 -0
  15. package/dist/__generated__/version.d.ts +2 -0
  16. package/dist/__generated__/version.d.ts.map +1 -0
  17. package/dist/__generated__/version.js +6 -0
  18. package/dist/__generated__/version.js.map +1 -0
  19. package/dist/__generated__/version.mjs +4 -0
  20. package/dist/__generated__/version.mjs.map +1 -0
  21. package/dist/__inputs__/public_api.types.d.ts +5170 -0
  22. package/dist/__inputs__/public_api.types.d.ts.map +1 -0
  23. package/dist/__polyfills__/window.d.ts +15 -0
  24. package/dist/__polyfills__/window.d.ts.map +1 -0
  25. package/dist/__polyfills__/window.js +30 -0
  26. package/dist/__polyfills__/window.js.map +1 -0
  27. package/dist/__polyfills__/window.mjs +28 -0
  28. package/dist/__polyfills__/window.mjs.map +1 -0
  29. package/dist/__stampers__/api/base.d.ts +20 -0
  30. package/dist/__stampers__/api/base.d.ts.map +1 -0
  31. package/dist/__stampers__/api/base.js +67 -0
  32. package/dist/__stampers__/api/base.js.map +1 -0
  33. package/dist/__stampers__/api/base.mjs +65 -0
  34. package/dist/__stampers__/api/base.mjs.map +1 -0
  35. package/dist/__stampers__/api/mobile/stamper.d.ts +13 -0
  36. package/dist/__stampers__/api/mobile/stamper.d.ts.map +1 -0
  37. package/dist/__stampers__/api/mobile/stamper.js +69 -0
  38. package/dist/__stampers__/api/mobile/stamper.js.map +1 -0
  39. package/dist/__stampers__/api/mobile/stamper.mjs +67 -0
  40. package/dist/__stampers__/api/mobile/stamper.mjs.map +1 -0
  41. package/dist/__stampers__/api/web/stamper.d.ts +14 -0
  42. package/dist/__stampers__/api/web/stamper.d.ts.map +1 -0
  43. package/dist/__stampers__/api/web/stamper.js +212 -0
  44. package/dist/__stampers__/api/web/stamper.js.map +1 -0
  45. package/dist/__stampers__/api/web/stamper.mjs +210 -0
  46. package/dist/__stampers__/api/web/stamper.mjs.map +1 -0
  47. package/dist/__stampers__/passkey/base.d.ts +18 -0
  48. package/dist/__stampers__/passkey/base.d.ts.map +1 -0
  49. package/dist/__stampers__/passkey/base.js +138 -0
  50. package/dist/__stampers__/passkey/base.js.map +1 -0
  51. package/dist/__stampers__/passkey/base.mjs +134 -0
  52. package/dist/__stampers__/passkey/base.mjs.map +1 -0
  53. package/dist/__storage__/base.d.ts +3 -0
  54. package/dist/__storage__/base.d.ts.map +1 -0
  55. package/dist/__storage__/base.js +27 -0
  56. package/dist/__storage__/base.js.map +1 -0
  57. package/dist/__storage__/base.mjs +25 -0
  58. package/dist/__storage__/base.mjs.map +1 -0
  59. package/dist/__storage__/mobile/storage.d.ts +18 -0
  60. package/dist/__storage__/mobile/storage.d.ts.map +1 -0
  61. package/dist/__storage__/mobile/storage.js +74 -0
  62. package/dist/__storage__/mobile/storage.js.map +1 -0
  63. package/dist/__storage__/mobile/storage.mjs +72 -0
  64. package/dist/__storage__/mobile/storage.mjs.map +1 -0
  65. package/dist/__storage__/web/storage.d.ts +19 -0
  66. package/dist/__storage__/web/storage.d.ts.map +1 -0
  67. package/dist/__storage__/web/storage.js +79 -0
  68. package/dist/__storage__/web/storage.js.map +1 -0
  69. package/dist/__storage__/web/storage.mjs +77 -0
  70. package/dist/__storage__/web/storage.mjs.map +1 -0
  71. package/dist/__types__/base.d.ts +407 -0
  72. package/dist/__types__/base.d.ts.map +1 -0
  73. package/dist/__types__/base.js +88 -0
  74. package/dist/__types__/base.js.map +1 -0
  75. package/dist/__types__/base.mjs +84 -0
  76. package/dist/__types__/base.mjs.map +1 -0
  77. package/dist/__wallet__/base.d.ts +3 -0
  78. package/dist/__wallet__/base.d.ts.map +1 -0
  79. package/dist/__wallet__/base.js +24 -0
  80. package/dist/__wallet__/base.js.map +1 -0
  81. package/dist/__wallet__/base.mjs +22 -0
  82. package/dist/__wallet__/base.mjs.map +1 -0
  83. package/dist/__wallet__/connector.d.ts +33 -0
  84. package/dist/__wallet__/connector.d.ts.map +1 -0
  85. package/dist/__wallet__/connector.js +63 -0
  86. package/dist/__wallet__/connector.js.map +1 -0
  87. package/dist/__wallet__/connector.mjs +61 -0
  88. package/dist/__wallet__/connector.mjs.map +1 -0
  89. package/dist/__wallet__/mobile/manager.d.ts +35 -0
  90. package/dist/__wallet__/mobile/manager.d.ts.map +1 -0
  91. package/dist/__wallet__/mobile/manager.js +95 -0
  92. package/dist/__wallet__/mobile/manager.js.map +1 -0
  93. package/dist/__wallet__/mobile/manager.mjs +93 -0
  94. package/dist/__wallet__/mobile/manager.mjs.map +1 -0
  95. package/dist/__wallet__/stamper.d.ts +19 -0
  96. package/dist/__wallet__/stamper.d.ts.map +1 -0
  97. package/dist/__wallet__/stamper.js +116 -0
  98. package/dist/__wallet__/stamper.js.map +1 -0
  99. package/dist/__wallet__/stamper.mjs +113 -0
  100. package/dist/__wallet__/stamper.mjs.map +1 -0
  101. package/dist/__wallet__/wallet-connect/base.d.ts +83 -0
  102. package/dist/__wallet__/wallet-connect/base.d.ts.map +1 -0
  103. package/dist/__wallet__/wallet-connect/base.js +362 -0
  104. package/dist/__wallet__/wallet-connect/base.js.map +1 -0
  105. package/dist/__wallet__/wallet-connect/base.mjs +360 -0
  106. package/dist/__wallet__/wallet-connect/base.mjs.map +1 -0
  107. package/dist/__wallet__/wallet-connect/client.d.ts +78 -0
  108. package/dist/__wallet__/wallet-connect/client.d.ts.map +1 -0
  109. package/dist/__wallet__/wallet-connect/client.js +139 -0
  110. package/dist/__wallet__/wallet-connect/client.js.map +1 -0
  111. package/dist/__wallet__/wallet-connect/client.mjs +137 -0
  112. package/dist/__wallet__/wallet-connect/client.mjs.map +1 -0
  113. package/dist/__wallet__/web/manager.d.ts +41 -0
  114. package/dist/__wallet__/web/manager.d.ts.map +1 -0
  115. package/dist/__wallet__/web/manager.js +115 -0
  116. package/dist/__wallet__/web/manager.js.map +1 -0
  117. package/dist/__wallet__/web/manager.mjs +113 -0
  118. package/dist/__wallet__/web/manager.mjs.map +1 -0
  119. package/dist/__wallet__/web/native/ethereum.d.ts +67 -0
  120. package/dist/__wallet__/web/native/ethereum.d.ts.map +1 -0
  121. package/dist/__wallet__/web/native/ethereum.js +248 -0
  122. package/dist/__wallet__/web/native/ethereum.js.map +1 -0
  123. package/dist/__wallet__/web/native/ethereum.mjs +245 -0
  124. package/dist/__wallet__/web/native/ethereum.mjs.map +1 -0
  125. package/dist/__wallet__/web/native/solana.d.ts +19 -0
  126. package/dist/__wallet__/web/native/solana.d.ts.map +1 -0
  127. package/dist/__wallet__/web/native/solana.js +149 -0
  128. package/dist/__wallet__/web/native/solana.js.map +1 -0
  129. package/dist/__wallet__/web/native/solana.mjs +146 -0
  130. package/dist/__wallet__/web/native/solana.mjs.map +1 -0
  131. package/dist/index.d.ts +9 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +78 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/index.mjs +8 -0
  136. package/dist/index.mjs.map +1 -0
  137. package/dist/turnkey-helpers.d.ts +68 -0
  138. package/dist/turnkey-helpers.d.ts.map +1 -0
  139. package/dist/turnkey-helpers.js +466 -0
  140. package/dist/turnkey-helpers.js.map +1 -0
  141. package/dist/turnkey-helpers.mjs +399 -0
  142. package/dist/turnkey-helpers.mjs.map +1 -0
  143. package/dist/utils.d.ts +54 -0
  144. package/dist/utils.d.ts.map +1 -0
  145. package/dist/utils.js +596 -0
  146. package/dist/utils.js.map +1 -0
  147. package/dist/utils.mjs +574 -0
  148. package/dist/utils.mjs.map +1 -0
  149. package/package.json +67 -0
@@ -0,0 +1,67 @@
1
+ import { ApiKeyStamper } from '@turnkey/api-key-stamper';
2
+ import { generateP256KeyPair } from '@turnkey/crypto';
3
+
4
+ let Keychain;
5
+ try {
6
+ Keychain = require("react-native-keychain");
7
+ }
8
+ catch {
9
+ throw new Error("Please install react-native-keychain in your app to use ReactNativeKeychainStamper");
10
+ }
11
+ class ReactNativeKeychainStamper {
12
+ async listKeyPairs() {
13
+ return await Keychain.getAllGenericPasswordServices();
14
+ }
15
+ async clearKeyPairs() {
16
+ const keys = await this.listKeyPairs();
17
+ for (const key of keys) {
18
+ await this.deleteKeyPair(key);
19
+ }
20
+ }
21
+ async createKeyPair(externalKeyPair) {
22
+ let privateKey;
23
+ let publicKey;
24
+ if (externalKeyPair) {
25
+ privateKey = externalKeyPair.privateKey;
26
+ publicKey = externalKeyPair.publicKey;
27
+ }
28
+ else {
29
+ const pair = generateP256KeyPair();
30
+ privateKey = pair.privateKey;
31
+ publicKey = pair.publicKey;
32
+ }
33
+ // store in Keychain
34
+ await Keychain.setGenericPassword(publicKey, privateKey, {
35
+ service: publicKey,
36
+ });
37
+ return publicKey;
38
+ }
39
+ async deleteKeyPair(publicKeyHex) {
40
+ await Keychain.resetGenericPassword({
41
+ service: publicKeyHex,
42
+ });
43
+ }
44
+ async getPrivateKey(publicKeyHex) {
45
+ const creds = await Keychain.getGenericPassword({
46
+ service: publicKeyHex,
47
+ });
48
+ if (!creds)
49
+ return null;
50
+ return creds.password;
51
+ }
52
+ async stamp(payload, publicKeyHex) {
53
+ const privateKey = await this.getPrivateKey(publicKeyHex);
54
+ if (!privateKey) {
55
+ throw new Error(`No private key found for public key: ${publicKeyHex}`);
56
+ }
57
+ const stamper = new ApiKeyStamper({
58
+ apiPublicKey: publicKeyHex,
59
+ apiPrivateKey: privateKey,
60
+ });
61
+ const { stampHeaderName, stampHeaderValue } = await stamper.stamp(payload);
62
+ return { stampHeaderName, stampHeaderValue };
63
+ }
64
+ }
65
+
66
+ export { ReactNativeKeychainStamper };
67
+ //# sourceMappingURL=stamper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamper.mjs","sources":["../../../../src/__stampers__/api/mobile/stamper.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIA,IAAI,QAAgD;AAEpD,IAAI;AACF,IAAA,QAAQ,GAAG,OAAO,CAAC,uBAAuB,CAAC;AAC7C;AAAE,MAAM;AACN,IAAA,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF;AACH;MAEa,0BAA0B,CAAA;AACrC,IAAA,MAAM,YAAY,GAAA;AAChB,QAAA,OAAO,MAAM,QAAQ,CAAC,6BAA6B,EAAE;;AAGvD,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE;AACtC,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;;;IAIjC,MAAM,aAAa,CAAC,eAGnB,EAAA;AACC,QAAA,IAAI,UAAkB;AACtB,QAAA,IAAI,SAAiB;QAErB,IAAI,eAAe,EAAE;AACnB,YAAA,UAAU,GAAG,eAAe,CAAC,UAAU;AACvC,YAAA,SAAS,GAAG,eAAe,CAAC,SAAS;;aAChC;AACL,YAAA,MAAM,IAAI,GAAG,mBAAmB,EAAE;AAClC,YAAA,UAAU,GAAG,IAAI,CAAC,UAAU;AAC5B,YAAA,SAAS,GAAG,IAAI,CAAC,SAAS;;;AAI5B,QAAA,MAAM,QAAQ,CAAC,kBAAkB,CAAC,SAAS,EAAE,UAAU,EAAE;AACvD,YAAA,OAAO,EAAE,SAAS;AACnB,SAAA,CAAC;AAEF,QAAA,OAAO,SAAS;;IAGlB,MAAM,aAAa,CAAC,YAAoB,EAAA;QACtC,MAAM,QAAQ,CAAC,oBAAoB,CAAC;AAClC,YAAA,OAAO,EAAE,YAAY;AACtB,SAAA,CAAC;;IAGI,MAAM,aAAa,CAAC,YAAoB,EAAA;AAC9C,QAAA,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC;AAC9C,YAAA,OAAO,EAAE,YAAY;AACtB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;QAEvB,OAAO,KAAK,CAAC,QAAQ;;AAGvB,IAAA,MAAM,KAAK,CAAC,OAAe,EAAE,YAAoB,EAAA;QAC/C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;QACzD,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,YAAY,CAAA,CAAE,CAAC;;AAEzE,QAAA,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC;AAChC,YAAA,YAAY,EAAE,YAAY;AAC1B,YAAA,aAAa,EAAE,UAAU;AAC1B,SAAA,CAAC;AACF,QAAA,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;AAC1E,QAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE;;AAE/C;;;;"}
@@ -0,0 +1,14 @@
1
+ import type { TStamp, ApiKeyStamperBase } from "@types";
2
+ export declare class IndexedDbStamper implements ApiKeyStamperBase {
3
+ constructor();
4
+ private openDb;
5
+ private storeKeyPair;
6
+ private getPrivateKey;
7
+ listKeyPairs(): Promise<string[]>;
8
+ createKeyPair(externalKeyPair?: CryptoKeyPair): Promise<string>;
9
+ deleteKeyPair(publicKeyHex: string): Promise<void>;
10
+ clearKeyPairs(): Promise<void>;
11
+ private sign;
12
+ stamp(payload: string, publicKeyHex: string): Promise<TStamp>;
13
+ }
14
+ //# sourceMappingURL=stamper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamper.d.ts","sourceRoot":"","sources":["../../../../src/__stampers__/api/web/stamper.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AA0ExD,qBAAa,gBAAiB,YAAW,iBAAiB;;YAO1C,MAAM;YAcN,YAAY;YAkBZ,aAAa;IAiBrB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBjC,aAAa,CAAC,eAAe,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA4B/D,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YActB,IAAI;IAiBZ,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAYpE"}
@@ -0,0 +1,212 @@
1
+ 'use strict';
2
+
3
+ var encoding = require('@turnkey/encoding');
4
+
5
+ const DB_NAME = "TurnkeyStamperDB";
6
+ const DB_STORE = "KeyStore";
7
+ const stampHeaderName = "X-Stamp";
8
+ /**
9
+ * `SubtleCrypto.sign(...)` outputs signature in IEEE P1363 format:
10
+ * - https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/sign#ecdsa
11
+ *
12
+ * Turnkey expects the signature encoding to be DER-encoded ASN.1:
13
+ * - https://github.com/tkhq/tkcli/blob/7f0159af5a73387ff050647180d1db4d3a3aa033/src/internal/apikey/apikey.go#L149
14
+ *
15
+ * Code modified from https://github.com/google/tink/blob/6f74b99a2bfe6677e3670799116a57268fd067fa/javascript/subtle/elliptic_curves.ts#L114
16
+ *
17
+ * Transform an ECDSA signature in IEEE 1363 encoding to DER encoding.
18
+ *
19
+ * @param ieee the ECDSA signature in IEEE encoding
20
+ * @return ECDSA signature in DER encoding
21
+ */
22
+ function convertEcdsaIeee1363ToDer(ieee) {
23
+ if (ieee.length % 2 != 0 || ieee.length == 0 || ieee.length > 132) {
24
+ throw new Error("Invalid IEEE P1363 signature encoding. Length: " + ieee.length);
25
+ }
26
+ const r = toUnsignedBigNum(ieee.subarray(0, ieee.length / 2));
27
+ const s = toUnsignedBigNum(ieee.subarray(ieee.length / 2, ieee.length));
28
+ let offset = 0;
29
+ const length = 1 + 1 + r.length + 1 + 1 + s.length;
30
+ let der;
31
+ if (length >= 128) {
32
+ der = new Uint8Array(length + 3);
33
+ der[offset++] = 48;
34
+ der[offset++] = 128 + 1;
35
+ der[offset++] = length;
36
+ }
37
+ else {
38
+ der = new Uint8Array(length + 2);
39
+ der[offset++] = 48;
40
+ der[offset++] = length;
41
+ }
42
+ der[offset++] = 2;
43
+ der[offset++] = r.length;
44
+ der.set(r, offset);
45
+ offset += r.length;
46
+ der[offset++] = 2;
47
+ der[offset++] = s.length;
48
+ der.set(s, offset);
49
+ return der;
50
+ }
51
+ /**
52
+ * Code modified from https://github.com/google/tink/blob/6f74b99a2bfe6677e3670799116a57268fd067fa/javascript/subtle/elliptic_curves.ts#L311
53
+ *
54
+ * Transform a big integer in big endian to minimal unsigned form which has
55
+ * no extra zero at the beginning except when the highest bit is set.
56
+ */
57
+ function toUnsignedBigNum(bytes) {
58
+ let start = 0;
59
+ while (start < bytes.length && bytes[start] == 0) {
60
+ start++;
61
+ }
62
+ if (start == bytes.length) {
63
+ start = bytes.length - 1;
64
+ }
65
+ let extraZero = 0;
66
+ if ((bytes[start] & 128) == 128) {
67
+ extraZero = 1;
68
+ }
69
+ const res = new Uint8Array(bytes.length - start + extraZero);
70
+ res.set(bytes.subarray(start), extraZero);
71
+ return res;
72
+ }
73
+ class IndexedDbStamper {
74
+ constructor() {
75
+ if (typeof window === "undefined") {
76
+ throw new Error("IndexedDB is only available in the browser");
77
+ }
78
+ }
79
+ async openDb() {
80
+ return new Promise((resolve, reject) => {
81
+ const request = indexedDB.open(DB_NAME, 1);
82
+ request.onupgradeneeded = (event) => {
83
+ const db = event.target.result;
84
+ if (!db.objectStoreNames.contains(DB_STORE)) {
85
+ db.createObjectStore(DB_STORE);
86
+ }
87
+ };
88
+ request.onsuccess = () => resolve(request.result);
89
+ request.onerror = () => reject(request.error);
90
+ });
91
+ }
92
+ async storeKeyPair(publicKeyHex, privateKey) {
93
+ const db = await this.openDb();
94
+ return new Promise((resolve, reject) => {
95
+ const tx = db.transaction(DB_STORE, "readwrite");
96
+ const store = tx.objectStore(DB_STORE);
97
+ store.put(privateKey, publicKeyHex);
98
+ tx.oncomplete = () => {
99
+ db.close();
100
+ resolve();
101
+ };
102
+ tx.onerror = () => reject(tx.error);
103
+ tx.onabort = () => reject(tx.error);
104
+ });
105
+ }
106
+ async getPrivateKey(publicKeyHex) {
107
+ const db = await this.openDb();
108
+ return new Promise((resolve, reject) => {
109
+ const tx = db.transaction(DB_STORE, "readonly");
110
+ const store = tx.objectStore(DB_STORE);
111
+ const request = store.get(publicKeyHex);
112
+ request.onsuccess = () => {
113
+ db.close();
114
+ resolve(request.result || null);
115
+ };
116
+ request.onerror = () => {
117
+ db.close();
118
+ reject(request.error);
119
+ };
120
+ });
121
+ }
122
+ async listKeyPairs() {
123
+ const db = await this.openDb();
124
+ return new Promise((resolve, reject) => {
125
+ const tx = db.transaction(DB_STORE, "readonly");
126
+ const store = tx.objectStore(DB_STORE);
127
+ const request = store.getAllKeys();
128
+ request.onsuccess = () => {
129
+ db.close();
130
+ resolve(request.result);
131
+ };
132
+ request.onerror = () => {
133
+ db.close();
134
+ reject(request.error);
135
+ };
136
+ });
137
+ }
138
+ async createKeyPair(externalKeyPair) {
139
+ let privateKey;
140
+ let publicKey;
141
+ if (externalKeyPair) {
142
+ const extractable = externalKeyPair.privateKey.extractable;
143
+ if (extractable !== false) {
144
+ throw new Error("Provided privateKey must be non-extractable.");
145
+ }
146
+ privateKey = externalKeyPair.privateKey;
147
+ publicKey = externalKeyPair.publicKey;
148
+ }
149
+ else {
150
+ const keyPair = await crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, false, // Non-extractable private key
151
+ ["sign", "verify"]);
152
+ privateKey = keyPair.privateKey;
153
+ publicKey = keyPair.publicKey;
154
+ }
155
+ const rawPubKey = new Uint8Array(await crypto.subtle.exportKey("raw", publicKey));
156
+ const compressedPubKey = encoding.pointEncode(rawPubKey);
157
+ const compressedHex = encoding.uint8ArrayToHexString(compressedPubKey);
158
+ await this.storeKeyPair(compressedHex, privateKey);
159
+ return compressedHex;
160
+ }
161
+ async deleteKeyPair(publicKeyHex) {
162
+ const db = await this.openDb();
163
+ return new Promise((resolve, reject) => {
164
+ const tx = db.transaction(DB_STORE, "readwrite");
165
+ const store = tx.objectStore(DB_STORE);
166
+ store.delete(publicKeyHex);
167
+ tx.oncomplete = () => {
168
+ db.close();
169
+ resolve();
170
+ };
171
+ tx.onerror = () => reject(tx.error);
172
+ });
173
+ }
174
+ async clearKeyPairs() {
175
+ const db = await this.openDb();
176
+ return new Promise((resolve, reject) => {
177
+ const tx = db.transaction(DB_STORE, "readwrite");
178
+ const store = tx.objectStore(DB_STORE);
179
+ store.clear();
180
+ tx.oncomplete = () => {
181
+ db.close();
182
+ resolve();
183
+ };
184
+ tx.onerror = () => reject(tx.error);
185
+ });
186
+ }
187
+ async sign(payload, publicKeyHex) {
188
+ const privateKey = await this.getPrivateKey(publicKeyHex);
189
+ if (!privateKey) {
190
+ throw new Error("Key not found for publicKey: " + publicKeyHex);
191
+ }
192
+ const encodedPayload = new TextEncoder().encode(payload);
193
+ const signatureIeee1363 = await crypto.subtle.sign({ name: "ECDSA", hash: { name: "SHA-256" } }, privateKey, encodedPayload);
194
+ const signatureDer = convertEcdsaIeee1363ToDer(new Uint8Array(signatureIeee1363));
195
+ return encoding.uint8ArrayToHexString(signatureDer);
196
+ }
197
+ async stamp(payload, publicKeyHex) {
198
+ const signature = await this.sign(payload, publicKeyHex);
199
+ const stamp = {
200
+ publicKey: publicKeyHex,
201
+ scheme: "SIGNATURE_SCHEME_TK_API_P256",
202
+ signature,
203
+ };
204
+ return {
205
+ stampHeaderName,
206
+ stampHeaderValue: encoding.stringToBase64urlString(JSON.stringify(stamp)),
207
+ };
208
+ }
209
+ }
210
+
211
+ exports.IndexedDbStamper = IndexedDbStamper;
212
+ //# sourceMappingURL=stamper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamper.js","sources":["../../../../src/__stampers__/api/web/stamper.ts"],"sourcesContent":[null],"names":["pointEncode","uint8ArrayToHexString","stringToBase64urlString"],"mappings":"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"}
@@ -0,0 +1,210 @@
1
+ import { pointEncode, uint8ArrayToHexString, stringToBase64urlString } from '@turnkey/encoding';
2
+
3
+ const DB_NAME = "TurnkeyStamperDB";
4
+ const DB_STORE = "KeyStore";
5
+ const stampHeaderName = "X-Stamp";
6
+ /**
7
+ * `SubtleCrypto.sign(...)` outputs signature in IEEE P1363 format:
8
+ * - https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/sign#ecdsa
9
+ *
10
+ * Turnkey expects the signature encoding to be DER-encoded ASN.1:
11
+ * - https://github.com/tkhq/tkcli/blob/7f0159af5a73387ff050647180d1db4d3a3aa033/src/internal/apikey/apikey.go#L149
12
+ *
13
+ * Code modified from https://github.com/google/tink/blob/6f74b99a2bfe6677e3670799116a57268fd067fa/javascript/subtle/elliptic_curves.ts#L114
14
+ *
15
+ * Transform an ECDSA signature in IEEE 1363 encoding to DER encoding.
16
+ *
17
+ * @param ieee the ECDSA signature in IEEE encoding
18
+ * @return ECDSA signature in DER encoding
19
+ */
20
+ function convertEcdsaIeee1363ToDer(ieee) {
21
+ if (ieee.length % 2 != 0 || ieee.length == 0 || ieee.length > 132) {
22
+ throw new Error("Invalid IEEE P1363 signature encoding. Length: " + ieee.length);
23
+ }
24
+ const r = toUnsignedBigNum(ieee.subarray(0, ieee.length / 2));
25
+ const s = toUnsignedBigNum(ieee.subarray(ieee.length / 2, ieee.length));
26
+ let offset = 0;
27
+ const length = 1 + 1 + r.length + 1 + 1 + s.length;
28
+ let der;
29
+ if (length >= 128) {
30
+ der = new Uint8Array(length + 3);
31
+ der[offset++] = 48;
32
+ der[offset++] = 128 + 1;
33
+ der[offset++] = length;
34
+ }
35
+ else {
36
+ der = new Uint8Array(length + 2);
37
+ der[offset++] = 48;
38
+ der[offset++] = length;
39
+ }
40
+ der[offset++] = 2;
41
+ der[offset++] = r.length;
42
+ der.set(r, offset);
43
+ offset += r.length;
44
+ der[offset++] = 2;
45
+ der[offset++] = s.length;
46
+ der.set(s, offset);
47
+ return der;
48
+ }
49
+ /**
50
+ * Code modified from https://github.com/google/tink/blob/6f74b99a2bfe6677e3670799116a57268fd067fa/javascript/subtle/elliptic_curves.ts#L311
51
+ *
52
+ * Transform a big integer in big endian to minimal unsigned form which has
53
+ * no extra zero at the beginning except when the highest bit is set.
54
+ */
55
+ function toUnsignedBigNum(bytes) {
56
+ let start = 0;
57
+ while (start < bytes.length && bytes[start] == 0) {
58
+ start++;
59
+ }
60
+ if (start == bytes.length) {
61
+ start = bytes.length - 1;
62
+ }
63
+ let extraZero = 0;
64
+ if ((bytes[start] & 128) == 128) {
65
+ extraZero = 1;
66
+ }
67
+ const res = new Uint8Array(bytes.length - start + extraZero);
68
+ res.set(bytes.subarray(start), extraZero);
69
+ return res;
70
+ }
71
+ class IndexedDbStamper {
72
+ constructor() {
73
+ if (typeof window === "undefined") {
74
+ throw new Error("IndexedDB is only available in the browser");
75
+ }
76
+ }
77
+ async openDb() {
78
+ return new Promise((resolve, reject) => {
79
+ const request = indexedDB.open(DB_NAME, 1);
80
+ request.onupgradeneeded = (event) => {
81
+ const db = event.target.result;
82
+ if (!db.objectStoreNames.contains(DB_STORE)) {
83
+ db.createObjectStore(DB_STORE);
84
+ }
85
+ };
86
+ request.onsuccess = () => resolve(request.result);
87
+ request.onerror = () => reject(request.error);
88
+ });
89
+ }
90
+ async storeKeyPair(publicKeyHex, privateKey) {
91
+ const db = await this.openDb();
92
+ return new Promise((resolve, reject) => {
93
+ const tx = db.transaction(DB_STORE, "readwrite");
94
+ const store = tx.objectStore(DB_STORE);
95
+ store.put(privateKey, publicKeyHex);
96
+ tx.oncomplete = () => {
97
+ db.close();
98
+ resolve();
99
+ };
100
+ tx.onerror = () => reject(tx.error);
101
+ tx.onabort = () => reject(tx.error);
102
+ });
103
+ }
104
+ async getPrivateKey(publicKeyHex) {
105
+ const db = await this.openDb();
106
+ return new Promise((resolve, reject) => {
107
+ const tx = db.transaction(DB_STORE, "readonly");
108
+ const store = tx.objectStore(DB_STORE);
109
+ const request = store.get(publicKeyHex);
110
+ request.onsuccess = () => {
111
+ db.close();
112
+ resolve(request.result || null);
113
+ };
114
+ request.onerror = () => {
115
+ db.close();
116
+ reject(request.error);
117
+ };
118
+ });
119
+ }
120
+ async listKeyPairs() {
121
+ const db = await this.openDb();
122
+ return new Promise((resolve, reject) => {
123
+ const tx = db.transaction(DB_STORE, "readonly");
124
+ const store = tx.objectStore(DB_STORE);
125
+ const request = store.getAllKeys();
126
+ request.onsuccess = () => {
127
+ db.close();
128
+ resolve(request.result);
129
+ };
130
+ request.onerror = () => {
131
+ db.close();
132
+ reject(request.error);
133
+ };
134
+ });
135
+ }
136
+ async createKeyPair(externalKeyPair) {
137
+ let privateKey;
138
+ let publicKey;
139
+ if (externalKeyPair) {
140
+ const extractable = externalKeyPair.privateKey.extractable;
141
+ if (extractable !== false) {
142
+ throw new Error("Provided privateKey must be non-extractable.");
143
+ }
144
+ privateKey = externalKeyPair.privateKey;
145
+ publicKey = externalKeyPair.publicKey;
146
+ }
147
+ else {
148
+ const keyPair = await crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, false, // Non-extractable private key
149
+ ["sign", "verify"]);
150
+ privateKey = keyPair.privateKey;
151
+ publicKey = keyPair.publicKey;
152
+ }
153
+ const rawPubKey = new Uint8Array(await crypto.subtle.exportKey("raw", publicKey));
154
+ const compressedPubKey = pointEncode(rawPubKey);
155
+ const compressedHex = uint8ArrayToHexString(compressedPubKey);
156
+ await this.storeKeyPair(compressedHex, privateKey);
157
+ return compressedHex;
158
+ }
159
+ async deleteKeyPair(publicKeyHex) {
160
+ const db = await this.openDb();
161
+ return new Promise((resolve, reject) => {
162
+ const tx = db.transaction(DB_STORE, "readwrite");
163
+ const store = tx.objectStore(DB_STORE);
164
+ store.delete(publicKeyHex);
165
+ tx.oncomplete = () => {
166
+ db.close();
167
+ resolve();
168
+ };
169
+ tx.onerror = () => reject(tx.error);
170
+ });
171
+ }
172
+ async clearKeyPairs() {
173
+ const db = await this.openDb();
174
+ return new Promise((resolve, reject) => {
175
+ const tx = db.transaction(DB_STORE, "readwrite");
176
+ const store = tx.objectStore(DB_STORE);
177
+ store.clear();
178
+ tx.oncomplete = () => {
179
+ db.close();
180
+ resolve();
181
+ };
182
+ tx.onerror = () => reject(tx.error);
183
+ });
184
+ }
185
+ async sign(payload, publicKeyHex) {
186
+ const privateKey = await this.getPrivateKey(publicKeyHex);
187
+ if (!privateKey) {
188
+ throw new Error("Key not found for publicKey: " + publicKeyHex);
189
+ }
190
+ const encodedPayload = new TextEncoder().encode(payload);
191
+ const signatureIeee1363 = await crypto.subtle.sign({ name: "ECDSA", hash: { name: "SHA-256" } }, privateKey, encodedPayload);
192
+ const signatureDer = convertEcdsaIeee1363ToDer(new Uint8Array(signatureIeee1363));
193
+ return uint8ArrayToHexString(signatureDer);
194
+ }
195
+ async stamp(payload, publicKeyHex) {
196
+ const signature = await this.sign(payload, publicKeyHex);
197
+ const stamp = {
198
+ publicKey: publicKeyHex,
199
+ scheme: "SIGNATURE_SCHEME_TK_API_P256",
200
+ signature,
201
+ };
202
+ return {
203
+ stampHeaderName,
204
+ stampHeaderValue: stringToBase64urlString(JSON.stringify(stamp)),
205
+ };
206
+ }
207
+ }
208
+
209
+ export { IndexedDbStamper };
210
+ //# sourceMappingURL=stamper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamper.mjs","sources":["../../../../src/__stampers__/api/web/stamper.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Passkey, TStamp, TStamper, TPasskeyStamperConfig } from "@types";
2
+ import { TurnkeyApiTypes } from "@turnkey/http";
3
+ export type TurnkeyAuthenticatorParams = TurnkeyApiTypes["v1AuthenticatorParamsV2"];
4
+ export declare class CrossPlatformPasskeyStamper implements TStamper {
5
+ private stamper;
6
+ private config;
7
+ constructor(config: TPasskeyStamperConfig);
8
+ init(): Promise<void>;
9
+ stamp(payload: string): Promise<TStamp>;
10
+ /**
11
+ * Create a passkey for an end-user, taking care of various lower-level details.
12
+ *
13
+ * @returns {Promise<Passkey>}
14
+ */
15
+ createWebPasskey: (config?: Record<any, any>) => Promise<Passkey>;
16
+ createReactNativePasskey: (config?: Record<any, any>) => Promise<TurnkeyAuthenticatorParams>;
17
+ }
18
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/__stampers__/passkey/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAM/E,OAAO,EAA0B,eAAe,EAAE,MAAM,eAAe,CAAC;AAKxE,MAAM,MAAM,0BAA0B,GACpC,eAAe,CAAC,yBAAyB,CAAC,CAAC;AAE7C,qBAAa,2BAA4B,YAAW,QAAQ;IAC1D,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAKnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCrB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C;;;;OAIG;IACH,gBAAgB,YACN,OAAO,GAAG,EAAE,GAAG,CAAC,KACvB,QAAQ,OAAO,CAAC,CA8DjB;IAEF,wBAAwB,YACd,OAAO,GAAG,EAAE,GAAG,CAAC,KACvB,QAAQ,0BAA0B,CAAC,CAsBpC;CACH"}