Skip to content

Commit cac8963

Browse files
committed
Merge branch 'master' into feat/PD-4297-Stack-upgrade
2 parents ffd64b0 + 169265f commit cac8963

File tree

4 files changed

+121
-41
lines changed

4 files changed

+121
-41
lines changed

src/helpers/common.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,16 @@ export const generatePrivateKey = (ecCurve: EC, buf: typeof Buffer): Buffer => {
1616
return ecCurve.genKeyPair().getPrivate().toArrayLike(buf);
1717
};
1818

19+
let secp256k1EC: EC;
20+
let ed25519EC: EC;
21+
1922
export const getKeyCurve = (keyType: KeyType) => {
20-
if (keyType === KEY_TYPE.ED25519) {
21-
return new EC(KEY_TYPE.ED25519);
22-
} else if (keyType === KEY_TYPE.SECP256K1) {
23-
return new EC(KEY_TYPE.SECP256K1);
23+
if (keyType === KEY_TYPE.SECP256K1) {
24+
if (!secp256k1EC) secp256k1EC = new EC("secp256k1");
25+
return secp256k1EC;
26+
} else if (keyType === KEY_TYPE.ED25519) {
27+
if (!ed25519EC) ed25519EC = new EC("ed25519");
28+
return ed25519EC;
2429
}
2530
throw new Error(`Invalid keyType: ${keyType}`);
2631
};

src/torus.ts

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
generateAddressFromPubKey,
1818
generateShares,
1919
getEd25519ExtendedPublicKey,
20+
getKeyCurve,
2021
getMetadata,
2122
getOrSetNonce,
2223
GetOrSetNonceError,
@@ -171,10 +172,11 @@ class Torus {
171172
async getPublicAddress(
172173
endpoints: string[],
173174
torusNodePubs: INodePub[],
174-
{ verifier, verifierId, extendedVerifierId }: { verifier: string; verifierId: string; extendedVerifierId?: string }
175+
{ verifier, verifierId, extendedVerifierId, keyType }: { verifier: string; verifierId: string; extendedVerifierId?: string; keyType?: KeyType }
175176
): Promise<TorusPublicKey> {
176177
log.info(torusNodePubs, { verifier, verifierId, extendedVerifierId });
177-
return this.getNewPublicAddress(endpoints, { verifier, verifierId, extendedVerifierId }, this.enableOneKey);
178+
const localKeyType = keyType ?? this.keyType;
179+
return this.getNewPublicAddress(endpoints, { verifier, verifierId, extendedVerifierId, keyType: localKeyType }, this.enableOneKey);
178180
}
179181

180182
async importPrivateKey(params: ImportKeyParams): Promise<TorusKey> {
@@ -264,15 +266,22 @@ class Torus {
264266

265267
private async getNewPublicAddress(
266268
endpoints: string[],
267-
{ verifier, verifierId, extendedVerifierId }: { verifier: string; verifierId: string; extendedVerifierId?: string },
269+
{ verifier, verifierId, extendedVerifierId, keyType }: { verifier: string; verifierId: string; extendedVerifierId?: string; keyType?: KeyType },
268270
enableOneKey: boolean
269271
): Promise<TorusPublicKey> {
272+
const localKeyType = keyType ?? this.keyType;
273+
const localEc = getKeyCurve(localKeyType);
274+
275+
if (localKeyType === KEY_TYPE.ED25519 && LEGACY_NETWORKS_ROUTE_MAP[this.network as TORUS_LEGACY_NETWORK_TYPE]) {
276+
throw new Error(`keyType: ${keyType} is not supported by ${this.network} network`);
277+
}
278+
270279
const keyAssignResult = await GetPubKeyOrKeyAssign({
271280
endpoints,
272281
network: this.network,
273282
verifier,
274283
verifierId,
275-
keyType: this.keyType,
284+
keyType: localKeyType,
276285
extendedVerifierId,
277286
});
278287

@@ -303,7 +312,7 @@ class Torus {
303312
let finalPubKey: curve.base.BasePoint;
304313
if (extendedVerifierId) {
305314
// for tss key no need to add pub nonce
306-
finalPubKey = this.ec.keyFromPublic({ x: X, y: Y }).getPublic();
315+
finalPubKey = localEc.keyFromPublic({ x: X, y: Y }).getPublic();
307316
oAuthPubKey = finalPubKey;
308317
} else if (LEGACY_NETWORKS_ROUTE_MAP[this.network as TORUS_LEGACY_NETWORK_TYPE]) {
309318
return this.formatLegacyPublicKeyData({
@@ -316,11 +325,11 @@ class Torus {
316325
});
317326
} else {
318327
const v2NonceResult = nonceResult as v2NonceResultType;
319-
oAuthPubKey = this.ec.keyFromPublic({ x: X, y: Y }).getPublic();
320-
finalPubKey = this.ec
328+
oAuthPubKey = localEc.keyFromPublic({ x: X, y: Y }).getPublic();
329+
finalPubKey = localEc
321330
.keyFromPublic({ x: X, y: Y })
322331
.getPublic()
323-
.add(this.ec.keyFromPublic({ x: v2NonceResult.pubNonce.x, y: v2NonceResult.pubNonce.y }).getPublic());
332+
.add(localEc.keyFromPublic({ x: v2NonceResult.pubNonce.x, y: v2NonceResult.pubNonce.y }).getPublic());
324333

325334
pubNonce = { X: v2NonceResult.pubNonce.x, Y: v2NonceResult.pubNonce.y };
326335
}
@@ -330,14 +339,14 @@ class Torus {
330339
}
331340
const oAuthX = oAuthPubKey.getX().toString(16, 64);
332341
const oAuthY = oAuthPubKey.getY().toString(16, 64);
333-
const oAuthAddress = generateAddressFromPubKey(this.keyType, oAuthPubKey.getX(), oAuthPubKey.getY());
342+
const oAuthAddress = generateAddressFromPubKey(localKeyType, oAuthPubKey.getX(), oAuthPubKey.getY());
334343

335344
if (!finalPubKey) {
336345
throw new Error("Unable to derive finalPubKey");
337346
}
338347
const finalX = finalPubKey ? finalPubKey.getX().toString(16, 64) : "";
339348
const finalY = finalPubKey ? finalPubKey.getY().toString(16, 64) : "";
340-
const finalAddress = finalPubKey ? generateAddressFromPubKey(this.keyType, finalPubKey.getX(), finalPubKey.getY()) : "";
349+
const finalAddress = finalPubKey ? generateAddressFromPubKey(localKeyType, finalPubKey.getX(), finalPubKey.getY()) : "";
341350
return {
342351
oAuthKeyData: {
343352
walletAddress: oAuthAddress,
@@ -367,63 +376,67 @@ class Torus {
367376
enableOneKey: boolean;
368377
isNewKey: boolean;
369378
serverTimeOffset: number;
379+
keyType?: KeyType;
370380
}): Promise<TorusPublicKey> {
371-
const { finalKeyResult, enableOneKey, isNewKey, serverTimeOffset } = params;
381+
const { finalKeyResult, enableOneKey, isNewKey, serverTimeOffset, keyType } = params;
382+
const localKeyType = keyType ?? this.keyType;
383+
const localEc = getKeyCurve(localKeyType);
384+
372385
const { pub_key_X: X, pub_key_Y: Y } = finalKeyResult.keys[0];
373386
let nonceResult: GetOrSetNonceResult;
374387
let nonce: BN;
375388
let finalPubKey: curve.base.BasePoint;
376389
let typeOfUser: GetOrSetNonceResult["typeOfUser"];
377390
let pubNonce: { X: string; Y: string } | undefined;
378391

379-
const oAuthPubKey = this.ec.keyFromPublic({ x: X, y: Y }).getPublic();
392+
const oAuthPubKey = localEc.keyFromPublic({ x: X, y: Y }).getPublic();
380393

381394
const finalServerTimeOffset = this.serverTimeOffset || serverTimeOffset;
382395
if (enableOneKey) {
383396
try {
384-
nonceResult = await getOrSetNonce(this.legacyMetadataHost, this.ec, finalServerTimeOffset, X, Y, undefined, !isNewKey);
397+
nonceResult = await getOrSetNonce(this.legacyMetadataHost, localEc, finalServerTimeOffset, X, Y, undefined, !isNewKey);
385398
nonce = new BN(nonceResult.nonce || "0", 16);
386399
typeOfUser = nonceResult.typeOfUser;
387400
} catch {
388401
throw new GetOrSetNonceError();
389402
}
390403
if (nonceResult.typeOfUser === "v1") {
391404
nonce = await getMetadata(this.legacyMetadataHost, { pub_key_X: X, pub_key_Y: Y });
392-
finalPubKey = this.ec
405+
finalPubKey = localEc
393406
.keyFromPublic({ x: X, y: Y })
394407
.getPublic()
395-
.add(this.ec.keyFromPrivate(nonce.toString(16, 64), "hex").getPublic());
408+
.add(localEc.keyFromPrivate(nonce.toString(16, 64), "hex").getPublic());
396409
} else if (nonceResult.typeOfUser === "v2") {
397-
finalPubKey = this.ec
410+
finalPubKey = localEc
398411
.keyFromPublic({ x: X, y: Y })
399412
.getPublic()
400-
.add(this.ec.keyFromPublic({ x: nonceResult.pubNonce.x, y: nonceResult.pubNonce.y }).getPublic());
413+
.add(localEc.keyFromPublic({ x: nonceResult.pubNonce.x, y: nonceResult.pubNonce.y }).getPublic());
401414
pubNonce = { X: nonceResult.pubNonce.x, Y: nonceResult.pubNonce.y };
402415
} else {
403416
throw new Error("getOrSetNonce should always return typeOfUser.");
404417
}
405418
} else {
406419
typeOfUser = "v1";
407420
nonce = await getMetadata(this.legacyMetadataHost, { pub_key_X: X, pub_key_Y: Y });
408-
finalPubKey = this.ec
421+
finalPubKey = localEc
409422
.keyFromPublic({ x: X, y: Y })
410423
.getPublic()
411-
.add(this.ec.keyFromPrivate(nonce.toString(16, 64), "hex").getPublic());
424+
.add(localEc.keyFromPrivate(nonce.toString(16, 64), "hex").getPublic());
412425
}
413426

414427
if (!oAuthPubKey) {
415428
throw new Error("Unable to derive oAuthPubKey");
416429
}
417430
const oAuthX = oAuthPubKey.getX().toString(16, 64);
418431
const oAuthY = oAuthPubKey.getY().toString(16, 64);
419-
const oAuthAddress = generateAddressFromPubKey(this.keyType, oAuthPubKey.getX(), oAuthPubKey.getY());
432+
const oAuthAddress = generateAddressFromPubKey(localKeyType, oAuthPubKey.getX(), oAuthPubKey.getY());
420433

421434
if (typeOfUser === "v2" && !finalPubKey) {
422435
throw new Error("Unable to derive finalPubKey");
423436
}
424437
const finalX = finalPubKey ? finalPubKey.getX().toString(16, 64) : "";
425438
const finalY = finalPubKey ? finalPubKey.getY().toString(16, 64) : "";
426-
const finalAddress = finalPubKey ? generateAddressFromPubKey(this.keyType, finalPubKey.getX(), finalPubKey.getY()) : "";
439+
const finalAddress = finalPubKey ? generateAddressFromPubKey(localKeyType, finalPubKey.getX(), finalPubKey.getY()) : "";
427440
return {
428441
oAuthKeyData: {
429442
walletAddress: oAuthAddress,

test/sapphire_devnet.test.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,38 @@ describe("torus utils sapphire devnet", () => {
238238
});
239239
});
240240

241-
it("should fetch public address of imported user", async () => {
241+
it("should should fetch public address with keyType", async function () {
242+
const verifierDetails = { verifier: TORUS_TEST_VERIFIER, verifierId: "Willa_Funk11@gmail.com" };
243+
const nodeDetails = await TORUS_NODE_MANAGER.getNodeDetails(verifierDetails);
244+
const torusNodeEndpoints = nodeDetails.torusNodeSSSEndpoints;
245+
const result = await torus.getPublicAddress(torusNodeEndpoints, nodeDetails.torusNodePub, { ...verifierDetails, keyType: "ed25519" });
246+
expect(result.finalKeyData.walletAddress).toBe("HHmiJMCAwhyf9ZWNtj7FEKGXeeC2NjUjPobpDKm43yKs");
247+
delete result.metadata.serverTimeOffset;
248+
expect(result).toEqual({
249+
oAuthKeyData: {
250+
walletAddress: "49yLu8yLqpuCXchzjQSt1tpBz8AP2E9EzzP7a8QtxmTE",
251+
X: "5d39eba90fafbce150b33b9a60b41e1cfdf9e2640b55bf96b787173d74f8e415",
252+
Y: "099639b7da35c1f31a44da7399a29d7db8eaa9639582cf7ed80aa4f7216adf2e",
253+
},
254+
finalKeyData: {
255+
walletAddress: "HHmiJMCAwhyf9ZWNtj7FEKGXeeC2NjUjPobpDKm43yKs",
256+
X: "575203523b34bcfa2c25c428871c421afd69dbcb7375833b52ef264aaa466a81",
257+
Y: "26f0b1f5740088c2ecf676081b8e2fe5254f1cbb693947ae391af13500d706f2",
258+
},
259+
metadata: {
260+
pubNonce: {
261+
X: "71bf997547c1ac3f0babee87ebac055e8542863ebb1ba66e8092499eacbffd22",
262+
Y: "71a0a70c5ae06d7eeb45673d4081fdfc9f29c4acfbbb57bf52a33dd7630599b1",
263+
},
264+
nonce: new BN("0", "hex"),
265+
typeOfUser: "v2",
266+
upgraded: false,
267+
},
268+
nodesData: result.nodesData,
269+
});
270+
});
271+
272+
it("should fetch public address of imported user", async function () {
242273
const verifierDetails = { verifier: TORUS_TEST_VERIFIER, verifierId: TORUS_IMPORT_EMAIL };
243274
const nodeDetails = await TORUS_NODE_MANAGER.getNodeDetails(verifierDetails);
244275
const torusNodeEndpoints = nodeDetails.torusNodeSSSEndpoints;

test/sapphire_devnet_ed25519.test.ts

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,38 @@ describe("torus utils ed25519 sapphire devnet", () => {
6565
});
6666
});
6767

68-
it("should be able to import a key for a new user", async () => {
68+
it("should should fetch public address with keyType", async function () {
69+
const verifierDetails = { verifier: TORUS_TEST_VERIFIER, verifierId: "Willa_Funk11@gmail.com" };
70+
const nodeDetails = await TORUS_NODE_MANAGER.getNodeDetails(verifierDetails);
71+
const torusNodeEndpoints = nodeDetails.torusNodeSSSEndpoints;
72+
const result = await torus.getPublicAddress(torusNodeEndpoints, nodeDetails.torusNodePub, { ...verifierDetails, keyType: "secp256k1" });
73+
expect(result.finalKeyData.walletAddress).toBe("0xc53Df7C3Eb4990CfB8f903e4240dBB3BBa715A96");
74+
delete result.metadata.serverTimeOffset;
75+
expect(result).toEqual({
76+
oAuthKeyData: {
77+
walletAddress: "0x27890B4B87E5a39CA0510B32B2b2621d7D1eF7c0",
78+
X: "d594a7c8368d37b2ca31b55be7db1b6a6bce9a3ddbcc573d5460bc7d630024e3",
79+
Y: "09416f76bdbb88307900f748f0edc1cc345a9ba78c98508c8e29236d98b1d043",
80+
},
81+
finalKeyData: {
82+
walletAddress: "0xc53Df7C3Eb4990CfB8f903e4240dBB3BBa715A96",
83+
X: "c60e9fbdb820c2ea430769fce86e2fd56ac4a4e5137346d54a914d57c56cab22",
84+
Y: "02df3331a556d429baea94b0da05ec9438ea2ba9912af0fc4b76925531fc4629",
85+
},
86+
metadata: {
87+
pubNonce: {
88+
X: "d3edb1a89af7db7a078e73cfdb59f9be82512e8121751934122f104b28b92074",
89+
Y: "2a2700c2934c0a0b5cdfaeeca5a4e279fc9d46c6b6837de6f2e2f15ad39c51a3",
90+
},
91+
nonce: new BN("0", "hex"),
92+
typeOfUser: "v2",
93+
upgraded: false,
94+
},
95+
nodesData: result.nodesData,
96+
});
97+
});
98+
99+
it("should be able to import a key for a new user", async function () {
69100
const email = faker.internet.email();
70101
const token = generateIdToken(email, "ES256");
71102
// const privKeyBuffer = new BN(generatePrivateKey(ec, Buffer));
@@ -133,28 +164,28 @@ describe("torus utils ed25519 sapphire devnet", () => {
133164
delete result.sessionData;
134165
expect(result).toEqual({
135166
oAuthKeyData: {
136-
walletAddress: "HV19ETHePfCtZK55Bo5znHXLfd46nu4AQbjtbYumY7ea",
137-
X: "1f5f95f5af0a67b4af731608fdb26115efcb011dcf64a355bf2442e4ec058ae0",
138-
Y: "33f3317a574a5444b78aecc56dd894a56d1fbb90134bc7c63d0f9d11f969e7f4",
139-
privKey: "07b1ff9ec97c93ac3d5125db8283ec0b22056623d0a9407a48c9def302db07b7",
167+
X: "10249abbadc55312ce60f8a6ef522f3c1f076f5df33f0017f9d30116a5793b98",
168+
Y: "6e613d07eaaaec03430ff89498044a53e18317a9ab5b897d8122b51d5f86ddae",
169+
privKey: "08fcf6cc843ea4ad9d7b314ca57b3fdc8bccf9293d7a3fb70dd3f7ea8c506fec",
170+
walletAddress: "CmbriSJicm3fga5cTtwWEmZxC2eMzXbntZRt7CMNoo1w",
140171
},
141172
postboxKeyData: {
142-
X: "a7fa19a07eb387e3b1a95843f7d56f8ca88d11c632c4f53b8554068876451d27",
143-
Y: "6ddc5c79c28d197991ecf9304b4e66ecc2e98dcf3cb73ec3c79953bd87e4a6ff",
144-
privKey: "fa5efb87dbdcea273654342d622fcbfa087f4a572caf76d2214e00a8732c6ddf",
173+
X: "ae706aa0becae4b1d6435a42010bdc616254e136d5054bdf431a04e36068fa1c",
174+
Y: "c54dc56e25661c227ad5bfab26368da7fce8629f22c127b24b2c2db93a3c45f1",
175+
privKey: "4a0629fffdec0303b76e5e8dfabf21edd4e1957e234e180b7767453a0b301bd0",
145176
},
146177
finalKeyData: {
147-
walletAddress: "Dp6eiDQs7LbHLVATSEaA7NUm9DkEAZTXdzXy13vbYoq8",
148-
X: "2cfc2713bd866494690b50d0cb1500878903130a0a1a31fae1ffa5f8cd436407",
149-
Y: "775cc21e123af488ad2c1fd70b22f9427a0596691c991186d42e69fa08ee5cbe",
150-
privKey: "cfe3a737880b01da41765e90466400512564bf3e12648e8e715ae54b53b1e11b",
178+
X: "3c244876ef8205fdc66d4a2f6d460945a9dbdbcb149519a5fbd33a4f4b1f99ae",
179+
Y: "5c4c708d2b09c114f0b5c4d3a002b0c26b3d6ba49eb1e57c8e67b1ba2f3a2555",
180+
privKey: "7cfc7bfbf35aaf17ecf1a7fed0688eba887993dcc987a03c69ee26e2d70e5c90",
181+
walletAddress: "6jNaYT5c1EgYaASeBte79hSQ1m1FKq6fsAzMo8SgxpiF",
151182
},
152183
metadata: {
153184
pubNonce: {
154-
X: "78f007266e249301a241bcb72dba7d305f41f11a432dd8f4dec22c9a0035b3ac",
155-
Y: "7e0545c176528910726ad528e12e1fa39e106ad06957e807a2660c9214596d33",
185+
X: "6afdf51271677bc31c38ee8e540e74f2f77252814bcaf547f1038a6df620dc0f",
186+
Y: "1a58d067a52bd15447cbfd31cc2e8c67231e5883d245dbf03d83bb0c91d4fe68",
156187
},
157-
nonce: new BN("58c39dd2c8dcdbd740b758623c88b9dfb36d6e3b590d073a1456c0268af8270", "hex"),
188+
nonce: new BN("02d19eb6bd599c6dd1473e821b1de1982f10ee7b53e9b303067e1edc42538c19", "hex"),
158189
typeOfUser: "v2",
159190
upgraded: false,
160191
},

0 commit comments

Comments
 (0)