@docknetwork/wallet-sdk-wasm 1.5.9 → 1.5.10
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/core/format-utils.js +0 -28
- package/lib/core/format-utils.mjs +1 -24
- package/lib/core/validation.js +1 -24
- package/lib/core/validation.mjs +2 -21
- package/lib/index.js +13 -23
- package/lib/index.mjs +13 -23
- package/lib/rpc-server.js +13 -23
- package/lib/rpc-server.mjs +13 -23
- package/lib/rpc-util.js +14 -0
- package/lib/rpc-util.mjs +14 -0
- package/lib/services/blockchain/index.js +3 -6
- package/lib/services/blockchain/index.mjs +3 -6
- package/lib/services/blockchain/service.js +4 -6
- package/lib/services/blockchain/service.mjs +4 -6
- package/lib/services/credential/bbs-revocation.js +4 -7
- package/lib/services/credential/bbs-revocation.mjs +3 -6
- package/lib/services/credential/bound-check.js +9 -4
- package/lib/services/credential/bound-check.mjs +9 -4
- package/lib/services/credential/index.js +11 -13
- package/lib/services/credential/index.mjs +11 -13
- package/lib/services/credential/service.js +18 -18
- package/lib/services/credential/service.mjs +15 -15
- package/lib/services/credential/utils.js +65 -28
- package/lib/services/credential/utils.mjs +62 -32
- package/lib/services/dids/index.js +11 -14
- package/lib/services/dids/index.mjs +11 -14
- package/lib/services/dids/keypair-utils.js +142 -0
- package/lib/services/dids/keypair-utils.mjs +113 -0
- package/lib/services/dids/service.js +15 -34
- package/lib/services/dids/service.mjs +15 -34
- package/lib/services/edv/index.js +8 -14
- package/lib/services/edv/index.mjs +8 -14
- package/lib/services/edv/service.js +10 -22
- package/lib/services/edv/service.mjs +10 -22
- package/lib/services/index.js +13 -25
- package/lib/services/index.mjs +13 -25
- package/lib/services/relay-service/configs.js +0 -1
- package/lib/services/relay-service/configs.mjs +0 -1
- package/lib/services/relay-service/index.android.js +0 -1
- package/lib/services/relay-service/index.android.mjs +0 -1
- package/lib/services/relay-service/index.ios.js +0 -1
- package/lib/services/relay-service/index.ios.mjs +0 -1
- package/lib/services/relay-service/index.js +0 -1
- package/lib/services/relay-service/index.mjs +0 -1
- package/lib/services/relay-service/service-rpc.js +0 -1
- package/lib/services/relay-service/service-rpc.mjs +0 -1
- package/lib/services/relay-service/service.js +0 -1
- package/lib/services/relay-service/service.mjs +0 -1
- package/lib/services/test-utils.js +0 -44
- package/lib/services/test-utils.mjs +1 -44
- package/lib/services/util-crypto/configs.js +0 -12
- package/lib/services/util-crypto/configs.mjs +0 -12
- package/lib/services/util-crypto/index.android.js +0 -3
- package/lib/services/util-crypto/index.android.mjs +0 -3
- package/lib/services/util-crypto/index.ios.js +0 -3
- package/lib/services/util-crypto/index.ios.mjs +0 -3
- package/lib/services/util-crypto/index.js +4 -7
- package/lib/services/util-crypto/index.mjs +4 -7
- package/lib/services/util-crypto/service-rpc.js +0 -23
- package/lib/services/util-crypto/service-rpc.mjs +0 -23
- package/lib/services/util-crypto/service.js +68 -61
- package/lib/services/util-crypto/service.mjs +50 -59
- package/lib/services/wallet/configs.js +0 -63
- package/lib/services/wallet/configs.mjs +1 -64
- package/lib/services/wallet/index.android.js +0 -1
- package/lib/services/wallet/index.android.mjs +0 -1
- package/lib/services/wallet/index.ios.js +0 -1
- package/lib/services/wallet/index.ios.mjs +0 -1
- package/lib/services/wallet/index.js +2 -12
- package/lib/services/wallet/index.mjs +2 -12
- package/lib/services/wallet/service-rpc.js +0 -77
- package/lib/services/wallet/service-rpc.mjs +0 -77
- package/lib/services/wallet/service.js +1 -215
- package/lib/services/wallet/service.mjs +1 -211
- package/lib/setup-nodejs.js +13 -23
- package/lib/setup-nodejs.mjs +13 -23
- package/lib/setup-tests.js +13 -23
- package/lib/setup-tests.mjs +13 -23
- package/lib/src/core/format-utils.d.ts +0 -5
- package/lib/src/core/format-utils.d.ts.map +1 -1
- package/lib/src/core/validation.d.ts +0 -3
- package/lib/src/core/validation.d.ts.map +1 -1
- package/lib/src/rpc-util.d.ts.map +1 -1
- package/lib/src/services/blockchain/service.d.ts.map +1 -1
- package/lib/src/services/credential/bbs-revocation.d.ts.map +1 -1
- package/lib/src/services/credential/bound-check.d.ts +1 -1
- package/lib/src/services/credential/bound-check.d.ts.map +1 -1
- package/lib/src/services/credential/service.d.ts.map +1 -1
- package/lib/src/services/credential/utils.d.ts +2 -1
- package/lib/src/services/credential/utils.d.ts.map +1 -1
- package/lib/src/services/dids/keypair-utils.d.ts +15 -0
- package/lib/src/services/dids/keypair-utils.d.ts.map +1 -0
- package/lib/src/services/dids/service.d.ts +6 -6
- package/lib/src/services/dids/service.d.ts.map +1 -1
- package/lib/src/services/edv/service.d.ts.map +1 -1
- package/lib/src/services/util-crypto/configs.d.ts +0 -3
- package/lib/src/services/util-crypto/configs.d.ts.map +1 -1
- package/lib/src/services/util-crypto/service.d.ts +3 -8
- package/lib/src/services/util-crypto/service.d.ts.map +1 -1
- package/lib/src/services/wallet/configs.d.ts +13 -0
- package/lib/src/services/wallet/configs.d.ts.map +1 -0
- package/lib/src/services/wallet/service.d.ts +1 -44
- package/lib/src/services/wallet/service.d.ts.map +1 -1
- package/lib/test-utils.js +0 -4
- package/lib/test-utils.mjs +1 -4
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -25
- package/readme.md +0 -61
- package/src/core/format-utils.test.js +1 -28
- package/src/core/format-utils.ts +0 -33
- package/src/core/validation.test.js +1 -33
- package/src/core/validation.ts +1 -25
- package/src/rpc-server.test.js +2 -9
- package/src/rpc-util.js +14 -0
- package/src/services/blockchain/service.ts +1 -0
- package/src/services/credential/bbs-revocation.ts +2 -1
- package/src/services/credential/bound-check.test.ts +6 -6
- package/src/services/credential/bound-check.ts +4 -4
- package/src/services/credential/index.test.js +0 -2
- package/src/services/credential/service.ts +5 -2
- package/src/services/credential/utils.js +65 -23
- package/src/services/dids/index.test.js +8 -19
- package/src/services/dids/keypair-utils.js +111 -0
- package/src/services/dids/service.ts +6 -25
- package/src/services/edv/service.ts +2 -9
- package/src/services/index.js +0 -4
- package/src/services/test-utils.js +0 -29
- package/src/services/util-crypto/configs.ts +0 -12
- package/src/services/util-crypto/index.test.js +6 -83
- package/src/services/util-crypto/service-rpc.js +0 -20
- package/src/services/util-crypto/service.ts +62 -75
- package/src/services/wallet/configs.ts +1 -113
- package/src/services/wallet/index.test.js +0 -159
- package/src/services/wallet/service-rpc.js +1 -88
- package/src/services/wallet/service.ts +0 -258
- package/src/test-utils.js +0 -13
- package/lib/account-357ab05d.js +0 -742
- package/lib/account-399e6053.js +0 -752
- package/lib/core/polkadot-utils.js +0 -119
- package/lib/core/polkadot-utils.mjs +0 -94
- package/lib/core/realm-schemas.js +0 -50
- package/lib/core/realm-schemas.mjs +0 -44
- package/lib/core/subscan.js +0 -75
- package/lib/core/subscan.mjs +0 -64
- package/lib/fixtures.js +0 -56
- package/lib/fixtures.mjs +0 -52
- package/lib/modules/account.js +0 -48
- package/lib/modules/account.mjs +0 -40
- package/lib/modules/accounts.js +0 -49
- package/lib/modules/accounts.mjs +0 -40
- package/lib/modules/data-migration.js +0 -72
- package/lib/modules/data-migration.mjs +0 -68
- package/lib/modules/wallet-backup.js +0 -82
- package/lib/modules/wallet-backup.mjs +0 -71
- package/lib/modules/wallet.js +0 -49
- package/lib/modules/wallet.mjs +0 -40
- package/lib/services/example/configs.js +0 -21
- package/lib/services/example/configs.mjs +0 -13
- package/lib/services/example/index.js +0 -18
- package/lib/services/example/index.mjs +0 -14
- package/lib/services/example/service-rpc.js +0 -25
- package/lib/services/example/service-rpc.mjs +0 -21
- package/lib/services/example/service.js +0 -25
- package/lib/services/example/service.mjs +0 -20
- package/lib/services/keyring/configs.js +0 -70
- package/lib/services/keyring/configs.mjs +0 -61
- package/lib/services/keyring/index.android.js +0 -22
- package/lib/services/keyring/index.android.mjs +0 -18
- package/lib/services/keyring/index.ios.js +0 -22
- package/lib/services/keyring/index.ios.mjs +0 -18
- package/lib/services/keyring/index.js +0 -16
- package/lib/services/keyring/index.mjs +0 -8
- package/lib/services/keyring/service-rpc.js +0 -65
- package/lib/services/keyring/service-rpc.mjs +0 -61
- package/lib/services/keyring/service.js +0 -84
- package/lib/services/keyring/service.mjs +0 -74
- package/lib/services/polkadot/configs.js +0 -17
- package/lib/services/polkadot/configs.mjs +0 -13
- package/lib/services/polkadot/index.android.js +0 -22
- package/lib/services/polkadot/index.android.mjs +0 -18
- package/lib/services/polkadot/index.ios.js +0 -22
- package/lib/services/polkadot/index.ios.mjs +0 -18
- package/lib/services/polkadot/index.js +0 -15
- package/lib/services/polkadot/index.mjs +0 -7
- package/lib/services/polkadot/service-rpc.js +0 -30
- package/lib/services/polkadot/service-rpc.mjs +0 -26
- package/lib/services/polkadot/service.js +0 -28
- package/lib/services/polkadot/service.mjs +0 -23
- package/lib/src/core/polkadot-utils.d.ts +0 -11
- package/lib/src/core/polkadot-utils.d.ts.map +0 -1
- package/lib/src/modules/account.d.ts +0 -60
- package/lib/src/modules/account.d.ts.map +0 -1
- package/lib/src/modules/accounts.d.ts +0 -48
- package/lib/src/modules/accounts.d.ts.map +0 -1
- package/lib/src/modules/data-migration.d.ts +0 -7
- package/lib/src/modules/data-migration.d.ts.map +0 -1
- package/lib/src/modules/wallet-backup.d.ts +0 -12
- package/lib/src/modules/wallet-backup.d.ts.map +0 -1
- package/lib/src/modules/wallet.d.ts +0 -134
- package/lib/src/modules/wallet.d.ts.map +0 -1
- package/lib/src/services/blockchain/index.d.ts +0 -2
- package/lib/src/services/blockchain/index.d.ts.map +0 -1
- package/lib/src/services/example/configs.d.ts +0 -9
- package/lib/src/services/example/configs.d.ts.map +0 -1
- package/lib/src/services/example/service.d.ts +0 -8
- package/lib/src/services/example/service.d.ts.map +0 -1
- package/lib/src/services/keyring/configs.d.ts +0 -39
- package/lib/src/services/keyring/configs.d.ts.map +0 -1
- package/lib/src/services/keyring/index.d.ts +0 -2
- package/lib/src/services/keyring/index.d.ts.map +0 -1
- package/lib/src/services/polkadot/configs.d.ts +0 -8
- package/lib/src/services/polkadot/configs.d.ts.map +0 -1
- package/lib/src/services/polkadot/index.d.ts +0 -2
- package/lib/src/services/polkadot/index.d.ts.map +0 -1
- package/lib/src/services/polkadot/service.d.ts +0 -8
- package/lib/src/services/polkadot/service.d.ts.map +0 -1
- package/lib/src/services/wallet/index.d.ts +0 -2
- package/lib/src/services/wallet/index.d.ts.map +0 -1
- package/lib/test/axiosMocks.js +0 -431
- package/lib/test/axiosMocks.mjs +0 -420
- package/lib/test/setup-test-state.js +0 -81
- package/lib/test/setup-test-state.mjs +0 -73
- package/src/core/polkadot-utils.js +0 -99
- package/src/core/realm-schemas.js +0 -42
- package/src/core/subscan.js +0 -62
- package/src/core/subscan.test.js +0 -56
- package/src/fixtures.js +0 -43
- package/src/modules/account.test.js +0 -56
- package/src/modules/account.ts +0 -128
- package/src/modules/accounts.test.js +0 -63
- package/src/modules/accounts.ts +0 -231
- package/src/modules/data-migration.test.js +0 -61
- package/src/modules/data-migration.ts +0 -86
- package/src/modules/wallet-backup.test.js +0 -24
- package/src/modules/wallet-backup.ts +0 -68
- package/src/modules/wallet.test.js +0 -216
- package/src/modules/wallet.ts +0 -424
- package/src/services/example/configs.js +0 -14
- package/src/services/example/index.js +0 -3
- package/src/services/example/index.test.js +0 -28
- package/src/services/example/service-rpc.js +0 -11
- package/src/services/example/service.ts +0 -18
- package/src/services/keyring/configs.ts +0 -110
- package/src/services/keyring/index.android.js +0 -3
- package/src/services/keyring/index.ios.js +0 -3
- package/src/services/keyring/index.js +0 -1
- package/src/services/keyring/index.test.js +0 -48
- package/src/services/keyring/service-rpc.js +0 -56
- package/src/services/keyring/service.ts +0 -111
- package/src/services/polkadot/configs.ts +0 -13
- package/src/services/polkadot/index.android.js +0 -3
- package/src/services/polkadot/index.ios.js +0 -3
- package/src/services/polkadot/index.js +0 -1
- package/src/services/polkadot/index.test.js +0 -52
- package/src/services/polkadot/service-rpc.js +0 -13
- package/src/services/polkadot/service.ts +0 -21
- package/src/test/axiosMocks.js +0 -20
- package/src/test/fixtures/subscan-failure.json +0 -5
- package/src/test/fixtures/subscan-success.json +0 -370
- package/src/test/fixtures/subscan-too-many-requests.json +0 -9
- package/src/test/setup-test-state.js +0 -35
- package/src/test/test-wallet.test.js +0 -15
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code is based on the implementation from truvera api
|
|
3
|
+
* https://github.com/docknetwork/web/blob/3c706c5dc5de4ae63f548c76ec6edeb17533a0c9/apps/api/src/utils/key-manager.js
|
|
4
|
+
*/
|
|
5
|
+
import {Ed25519Keypair} from '@docknetwork/credential-sdk/keypairs';
|
|
6
|
+
import {hexToU8a, u8aToHex, u8aToU8a} from '@docknetwork/credential-sdk/utils';
|
|
7
|
+
// import {encodeBase58} from './dock-shared';
|
|
8
|
+
import * as bs58 from 'base58-universal';
|
|
9
|
+
|
|
10
|
+
export function getKeyPairType(key) {
|
|
11
|
+
const keyType = key.type || key.constructor.VerKeyType;
|
|
12
|
+
if (keyType) {
|
|
13
|
+
return keyType;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (key instanceof Ed25519Keypair) {
|
|
17
|
+
return 'Ed25519VerificationKey2018';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
throw new Error(`Unknown key type for ${key.constructor.name}`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const MULTIBASE_BASE58BTC_HEADER = 'z';
|
|
24
|
+
export const MULTICODEC_ED25519_PUB_HEADER = new Uint8Array([0xed, 0x01]);
|
|
25
|
+
export const MULTICODEC_ED25519_PRIV_HEADER = new Uint8Array([0x80, 0x26]);
|
|
26
|
+
|
|
27
|
+
export function encodeMbKey(header, key) {
|
|
28
|
+
const mbKey = new Uint8Array(header.length + key.length);
|
|
29
|
+
mbKey.set(header);
|
|
30
|
+
mbKey.set(key, header.length);
|
|
31
|
+
return MULTIBASE_BASE58BTC_HEADER + bs58.encode(mbKey);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function getKeyFingerprint(keyType, publicKey) {
|
|
35
|
+
if (keyType.startsWith('Ed25519')) {
|
|
36
|
+
return encodeMbKey(MULTICODEC_ED25519_PUB_HEADER, publicKey);
|
|
37
|
+
} else {
|
|
38
|
+
throw new Error(`Cannot detect key type for fingerprint: ${keyType}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const keyTypeToDocType = {
|
|
43
|
+
bjj: 'BJJVerificationKey2021',
|
|
44
|
+
secp256k1: 'EcdsaSecp256k1VerificationKey2019',
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export function keypairToKeydoc(key, controller, id = undefined) {
|
|
48
|
+
const keyType = getKeyPairType(key);
|
|
49
|
+
let keyDoc;
|
|
50
|
+
if (
|
|
51
|
+
keyType === 'Ed25519VerificationKey2020' ||
|
|
52
|
+
keyType === 'Ed25519VerificationKey2018'
|
|
53
|
+
) {
|
|
54
|
+
const publicKey = u8aToU8a(
|
|
55
|
+
(key.keyPair &&
|
|
56
|
+
key.keyPair.publicKey &&
|
|
57
|
+
u8aToU8a(key.keyPair.publicKey)) ||
|
|
58
|
+
key.publicKeyBuffer ||
|
|
59
|
+
(key.pk && key.pk.value),
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
if (!publicKey) {
|
|
63
|
+
throw new Error('Cannot find public key');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const pk = u8aToU8a(
|
|
67
|
+
(key.keyPair && key.keyPair.secretKey) ||
|
|
68
|
+
key.privateKeyBuffer ||
|
|
69
|
+
(key.sk &&
|
|
70
|
+
(typeof key.sk === 'string'
|
|
71
|
+
? hexToU8a(key.sk)
|
|
72
|
+
: key.sk.value || key.sk)) ||
|
|
73
|
+
hexToU8a(key.pk),
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const publicKeyBase58 = bs58.encode(publicKey);
|
|
77
|
+
const privateKeyBase58 = bs58.encode(pk);
|
|
78
|
+
|
|
79
|
+
const fingerprint =
|
|
80
|
+
(key.fingerprint && key.fingerprint()) ||
|
|
81
|
+
getKeyFingerprint(keyType, publicKey);
|
|
82
|
+
|
|
83
|
+
// auto create controller
|
|
84
|
+
if (!controller) {
|
|
85
|
+
controller = `did:key:${fingerprint}`;
|
|
86
|
+
id = id || key.id || `${controller}#${fingerprint}`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const keyId = id || key.id || `${controller}#${fingerprint}`;
|
|
90
|
+
const type = keyTypeToDocType[keyType] || keyType;
|
|
91
|
+
keyDoc = {
|
|
92
|
+
controller,
|
|
93
|
+
type,
|
|
94
|
+
id: keyId,
|
|
95
|
+
publicKeyMultibase: encodeMbKey(MULTICODEC_ED25519_PUB_HEADER, publicKey),
|
|
96
|
+
privateKeyMultibase: encodeMbKey(MULTICODEC_ED25519_PRIV_HEADER, pk),
|
|
97
|
+
privateKeyBase58,
|
|
98
|
+
publicKeyBase58,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
if (key.seed) {
|
|
102
|
+
keyDoc.seed = u8aToHex(key.seed);
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
throw new Error(`Unknown keypairToKeydoc type: ${keyType}`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
keyDoc['@context'] = ['https://w3id.org/wallet/v1'];
|
|
109
|
+
|
|
110
|
+
return keyDoc;
|
|
111
|
+
}
|
|
@@ -6,7 +6,6 @@ import {
|
|
|
6
6
|
KeypairToDIDKeyDocumentParams,
|
|
7
7
|
GetDIDResolutionParams,
|
|
8
8
|
} from './config';
|
|
9
|
-
import {keyringService} from '../keyring/service';
|
|
10
9
|
import {utilCryptoService} from '../util-crypto/service';
|
|
11
10
|
import assert from 'assert';
|
|
12
11
|
import {blockchainService, getDock} from '../blockchain/service';
|
|
@@ -20,13 +19,13 @@ import {
|
|
|
20
19
|
import {Ed25519Keypair} from '@docknetwork/credential-sdk/keypairs';
|
|
21
20
|
|
|
22
21
|
import {Logger} from '../../core/logger';
|
|
23
|
-
import {polkadotToKeydoc} from '../../core/polkadot-utils';
|
|
24
22
|
import base64url from 'base64url';
|
|
25
23
|
import {keyDocToKeypair} from '../credential/utils';
|
|
26
24
|
import {
|
|
27
25
|
Ed25519Signature2020,
|
|
28
26
|
EcdsaSecp256k1Signature2019,
|
|
29
27
|
} from '@docknetwork/credential-sdk/vc/crypto';
|
|
28
|
+
import { keypairToKeydoc } from './keypair-utils';
|
|
30
29
|
|
|
31
30
|
async function getSignerKeypair(privateKeyDoc) {
|
|
32
31
|
const privateKey =
|
|
@@ -84,34 +83,16 @@ class DIDService {
|
|
|
84
83
|
|
|
85
84
|
async generateKeyDoc(params) {
|
|
86
85
|
validation.generateKeyDoc(params);
|
|
87
|
-
const {derivePath = '', type = 'ed25519'
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (keyPairJSON) {
|
|
91
|
-
keyring = keyringService.keyring.addFromJson(keyPairJSON);
|
|
92
|
-
keyring.unlock('');
|
|
93
|
-
} else {
|
|
94
|
-
const mnemonic = await utilCryptoService.mnemonicGenerate(12);
|
|
95
|
-
keyring = keyringService.getKeyringPair({
|
|
96
|
-
mnemonic,
|
|
97
|
-
derivePath,
|
|
98
|
-
type,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return polkadotToKeydoc(keyring, params.controller);
|
|
86
|
+
const {derivePath = '', type = 'ed25519'} = params;
|
|
87
|
+
const keyPair = Ed25519Keypair.random()
|
|
88
|
+
return keypairToKeydoc(keyPair, params.controller);
|
|
103
89
|
}
|
|
104
90
|
|
|
105
91
|
async deriveKeyDoc(params) {
|
|
106
92
|
validation.deriveKeyDoc(params);
|
|
107
93
|
const { pair, type = 'ed25519' } = params;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
pair,
|
|
111
|
-
type,
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
return polkadotToKeydoc(keyring, params.controller);
|
|
94
|
+
const keyPair = new Ed25519Keypair(pair.secretKey, 'private')
|
|
95
|
+
return keypairToKeydoc(keyPair, params.controller);
|
|
115
96
|
}
|
|
116
97
|
|
|
117
98
|
async createSignedJWT({payload, privateKeyDoc, headerInput}) {
|
|
@@ -8,8 +8,7 @@ import {X25519KeyAgreementKey2020} from '@digitalbazaar/x25519-key-agreement-key
|
|
|
8
8
|
import {getKeypairFromDoc} from '@docknetwork/universal-wallet/methods/keypairs';
|
|
9
9
|
import {logger} from '@docknetwork/wallet-sdk-data-store/src/logger';
|
|
10
10
|
import {didService} from '@docknetwork/wallet-sdk-wasm/src/services/dids/service';
|
|
11
|
-
import {
|
|
12
|
-
import {ed25519PairFromSeed} from '@polkadot/util-crypto';
|
|
11
|
+
import {Ed25519Keypair} from '@docknetwork/credential-sdk/keypairs';
|
|
13
12
|
|
|
14
13
|
/**
|
|
15
14
|
* EDVService
|
|
@@ -97,9 +96,6 @@ export class EDVService {
|
|
|
97
96
|
}
|
|
98
97
|
|
|
99
98
|
async generateKeys() {
|
|
100
|
-
await keyringService.initialize({
|
|
101
|
-
ss58Format: 22,
|
|
102
|
-
});
|
|
103
99
|
const keyPair = await didService.generateKeyDoc({});
|
|
104
100
|
|
|
105
101
|
const verificationKey = await Ed25519VerificationKey2018.generate({
|
|
@@ -116,10 +112,7 @@ export class EDVService {
|
|
|
116
112
|
}
|
|
117
113
|
|
|
118
114
|
async deriveKeys(masterKey: Uint8Array) {
|
|
119
|
-
|
|
120
|
-
ss58Format: 22,
|
|
121
|
-
});
|
|
122
|
-
const pair = ed25519PairFromSeed(masterKey);
|
|
115
|
+
const {keyPair: pair} = new Ed25519Keypair(masterKey, 'seed');
|
|
123
116
|
|
|
124
117
|
const keyPair = await didService.deriveKeyDoc({ pair });
|
|
125
118
|
|
package/src/services/index.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import {keyringService} from './keyring/service';
|
|
2
1
|
import {blockchainService} from './blockchain/service';
|
|
3
2
|
import {walletService} from './wallet/service';
|
|
4
|
-
import {polkadotService} from './polkadot/service';
|
|
5
3
|
import {utilCryptoService} from './util-crypto/service';
|
|
6
4
|
import {storageService} from './storage/service';
|
|
7
5
|
import {didService} from './dids/service';
|
|
@@ -11,10 +9,8 @@ import {pexService} from './pex/service';
|
|
|
11
9
|
import {edvService} from './edv/service';
|
|
12
10
|
|
|
13
11
|
export default [
|
|
14
|
-
keyringService,
|
|
15
12
|
blockchainService,
|
|
16
13
|
walletService,
|
|
17
|
-
polkadotService,
|
|
18
14
|
utilCryptoService,
|
|
19
15
|
storageService,
|
|
20
16
|
didService,
|
|
@@ -1,18 +1,6 @@
|
|
|
1
|
-
import {cryptoWaitReady} from '@polkadot/util-crypto';
|
|
2
1
|
import assert from 'assert';
|
|
3
|
-
import {TestFixtures} from '../fixtures';
|
|
4
2
|
import {NetworkManager} from '../modules/network-manager';
|
|
5
|
-
import {keyringService} from './keyring';
|
|
6
3
|
import {RpcService} from './rpc-service-client';
|
|
7
|
-
import {walletService} from './wallet';
|
|
8
|
-
|
|
9
|
-
export async function initializeWalletService() {
|
|
10
|
-
await cryptoWaitReady();
|
|
11
|
-
await keyringService.initialize({
|
|
12
|
-
ss58Format: 21,
|
|
13
|
-
});
|
|
14
|
-
await walletService.create('test-wallet', 'memory');
|
|
15
|
-
}
|
|
16
4
|
|
|
17
5
|
export const TEST_FEE_AMOUNT = 2.48;
|
|
18
6
|
export const API_MOCK_DISABLED = process.env.API_MOCK_DISABLED === 'true';
|
|
@@ -39,23 +27,6 @@ export async function setupTestWallet() {
|
|
|
39
27
|
|
|
40
28
|
NetworkManager.getInstance().setNetworkId('testnet');
|
|
41
29
|
|
|
42
|
-
await cryptoWaitReady();
|
|
43
|
-
await keyringService.initialize({
|
|
44
|
-
ss58Format: NetworkManager.getInstance().getNetworkInfo().addressPrefix,
|
|
45
|
-
});
|
|
46
|
-
await walletService.create({
|
|
47
|
-
walletId: 'test-wallet',
|
|
48
|
-
type: 'memory',
|
|
49
|
-
});
|
|
50
|
-
await walletService.createAccountDocuments({
|
|
51
|
-
mnemonic: TestFixtures.account1.mnemonic,
|
|
52
|
-
name: TestFixtures.account1.name,
|
|
53
|
-
});
|
|
54
|
-
await walletService.createAccountDocuments({
|
|
55
|
-
mnemonic: TestFixtures.account2.mnemonic,
|
|
56
|
-
name: TestFixtures.account2.name,
|
|
57
|
-
});
|
|
58
|
-
|
|
59
30
|
walletCreated = true;
|
|
60
31
|
}
|
|
61
32
|
|
|
@@ -3,14 +3,6 @@ import assert from 'assert';
|
|
|
3
3
|
import {assertAddress} from '../../core/validation';
|
|
4
4
|
|
|
5
5
|
export const validation = {
|
|
6
|
-
deriveValidate(uri: string) {
|
|
7
|
-
assert(!!uri, 'uri is required');
|
|
8
|
-
},
|
|
9
|
-
|
|
10
|
-
isAddressValid(address: string) {
|
|
11
|
-
assertAddress(address);
|
|
12
|
-
},
|
|
13
|
-
|
|
14
6
|
mnemonicGenerate(numWords: number) {
|
|
15
7
|
if (numWords) {
|
|
16
8
|
assert(typeof numWords === 'number', 'invalid number of words');
|
|
@@ -20,8 +12,4 @@ export const validation = {
|
|
|
20
12
|
mnemonicToMiniSecret(phrase: string) {
|
|
21
13
|
assert(typeof phrase === 'string', 'invalid mnemonic phrase');
|
|
22
14
|
},
|
|
23
|
-
|
|
24
|
-
mnemonicValidate(phrase: string) {
|
|
25
|
-
assert(typeof phrase === 'string', 'invalid mnemonic phrase');
|
|
26
|
-
},
|
|
27
15
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {assertRpcService, getPromiseError} from '../test-utils';
|
|
1
|
+
import {assertRpcService} from '../test-utils';
|
|
3
2
|
import {validation} from './configs';
|
|
4
3
|
import {utilCryptoService as service} from './service';
|
|
5
4
|
import {UtilCryptoServiceRpc} from './service-rpc';
|
|
@@ -10,71 +9,19 @@ describe('UtilCryptoService', () => {
|
|
|
10
9
|
});
|
|
11
10
|
|
|
12
11
|
describe('service', () => {
|
|
13
|
-
beforeAll(async () => {
|
|
14
|
-
await cryptoWaitReady();
|
|
15
|
-
});
|
|
16
|
-
|
|
17
12
|
it('mnemonicGenerate', () => {
|
|
18
13
|
const result = service.mnemonicGenerate(12);
|
|
19
14
|
expect(typeof result).toBe('string');
|
|
20
15
|
});
|
|
21
16
|
|
|
22
|
-
it('isAddressValid', async () => {
|
|
23
|
-
expect(
|
|
24
|
-
await service.isAddressValid(
|
|
25
|
-
'3HM9DYxHe5tAwh2cuErNHiLxSMDJhetxaVGCDTYXiwyuuHN6',
|
|
26
|
-
),
|
|
27
|
-
).toBe(true);
|
|
28
|
-
|
|
29
|
-
expect(await service.isAddressValid('wrong value')).toBe(false);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('mnemonicValidate', () => {
|
|
33
|
-
it('expect mnemonic to be valid', async () => {
|
|
34
|
-
const phrase = await service.mnemonicGenerate(12);
|
|
35
|
-
const isValid = await service.mnemonicValidate(phrase);
|
|
36
|
-
|
|
37
|
-
expect(isValid).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('expect mnemonic to be invalid', async () => {
|
|
41
|
-
const isValid = await service.mnemonicValidate('invalid mnemonic');
|
|
42
|
-
|
|
43
|
-
expect(isValid).toBe(false);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
describe('deriveValidate', () => {
|
|
48
|
-
let phrase;
|
|
49
|
-
|
|
50
|
-
beforeAll(async () => {
|
|
51
|
-
phrase = await service.mnemonicGenerate(12);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('expect derive path to be valid', async () => {
|
|
55
|
-
const result = await service.deriveValidate(`${phrase}/stuff/stuff`);
|
|
56
|
-
expect(result).toStrictEqual({});
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('expect derive path to not be valid', async () => {
|
|
60
|
-
const error = await getPromiseError(() =>
|
|
61
|
-
service.deriveValidate('wrong phrase'),
|
|
62
|
-
);
|
|
63
|
-
expect(error.message).toBe('invalid derive path');
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('expect derive path to have warning', async () => {
|
|
67
|
-
const result = await service.deriveValidate(
|
|
68
|
-
`${phrase}/stuff///pass/tst`,
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
expect(result.warning).toBe('slash password detected');
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
|
|
75
17
|
describe('isBase64', () => {
|
|
76
18
|
it('expect to be base64', async () => {
|
|
77
19
|
expect(await service.isBase64('dGVzdA==')).toBe(true);
|
|
20
|
+
expect(
|
|
21
|
+
await service.isBase64(
|
|
22
|
+
'eyJ0eXAiOiJhcHBsaWNhdGlvbi9kaWRjb21tLWVuY3J5cHRlZCtqc29uIiwicHJvdGVjdGVkIjoiZXlKbGJtTWlPaUpZUXpJd1VDSjkiLCJyZWNpcGllbnRzIjpbeyJoZWFkZXIiOnsia2lkIjoiZGlkOmtleTp6Nk1raE43UEJqV2dTTVEyNEJlYmRwdnZ3OGZWUnY3bTZNSERxaXdUS296ekJnckojejZMU29qOXpqWmhBcDdNUFFjUndDMnludUJYdXk5YkVnVks1aDNzVFo5c01nMUdtIiwiYWxnIjoiRUNESC0xUFUrQTI1NktXIiwiZXBrIjp7Imt0eSI6Ik9LUCIsImNydiI6IlgyNTUxOSIsIngiOiJoLXE4elVXVkt2VE9GQWNYUVRRbllvckhBQlk0Y044ZVNkRy1yT0JjWlFvIn0sImFwdSI6IlpHbGtPbXRsZVRwNk5rMXJhRTQzVUVKcVYyZFRUVkV5TkVKbFltUndkblozT0daV1VuWTNiVFpOU0VSeGFYZFVTMjk2ZWtKbmNrb2plalpNVTI5cU9YcHFXbWhCY0RkTlVGRmpVbmRETW5sdWRVSllkWGs1WWtWblZrczFhRE56VkZvNWMwMW5NVWR0IiwiYXB2IjoiWkdsa09tdGxlVHA2TmsxcmFFNDNVRUpxVjJkVFRWRXlORUpsWW1Sd2RuWjNPR1pXVW5ZM2JUWk5TRVJ4YVhkVVMyOTZla0puY2tvamVqWk1VMjlxT1hwcVdtaEJjRGROVUZGalVuZERNbmx1ZFVKWWRYazVZa1ZuVmtzMWFETnpWRm81YzAxbk1VZHQiLCJza2lkIjoiZGlkOmtleTp6Nk1raE43UEJqV2dTTVEyNEJlYmRwdnZ3OGZWUnY3bTZNSERxaXdUS296ekJnckojejZMU29qOXpqWmhBcDdNUFFjUndDMnludUJYdXk5YkVnVks1aDNzVFo5c01nMUdtIn0sImVuY3J5cHRlZF9rZXkiOiJNSUxvRFFBWEFFV0xTamdSVnZ3WlduLXE4RUlBUGtCUURpNWEtZDJvX084NW12OERnUncyZHcifV0sIml2IjoiT2FLY21DbW9GTDZiLVRxcVluQ1NUMGFLSkhoUTUwSW4iLCJjaXBoZXJ0ZXh0IjoiTkx4UkkxZjhaNVpQNTVjZVVubHk3SVBKOWpvbXItYUk5RkhlNW9xZHQ5cmNTb3h3RC1CdHItSHdvWmZRZFlPbVRzVndEaVpoQmdmT0ZMeVgtMExlbDl1U3piYjk3SzljQ3h2djBDVnF5a1lNQmpaTno2QWtVek9uS1p0ZWRrWnE3UXFRb2ZNMXoyOEt4SXc5emdSaDNDcWJ0MmpPbTZiMUxfbnkwOWF0TXdob2hZdUpPVko0R2FBdTBBZXJDaURjaDZsNFVGbzU3U2FEdWFvZ3VoTGZ4eUMzZjRFbGVpYUFOcTdmWmhYOEV5ZkxELWpqaEY0RlZocUhXbk5aRTRRbm5JdHhlblRtWi02b0hETDNnaUJCTXFlaXJpcTFFcWpFM1JfVUVqVlJJclEzTmZwSmZqc3V4MnBpY0k5RXp5ZUhMQSIsInRhZyI6IkVDX2NnZzVWSVdfWUNYdno3MzgyUHcifQ',
|
|
23
|
+
),
|
|
24
|
+
).toBe(true);
|
|
78
25
|
});
|
|
79
26
|
|
|
80
27
|
it('expect to not be base64', async () => {
|
|
@@ -82,29 +29,5 @@ describe('UtilCryptoService', () => {
|
|
|
82
29
|
expect(await service.isBase64('Test')).toBe(false);
|
|
83
30
|
});
|
|
84
31
|
});
|
|
85
|
-
|
|
86
|
-
describe('getAddressPrefix', () => {
|
|
87
|
-
const MAINNET_PREFIX = 22;
|
|
88
|
-
const TESTNET_PREFIX = 21;
|
|
89
|
-
it('expect to match mainnet prefix', () => {
|
|
90
|
-
const result = service.getAddressPrefix({
|
|
91
|
-
address: '3EGurYbWGtyVfouDTZjxz1t2jiV3voU9N6sSDAvhHyxaqf8L',
|
|
92
|
-
startPrefix: TESTNET_PREFIX,
|
|
93
|
-
endPrefix: MAINNET_PREFIX,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
expect(result).toBe(MAINNET_PREFIX);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('expect to match testnet prefix', () => {
|
|
100
|
-
const result = service.getAddressPrefix({
|
|
101
|
-
address: '37PsGbLmrTfV6VVknkrh6LKACXuC9LuSCwuxhk6ajGDjNCwc',
|
|
102
|
-
startPrefix: TESTNET_PREFIX,
|
|
103
|
-
endPrefix: MAINNET_PREFIX,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
expect(result).toBe(TESTNET_PREFIX);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
32
|
});
|
|
110
33
|
});
|
|
@@ -18,26 +18,6 @@ export class UtilCryptoServiceRpc extends RpcService {
|
|
|
18
18
|
return this.call('mnemonicToMiniSecret', phrase);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
mnemonicValidate(phrase: string): Promise<any> {
|
|
22
|
-
validation.mnemonicValidate(phrase);
|
|
23
|
-
|
|
24
|
-
return this.call('mnemonicValidate', phrase);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
cryptoWaitReady(): Promise<any> {
|
|
28
|
-
return this.call('cryptoWaitReady');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
cryptoIsReady(): Promise<any> {
|
|
32
|
-
return this.call('cryptoIsReady');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
isAddressValid(address: string): Promise<any> {
|
|
36
|
-
validation.deriveValidate(address);
|
|
37
|
-
|
|
38
|
-
return this.call('isAddressValid', address);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
21
|
deriveValidate(uri: string): Promise<any> {
|
|
42
22
|
validation.deriveValidate(uri);
|
|
43
23
|
return this.call('deriveValidate', uri);
|
|
@@ -1,44 +1,66 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
cryptoIsReady,
|
|
6
|
-
cryptoWaitReady,
|
|
7
|
-
keyExtractSuri,
|
|
8
|
-
mnemonicGenerate,
|
|
9
|
-
mnemonicToMiniSecret,
|
|
10
|
-
mnemonicValidate,
|
|
11
|
-
} from '@polkadot/util-crypto';
|
|
2
|
+
import {hexToU8a, u8aToString} from '@docknetwork/credential-sdk/utils';
|
|
3
|
+
import * as bip39 from '@scure/bip39';
|
|
4
|
+
import {wordlist} from '@scure/bip39/wordlists/english';
|
|
12
5
|
import assert from 'assert';
|
|
13
6
|
import {validation} from './configs';
|
|
14
7
|
|
|
8
|
+
function isHex(value: string) {
|
|
9
|
+
const isDefinitelyHexString = value.startsWith('0x');
|
|
10
|
+
const isHex =
|
|
11
|
+
isDefinitelyHexString || (/^[0-9a-fA-F]+$/.test(value) && value.length % 2 === 0);
|
|
12
|
+
|
|
13
|
+
return isHex;
|
|
14
|
+
}
|
|
15
|
+
|
|
15
16
|
export class UtilCryptoService {
|
|
16
17
|
rpcMethods = [
|
|
17
18
|
UtilCryptoService.prototype.mnemonicGenerate,
|
|
18
19
|
UtilCryptoService.prototype.mnemonicToMiniSecret,
|
|
19
|
-
UtilCryptoService.prototype.mnemonicValidate,
|
|
20
|
-
UtilCryptoService.prototype.cryptoWaitReady,
|
|
21
|
-
UtilCryptoService.prototype.cryptoIsReady,
|
|
22
|
-
UtilCryptoService.prototype.isAddressValid,
|
|
23
|
-
UtilCryptoService.prototype.deriveValidate,
|
|
24
20
|
UtilCryptoService.prototype.isBase64,
|
|
25
|
-
UtilCryptoService.prototype.
|
|
21
|
+
UtilCryptoService.prototype.hexToString,
|
|
26
22
|
];
|
|
27
23
|
|
|
28
24
|
constructor() {
|
|
29
25
|
this.name = 'utilCrypto';
|
|
30
26
|
}
|
|
31
27
|
|
|
32
|
-
mnemonicGenerate(numWords) {
|
|
28
|
+
mnemonicGenerate(numWords = 12) {
|
|
33
29
|
validation.mnemonicGenerate(numWords);
|
|
34
30
|
|
|
35
|
-
|
|
31
|
+
// @scure/bip39 uses strength in bits, not number of words
|
|
32
|
+
// 12 words = 128 bits, 15 words = 160 bits, 18 words = 192 bits, 21 words = 224 bits, 24 words = 256 bits
|
|
33
|
+
const strengthMap = {
|
|
34
|
+
12: 128,
|
|
35
|
+
15: 160,
|
|
36
|
+
18: 192,
|
|
37
|
+
21: 224,
|
|
38
|
+
24: 256
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const strength = strengthMap[numWords];
|
|
42
|
+
if (!strength) {
|
|
43
|
+
throw new Error(`Invalid number of words: ${numWords}. Supported values: 12, 15, 18, 21, 24`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return bip39.generateMnemonic(wordlist, strength);
|
|
36
47
|
}
|
|
37
48
|
|
|
38
49
|
mnemonicToMiniSecret(phrase) {
|
|
39
50
|
validation.mnemonicToMiniSecret(phrase);
|
|
40
51
|
|
|
41
|
-
|
|
52
|
+
// Convert mnemonic to entropy which gives us a 32-byte mini secret for 12-word mnemonics
|
|
53
|
+
// This matches the behavior of Polkadot's mnemonicToMiniSecret
|
|
54
|
+
const entropy = bip39.mnemonicToEntropy(phrase, wordlist);
|
|
55
|
+
|
|
56
|
+
// For 12-word mnemonics, entropy is already 16 bytes (128 bits)
|
|
57
|
+
// We need to pad it to 32 bytes to match Polkadot's mini secret size
|
|
58
|
+
// Polkadot uses PBKDF2 with specific parameters, but for compatibility
|
|
59
|
+
// we can use the seed derivation and take the first 32 bytes
|
|
60
|
+
const seed = bip39.mnemonicToSeedSync(phrase);
|
|
61
|
+
|
|
62
|
+
// Return first 32 bytes as Uint8Array to match the expected mini secret format
|
|
63
|
+
return new Uint8Array(seed.slice(0, 32));
|
|
42
64
|
}
|
|
43
65
|
|
|
44
66
|
isBase64(value) {
|
|
@@ -46,72 +68,37 @@ export class UtilCryptoService {
|
|
|
46
68
|
return false;
|
|
47
69
|
}
|
|
48
70
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return value === encoded2;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
mnemonicValidate(phrase) {
|
|
55
|
-
validation.mnemonicValidate(phrase);
|
|
56
|
-
|
|
57
|
-
return mnemonicValidate(phrase);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
cryptoWaitReady() {
|
|
61
|
-
return cryptoWaitReady();
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
cryptoIsReady(...args) {
|
|
65
|
-
return cryptoIsReady();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
getAddressPrefix(params) {
|
|
69
|
-
const {address, startPrefix, endPrefix} = params;
|
|
70
|
-
|
|
71
|
-
for (let prefix = startPrefix; prefix <= endPrefix; prefix++) {
|
|
72
|
-
try {
|
|
73
|
-
const decoded = decodeAddress(address);
|
|
74
|
-
const reencoded = encodeAddress(decoded, prefix);
|
|
75
|
-
|
|
76
|
-
if (reencoded === address) {
|
|
77
|
-
return prefix;
|
|
78
|
-
}
|
|
79
|
-
} catch (err) {
|
|
80
|
-
// Ignore invalid prefixes
|
|
81
|
-
}
|
|
71
|
+
if (value === '') {
|
|
72
|
+
return false;
|
|
82
73
|
}
|
|
83
74
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
validation.isAddressValid(address);
|
|
75
|
+
const regex = '(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}(==)?|[A-Za-z0-9+\\/]{3}=?)?';
|
|
76
|
+
if (!(new RegExp('^' + regex + '$', 'gi')).test(value)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
89
79
|
|
|
90
80
|
try {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
81
|
+
const decoded = Buffer.from(value, 'base64');
|
|
82
|
+
const asUtf8 = decoded.toString('utf8');
|
|
83
|
+
const reencoded = Buffer.from(asUtf8, 'utf8').toString('base64');
|
|
84
|
+
|
|
85
|
+
const normalize = (str) => str.replace(/=+$/, '');
|
|
86
|
+
|
|
87
|
+
return normalize(value) === normalize(reencoded);
|
|
88
|
+
} catch (e) {
|
|
97
89
|
return false;
|
|
98
90
|
}
|
|
99
91
|
}
|
|
100
92
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
assert(path.length, 'invalid derive path');
|
|
108
|
-
|
|
109
|
-
// show a warning in case the password contains an unintended / character
|
|
110
|
-
if (password && password.includes('/')) {
|
|
111
|
-
result = {warning: 'slash password detected'};
|
|
93
|
+
hexToString(hex: string): string {
|
|
94
|
+
try {
|
|
95
|
+
const bytes = hexToU8a(hex);
|
|
96
|
+
return u8aToString(bytes);
|
|
97
|
+
} catch (e) {
|
|
98
|
+
console.log('error: ', e);
|
|
112
99
|
}
|
|
113
100
|
|
|
114
|
-
return
|
|
101
|
+
return '';
|
|
115
102
|
}
|
|
116
103
|
}
|
|
117
104
|
|