Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
983 changes: 979 additions & 4 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,8 @@
"hooks": {
"pre-commit": "lerna run pre-commit --concurrency 1 --since HEAD"
}
},
"dependencies": {
"@tkey/service-provider-torus": "^10.1.0"
}
}
5 changes: 5 additions & 0 deletions packages/common-types/src/baseTypes/commonTypes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { CustomAuthArgs } from "@toruslabs/customauth";
import { PointHex } from "@toruslabs/rss-client";
import type { Web3AuthOptions } from "@web3auth/single-factor-auth";
import BN from "bn.js";
import type { curve } from "elliptic";

Expand Down Expand Up @@ -39,6 +40,10 @@ export interface ServiceProviderArgs {
useTSS?: boolean;
}

export interface SfaServiceProviderArgs extends ServiceProviderArgs {
web3AuthOptions: Web3AuthOptions;
}

export interface TorusServiceProviderArgs extends ServiceProviderArgs {
customAuthArgs: CustomAuthArgs;
nodeEndpoints?: string[];
Expand Down
1 change: 1 addition & 0 deletions packages/default/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"@tkey-mpc/share-serialization": "^8.1.0",
"@tkey-mpc/share-transfer": "^8.1.0",
"@tkey-mpc/storage-layer-torus": "^8.1.0",
"@tkey-mpc/service-provider-sfa": "^8.1.0",
"@toruslabs/eccrypto": "^3.0.0",
"@toruslabs/rss-client": "^1.4.1",
"bn.js": "^5.2.1"
Expand Down
2 changes: 2 additions & 0 deletions packages/default/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { IServiceProvider, IStorageLayer, StringifiedType, TKeyArgs } from "@tkey-mpc/common-types";
import TKey from "@tkey-mpc/core";
import { ServiceProviderBase } from "@tkey-mpc/service-provider-base";
import { SfaServiceProvider } from "@tkey-mpc/service-provider-sfa";
import { TorusServiceProvider } from "@tkey-mpc/service-provider-torus";
import { SHARE_SERIALIZATION_MODULE_NAME, ShareSerializationModule } from "@tkey-mpc/share-serialization";
import { SHARE_TRANSFER_MODULE_NAME, ShareTransferModule } from "@tkey-mpc/share-transfer";
Expand Down Expand Up @@ -39,6 +40,7 @@ class ThresholdKey extends TKey {
const finalServiceProvider: IServiceProvider =
serviceProvider ||
TorusServiceProvider.fromJSON(tempOldServiceProvider) ||
SfaServiceProvider.fromJSON(tempOldServiceProvider) ||
ServiceProviderBase.fromJSON(tempOldServiceProvider) ||
new TorusServiceProvider({ customAuthArgs });

Expand Down
22 changes: 22 additions & 0 deletions packages/default/test/sfaSPAutoSync.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { SfaServiceProvider } from "@tkey-mpc/service-provider-sfa";
import { generatePrivate } from "@toruslabs/eccrypto";

import { getMetadataUrl, initStorageLayer } from "./helpers";
import { sharedTestCases } from "./shared";

const MANUAL_SYNC = false;
const metadataURL = getMetadataUrl();
const PRIVATE_KEY = generatePrivate().toString("hex");
const sfaSP = new SfaServiceProvider({
postboxKey: PRIVATE_KEY,
web3AuthOptions: {
clientId: "YOUR_CLIENT_ID",
},
});

const sfaSL = initStorageLayer({ hostUrl: metadataURL });

describe(`SfaServiceProvider with manualSync: ${MANUAL_SYNC}`, function () {
// eslint-disable-next-line mocha/no-setup-in-describe
sharedTestCases(MANUAL_SYNC, sfaSP, sfaSL);
});
22 changes: 22 additions & 0 deletions packages/default/test/sfaSPManualSync.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { SfaServiceProvider } from "@tkey-mpc/service-provider-sfa";
import { generatePrivate } from "@toruslabs/eccrypto";

import { getMetadataUrl, initStorageLayer } from "./helpers";
import { sharedTestCases } from "./shared";

const MANUAL_SYNC = true;
const metadataURL = getMetadataUrl();
const PRIVATE_KEY = generatePrivate().toString("hex");
const sfaSP = new SfaServiceProvider({
postboxKey: PRIVATE_KEY,
web3AuthOptions: {
clientId: "YOUR_CLIENT_ID",
},
});

const sfaSL = initStorageLayer({ hostUrl: metadataURL });

describe(`SfaServiceProvider with manualSync: ${MANUAL_SYNC}`, function () {
// eslint-disable-next-line mocha/no-setup-in-describe
sharedTestCases(MANUAL_SYNC, sfaSP, sfaSL);
});
28 changes: 28 additions & 0 deletions packages/service-provider-sfa/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# tKey Torus Service Provider

[![npm version](https://img.shields.io/npm/v/@tkey/service-provider-torus?label=%22%22)](https://www.npmjs.com/package/@tkey/service-provider-torus/v/latest) [![minzip](https://img.shields.io/bundlephobia/minzip/@tkey/service-provider-torus?label=%22%22)](https://bundlephobia.com/result?p=@tkey/service-provider-torus@latest)

Service Provider in `tKey` is used for generating a social login share of the private key share managed by a wallet service provider via
their own authentication flows.

## Installation

```shell
npm install --save @tkey/service-provider-torus
```

### See the full [SDK Reference](https://web3auth.io/docs/sdk/self-host/service-provider) on the Web3Auth Documentation

## Example

```js
import TorusServiceProvider from "@tkey/service-provider-torus";

const customAuthParams = {
baseUrl: `${window.location.origin}/serviceworker`,
enableLogging: true,
network: "testnet",
web3AuthClientId: "test",
};
const serviceProvider = new TorusServiceProvider({ customAuthParams });
```
64 changes: 64 additions & 0 deletions packages/service-provider-sfa/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{
"name": "@tkey-mpc/service-provider-sfa",
"version": "8.1.0",
"description": "TKey Torus Service Provider Module",
"author": "Torus Labs",
"homepage": "https://github.com/tkey/tkey#readme",
"license": "MIT",
"main": "dist/serviceProviderSfa.cjs.js",
"module": "dist/serviceProviderSfa.esm.js",
"unpkg": "dist/serviceProviderSfa.umd.min.js",
"jsdelivr": "dist/serviceProviderSfa.umd.min.js",
"types": "dist/types/index.d.ts",
"files": [
"dist",
"src"
],
"publishConfig": {
"access": "public"
},
"repository": {
"type": "git",
"url": "git+https://github.com/tkey/tkey.git"
},
"scripts": {
"test": "cross-env MOCKED=true mocha --config ../../.mocharc.json ",
"coverage": "nyc yarn test",
"coverage-production": "nyc yarn test-production",
"test-development": "cross-env MOCKED=false METADATA=http://localhost:5051 mocha --config ../../.mocharc.json ",
"test-production": "cross-env MOCKED=false METADATA=https://metadata.tor.us mocha --config ../../.mocharc.json ",
"test-debugger": "mocha --config ../../.mocharc.json --inspect-brk",
"dev": "rimraf dist/ && cross-env NODE_ENV=development torus-scripts build",
"build": "rimraf dist/ && cross-env NODE_ENV=production torus-scripts build",
"lint": "eslint --fix 'src/**/*.ts'",
"prepack": "yarn run build",
"pre-commit": "lint-staged"
},
"peerDependencies": {
"@babel/runtime": "7.x"
},
"dependencies": {
"@tkey-mpc/common-types": "^8.1.0",
"@tkey-mpc/service-provider-base": "^8.1.0",
"@web3auth/single-factor-auth": "^6.5.0",
"@toruslabs/fetch-node-details": "^12.0.0",
"bn.js": "^5.2.1"
},
"devDependencies": {
"@types/bn.js": "^5.1.1"
},
"bugs": {
"url": "https://github.com/tkey/tkey/issues"
},
"lint-staged": {
"!(*d).ts": [
"yarn run lint --",
"prettier --write 'src/**/*.ts'"
]
},
"engines": {
"node": ">=16.18.1",
"npm": ">=8.x"
},
"gitHead": "9967ce9f795f495f28ef0da1fc50acde31dcc258"
}
116 changes: 116 additions & 0 deletions packages/service-provider-sfa/src/SfaServiceProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import { PointHex, SfaServiceProviderArgs, StringifiedType } from "@tkey-mpc/common-types";
import { ServiceProviderBase } from "@tkey-mpc/service-provider-base";
import { LoginParams, PrivateKeyProvider, Web3Auth, Web3AuthOptions } from "@web3auth/single-factor-auth";
import BN from "bn.js";

class SfaServiceProvider extends ServiceProviderBase {
web3AuthOptions: Web3AuthOptions;

web3AuthInstance: Web3Auth;

constructor({ enableLogging = false, postboxKey, web3AuthOptions }: SfaServiceProviderArgs) {
super({ enableLogging, postboxKey });

this.web3AuthOptions = web3AuthOptions;
this.web3AuthInstance = new Web3Auth(web3AuthOptions);
this.serviceProviderName = "SfaServiceProvider";
}

static fromJSON(value: StringifiedType): SfaServiceProvider {
const { enableLogging, postboxKey, web3AuthOptions, serviceProviderName } = value;
if (serviceProviderName !== "SfaServiceProvider") return undefined;

return new SfaServiceProvider({
enableLogging,
postboxKey,
web3AuthOptions,
});
}

async init(params: PrivateKeyProvider): Promise<void> {
return this.web3AuthInstance.init(params);
}

async connect(params: LoginParams): Promise<BN> {
const privKey = await this.web3AuthInstance.getPostboxKey(params);
this.postboxKey = new BN(privKey, "hex");
return this.postboxKey;
}

async getTSSNodeDetails(): Promise<{ serverEndpoints: string[]; serverPubKeys: PointHex[]; serverThreshold: number }> {
if (!this.verifierId) throw new Error("no verifierId, not logged in");
if (!this.verifierName) throw new Error("no verifierName, not logged in");
if (!this.web3AuthInstance.nodeDetailManagerInstance) throw new Error("web3auth instance is not initialized");

const { torusNodeTSSEndpoints: tssNodeEndpoints, torusNodePub: torusPubKeys } =
await this.web3AuthInstance.nodeDetailManagerInstance.getNodeDetails({
verifier: this.verifierName,
verifierId: this.verifierId,
});

return {
serverEndpoints: tssNodeEndpoints,
serverPubKeys: torusPubKeys.map((key) => {
return {
x: key.X,
y: key.Y,
};
}),
serverThreshold: Math.ceil(tssNodeEndpoints.length / 2),
};
}

async getSSSNodeDetails(): Promise<{ serverEndpoints: string[]; serverPubKeys: PointHex[]; serverThreshold: number }> {
if (!this.verifierId) throw new Error("no verifierId, not logged in");
if (!this.verifierName) throw new Error("no verifierName, not logged in");
if (!this.web3AuthInstance.nodeDetailManagerInstance) throw new Error("web3auth instance is not initialized");

const { torusNodeSSSEndpoints: tssNodeEndpoints, torusNodePub: torusPubKeys } =
await this.web3AuthInstance.nodeDetailManagerInstance.getNodeDetails({
verifier: this.verifierName,
verifierId: this.verifierId,
});
return {
serverEndpoints: tssNodeEndpoints,
serverPubKeys: torusPubKeys.map((key) => {
return {
x: key.X,
y: key.Y,
};
}),
serverThreshold: Math.ceil(tssNodeEndpoints.length / 2),
};
}

async getRSSNodeDetails(): Promise<{ serverEndpoints: string[]; serverPubKeys: PointHex[]; serverThreshold: number }> {
if (!this.verifierId) throw new Error("no verifierId, not logged in");
if (!this.verifierName) throw new Error("no verifierName, not logged in");
if (!this.web3AuthInstance.nodeDetailManagerInstance) throw new Error("web3auth instance is not initialized");
const { torusNodeRSSEndpoints: tssNodeEndpoints, torusNodePub: torusPubKeys } =
await this.web3AuthInstance.nodeDetailManagerInstance.getNodeDetails({
verifier: this.verifierName,
verifierId: this.verifierId,
});

return {
serverEndpoints: tssNodeEndpoints,
serverPubKeys: torusPubKeys.map((key) => {
return {
x: key.X,
y: key.Y,
};
}),
serverThreshold: Math.ceil(tssNodeEndpoints.length / 2),
};
}

toJSON(): StringifiedType {
return {
...super.toJSON(),
serviceProviderName: this.serviceProviderName,
web3AuthOptions: this.web3AuthOptions,
};
}
}

export default SfaServiceProvider;
1 change: 1 addition & 0 deletions packages/service-provider-sfa/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default, default as SfaServiceProvider } from "./SfaServiceProvider";
7 changes: 7 additions & 0 deletions packages/service-provider-sfa/test/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"rules": {
"prefer-arrow-callback": "off",
"func-names": "off"
}

}
Empty file.
1 change: 1 addition & 0 deletions packages/service-provider-sfa/torus.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require("../../torus.config");
3 changes: 3 additions & 0 deletions packages/service-provider-sfa/tsconfig.build.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"include": ["src"]
}
4 changes: 4 additions & 0 deletions packages/service-provider-sfa/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"extends": "../../tsconfig.json",
"include": ["src", "test"]
}
11 changes: 11 additions & 0 deletions packages/service-provider-sfa/webpack.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require("path");
const generateWebpackConfig = require("../../webpack.config");

const pkg = require("./package.json");

const currentPath = path.resolve(".");

const config = generateWebpackConfig({ currentPath, pkg });

exports.baseConfig = config.baseConfig;