@libp2p/crypto 4.1.9 → 5.0.0-1210884ed
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 +4 -5
- package/dist/src/ciphers/aes-gcm.browser.js +1 -1
- package/dist/src/ciphers/aes-gcm.browser.js.map +1 -1
- package/dist/src/ciphers/index.d.ts +2 -0
- package/dist/src/ciphers/index.d.ts.map +1 -0
- package/dist/src/ciphers/index.js +2 -0
- package/dist/src/ciphers/index.js.map +1 -0
- package/dist/src/errors.d.ts +19 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +28 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/hmac/{index-browser.d.ts → index.browser.d.ts} +1 -1
- package/dist/src/hmac/{index-browser.d.ts.map → index.browser.d.ts.map} +1 -1
- package/dist/src/hmac/{index-browser.js → index.browser.js} +2 -2
- package/dist/src/hmac/{index-browser.js.map → index.browser.js.map} +1 -1
- package/dist/src/keys/ecdh/index.browser.d.ts +4 -0
- package/dist/src/keys/ecdh/index.browser.d.ts.map +1 -0
- package/dist/src/keys/{ecdh-browser.js → ecdh/index.browser.js} +13 -11
- package/dist/src/keys/ecdh/index.browser.js.map +1 -0
- package/dist/src/keys/{ecdh.d.ts → ecdh/index.d.ts} +4 -3
- package/dist/src/keys/ecdh/index.d.ts.map +1 -0
- package/dist/src/keys/{ecdh.js → ecdh/index.js} +4 -4
- package/dist/src/keys/ecdh/index.js.map +1 -0
- package/dist/src/keys/ed25519/ed25519.d.ts +23 -0
- package/dist/src/keys/ed25519/ed25519.d.ts.map +1 -0
- package/dist/src/keys/ed25519/ed25519.js +54 -0
- package/dist/src/keys/ed25519/ed25519.js.map +1 -0
- package/dist/src/keys/{ed25519-browser.d.ts → ed25519/index.browser.d.ts} +2 -2
- package/dist/src/keys/ed25519/index.browser.d.ts.map +1 -0
- package/dist/src/keys/{ed25519-browser.js → ed25519/index.browser.js} +1 -1
- package/dist/src/keys/ed25519/index.browser.js.map +1 -0
- package/dist/src/keys/{ed25519.d.ts → ed25519/index.d.ts} +2 -2
- package/dist/src/keys/ed25519/index.d.ts.map +1 -0
- package/dist/src/keys/{ed25519.js → ed25519/index.js} +1 -1
- package/dist/src/keys/ed25519/index.js.map +1 -0
- package/dist/src/keys/ed25519/utils.d.ts +7 -0
- package/dist/src/keys/ed25519/utils.d.ts.map +1 -0
- package/dist/src/keys/ed25519/utils.js +36 -0
- package/dist/src/keys/ed25519/utils.js.map +1 -0
- package/dist/src/keys/ephemeral-keys.d.ts +2 -2
- package/dist/src/keys/ephemeral-keys.d.ts.map +1 -1
- package/dist/src/keys/ephemeral-keys.js +2 -2
- package/dist/src/keys/ephemeral-keys.js.map +1 -1
- package/dist/src/keys/index.d.ts +33 -36
- package/dist/src/keys/index.d.ts.map +1 -1
- package/dist/src/keys/index.js +93 -83
- package/dist/src/keys/index.js.map +1 -1
- package/dist/src/keys/key-stretcher.d.ts.map +1 -1
- package/dist/src/keys/key-stretcher.js +9 -7
- package/dist/src/keys/key-stretcher.js.map +1 -1
- package/dist/src/keys/keys.d.ts +4 -4
- package/dist/src/keys/keys.d.ts.map +1 -1
- package/dist/src/keys/keys.js +21 -15
- package/dist/src/keys/keys.js.map +1 -1
- package/dist/src/keys/rsa/index.browser.d.ts +11 -0
- package/dist/src/keys/rsa/index.browser.d.ts.map +1 -0
- package/dist/src/keys/{rsa-browser.js → rsa/index.browser.js} +10 -39
- package/dist/src/keys/rsa/index.browser.js.map +1 -0
- package/dist/src/keys/rsa/index.d.ts +11 -0
- package/dist/src/keys/rsa/index.d.ts.map +1 -0
- package/dist/src/keys/{rsa.js → rsa/index.js} +8 -22
- package/dist/src/keys/rsa/index.js.map +1 -0
- package/dist/src/keys/rsa/rsa.d.ts +28 -0
- package/dist/src/keys/rsa/rsa.d.ts.map +1 -0
- package/dist/src/keys/rsa/rsa.js +65 -0
- package/dist/src/keys/rsa/rsa.js.map +1 -0
- package/dist/src/keys/rsa/utils.d.ts +34 -0
- package/dist/src/keys/rsa/utils.d.ts.map +1 -0
- package/dist/src/keys/rsa/utils.js +193 -0
- package/dist/src/keys/rsa/utils.js.map +1 -0
- package/dist/src/keys/secp256k1/index.browser.d.ts +10 -0
- package/dist/src/keys/secp256k1/index.browser.d.ts.map +1 -0
- package/dist/src/keys/secp256k1/index.browser.js +41 -0
- package/dist/src/keys/secp256k1/index.browser.js.map +1 -0
- package/dist/src/keys/secp256k1/index.d.ts +10 -0
- package/dist/src/keys/secp256k1/index.d.ts.map +1 -0
- package/dist/src/keys/secp256k1/index.js +47 -0
- package/dist/src/keys/secp256k1/index.js.map +1 -0
- package/dist/src/keys/secp256k1/secp256k1.d.ts +24 -0
- package/dist/src/keys/secp256k1/secp256k1.d.ts.map +1 -0
- package/dist/src/keys/secp256k1/secp256k1.js +53 -0
- package/dist/src/keys/secp256k1/secp256k1.js.map +1 -0
- package/dist/src/keys/secp256k1/utils.d.ts +13 -0
- package/dist/src/keys/secp256k1/utils.d.ts.map +1 -0
- package/dist/src/keys/secp256k1/utils.js +53 -0
- package/dist/src/keys/secp256k1/utils.js.map +1 -0
- package/dist/src/pbkdf2.js +2 -2
- package/dist/src/pbkdf2.js.map +1 -1
- package/dist/src/random-bytes.js +2 -2
- package/dist/src/random-bytes.js.map +1 -1
- package/dist/src/webcrypto/index.d.ts +3 -0
- package/dist/src/webcrypto/index.d.ts.map +1 -0
- package/dist/src/webcrypto/index.js +3 -0
- package/dist/src/webcrypto/index.js.map +1 -0
- package/dist/src/{webcrypto-browser.d.ts → webcrypto/webcrypto.browser.d.ts} +1 -1
- package/dist/src/webcrypto/webcrypto.browser.d.ts.map +1 -0
- package/dist/src/{webcrypto-browser.js → webcrypto/webcrypto.browser.js} +4 -3
- package/dist/src/webcrypto/webcrypto.browser.js.map +1 -0
- package/dist/src/webcrypto/webcrypto.d.ts.map +1 -0
- package/dist/src/webcrypto/webcrypto.js.map +1 -0
- package/package.json +16 -8
- package/src/ciphers/aes-gcm.browser.ts +1 -1
- package/src/ciphers/index.ts +1 -0
- package/src/errors.ts +29 -0
- package/src/hmac/{index-browser.ts → index.browser.ts} +1 -1
- package/src/keys/{ecdh-browser.ts → ecdh/index.browser.ts} +16 -13
- package/src/keys/{ecdh.ts → ecdh/index.ts} +6 -4
- package/src/keys/ed25519/ed25519.ts +68 -0
- package/src/keys/{ed25519-browser.ts → ed25519/index.browser.ts} +1 -1
- package/src/keys/{ed25519.ts → ed25519/index.ts} +1 -1
- package/src/keys/ed25519/utils.ts +42 -0
- package/src/keys/ephemeral-keys.ts +2 -2
- package/src/keys/index.ts +110 -92
- package/src/keys/key-stretcher.ts +15 -8
- package/src/keys/keys.proto +1 -1
- package/src/keys/keys.ts +21 -16
- package/src/keys/{rsa-browser.ts → rsa/index.browser.ts} +10 -56
- package/src/keys/{rsa.ts → rsa/index.ts} +8 -23
- package/src/keys/rsa/rsa.ts +83 -0
- package/src/keys/rsa/utils.ts +235 -0
- package/src/keys/secp256k1/index.browser.ts +45 -0
- package/src/keys/secp256k1/index.ts +51 -0
- package/src/keys/secp256k1/secp256k1.ts +68 -0
- package/src/keys/secp256k1/utils.ts +63 -0
- package/src/pbkdf2.ts +2 -2
- package/src/random-bytes.ts +2 -2
- package/src/webcrypto/index.ts +3 -0
- package/src/webcrypto/webcrypto.browser.ts +23 -0
- package/dist/src/keys/ecdh-browser.d.ts +0 -3
- package/dist/src/keys/ecdh-browser.d.ts.map +0 -1
- package/dist/src/keys/ecdh-browser.js.map +0 -1
- package/dist/src/keys/ecdh.d.ts.map +0 -1
- package/dist/src/keys/ecdh.js.map +0 -1
- package/dist/src/keys/ed25519-browser.d.ts.map +0 -1
- package/dist/src/keys/ed25519-browser.js.map +0 -1
- package/dist/src/keys/ed25519-class.d.ts +0 -42
- package/dist/src/keys/ed25519-class.d.ts.map +0 -1
- package/dist/src/keys/ed25519-class.js +0 -133
- package/dist/src/keys/ed25519-class.js.map +0 -1
- package/dist/src/keys/ed25519.d.ts.map +0 -1
- package/dist/src/keys/ed25519.js.map +0 -1
- package/dist/src/keys/exporter.d.ts +0 -8
- package/dist/src/keys/exporter.d.ts.map +0 -1
- package/dist/src/keys/exporter.js +0 -13
- package/dist/src/keys/exporter.js.map +0 -1
- package/dist/src/keys/importer.d.ts +0 -7
- package/dist/src/keys/importer.d.ts.map +0 -1
- package/dist/src/keys/importer.js +0 -13
- package/dist/src/keys/importer.js.map +0 -1
- package/dist/src/keys/rsa-browser.d.ts +0 -12
- package/dist/src/keys/rsa-browser.d.ts.map +0 -1
- package/dist/src/keys/rsa-browser.js.map +0 -1
- package/dist/src/keys/rsa-class.d.ts +0 -46
- package/dist/src/keys/rsa-class.d.ts.map +0 -1
- package/dist/src/keys/rsa-class.js +0 -135
- package/dist/src/keys/rsa-class.js.map +0 -1
- package/dist/src/keys/rsa-utils.d.ts +0 -20
- package/dist/src/keys/rsa-utils.d.ts.map +0 -1
- package/dist/src/keys/rsa-utils.js +0 -330
- package/dist/src/keys/rsa-utils.js.map +0 -1
- package/dist/src/keys/rsa.d.ts +0 -12
- package/dist/src/keys/rsa.d.ts.map +0 -1
- package/dist/src/keys/rsa.js.map +0 -1
- package/dist/src/keys/secp256k1-browser.d.ts +0 -18
- package/dist/src/keys/secp256k1-browser.d.ts.map +0 -1
- package/dist/src/keys/secp256k1-browser.js +0 -78
- package/dist/src/keys/secp256k1-browser.js.map +0 -1
- package/dist/src/keys/secp256k1-class.d.ts +0 -39
- package/dist/src/keys/secp256k1-class.d.ts.map +0 -1
- package/dist/src/keys/secp256k1-class.js +0 -109
- package/dist/src/keys/secp256k1-class.js.map +0 -1
- package/dist/src/keys/secp256k1.d.ts +0 -18
- package/dist/src/keys/secp256k1.d.ts.map +0 -1
- package/dist/src/keys/secp256k1.js +0 -84
- package/dist/src/keys/secp256k1.js.map +0 -1
- package/dist/src/webcrypto-browser.d.ts.map +0 -1
- package/dist/src/webcrypto-browser.js.map +0 -1
- package/dist/src/webcrypto.d.ts.map +0 -1
- package/dist/src/webcrypto.js.map +0 -1
- package/dist/typedoc-urls.json +0 -40
- package/src/keys/ed25519-class.ts +0 -160
- package/src/keys/exporter.ts +0 -14
- package/src/keys/importer.ts +0 -13
- package/src/keys/rsa-class.ts +0 -172
- package/src/keys/rsa-utils.ts +0 -408
- package/src/keys/secp256k1-browser.ts +0 -87
- package/src/keys/secp256k1-class.ts +0 -133
- package/src/keys/secp256k1.ts +0 -93
- package/src/webcrypto-browser.ts +0 -24
- /package/dist/src/{webcrypto.d.ts → webcrypto/webcrypto.d.ts} +0 -0
- /package/dist/src/{webcrypto.js → webcrypto/webcrypto.js} +0 -0
- /package/src/{webcrypto.ts → webcrypto/webcrypto.ts} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { InvalidParametersError } from '@libp2p/interface';
|
|
2
2
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
3
|
-
import randomBytes from '
|
|
4
|
-
import webcrypto from '
|
|
5
|
-
import * as utils from './
|
|
3
|
+
import randomBytes from '../../random-bytes.js';
|
|
4
|
+
import webcrypto from '../../webcrypto/index.js';
|
|
5
|
+
import * as utils from './utils.js';
|
|
6
6
|
export { utils };
|
|
7
|
-
export async function
|
|
7
|
+
export async function generateRSAKey(bits) {
|
|
8
8
|
const pair = await webcrypto.get().subtle.generateKey({
|
|
9
9
|
name: 'RSASSA-PKCS1-v1_5',
|
|
10
10
|
modulusLength: bits,
|
|
@@ -17,25 +17,6 @@ export async function generateKey(bits) {
|
|
|
17
17
|
publicKey: keys[1]
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
// Takes a jwk key
|
|
21
|
-
export async function unmarshalPrivateKey(key) {
|
|
22
|
-
const privateKey = await webcrypto.get().subtle.importKey('jwk', key, {
|
|
23
|
-
name: 'RSASSA-PKCS1-v1_5',
|
|
24
|
-
hash: { name: 'SHA-256' }
|
|
25
|
-
}, true, ['sign']);
|
|
26
|
-
const pair = [
|
|
27
|
-
privateKey,
|
|
28
|
-
await derivePublicFromPrivate(key)
|
|
29
|
-
];
|
|
30
|
-
const keys = await exportKey({
|
|
31
|
-
privateKey: pair[0],
|
|
32
|
-
publicKey: pair[1]
|
|
33
|
-
});
|
|
34
|
-
return {
|
|
35
|
-
privateKey: keys[0],
|
|
36
|
-
publicKey: keys[1]
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
20
|
export { randomBytes as getRandomValues };
|
|
40
21
|
export async function hashAndSign(key, msg) {
|
|
41
22
|
const privateKey = await webcrypto.get().subtle.importKey('jwk', key, {
|
|
@@ -54,31 +35,21 @@ export async function hashAndVerify(key, sig, msg) {
|
|
|
54
35
|
}
|
|
55
36
|
async function exportKey(pair) {
|
|
56
37
|
if (pair.privateKey == null || pair.publicKey == null) {
|
|
57
|
-
throw new
|
|
38
|
+
throw new InvalidParametersError('Private and public key are required');
|
|
58
39
|
}
|
|
59
40
|
return Promise.all([
|
|
60
41
|
webcrypto.get().subtle.exportKey('jwk', pair.privateKey),
|
|
61
42
|
webcrypto.get().subtle.exportKey('jwk', pair.publicKey)
|
|
62
43
|
]);
|
|
63
44
|
}
|
|
64
|
-
|
|
65
|
-
return webcrypto.get().subtle.importKey('jwk', {
|
|
66
|
-
kty: jwKey.kty,
|
|
67
|
-
n: jwKey.n,
|
|
68
|
-
e: jwKey.e
|
|
69
|
-
}, {
|
|
70
|
-
name: 'RSASSA-PKCS1-v1_5',
|
|
71
|
-
hash: { name: 'SHA-256' }
|
|
72
|
-
}, true, ['verify']);
|
|
73
|
-
}
|
|
74
|
-
export function keySize(jwk) {
|
|
45
|
+
export function rsaKeySize(jwk) {
|
|
75
46
|
if (jwk.kty !== 'RSA') {
|
|
76
|
-
throw new
|
|
47
|
+
throw new InvalidParametersError('invalid key type');
|
|
77
48
|
}
|
|
78
49
|
else if (jwk.n == null) {
|
|
79
|
-
throw new
|
|
50
|
+
throw new InvalidParametersError('invalid key modulus');
|
|
80
51
|
}
|
|
81
52
|
const bytes = uint8ArrayFromString(jwk.n, 'base64url');
|
|
82
53
|
return bytes.length * 8;
|
|
83
54
|
}
|
|
84
|
-
//# sourceMappingURL=
|
|
55
|
+
//# sourceMappingURL=index.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../../../src/keys/rsa/index.browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import randomBytes from '../../random-bytes.js';
|
|
2
|
+
import * as utils from './utils.js';
|
|
3
|
+
import type { JWKKeyPair } from '../interface.js';
|
|
4
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
5
|
+
export { utils };
|
|
6
|
+
export declare function generateRSAKey(bits: number): Promise<JWKKeyPair>;
|
|
7
|
+
export { randomBytes as getRandomValues };
|
|
8
|
+
export declare function hashAndSign(key: JsonWebKey, msg: Uint8Array | Uint8ArrayList): Promise<Uint8Array>;
|
|
9
|
+
export declare function hashAndVerify(key: JsonWebKey, sig: Uint8Array, msg: Uint8Array | Uint8ArrayList): Promise<boolean>;
|
|
10
|
+
export declare function rsaKeySize(jwk: JsonWebKey): number;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/keys/rsa/index.ts"],"names":[],"mappings":"AAIA,OAAO,WAAW,MAAM,uBAAuB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAIpD,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,wBAAsB,cAAc,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAcvE;AAED,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,CAAA;AAEzC,wBAAsB,WAAW,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAazG;AAED,wBAAsB,aAAa,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAazH;AAED,wBAAgB,UAAU,CAAE,GAAG,EAAE,UAAU,GAAG,MAAM,CAQnD"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import crypto from 'crypto';
|
|
2
2
|
import { promisify } from 'util';
|
|
3
|
-
import {
|
|
3
|
+
import { InvalidParametersError } from '@libp2p/interface';
|
|
4
4
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
5
|
-
import randomBytes from '
|
|
6
|
-
import * as utils from './
|
|
5
|
+
import randomBytes from '../../random-bytes.js';
|
|
6
|
+
import * as utils from './utils.js';
|
|
7
7
|
const keypair = promisify(crypto.generateKeyPair);
|
|
8
8
|
export { utils };
|
|
9
|
-
export async function
|
|
9
|
+
export async function generateRSAKey(bits) {
|
|
10
10
|
// @ts-expect-error node types are missing jwk as a format
|
|
11
11
|
const key = await keypair('rsa', {
|
|
12
12
|
modulusLength: bits,
|
|
@@ -20,20 +20,6 @@ export async function generateKey(bits) {
|
|
|
20
20
|
publicKey: key.publicKey
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
-
// Takes a jwk key
|
|
24
|
-
export async function unmarshalPrivateKey(key) {
|
|
25
|
-
if (key == null) {
|
|
26
|
-
throw new CodeError('Missing key parameter', 'ERR_MISSING_KEY');
|
|
27
|
-
}
|
|
28
|
-
return {
|
|
29
|
-
privateKey: key,
|
|
30
|
-
publicKey: {
|
|
31
|
-
kty: key.kty,
|
|
32
|
-
n: key.n,
|
|
33
|
-
e: key.e
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
23
|
export { randomBytes as getRandomValues };
|
|
38
24
|
export async function hashAndSign(key, msg) {
|
|
39
25
|
const hash = crypto.createSign('RSA-SHA256');
|
|
@@ -61,14 +47,14 @@ export async function hashAndVerify(key, sig, msg) {
|
|
|
61
47
|
// @ts-expect-error node types are missing jwk as a format
|
|
62
48
|
return hash.verify({ format: 'jwk', key }, sig);
|
|
63
49
|
}
|
|
64
|
-
export function
|
|
50
|
+
export function rsaKeySize(jwk) {
|
|
65
51
|
if (jwk.kty !== 'RSA') {
|
|
66
|
-
throw new
|
|
52
|
+
throw new InvalidParametersError('Invalid key type');
|
|
67
53
|
}
|
|
68
54
|
else if (jwk.n == null) {
|
|
69
|
-
throw new
|
|
55
|
+
throw new InvalidParametersError('Invalid key modulus');
|
|
70
56
|
}
|
|
71
57
|
const modulus = uint8ArrayFromString(jwk.n, 'base64url');
|
|
72
58
|
return modulus.length * 8;
|
|
73
59
|
}
|
|
74
|
-
//# sourceMappingURL=
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/keys/rsa/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,WAAW,MAAM,uBAAuB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAInC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;AAEjD,OAAO,EAAE,KAAK,EAAE,CAAA;AAEhB,MAAM,CAAC,KAAK,UAAU,cAAc,CAAE,IAAY;IAChD,0DAA0D;IAC1D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE;QAC/B,aAAa,EAAE,IAAI;QACnB,iBAAiB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;QACnD,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;KACrD,CAAC,CAAA;IAEF,OAAO;QACL,0DAA0D;QAC1D,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,0DAA0D;QAC1D,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAA;AACH,CAAC;AAED,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAE,GAAe,EAAE,GAAgC;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;IAE5C,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAE,GAAe,EAAE,GAAe,EAAE,GAAgC;IACrG,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;IAE9C,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,UAAU,CAAE,GAAe;IACzC,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,sBAAsB,CAAC,kBAAkB,CAAC,CAAA;IACtD,CAAC;SAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,sBAAsB,CAAC,qBAAqB,CAAC,CAAA;IACzD,CAAC;IACD,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;IACxD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { CID } from 'multiformats/cid';
|
|
2
|
+
import { type Digest } from 'multiformats/hashes/digest';
|
|
3
|
+
import type { RSAPublicKey as RSAPublicKeyInterface, RSAPrivateKey as RSAPrivateKeyInterface } from '@libp2p/interface';
|
|
4
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
5
|
+
export declare class RSAPublicKey implements RSAPublicKeyInterface {
|
|
6
|
+
readonly type = "RSA";
|
|
7
|
+
private readonly _key;
|
|
8
|
+
private _raw?;
|
|
9
|
+
private readonly _multihash;
|
|
10
|
+
constructor(key: JsonWebKey, digest: Digest<18, number>);
|
|
11
|
+
get raw(): Uint8Array;
|
|
12
|
+
toMultihash(): Digest<18, number>;
|
|
13
|
+
toCID(): CID<unknown, 114, 18, 1>;
|
|
14
|
+
toString(): string;
|
|
15
|
+
equals(key?: any): boolean;
|
|
16
|
+
verify(data: Uint8Array | Uint8ArrayList, sig: Uint8Array): boolean | Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
export declare class RSAPrivateKey implements RSAPrivateKeyInterface {
|
|
19
|
+
readonly type = "RSA";
|
|
20
|
+
private readonly _key;
|
|
21
|
+
private _raw?;
|
|
22
|
+
readonly publicKey: RSAPublicKey;
|
|
23
|
+
constructor(key: JsonWebKey, publicKey: RSAPublicKey);
|
|
24
|
+
get raw(): Uint8Array;
|
|
25
|
+
equals(key: any): boolean;
|
|
26
|
+
sign(message: Uint8Array | Uint8ArrayList): Uint8Array | Promise<Uint8Array>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=rsa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa.d.ts","sourceRoot":"","sources":["../../../../src/keys/rsa/rsa.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGxD,OAAO,KAAK,EAAE,YAAY,IAAI,qBAAqB,EAAE,aAAa,IAAI,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AACvH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,qBAAa,YAAa,YAAW,qBAAqB;IACxD,SAAgB,IAAI,SAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,IAAI,CAAC,CAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;gBAElC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC;IAKxD,IAAI,GAAG,IAAK,UAAU,CAMrB;IAED,WAAW,IAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC;IAIlC,KAAK,IAAK,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAIlC,QAAQ,IAAK,MAAM;IAInB,MAAM,CAAE,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO;IAQ3B,MAAM,CAAE,IAAI,EAAE,UAAU,GAAG,cAAc,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAGxF;AAED,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,SAAgB,IAAI,SAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,IAAI,CAAC,CAAY;IACzB,SAAgB,SAAS,EAAE,YAAY,CAAA;gBAE1B,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY;IAKrD,IAAI,GAAG,IAAK,UAAU,CAMrB;IAED,MAAM,CAAE,GAAG,EAAE,GAAG,GAAG,OAAO;IAQ1B,IAAI,CAAE,OAAO,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CAG9E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { base58btc } from 'multiformats/bases/base58';
|
|
2
|
+
import { CID } from 'multiformats/cid';
|
|
3
|
+
import {} from 'multiformats/hashes/digest';
|
|
4
|
+
import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
5
|
+
import { hashAndSign, utils, hashAndVerify } from './index.js';
|
|
6
|
+
export class RSAPublicKey {
|
|
7
|
+
type = 'RSA';
|
|
8
|
+
_key;
|
|
9
|
+
_raw;
|
|
10
|
+
_multihash;
|
|
11
|
+
constructor(key, digest) {
|
|
12
|
+
this._key = key;
|
|
13
|
+
this._multihash = digest;
|
|
14
|
+
}
|
|
15
|
+
get raw() {
|
|
16
|
+
if (this._raw == null) {
|
|
17
|
+
this._raw = utils.jwkToPkix(this._key);
|
|
18
|
+
}
|
|
19
|
+
return this._raw;
|
|
20
|
+
}
|
|
21
|
+
toMultihash() {
|
|
22
|
+
return this._multihash;
|
|
23
|
+
}
|
|
24
|
+
toCID() {
|
|
25
|
+
return CID.createV1(114, this._multihash);
|
|
26
|
+
}
|
|
27
|
+
toString() {
|
|
28
|
+
return base58btc.encode(this.toMultihash().bytes).substring(1);
|
|
29
|
+
}
|
|
30
|
+
equals(key) {
|
|
31
|
+
if (key == null || !(key.raw instanceof Uint8Array)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return uint8ArrayEquals(this.raw, key.raw);
|
|
35
|
+
}
|
|
36
|
+
verify(data, sig) {
|
|
37
|
+
return hashAndVerify(this._key, sig, data);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class RSAPrivateKey {
|
|
41
|
+
type = 'RSA';
|
|
42
|
+
_key;
|
|
43
|
+
_raw;
|
|
44
|
+
publicKey;
|
|
45
|
+
constructor(key, publicKey) {
|
|
46
|
+
this._key = key;
|
|
47
|
+
this.publicKey = publicKey;
|
|
48
|
+
}
|
|
49
|
+
get raw() {
|
|
50
|
+
if (this._raw == null) {
|
|
51
|
+
this._raw = utils.jwkToPkcs1(this._key);
|
|
52
|
+
}
|
|
53
|
+
return this._raw;
|
|
54
|
+
}
|
|
55
|
+
equals(key) {
|
|
56
|
+
if (key == null || !(key.raw instanceof Uint8Array)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return uint8ArrayEquals(this.raw, key.raw);
|
|
60
|
+
}
|
|
61
|
+
sign(message) {
|
|
62
|
+
return hashAndSign(this._key, message);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=rsa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa.js","sourceRoot":"","sources":["../../../../src/keys/rsa/rsa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAe,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAI9D,MAAM,OAAO,YAAY;IACP,IAAI,GAAG,KAAK,CAAA;IACX,IAAI,CAAY;IACzB,IAAI,CAAa;IACR,UAAU,CAAoB;IAE/C,YAAa,GAAe,EAAE,MAA0B;QACtD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,UAAU,GAAG,MAAM,CAAA;IAC1B,CAAC;IAED,IAAI,GAAG;QACL,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,KAAK;QACH,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IAC3C,CAAC;IAED,QAAQ;QACN,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,CAAE,GAAS;QACf,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,YAAY,UAAU,CAAC,EAAE,CAAC;YACpD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,CAAE,IAAiC,EAAE,GAAe;QACxD,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC5C,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IACR,IAAI,GAAG,KAAK,CAAA;IACX,IAAI,CAAY;IACzB,IAAI,CAAa;IACT,SAAS,CAAc;IAEvC,YAAa,GAAe,EAAE,SAAuB;QACnD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,IAAI,GAAG;QACL,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,MAAM,CAAE,GAAQ;QACd,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,YAAY,UAAU,CAAC,EAAE,CAAC;YACpD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5C,CAAC;IAED,IAAI,CAAE,OAAoC;QACxC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { JWKKeyPair } from '../interface.js';
|
|
2
|
+
import type { RSAPrivateKey, RSAPublicKey } from '@libp2p/interface';
|
|
3
|
+
export declare const MAX_RSA_KEY_SIZE = 8192;
|
|
4
|
+
/**
|
|
5
|
+
* Convert a PKCS#1 in ASN1 DER format to a JWK key
|
|
6
|
+
*/
|
|
7
|
+
export declare function pkcs1ToJwk(bytes: Uint8Array): JsonWebKey;
|
|
8
|
+
/**
|
|
9
|
+
* Convert a JWK key into PKCS#1 in ASN1 DER format
|
|
10
|
+
*/
|
|
11
|
+
export declare function jwkToPkcs1(jwk: JsonWebKey): Uint8Array;
|
|
12
|
+
/**
|
|
13
|
+
* Convert a PKIX in ASN1 DER format to a JWK key
|
|
14
|
+
*/
|
|
15
|
+
export declare function pkixToJwk(bytes: Uint8Array): JsonWebKey;
|
|
16
|
+
/**
|
|
17
|
+
* Convert a JWK key to PKIX in ASN1 DER format
|
|
18
|
+
*/
|
|
19
|
+
export declare function jwkToPkix(jwk: JsonWebKey): Uint8Array;
|
|
20
|
+
/**
|
|
21
|
+
* Turn PCKS#1 DER bytes to a PrivateKey
|
|
22
|
+
*/
|
|
23
|
+
export declare function pkcs1ToRSAPrivateKey(bytes: Uint8Array): RSAPrivateKey;
|
|
24
|
+
/**
|
|
25
|
+
* Turn PKIX bytes to a PublicKey
|
|
26
|
+
*/
|
|
27
|
+
export declare function pkixToRSAPublicKey(bytes: Uint8Array): RSAPublicKey;
|
|
28
|
+
export declare function jwkToRSAPrivateKey(jwk: JsonWebKey): RSAPrivateKey;
|
|
29
|
+
export declare function generateRSAKeyPair(bits: number): Promise<RSAPrivateKey>;
|
|
30
|
+
/**
|
|
31
|
+
* Takes a jwk key and returns a JWK KeyPair
|
|
32
|
+
*/
|
|
33
|
+
export declare function jwkToJWKKeyPair(key: JsonWebKey): JWKKeyPair;
|
|
34
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/keys/rsa/utils.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEpE,eAAO,MAAM,gBAAgB,OAAO,CAAA;AAGpC;;GAEG;AACH,wBAAgB,UAAU,CAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CAqBzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAsBvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CAYxD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAgCtD;AAwCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAItE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,UAAU,GAAG,YAAY,CAcnE;AAED,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,UAAU,GAAG,aAAa,CAalE;AAED,wBAAsB,kBAAkB,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAa9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAa5D"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { InvalidParametersError, InvalidPublicKeyError } from '@libp2p/interface';
|
|
2
|
+
import { sha256 } from '@noble/hashes/sha256';
|
|
3
|
+
import * as asn1js from 'asn1js';
|
|
4
|
+
import { create } from 'multiformats/hashes/digest';
|
|
5
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
6
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
7
|
+
import * as pb from '../keys.js';
|
|
8
|
+
import { RSAPrivateKey as RSAPrivateKeyClass, RSAPublicKey as RSAPublicKeyClass } from './rsa.js';
|
|
9
|
+
import { generateRSAKey, rsaKeySize } from './index.js';
|
|
10
|
+
export const MAX_RSA_KEY_SIZE = 8192;
|
|
11
|
+
const SHA2_256_CODE = 0x12;
|
|
12
|
+
/**
|
|
13
|
+
* Convert a PKCS#1 in ASN1 DER format to a JWK key
|
|
14
|
+
*/
|
|
15
|
+
export function pkcs1ToJwk(bytes) {
|
|
16
|
+
const { result } = asn1js.fromBER(bytes);
|
|
17
|
+
// @ts-expect-error this looks fragile but DER is a canonical format so we are
|
|
18
|
+
// safe to have deeply property chains like this
|
|
19
|
+
const values = result.valueBlock.value;
|
|
20
|
+
const key = {
|
|
21
|
+
n: uint8ArrayToString(bnToBuf(values[1].toBigInt()), 'base64url'),
|
|
22
|
+
e: uint8ArrayToString(bnToBuf(values[2].toBigInt()), 'base64url'),
|
|
23
|
+
d: uint8ArrayToString(bnToBuf(values[3].toBigInt()), 'base64url'),
|
|
24
|
+
p: uint8ArrayToString(bnToBuf(values[4].toBigInt()), 'base64url'),
|
|
25
|
+
q: uint8ArrayToString(bnToBuf(values[5].toBigInt()), 'base64url'),
|
|
26
|
+
dp: uint8ArrayToString(bnToBuf(values[6].toBigInt()), 'base64url'),
|
|
27
|
+
dq: uint8ArrayToString(bnToBuf(values[7].toBigInt()), 'base64url'),
|
|
28
|
+
qi: uint8ArrayToString(bnToBuf(values[8].toBigInt()), 'base64url'),
|
|
29
|
+
kty: 'RSA',
|
|
30
|
+
alg: 'RS256'
|
|
31
|
+
};
|
|
32
|
+
return key;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Convert a JWK key into PKCS#1 in ASN1 DER format
|
|
36
|
+
*/
|
|
37
|
+
export function jwkToPkcs1(jwk) {
|
|
38
|
+
if (jwk.n == null || jwk.e == null || jwk.d == null || jwk.p == null || jwk.q == null || jwk.dp == null || jwk.dq == null || jwk.qi == null) {
|
|
39
|
+
throw new InvalidParametersError('JWK was missing components');
|
|
40
|
+
}
|
|
41
|
+
const root = new asn1js.Sequence({
|
|
42
|
+
value: [
|
|
43
|
+
new asn1js.Integer({ value: 0 }),
|
|
44
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.n, 'base64url'))),
|
|
45
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.e, 'base64url'))),
|
|
46
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.d, 'base64url'))),
|
|
47
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.p, 'base64url'))),
|
|
48
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.q, 'base64url'))),
|
|
49
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.dp, 'base64url'))),
|
|
50
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.dq, 'base64url'))),
|
|
51
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.qi, 'base64url')))
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
const der = root.toBER();
|
|
55
|
+
return new Uint8Array(der, 0, der.byteLength);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Convert a PKIX in ASN1 DER format to a JWK key
|
|
59
|
+
*/
|
|
60
|
+
export function pkixToJwk(bytes) {
|
|
61
|
+
const { result } = asn1js.fromBER(bytes);
|
|
62
|
+
// @ts-expect-error this looks fragile but DER is a canonical format so we are
|
|
63
|
+
// safe to have deeply property chains like this
|
|
64
|
+
const values = result.valueBlock.value[1].valueBlock.value[0].valueBlock.value;
|
|
65
|
+
return {
|
|
66
|
+
kty: 'RSA',
|
|
67
|
+
n: uint8ArrayToString(bnToBuf(values[0].toBigInt()), 'base64url'),
|
|
68
|
+
e: uint8ArrayToString(bnToBuf(values[1].toBigInt()), 'base64url')
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Convert a JWK key to PKIX in ASN1 DER format
|
|
73
|
+
*/
|
|
74
|
+
export function jwkToPkix(jwk) {
|
|
75
|
+
if (jwk.n == null || jwk.e == null) {
|
|
76
|
+
throw new InvalidParametersError('JWK was missing components');
|
|
77
|
+
}
|
|
78
|
+
const root = new asn1js.Sequence({
|
|
79
|
+
value: [
|
|
80
|
+
new asn1js.Sequence({
|
|
81
|
+
value: [
|
|
82
|
+
// rsaEncryption
|
|
83
|
+
new asn1js.ObjectIdentifier({
|
|
84
|
+
value: '1.2.840.113549.1.1.1'
|
|
85
|
+
}),
|
|
86
|
+
new asn1js.Null()
|
|
87
|
+
]
|
|
88
|
+
}),
|
|
89
|
+
// this appears to be a bug in asn1js.js - this should really be a Sequence
|
|
90
|
+
// and not a BitString but it generates the same bytes as node-forge so 🤷♂️
|
|
91
|
+
new asn1js.BitString({
|
|
92
|
+
valueHex: new asn1js.Sequence({
|
|
93
|
+
value: [
|
|
94
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.n, 'base64url'))),
|
|
95
|
+
asn1js.Integer.fromBigInt(bufToBn(uint8ArrayFromString(jwk.e, 'base64url')))
|
|
96
|
+
]
|
|
97
|
+
}).toBER()
|
|
98
|
+
})
|
|
99
|
+
]
|
|
100
|
+
});
|
|
101
|
+
const der = root.toBER();
|
|
102
|
+
return new Uint8Array(der, 0, der.byteLength);
|
|
103
|
+
}
|
|
104
|
+
function bnToBuf(bn) {
|
|
105
|
+
let hex = bn.toString(16);
|
|
106
|
+
if (hex.length % 2 > 0) {
|
|
107
|
+
hex = `0${hex}`;
|
|
108
|
+
}
|
|
109
|
+
const len = hex.length / 2;
|
|
110
|
+
const u8 = new Uint8Array(len);
|
|
111
|
+
let i = 0;
|
|
112
|
+
let j = 0;
|
|
113
|
+
while (i < len) {
|
|
114
|
+
u8[i] = parseInt(hex.slice(j, j + 2), 16);
|
|
115
|
+
i += 1;
|
|
116
|
+
j += 2;
|
|
117
|
+
}
|
|
118
|
+
return u8;
|
|
119
|
+
}
|
|
120
|
+
function bufToBn(u8) {
|
|
121
|
+
const hex = [];
|
|
122
|
+
u8.forEach(function (i) {
|
|
123
|
+
let h = i.toString(16);
|
|
124
|
+
if (h.length % 2 > 0) {
|
|
125
|
+
h = `0${h}`;
|
|
126
|
+
}
|
|
127
|
+
hex.push(h);
|
|
128
|
+
});
|
|
129
|
+
return BigInt('0x' + hex.join(''));
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Turn PCKS#1 DER bytes to a PrivateKey
|
|
133
|
+
*/
|
|
134
|
+
export function pkcs1ToRSAPrivateKey(bytes) {
|
|
135
|
+
const jwk = pkcs1ToJwk(bytes);
|
|
136
|
+
return jwkToRSAPrivateKey(jwk);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Turn PKIX bytes to a PublicKey
|
|
140
|
+
*/
|
|
141
|
+
export function pkixToRSAPublicKey(bytes) {
|
|
142
|
+
const jwk = pkixToJwk(bytes);
|
|
143
|
+
if (rsaKeySize(jwk) > MAX_RSA_KEY_SIZE) {
|
|
144
|
+
throw new InvalidPublicKeyError('Key size is too large');
|
|
145
|
+
}
|
|
146
|
+
const hash = sha256(pb.PublicKey.encode({
|
|
147
|
+
Type: pb.KeyType.RSA,
|
|
148
|
+
Data: bytes
|
|
149
|
+
}));
|
|
150
|
+
const digest = create(SHA2_256_CODE, hash);
|
|
151
|
+
return new RSAPublicKeyClass(jwk, digest);
|
|
152
|
+
}
|
|
153
|
+
export function jwkToRSAPrivateKey(jwk) {
|
|
154
|
+
if (rsaKeySize(jwk) > MAX_RSA_KEY_SIZE) {
|
|
155
|
+
throw new InvalidParametersError('Key size is too large');
|
|
156
|
+
}
|
|
157
|
+
const keys = jwkToJWKKeyPair(jwk);
|
|
158
|
+
const hash = sha256(pb.PublicKey.encode({
|
|
159
|
+
Type: pb.KeyType.RSA,
|
|
160
|
+
Data: jwkToPkix(keys.publicKey)
|
|
161
|
+
}));
|
|
162
|
+
const digest = create(SHA2_256_CODE, hash);
|
|
163
|
+
return new RSAPrivateKeyClass(keys.privateKey, new RSAPublicKeyClass(keys.publicKey, digest));
|
|
164
|
+
}
|
|
165
|
+
export async function generateRSAKeyPair(bits) {
|
|
166
|
+
if (bits > MAX_RSA_KEY_SIZE) {
|
|
167
|
+
throw new InvalidParametersError('Key size is too large');
|
|
168
|
+
}
|
|
169
|
+
const keys = await generateRSAKey(bits);
|
|
170
|
+
const hash = sha256(pb.PublicKey.encode({
|
|
171
|
+
Type: pb.KeyType.RSA,
|
|
172
|
+
Data: jwkToPkix(keys.publicKey)
|
|
173
|
+
}));
|
|
174
|
+
const digest = create(SHA2_256_CODE, hash);
|
|
175
|
+
return new RSAPrivateKeyClass(keys.privateKey, new RSAPublicKeyClass(keys.publicKey, digest));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Takes a jwk key and returns a JWK KeyPair
|
|
179
|
+
*/
|
|
180
|
+
export function jwkToJWKKeyPair(key) {
|
|
181
|
+
if (key == null) {
|
|
182
|
+
throw new InvalidParametersError('Missing key parameter');
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
privateKey: key,
|
|
186
|
+
publicKey: {
|
|
187
|
+
kty: key.kty,
|
|
188
|
+
n: key.n,
|
|
189
|
+
e: key.e
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/keys/rsa/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
2
|
+
/**
|
|
3
|
+
* Hash and sign message with private key
|
|
4
|
+
*/
|
|
5
|
+
export declare function hashAndSign(key: Uint8Array, msg: Uint8Array | Uint8ArrayList): Uint8Array | Promise<Uint8Array>;
|
|
6
|
+
/**
|
|
7
|
+
* Hash message and verify signature with public key
|
|
8
|
+
*/
|
|
9
|
+
export declare function hashAndVerify(key: Uint8Array, sig: Uint8Array, msg: Uint8Array | Uint8ArrayList): boolean | Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=index.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../../../../src/keys/secp256k1/index.browser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD;;GAEG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAehH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAe7H"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { secp256k1 as secp } from '@noble/curves/secp256k1';
|
|
2
|
+
import { sha256 } from 'multiformats/hashes/sha2';
|
|
3
|
+
import { SigningError, VerificationError } from '../../errors.js';
|
|
4
|
+
import { isPromise } from '../../util.js';
|
|
5
|
+
/**
|
|
6
|
+
* Hash and sign message with private key
|
|
7
|
+
*/
|
|
8
|
+
export function hashAndSign(key, msg) {
|
|
9
|
+
const p = sha256.digest(msg instanceof Uint8Array ? msg : msg.subarray());
|
|
10
|
+
if (isPromise(p)) {
|
|
11
|
+
return p.then(({ digest }) => secp.sign(digest, key).toDERRawBytes())
|
|
12
|
+
.catch(err => {
|
|
13
|
+
throw new SigningError(String(err));
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
return secp.sign(p.digest, key).toDERRawBytes();
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
throw new SigningError(String(err));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Hash message and verify signature with public key
|
|
25
|
+
*/
|
|
26
|
+
export function hashAndVerify(key, sig, msg) {
|
|
27
|
+
const p = sha256.digest(msg instanceof Uint8Array ? msg : msg.subarray());
|
|
28
|
+
if (isPromise(p)) {
|
|
29
|
+
return p.then(({ digest }) => secp.verify(sig, digest, key))
|
|
30
|
+
.catch(err => {
|
|
31
|
+
throw new VerificationError(String(err));
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
return secp.verify(sig, p.digest, key);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
throw new VerificationError(String(err));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../../../src/keys/secp256k1/index.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAGzC;;GAEG;AACH,MAAM,UAAU,WAAW,CAAE,GAAe,EAAE,GAAgC;IAC5E,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEzE,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;aAClE,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;IACN,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACrC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAE,GAAe,EAAE,GAAe,EAAE,GAAgC;IAC/F,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEzE,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;aACzD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACN,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
2
|
+
/**
|
|
3
|
+
* Hash and sign message with private key
|
|
4
|
+
*/
|
|
5
|
+
export declare function hashAndSign(key: Uint8Array, msg: Uint8Array | Uint8ArrayList): Uint8Array;
|
|
6
|
+
/**
|
|
7
|
+
* Hash message and verify signature with public key
|
|
8
|
+
*/
|
|
9
|
+
export declare function hashAndVerify(key: Uint8Array, sig: Uint8Array, msg: Uint8Array | Uint8ArrayList): boolean;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/keys/secp256k1/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD;;GAEG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,CAmB1F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO,CAkB1G"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import { secp256k1 as secp } from '@noble/curves/secp256k1';
|
|
3
|
+
import { SigningError, VerificationError } from '../../errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Hash and sign message with private key
|
|
6
|
+
*/
|
|
7
|
+
export function hashAndSign(key, msg) {
|
|
8
|
+
const hash = crypto.createHash('sha256');
|
|
9
|
+
if (msg instanceof Uint8Array) {
|
|
10
|
+
hash.update(msg);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
for (const buf of msg) {
|
|
14
|
+
hash.update(buf);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const digest = hash.digest();
|
|
18
|
+
try {
|
|
19
|
+
const signature = secp.sign(digest, key);
|
|
20
|
+
return signature.toDERRawBytes();
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
throw new SigningError(String(err));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Hash message and verify signature with public key
|
|
28
|
+
*/
|
|
29
|
+
export function hashAndVerify(key, sig, msg) {
|
|
30
|
+
const hash = crypto.createHash('sha256');
|
|
31
|
+
if (msg instanceof Uint8Array) {
|
|
32
|
+
hash.update(msg);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
for (const buf of msg) {
|
|
36
|
+
hash.update(buf);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const digest = hash.digest();
|
|
40
|
+
try {
|
|
41
|
+
return secp.verify(sig, digest, key);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
throw new VerificationError(String(err));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/keys/secp256k1/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGjE;;GAEG;AACH,MAAM,UAAU,WAAW,CAAE,GAAe,EAAE,GAAgC;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAExC,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IAE5B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACxC,OAAO,SAAS,CAAC,aAAa,EAAE,CAAA;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACrC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAE,GAAe,EAAE,GAAe,EAAE,GAAgC;IAC/F,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAExC,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IAE5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
|