@cartridge/controller 0.1.47 → 0.1.48
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/lib/account.js +100 -189
- package/lib/account.js.map +1 -1
- package/lib/index.js +79 -145
- package/lib/index.js.map +1 -1
- package/lib/messenger.js +29 -47
- package/lib/messenger.js.map +1 -1
- package/lib/signer.js +49 -93
- package/lib/signer.js.map +1 -1
- package/lib/utils.js +2 -13
- package/lib/utils.js.map +1 -1
- package/lib/webauthn.js +74 -134
- package/lib/webauthn.js.map +1 -1
- package/package.json +1 -1
package/lib/webauthn.js
CHANGED
|
@@ -8,55 +8,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
39
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
40
|
-
if (ar || !(i in from)) {
|
|
41
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
42
|
-
ar[i] = from[i];
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
46
|
-
};
|
|
47
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
48
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
49
13
|
};
|
|
50
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
15
|
exports.WebauthnSigner = void 0;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
16
|
+
const starknet_1 = require("starknet");
|
|
17
|
+
const base64url_1 = __importDefault(require("base64url"));
|
|
18
|
+
const BASE = starknet_1.number.toBN(2).pow(86);
|
|
55
19
|
function split(n) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return { x
|
|
20
|
+
const x = n.mod(BASE);
|
|
21
|
+
const y = n.div(BASE).mod(BASE);
|
|
22
|
+
const z = n.div(BASE).div(BASE);
|
|
23
|
+
return { x, y, z };
|
|
60
24
|
}
|
|
61
25
|
function convertUint8ArrayToWordArray(u8Array) {
|
|
62
26
|
var words = [], i = 0, len = u8Array.length;
|
|
@@ -72,67 +36,58 @@ function convertUint8ArrayToWordArray(u8Array) {
|
|
|
72
36
|
words: words,
|
|
73
37
|
};
|
|
74
38
|
}
|
|
75
|
-
|
|
76
|
-
|
|
39
|
+
class WebauthnSigner {
|
|
40
|
+
constructor(credentialId, publicKey) {
|
|
77
41
|
this.credentialId = credentialId;
|
|
78
42
|
this.publicKey = publicKey;
|
|
79
43
|
}
|
|
80
|
-
|
|
81
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
82
|
-
return
|
|
83
|
-
return [2 /*return*/, this.publicKey];
|
|
84
|
-
});
|
|
44
|
+
getPubKey() {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
return this.publicKey;
|
|
85
47
|
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
89
|
-
|
|
90
|
-
return
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
],
|
|
105
|
-
userVerification: "required",
|
|
106
|
-
},
|
|
107
|
-
})];
|
|
108
|
-
case 1: return [2 /*return*/, (_a.sent())];
|
|
109
|
-
}
|
|
110
|
-
});
|
|
48
|
+
}
|
|
49
|
+
sign(hash) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
const challenge = Buffer.from(hash.slice(2).padStart(64, "0").slice(0, 64), "hex");
|
|
52
|
+
return (yield navigator.credentials.get({
|
|
53
|
+
publicKey: {
|
|
54
|
+
challenge,
|
|
55
|
+
timeout: 60000,
|
|
56
|
+
rpId: "cartridge.gg",
|
|
57
|
+
allowCredentials: [
|
|
58
|
+
{
|
|
59
|
+
type: "public-key",
|
|
60
|
+
id: base64url_1.default.toBuffer(this.credentialId),
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
userVerification: "required",
|
|
64
|
+
},
|
|
65
|
+
}));
|
|
111
66
|
});
|
|
112
|
-
}
|
|
113
|
-
|
|
67
|
+
}
|
|
68
|
+
formatAssertion(assertion) {
|
|
114
69
|
var authenticatorDataBytes = new Uint8Array(assertion.response.authenticatorData);
|
|
115
|
-
|
|
70
|
+
let authenticatorDataRem = 4 - (authenticatorDataBytes.length % 4);
|
|
116
71
|
if (authenticatorDataRem == 4) {
|
|
117
72
|
authenticatorDataRem = 0;
|
|
118
73
|
}
|
|
119
|
-
|
|
74
|
+
const authenticatorDataWords = convertUint8ArrayToWordArray(authenticatorDataBytes).words;
|
|
120
75
|
var clientDataJSONBytes = new Uint8Array(assertion.response.clientDataJSON);
|
|
121
|
-
|
|
76
|
+
let clientDataJSONRem = 4 - (clientDataJSONBytes.length % 4);
|
|
122
77
|
if (clientDataJSONRem == 4) {
|
|
123
78
|
clientDataJSONRem = 0;
|
|
124
79
|
}
|
|
125
|
-
|
|
80
|
+
const clientDataWords = convertUint8ArrayToWordArray(clientDataJSONBytes).words;
|
|
126
81
|
// Convert signature from ASN.1 sequence to "raw" format
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
return
|
|
82
|
+
const usignature = new Uint8Array(assertion.response.signature);
|
|
83
|
+
const rStart = usignature[4] === 0 ? 5 : 4;
|
|
84
|
+
const rEnd = rStart + 32;
|
|
85
|
+
const sStart = usignature[rEnd + 2] === 0 ? rEnd + 3 : rEnd + 2;
|
|
86
|
+
const r = starknet_1.number.toBN("0x" + Buffer.from(usignature.slice(rStart, rEnd)).toString("hex"));
|
|
87
|
+
const s = starknet_1.number.toBN("0x" + Buffer.from(usignature.slice(sStart)).toString("hex"));
|
|
88
|
+
const { x: r0, y: r1, z: r2 } = split(r);
|
|
89
|
+
const { x: s0, y: s1, z: s2 } = split(s);
|
|
90
|
+
return [
|
|
136
91
|
"0",
|
|
137
92
|
r0.toString(),
|
|
138
93
|
r1.toString(),
|
|
@@ -142,56 +97,41 @@ var WebauthnSigner = /** @class */ (function () {
|
|
|
142
97
|
s2.toString(),
|
|
143
98
|
"9",
|
|
144
99
|
"0",
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
100
|
+
`${clientDataWords.length}`,
|
|
101
|
+
`${clientDataJSONRem}`,
|
|
102
|
+
...clientDataWords.map((word) => `${word}`),
|
|
103
|
+
`${authenticatorDataWords.length}`,
|
|
104
|
+
`${authenticatorDataRem}`,
|
|
105
|
+
...authenticatorDataWords.map((word) => `${word}`),
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
hashTransaction(transactions, transactionsDetail, abis) {
|
|
153
109
|
if (abis && abis.length !== transactions.length) {
|
|
154
110
|
throw new Error("ABI must be provided for each transaction or no transaction");
|
|
155
111
|
}
|
|
156
112
|
// now use abi to display decoded data somewhere, but as this signer is headless, we can't do that
|
|
157
|
-
|
|
113
|
+
const calldata = starknet_1.transaction.fromCallsToExecuteCalldataWithNonce(transactions, transactionsDetail.nonce);
|
|
158
114
|
return starknet_1.hash.calculateTransactionHash(transactionsDetail.walletAddress, transactionsDetail.version, [starknet_1.hash.getSelectorFromName("__execute__")].concat(calldata), transactionsDetail.maxFee, transactionsDetail.chainId, transactionsDetail.nonce);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
msgHash = starknet_1.hash.calculateTransactionHash(transactionsDetail.walletAddress, transactionsDetail.version, [starknet_1.hash.getSelectorFromName("__execute__")].concat(calldata), transactionsDetail.maxFee, transactionsDetail.chainId, transactionsDetail.nonce);
|
|
171
|
-
return [4 /*yield*/, this.sign(msgHash)];
|
|
172
|
-
case 1:
|
|
173
|
-
assertion = _a.sent();
|
|
174
|
-
return [2 /*return*/, this.formatAssertion(assertion)];
|
|
175
|
-
}
|
|
176
|
-
});
|
|
115
|
+
}
|
|
116
|
+
signTransaction(calls, transactionsDetail, abis) {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
if (abis && abis.length !== calls.length) {
|
|
119
|
+
throw new Error("ABI must be provided for each transaction or no transaction");
|
|
120
|
+
}
|
|
121
|
+
// now use abi to display decoded data somewhere, but as this signer is headless, we can't do that
|
|
122
|
+
const calldata = starknet_1.transaction.fromCallsToExecuteCalldataWithNonce(calls, transactionsDetail.nonce);
|
|
123
|
+
const msgHash = starknet_1.hash.calculateTransactionHash(transactionsDetail.walletAddress, transactionsDetail.version, [starknet_1.hash.getSelectorFromName("__execute__")].concat(calldata), transactionsDetail.maxFee, transactionsDetail.chainId, transactionsDetail.nonce);
|
|
124
|
+
const assertion = yield this.sign(msgHash);
|
|
125
|
+
return this.formatAssertion(assertion);
|
|
177
126
|
});
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
case 0:
|
|
185
|
-
msgHash = starknet_1.typedData.getMessageHash(td, accountAddress);
|
|
186
|
-
return [4 /*yield*/, this.sign(msgHash)];
|
|
187
|
-
case 1:
|
|
188
|
-
assertion = _a.sent();
|
|
189
|
-
return [2 /*return*/, this.formatAssertion(assertion)];
|
|
190
|
-
}
|
|
191
|
-
});
|
|
127
|
+
}
|
|
128
|
+
signMessage(td, accountAddress) {
|
|
129
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
+
const msgHash = starknet_1.typedData.getMessageHash(td, accountAddress);
|
|
131
|
+
const assertion = yield this.sign(msgHash);
|
|
132
|
+
return this.formatAssertion(assertion);
|
|
192
133
|
});
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
}());
|
|
134
|
+
}
|
|
135
|
+
}
|
|
196
136
|
exports.WebauthnSigner = WebauthnSigner;
|
|
197
137
|
//# sourceMappingURL=webauthn.js.map
|
package/lib/webauthn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"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"}
|