@libp2p/crypto 2.0.2 → 2.0.3
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/dist/index.min.js +39 -15
- package/dist/src/keys/ed25519-browser.js +3 -3
- package/dist/src/keys/ed25519-browser.js.map +1 -1
- package/dist/src/keys/secp256k1.d.ts.map +1 -1
- package/dist/src/keys/secp256k1.js +6 -5
- package/dist/src/keys/secp256k1.js.map +1 -1
- package/dist/src/random-bytes.js +2 -2
- package/dist/src/random-bytes.js.map +1 -1
- package/package.json +6 -6
- package/src/aes/index.ts +3 -3
- package/src/ciphers/aes-gcm.browser.ts +1 -1
- package/src/ciphers/aes-gcm.ts +4 -4
- package/src/hmac/index-browser.ts +1 -1
- package/src/hmac/index.ts +1 -1
- package/src/keys/ecdh.ts +2 -2
- package/src/keys/ed25519-browser.ts +3 -3
- package/src/keys/ed25519-class.ts +2 -2
- package/src/keys/index.ts +4 -4
- package/src/keys/rsa-class.ts +3 -3
- package/src/keys/rsa.ts +3 -3
- package/src/keys/secp256k1.ts +6 -5
- package/src/random-bytes.ts +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ed25519 as ed } from '@noble/curves/ed25519';
|
|
2
2
|
const PUBLIC_KEY_BYTE_LENGTH = 32;
|
|
3
3
|
const PRIVATE_KEY_BYTE_LENGTH = 64; // private key is actually 32 bytes but for historical reasons we concat private and public keys
|
|
4
4
|
const KEYS_BYTE_LENGTH = 32;
|
|
@@ -7,7 +7,7 @@ export { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength };
|
|
|
7
7
|
export async function generateKey() {
|
|
8
8
|
// the actual private key (32 bytes)
|
|
9
9
|
const privateKeyRaw = ed.utils.randomPrivateKey();
|
|
10
|
-
const publicKey =
|
|
10
|
+
const publicKey = ed.getPublicKey(privateKeyRaw);
|
|
11
11
|
// concatenated the public key to the private key
|
|
12
12
|
const privateKey = concatKeys(privateKeyRaw, publicKey);
|
|
13
13
|
return {
|
|
@@ -27,7 +27,7 @@ export async function generateKeyFromSeed(seed) {
|
|
|
27
27
|
}
|
|
28
28
|
// based on node forges algorithm, the seed is used directly as private key
|
|
29
29
|
const privateKeyRaw = seed;
|
|
30
|
-
const publicKey =
|
|
30
|
+
const publicKey = ed.getPublicKey(privateKeyRaw);
|
|
31
31
|
const privateKey = concatKeys(privateKeyRaw, publicKey);
|
|
32
32
|
return {
|
|
33
33
|
privateKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ed25519-browser.js","sourceRoot":"","sources":["../../../src/keys/ed25519-browser.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ed25519-browser.js","sourceRoot":"","sources":["../../../src/keys/ed25519-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,uBAAuB,CAAA;AAGrD,MAAM,sBAAsB,GAAG,EAAE,CAAA;AACjC,MAAM,uBAAuB,GAAG,EAAE,CAAA,CAAC,gGAAgG;AACnI,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,OAAO,EAAE,sBAAsB,IAAI,eAAe,EAAE,CAAA;AACpD,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,CAAA;AAEtD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,oCAAoC;IACpC,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAA;IACjD,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;IAEhD,iDAAiD;IACjD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAEvD,OAAO;QACL,UAAU;QACV,SAAS;KACV,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAE,IAAgB;IACzD,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,EAAE;QACpC,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAA;KAC1D;SAAM,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC,EAAE;QACxC,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAA;KACvE;IAED,2EAA2E;IAC3E,MAAM,aAAa,GAAG,IAAI,CAAA;IAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;IAEhD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAEvD,OAAO;QACL,UAAU;QACV,SAAS;KACV,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAE,UAAsB,EAAE,GAAe;IACxE,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;IAE9D,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAE,SAAqB,EAAE,GAAe,EAAE,GAAe;IAC1F,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;AACvC,CAAC;AAED,SAAS,UAAU,CAAE,aAAyB,EAAE,SAAqB;IACnE,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,uBAAuB,CAAC,CAAA;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE;QACzC,UAAU,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QAChC,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;KAChD;IACD,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secp256k1.d.ts","sourceRoot":"","sources":["../../../src/keys/secp256k1.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,uBAAuB,KAAK,CAAA;AAElC,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,CAAA;AAEtD,wBAAgB,WAAW,IAAK,UAAU,CAEzC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"secp256k1.d.ts","sourceRoot":"","sources":["../../../src/keys/secp256k1.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,uBAAuB,KAAK,CAAA;AAElC,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,CAAA;AAEtD,wBAAgB,WAAW,IAAK,UAAU,CAEzC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAQxF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxG;AAED,wBAAgB,iBAAiB,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAG9D;AAED,wBAAgB,mBAAmB,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAGhE;AAED,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAMzD;AAED,wBAAgB,iBAAiB,CAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAMxD;AAED,wBAAgB,gBAAgB,CAAE,UAAU,EAAE,UAAU,GAAG,UAAU,CAMpE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CodeError } from '@libp2p/interface/errors';
|
|
2
|
-
import
|
|
2
|
+
import { secp256k1 as secp } from '@noble/curves/secp256k1';
|
|
3
3
|
import { sha256 } from 'multiformats/hashes/sha2';
|
|
4
4
|
const PRIVATE_KEY_BYTE_LENGTH = 32;
|
|
5
5
|
export { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength };
|
|
@@ -12,7 +12,8 @@ export function generateKey() {
|
|
|
12
12
|
export async function hashAndSign(key, msg) {
|
|
13
13
|
const { digest } = await sha256.digest(msg);
|
|
14
14
|
try {
|
|
15
|
-
|
|
15
|
+
const signature = secp.sign(digest, key);
|
|
16
|
+
return signature.toDERRawBytes();
|
|
16
17
|
}
|
|
17
18
|
catch (err) {
|
|
18
19
|
throw new CodeError(String(err), 'ERR_INVALID_INPUT');
|
|
@@ -31,11 +32,11 @@ export async function hashAndVerify(key, sig, msg) {
|
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
export function compressPublicKey(key) {
|
|
34
|
-
const point = secp.
|
|
35
|
+
const point = secp.ProjectivePoint.fromHex(key).toRawBytes(true);
|
|
35
36
|
return point;
|
|
36
37
|
}
|
|
37
38
|
export function decompressPublicKey(key) {
|
|
38
|
-
const point = secp.
|
|
39
|
+
const point = secp.ProjectivePoint.fromHex(key).toRawBytes(false);
|
|
39
40
|
return point;
|
|
40
41
|
}
|
|
41
42
|
export function validatePrivateKey(key) {
|
|
@@ -48,7 +49,7 @@ export function validatePrivateKey(key) {
|
|
|
48
49
|
}
|
|
49
50
|
export function validatePublicKey(key) {
|
|
50
51
|
try {
|
|
51
|
-
secp.
|
|
52
|
+
secp.ProjectivePoint.fromHex(key);
|
|
52
53
|
}
|
|
53
54
|
catch (err) {
|
|
54
55
|
throw new CodeError(String(err), 'ERR_INVALID_PUBLIC_KEY');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secp256k1.js","sourceRoot":"","sources":["../../../src/keys/secp256k1.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"secp256k1.js","sourceRoot":"","sources":["../../../src/keys/secp256k1.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAEjD,MAAM,uBAAuB,GAAG,EAAE,CAAA;AAElC,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,CAAA;AAEtD,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAA;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAE,GAAe,EAAE,GAAe;IACjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC3C,IAAI;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACxC,OAAO,SAAS,CAAC,aAAa,EAAE,CAAA;KACjC;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAA;KACtD;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAE,GAAe,EAAE,GAAe,EAAE,GAAe;IACpF,IAAI;QACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;KACrC;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAA;KACtD;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAE,GAAe;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAChE,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAE,GAAe;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IACjE,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAE,GAAe;IACjD,IAAI;QACF,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;KAC7B;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,yBAAyB,CAAC,CAAA;KAC5D;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAE,GAAe;IAChD,IAAI;QACF,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;KAClC;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,wBAAwB,CAAC,CAAA;KAC3D;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAE,UAAsB;IACtD,IAAI;QACF,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;KAC3C;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,yBAAyB,CAAC,CAAA;KAC5D;AACH,CAAC"}
|
package/dist/src/random-bytes.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { CodeError } from '@libp2p/interface/errors';
|
|
2
|
-
import {
|
|
2
|
+
import { randomBytes as randB } from '@noble/hashes/utils';
|
|
3
3
|
export default function randomBytes(length) {
|
|
4
4
|
if (isNaN(length) || length <= 0) {
|
|
5
5
|
throw new CodeError('random bytes length must be a Number bigger than 0', 'ERR_INVALID_LENGTH');
|
|
6
6
|
}
|
|
7
|
-
return
|
|
7
|
+
return randB(length);
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=random-bytes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random-bytes.js","sourceRoot":"","sources":["../../src/random-bytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"random-bytes.js","sourceRoot":"","sources":["../../src/random-bytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,WAAW,IAAI,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAE1D,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,MAAc;IACjD,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;QAChC,MAAM,IAAI,SAAS,CAAC,oDAAoD,EAAE,oBAAoB,CAAC,CAAA;KAChG;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAA;AACtB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/crypto",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "Crypto primitives for libp2p",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p/tree/master/packages/crypto#readme",
|
|
@@ -85,18 +85,18 @@
|
|
|
85
85
|
"generate": "protons ./src/keys/keys.proto"
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
|
-
"@libp2p/interface": "^0.1.
|
|
89
|
-
"@noble/
|
|
90
|
-
"@noble/
|
|
88
|
+
"@libp2p/interface": "^0.1.2",
|
|
89
|
+
"@noble/curves": "^1.1.0",
|
|
90
|
+
"@noble/hashes": "^1.3.1",
|
|
91
91
|
"multiformats": "^12.0.1",
|
|
92
92
|
"node-forge": "^1.1.0",
|
|
93
93
|
"protons-runtime": "^5.0.0",
|
|
94
94
|
"uint8arraylist": "^2.4.3",
|
|
95
|
-
"uint8arrays": "^4.0.
|
|
95
|
+
"uint8arrays": "^4.0.6"
|
|
96
96
|
},
|
|
97
97
|
"devDependencies": {
|
|
98
98
|
"@types/mocha": "^10.0.0",
|
|
99
|
-
"aegir": "^40.0.
|
|
99
|
+
"aegir": "^40.0.8",
|
|
100
100
|
"benchmark": "^2.1.4",
|
|
101
101
|
"protons": "^7.0.2"
|
|
102
102
|
},
|
package/src/aes/index.ts
CHANGED
|
@@ -6,17 +6,17 @@ export interface AESCipher {
|
|
|
6
6
|
decrypt: (data: Uint8Array) => Promise<Uint8Array>
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export async function create (key: Uint8Array, iv: Uint8Array): Promise<AESCipher> {
|
|
9
|
+
export async function create (key: Uint8Array, iv: Uint8Array): Promise<AESCipher> {
|
|
10
10
|
const mode = cipherMode(key)
|
|
11
11
|
const cipher = ciphers.createCipheriv(mode, key, iv)
|
|
12
12
|
const decipher = ciphers.createDecipheriv(mode, key, iv)
|
|
13
13
|
|
|
14
14
|
const res: AESCipher = {
|
|
15
|
-
async encrypt (data) {
|
|
15
|
+
async encrypt (data) {
|
|
16
16
|
return cipher.update(data)
|
|
17
17
|
},
|
|
18
18
|
|
|
19
|
-
async decrypt (data) {
|
|
19
|
+
async decrypt (data) {
|
|
20
20
|
return decipher.update(data)
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -32,7 +32,7 @@ export function create (opts?: CreateOptions): AESCipher {
|
|
|
32
32
|
* Uses the provided password to derive a pbkdf2 key. The key
|
|
33
33
|
* will then be used to encrypt the data.
|
|
34
34
|
*/
|
|
35
|
-
async function encrypt (data: Uint8Array, password: string | Uint8Array): Promise<Uint8Array> {
|
|
35
|
+
async function encrypt (data: Uint8Array, password: string | Uint8Array): Promise<Uint8Array> {
|
|
36
36
|
const salt = crypto.getRandomValues(new Uint8Array(saltLength))
|
|
37
37
|
const nonce = crypto.getRandomValues(new Uint8Array(nonceLength))
|
|
38
38
|
const aesGcm = { name: algorithm, iv: nonce }
|
package/src/ciphers/aes-gcm.ts
CHANGED
|
@@ -14,7 +14,7 @@ export function create (opts?: CreateOptions): AESCipher {
|
|
|
14
14
|
const iterations = opts?.iterations ?? 32767
|
|
15
15
|
const algorithmTagLength = opts?.algorithmTagLength ?? 16
|
|
16
16
|
|
|
17
|
-
async function encryptWithKey (data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {
|
|
17
|
+
async function encryptWithKey (data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {
|
|
18
18
|
const nonce = crypto.randomBytes(nonceLength)
|
|
19
19
|
|
|
20
20
|
// Create the cipher instance.
|
|
@@ -31,7 +31,7 @@ export function create (opts?: CreateOptions): AESCipher {
|
|
|
31
31
|
* Uses the provided password to derive a pbkdf2 key. The key
|
|
32
32
|
* will then be used to encrypt the data.
|
|
33
33
|
*/
|
|
34
|
-
async function encrypt (data: Uint8Array, password: string | Uint8Array): Promise<Uint8Array> {
|
|
34
|
+
async function encrypt (data: Uint8Array, password: string | Uint8Array): Promise<Uint8Array> {
|
|
35
35
|
// Generate a 128-bit salt using a CSPRNG.
|
|
36
36
|
const salt = crypto.randomBytes(saltLength)
|
|
37
37
|
|
|
@@ -53,7 +53,7 @@ export function create (opts?: CreateOptions): AESCipher {
|
|
|
53
53
|
* this decryption cipher must be the same as those used to create
|
|
54
54
|
* the encryption cipher.
|
|
55
55
|
*/
|
|
56
|
-
async function decryptWithKey (ciphertextAndNonce: Uint8Array, key: Uint8Array): Promise<Uint8Array> {
|
|
56
|
+
async function decryptWithKey (ciphertextAndNonce: Uint8Array, key: Uint8Array): Promise<Uint8Array> {
|
|
57
57
|
// Create Uint8Arrays of nonce, ciphertext and tag.
|
|
58
58
|
const nonce = ciphertextAndNonce.subarray(0, nonceLength)
|
|
59
59
|
const ciphertext = ciphertextAndNonce.subarray(nonceLength, ciphertextAndNonce.length - algorithmTagLength)
|
|
@@ -77,7 +77,7 @@ export function create (opts?: CreateOptions): AESCipher {
|
|
|
77
77
|
* @param {Uint8Array} data - The data to decrypt
|
|
78
78
|
* @param {string|Uint8Array} password - A plain password
|
|
79
79
|
*/
|
|
80
|
-
async function decrypt (data: Uint8Array, password: string | Uint8Array): Promise<Uint8Array> {
|
|
80
|
+
async function decrypt (data: Uint8Array, password: string | Uint8Array): Promise<Uint8Array> {
|
|
81
81
|
// Create Uint8Arrays of salt and ciphertextAndNonce.
|
|
82
82
|
const salt = data.subarray(0, saltLength)
|
|
83
83
|
const ciphertextAndNonce = data.subarray(saltLength)
|
|
@@ -27,7 +27,7 @@ export async function create (hashType: 'SHA1' | 'SHA256' | 'SHA512', secret: Ui
|
|
|
27
27
|
)
|
|
28
28
|
|
|
29
29
|
return {
|
|
30
|
-
async digest (data: Uint8Array) {
|
|
30
|
+
async digest (data: Uint8Array) {
|
|
31
31
|
return sign(key, data)
|
|
32
32
|
},
|
|
33
33
|
length: lengths[hashType]
|
package/src/hmac/index.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface HMAC {
|
|
|
8
8
|
|
|
9
9
|
export async function create (hash: 'SHA1' | 'SHA256' | 'SHA512', secret: Uint8Array): Promise<HMAC> {
|
|
10
10
|
const res = {
|
|
11
|
-
async digest (data: Uint8Array) {
|
|
11
|
+
async digest (data: Uint8Array) {
|
|
12
12
|
const hmac = crypto.createHmac(hash.toLowerCase(), secret)
|
|
13
13
|
hmac.update(data)
|
|
14
14
|
return hmac.digest()
|
package/src/keys/ecdh.ts
CHANGED
|
@@ -11,7 +11,7 @@ const curves = {
|
|
|
11
11
|
const curveTypes = Object.keys(curves)
|
|
12
12
|
const names = curveTypes.join(' / ')
|
|
13
13
|
|
|
14
|
-
export async function generateEphmeralKeyPair (curve: string): Promise<ECDHKey> {
|
|
14
|
+
export async function generateEphmeralKeyPair (curve: string): Promise<ECDHKey> {
|
|
15
15
|
if (curve !== 'P-256' && curve !== 'P-384' && curve !== 'P-521') {
|
|
16
16
|
throw new CodeError(`Unknown curve: ${curve}. Must be ${names}`, 'ERR_INVALID_CURVE')
|
|
17
17
|
}
|
|
@@ -22,7 +22,7 @@ export async function generateEphmeralKeyPair (curve: string): Promise<ECDHKey>
|
|
|
22
22
|
return {
|
|
23
23
|
key: ecdh.getPublicKey() as Uint8Array,
|
|
24
24
|
|
|
25
|
-
async genSharedKey (theirPub: Uint8Array, forcePrivate?: ECDHKeyPair): Promise<Uint8Array> {
|
|
25
|
+
async genSharedKey (theirPub: Uint8Array, forcePrivate?: ECDHKeyPair): Promise<Uint8Array> {
|
|
26
26
|
if (forcePrivate != null) {
|
|
27
27
|
ecdh.setPrivateKey(forcePrivate.private)
|
|
28
28
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ed25519 as ed } from '@noble/curves/ed25519'
|
|
2
2
|
import type { Uint8ArrayKeyPair } from './interface'
|
|
3
3
|
|
|
4
4
|
const PUBLIC_KEY_BYTE_LENGTH = 32
|
|
@@ -11,7 +11,7 @@ export { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength }
|
|
|
11
11
|
export async function generateKey (): Promise<Uint8ArrayKeyPair> {
|
|
12
12
|
// the actual private key (32 bytes)
|
|
13
13
|
const privateKeyRaw = ed.utils.randomPrivateKey()
|
|
14
|
-
const publicKey =
|
|
14
|
+
const publicKey = ed.getPublicKey(privateKeyRaw)
|
|
15
15
|
|
|
16
16
|
// concatenated the public key to the private key
|
|
17
17
|
const privateKey = concatKeys(privateKeyRaw, publicKey)
|
|
@@ -34,7 +34,7 @@ export async function generateKeyFromSeed (seed: Uint8Array): Promise<Uint8Array
|
|
|
34
34
|
|
|
35
35
|
// based on node forges algorithm, the seed is used directly as private key
|
|
36
36
|
const privateKeyRaw = seed
|
|
37
|
-
const publicKey =
|
|
37
|
+
const publicKey = ed.getPublicKey(privateKeyRaw)
|
|
38
38
|
|
|
39
39
|
const privateKey = concatKeys(privateKeyRaw, publicKey)
|
|
40
40
|
|
|
@@ -15,7 +15,7 @@ export class Ed25519PublicKey {
|
|
|
15
15
|
this._key = ensureKey(key, crypto.publicKeyLength)
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
async verify (data: Uint8Array, sig: Uint8Array): Promise<boolean> {
|
|
18
|
+
async verify (data: Uint8Array, sig: Uint8Array): Promise<boolean> {
|
|
19
19
|
return crypto.hashAndVerify(this._key, sig, data)
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -52,7 +52,7 @@ export class Ed25519PrivateKey {
|
|
|
52
52
|
this._publicKey = ensureKey(publicKey, crypto.publicKeyLength)
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
async sign (message: Uint8Array): Promise<Uint8Array> {
|
|
55
|
+
async sign (message: Uint8Array): Promise<Uint8Array> {
|
|
56
56
|
return crypto.hashAndSign(this._key, message)
|
|
57
57
|
}
|
|
58
58
|
|
package/src/keys/index.ts
CHANGED
|
@@ -41,13 +41,13 @@ function typeToKey (type: string): typeof RSA | typeof Ed25519 | typeof Secp256k
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
// Generates a keypair of the given type and bitsize
|
|
44
|
-
export async function generateKeyPair (type: KeyTypes, bits?: number): Promise<PrivateKey> {
|
|
44
|
+
export async function generateKeyPair (type: KeyTypes, bits?: number): Promise<PrivateKey> {
|
|
45
45
|
return typeToKey(type).generateKeyPair(bits ?? 2048)
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
// Generates a keypair of the given type and bitsize
|
|
49
49
|
// seed is a 32 byte uint8array
|
|
50
|
-
export async function generateKeyPairFromSeed (type: KeyTypes, seed: Uint8Array, bits?: number): Promise<PrivateKey> {
|
|
50
|
+
export async function generateKeyPairFromSeed (type: KeyTypes, seed: Uint8Array, bits?: number): Promise<PrivateKey> {
|
|
51
51
|
if (type.toLowerCase() !== 'ed25519') {
|
|
52
52
|
throw new CodeError('Seed key derivation is unimplemented for RSA or secp256k1', 'ERR_UNSUPPORTED_KEY_DERIVATION_TYPE')
|
|
53
53
|
}
|
|
@@ -82,7 +82,7 @@ export function marshalPublicKey (key: { bytes: Uint8Array }, type?: string): Ui
|
|
|
82
82
|
|
|
83
83
|
// Converts a protobuf serialized private key into its
|
|
84
84
|
// representative object
|
|
85
|
-
export async function unmarshalPrivateKey (buf: Uint8Array): Promise<PrivateKey> {
|
|
85
|
+
export async function unmarshalPrivateKey (buf: Uint8Array): Promise<PrivateKey> {
|
|
86
86
|
const decoded = keysPBM.PrivateKey.decode(buf)
|
|
87
87
|
const data = decoded.Data ?? new Uint8Array()
|
|
88
88
|
|
|
@@ -110,7 +110,7 @@ export function marshalPrivateKey (key: { bytes: Uint8Array }, type?: string): U
|
|
|
110
110
|
* @param {string} encryptedKey
|
|
111
111
|
* @param {string} password
|
|
112
112
|
*/
|
|
113
|
-
export async function importKey (encryptedKey: string, password: string): Promise<PrivateKey> {
|
|
113
|
+
export async function importKey (encryptedKey: string, password: string): Promise<PrivateKey> {
|
|
114
114
|
try {
|
|
115
115
|
const key = await importer(encryptedKey, password)
|
|
116
116
|
return await unmarshalPrivateKey(key)
|
package/src/keys/rsa-class.ts
CHANGED
|
@@ -19,7 +19,7 @@ export class RsaPublicKey {
|
|
|
19
19
|
this._key = key
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
async verify (data: Uint8Array, sig: Uint8Array): Promise<boolean> {
|
|
22
|
+
async verify (data: Uint8Array, sig: Uint8Array): Promise<boolean> {
|
|
23
23
|
return crypto.hashAndVerify(this._key, sig, data)
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -62,7 +62,7 @@ export class RsaPrivateKey {
|
|
|
62
62
|
return crypto.getRandomValues(16)
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
async sign (message: Uint8Array): Promise<Uint8Array> {
|
|
65
|
+
async sign (message: Uint8Array): Promise<Uint8Array> {
|
|
66
66
|
return crypto.hashAndSign(this._key, message)
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -114,7 +114,7 @@ export class RsaPrivateKey {
|
|
|
114
114
|
/**
|
|
115
115
|
* Exports the key into a password protected PEM format
|
|
116
116
|
*/
|
|
117
|
-
async export (password: string, format = 'pkcs-8'): Promise<Multibase<'m'>> {
|
|
117
|
+
async export (password: string, format = 'pkcs-8'): Promise<Multibase<'m'>> {
|
|
118
118
|
if (format === 'pkcs-8') {
|
|
119
119
|
const buffer = new forge.util.ByteBuffer(this.marshal())
|
|
120
120
|
const asn1 = forge.asn1.fromDer(buffer)
|
package/src/keys/rsa.ts
CHANGED
|
@@ -9,7 +9,7 @@ const keypair = promisify(crypto.generateKeyPair)
|
|
|
9
9
|
|
|
10
10
|
export { utils }
|
|
11
11
|
|
|
12
|
-
export async function generateKey (bits: number): Promise<JWKKeyPair> {
|
|
12
|
+
export async function generateKey (bits: number): Promise<JWKKeyPair> {
|
|
13
13
|
// @ts-expect-error node types are missing jwk as a format
|
|
14
14
|
const key = await keypair('rsa', {
|
|
15
15
|
modulusLength: bits,
|
|
@@ -26,7 +26,7 @@ export async function generateKey (bits: number): Promise<JWKKeyPair> { // eslin
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// Takes a jwk key
|
|
29
|
-
export async function unmarshalPrivateKey (key: JsonWebKey): Promise<JWKKeyPair> {
|
|
29
|
+
export async function unmarshalPrivateKey (key: JsonWebKey): Promise<JWKKeyPair> {
|
|
30
30
|
if (key == null) {
|
|
31
31
|
throw new CodeError('Missing key parameter', 'ERR_MISSING_KEY')
|
|
32
32
|
}
|
|
@@ -49,7 +49,7 @@ export async function hashAndSign (key: JsonWebKey, msg: Uint8Array): Promise<Ui
|
|
|
49
49
|
.sign({ format: 'jwk', key })
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
export async function hashAndVerify (key: JsonWebKey, sig: Uint8Array, msg: Uint8Array): Promise<boolean> {
|
|
52
|
+
export async function hashAndVerify (key: JsonWebKey, sig: Uint8Array, msg: Uint8Array): Promise<boolean> {
|
|
53
53
|
return crypto.createVerify('RSA-SHA256')
|
|
54
54
|
.update(msg)
|
|
55
55
|
// @ts-expect-error node types are missing jwk as a format
|
package/src/keys/secp256k1.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CodeError } from '@libp2p/interface/errors'
|
|
2
|
-
import
|
|
2
|
+
import { secp256k1 as secp } from '@noble/curves/secp256k1'
|
|
3
3
|
import { sha256 } from 'multiformats/hashes/sha2'
|
|
4
4
|
|
|
5
5
|
const PRIVATE_KEY_BYTE_LENGTH = 32
|
|
@@ -16,7 +16,8 @@ export function generateKey (): Uint8Array {
|
|
|
16
16
|
export async function hashAndSign (key: Uint8Array, msg: Uint8Array): Promise<Uint8Array> {
|
|
17
17
|
const { digest } = await sha256.digest(msg)
|
|
18
18
|
try {
|
|
19
|
-
|
|
19
|
+
const signature = secp.sign(digest, key)
|
|
20
|
+
return signature.toDERRawBytes()
|
|
20
21
|
} catch (err) {
|
|
21
22
|
throw new CodeError(String(err), 'ERR_INVALID_INPUT')
|
|
22
23
|
}
|
|
@@ -35,12 +36,12 @@ export async function hashAndVerify (key: Uint8Array, sig: Uint8Array, msg: Uint
|
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
export function compressPublicKey (key: Uint8Array): Uint8Array {
|
|
38
|
-
const point = secp.
|
|
39
|
+
const point = secp.ProjectivePoint.fromHex(key).toRawBytes(true)
|
|
39
40
|
return point
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
export function decompressPublicKey (key: Uint8Array): Uint8Array {
|
|
43
|
-
const point = secp.
|
|
44
|
+
const point = secp.ProjectivePoint.fromHex(key).toRawBytes(false)
|
|
44
45
|
return point
|
|
45
46
|
}
|
|
46
47
|
|
|
@@ -54,7 +55,7 @@ export function validatePrivateKey (key: Uint8Array): void {
|
|
|
54
55
|
|
|
55
56
|
export function validatePublicKey (key: Uint8Array): void {
|
|
56
57
|
try {
|
|
57
|
-
secp.
|
|
58
|
+
secp.ProjectivePoint.fromHex(key)
|
|
58
59
|
} catch (err) {
|
|
59
60
|
throw new CodeError(String(err), 'ERR_INVALID_PUBLIC_KEY')
|
|
60
61
|
}
|
package/src/random-bytes.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { CodeError } from '@libp2p/interface/errors'
|
|
2
|
-
import {
|
|
2
|
+
import { randomBytes as randB } from '@noble/hashes/utils'
|
|
3
3
|
|
|
4
4
|
export default function randomBytes (length: number): Uint8Array {
|
|
5
5
|
if (isNaN(length) || length <= 0) {
|
|
6
6
|
throw new CodeError('random bytes length must be a Number bigger than 0', 'ERR_INVALID_LENGTH')
|
|
7
7
|
}
|
|
8
|
-
return
|
|
8
|
+
return randB(length)
|
|
9
9
|
}
|