@libp2p/crypto 5.0.13 → 5.0.14
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 +1 -71
- package/dist/src/keys/index.d.ts +9 -2
- package/dist/src/keys/index.d.ts.map +1 -1
- package/dist/src/keys/index.js +9 -3
- package/dist/src/keys/index.js.map +1 -1
- package/dist/src/keys/rsa/der.d.ts +10 -0
- package/dist/src/keys/rsa/der.d.ts.map +1 -0
- package/dist/src/keys/rsa/der.js +137 -0
- package/dist/src/keys/rsa/der.js.map +1 -0
- package/dist/src/keys/rsa/utils.d.ts +6 -5
- package/dist/src/keys/rsa/utils.d.ts.map +1 -1
- package/dist/src/keys/rsa/utils.js +56 -94
- package/dist/src/keys/rsa/utils.js.map +1 -1
- package/package.json +3 -3
- package/src/keys/index.ts +10 -3
- package/src/keys/rsa/der.ts +212 -0
- package/src/keys/rsa/utils.ts +69 -111
package/dist/src/keys/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import type { PrivateKey, PublicKey, KeyType, RSAPrivateKey, Secp256k1PrivateKey, Ed25519PrivateKey, Secp256k1PublicKey, Ed25519PublicKey } from '@libp2p/interface';
|
|
11
11
|
import type { MultihashDigest } from 'multiformats';
|
|
12
|
+
import type { Digest } from 'multiformats/hashes/digest';
|
|
12
13
|
export { generateEphemeralKeyPair } from './ecdh/index.js';
|
|
13
14
|
export type { Curve } from './ecdh/index.js';
|
|
14
15
|
export type { ECDHKey, EnhancedKey, EnhancedKeyPair, ECDHKeyPair } from './interface.js';
|
|
@@ -29,9 +30,15 @@ export declare function generateKeyPair(type: KeyType, bits?: number): Promise<P
|
|
|
29
30
|
export declare function generateKeyPairFromSeed(type: 'Ed25519', seed: Uint8Array): Promise<Ed25519PrivateKey>;
|
|
30
31
|
export declare function generateKeyPairFromSeed<T extends KeyType>(type: T, seed: Uint8Array, bits?: number): Promise<never>;
|
|
31
32
|
/**
|
|
32
|
-
* Converts a protobuf serialized public key into its representative object
|
|
33
|
+
* Converts a protobuf serialized public key into its representative object.
|
|
34
|
+
*
|
|
35
|
+
* For RSA public keys optionally pass the multihash digest of the public key if
|
|
36
|
+
* it is known. If the digest is omitted it will be calculated which can be
|
|
37
|
+
* expensive.
|
|
38
|
+
*
|
|
39
|
+
* For other key types the digest option is ignored.
|
|
33
40
|
*/
|
|
34
|
-
export declare function publicKeyFromProtobuf(buf: Uint8Array): PublicKey;
|
|
41
|
+
export declare function publicKeyFromProtobuf(buf: Uint8Array, digest?: Digest<18, number>): PublicKey;
|
|
35
42
|
/**
|
|
36
43
|
* Creates a public key from the raw key bytes
|
|
37
44
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/keys/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpK,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/keys/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpK,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAExD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAC5C,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;GAEG;AACH,wBAAsB,eAAe,CAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AACnF,wBAAsB,eAAe,CAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AACvF,wBAAsB,eAAe,CAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;AAC1F,wBAAsB,eAAe,CAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAiBzF;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAC7G,wBAAsB,uBAAuB,CAAE,CAAC,SAAS,OAAO,EAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;AAS5H;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,SAAS,CAc9F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,UAAU,GAAG,SAAS,CAQ5D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,gBAAgB,GAAG,kBAAkB,CAY3G;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAE,GAAG,EAAE,SAAS,GAAG,UAAU,CAK/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAE,GAAG,EAAE,UAAU,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,aAAa,CAchH;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAQ9D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAKjE"}
|
package/dist/src/keys/index.js
CHANGED
|
@@ -33,14 +33,20 @@ export async function generateKeyPairFromSeed(type, seed) {
|
|
|
33
33
|
return generateEd25519KeyPairFromSeed(seed);
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
* Converts a protobuf serialized public key into its representative object
|
|
36
|
+
* Converts a protobuf serialized public key into its representative object.
|
|
37
|
+
*
|
|
38
|
+
* For RSA public keys optionally pass the multihash digest of the public key if
|
|
39
|
+
* it is known. If the digest is omitted it will be calculated which can be
|
|
40
|
+
* expensive.
|
|
41
|
+
*
|
|
42
|
+
* For other key types the digest option is ignored.
|
|
37
43
|
*/
|
|
38
|
-
export function publicKeyFromProtobuf(buf) {
|
|
44
|
+
export function publicKeyFromProtobuf(buf, digest) {
|
|
39
45
|
const { Type, Data } = pb.PublicKey.decode(buf);
|
|
40
46
|
const data = Data ?? new Uint8Array();
|
|
41
47
|
switch (Type) {
|
|
42
48
|
case pb.KeyType.RSA:
|
|
43
|
-
return pkixToRSAPublicKey(data);
|
|
49
|
+
return pkixToRSAPublicKey(data, digest);
|
|
44
50
|
case pb.KeyType.Ed25519:
|
|
45
51
|
return unmarshalEd25519PublicKey(data);
|
|
46
52
|
case pb.KeyType.secp256k1:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/keys/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,8BAA8B,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAClJ,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC7F,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/keys/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Uint8ArrayList } from 'uint8arraylist';
|
|
2
|
+
interface Context {
|
|
3
|
+
offset: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function decodeDer(buf: Uint8Array, context?: Context): any;
|
|
6
|
+
export declare function encodeInteger(value: Uint8Array | Uint8ArrayList): Uint8ArrayList;
|
|
7
|
+
export declare function encodeBitString(value: Uint8Array | Uint8ArrayList): Uint8ArrayList;
|
|
8
|
+
export declare function encodeSequence(values: Array<Uint8Array | Uint8ArrayList>): Uint8ArrayList;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=der.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"der.d.ts","sourceRoot":"","sources":["../../../../src/keys/rsa/der.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,UAAU,OAAO;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAoBD,wBAAgB,SAAS,CAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,OAAuB,GAAG,GAAG,CASjF;AAiID,wBAAgB,aAAa,CAAE,KAAK,EAAE,UAAU,GAAG,cAAc,GAAG,cAAc,CAiBjF;AAED,wBAAgB,eAAe,CAAE,KAAK,EAAE,UAAU,GAAG,cAAc,GAAG,cAAc,CAcnF;AAED,wBAAgB,cAAc,CAAE,MAAM,EAAE,KAAK,CAAC,UAAU,GAAG,cAAc,CAAC,GAAG,cAAc,CAc1F"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Uint8ArrayList } from 'uint8arraylist';
|
|
2
|
+
const TAG_MASK = parseInt('11111', 2);
|
|
3
|
+
const LONG_LENGTH_MASK = parseInt('10000000', 2);
|
|
4
|
+
const LONG_LENGTH_BYTES_MASK = parseInt('01111111', 2);
|
|
5
|
+
const decoders = {
|
|
6
|
+
0x2: readInteger,
|
|
7
|
+
0x3: readBitString,
|
|
8
|
+
0x5: readNull,
|
|
9
|
+
0x6: readObjectIdentifier,
|
|
10
|
+
0x10: readSequence,
|
|
11
|
+
0x16: readSequence,
|
|
12
|
+
0x30: readSequence
|
|
13
|
+
};
|
|
14
|
+
export function decodeDer(buf, context = { offset: 0 }) {
|
|
15
|
+
const tag = buf[context.offset] & TAG_MASK;
|
|
16
|
+
context.offset++;
|
|
17
|
+
if (decoders[tag] != null) {
|
|
18
|
+
return decoders[tag](buf, context);
|
|
19
|
+
}
|
|
20
|
+
throw new Error('No decoder for tag ' + tag);
|
|
21
|
+
}
|
|
22
|
+
function readLength(buf, context) {
|
|
23
|
+
let length = 0;
|
|
24
|
+
if ((buf[context.offset] & LONG_LENGTH_MASK) === LONG_LENGTH_MASK) {
|
|
25
|
+
// long length
|
|
26
|
+
const count = buf[context.offset] & LONG_LENGTH_BYTES_MASK;
|
|
27
|
+
let str = '0x';
|
|
28
|
+
context.offset++;
|
|
29
|
+
for (let i = 0; i < count; i++, context.offset++) {
|
|
30
|
+
str += buf[context.offset].toString(16).padStart(2, '0');
|
|
31
|
+
}
|
|
32
|
+
length = parseInt(str, 16);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
length = buf[context.offset];
|
|
36
|
+
context.offset++;
|
|
37
|
+
}
|
|
38
|
+
return length;
|
|
39
|
+
}
|
|
40
|
+
function readSequence(buf, context) {
|
|
41
|
+
readLength(buf, context);
|
|
42
|
+
const entries = [];
|
|
43
|
+
while (true) {
|
|
44
|
+
if (context.offset >= buf.byteLength) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
const result = decodeDer(buf, context);
|
|
48
|
+
if (result === null) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
entries.push(result);
|
|
52
|
+
}
|
|
53
|
+
return entries;
|
|
54
|
+
}
|
|
55
|
+
function readInteger(buf, context) {
|
|
56
|
+
const length = readLength(buf, context);
|
|
57
|
+
const start = context.offset;
|
|
58
|
+
const end = context.offset + length;
|
|
59
|
+
const vals = [];
|
|
60
|
+
for (let i = start; i < end; i++) {
|
|
61
|
+
if (i === start && buf[i] === 0) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
vals.push(buf[i]);
|
|
65
|
+
}
|
|
66
|
+
context.offset += length;
|
|
67
|
+
return Uint8Array.from(vals);
|
|
68
|
+
}
|
|
69
|
+
function readObjectIdentifier(buf, context) {
|
|
70
|
+
const count = readLength(buf, context);
|
|
71
|
+
// skip OID
|
|
72
|
+
context.offset += count;
|
|
73
|
+
return ['oid-unimplemented'];
|
|
74
|
+
}
|
|
75
|
+
function readNull(buf, context) {
|
|
76
|
+
context.offset++;
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
function readBitString(buf, context) {
|
|
80
|
+
const length = readLength(buf, context);
|
|
81
|
+
const unusedBits = buf[context.offset];
|
|
82
|
+
context.offset++;
|
|
83
|
+
const bytes = buf.subarray(context.offset, context.offset + length);
|
|
84
|
+
context.offset += length;
|
|
85
|
+
if (unusedBits !== 0) {
|
|
86
|
+
// need to shift all bytes along by this many bits
|
|
87
|
+
throw new Error('Unused bits in bit string is unimplemented');
|
|
88
|
+
}
|
|
89
|
+
return decodeDer(bytes, {
|
|
90
|
+
offset: 0
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function encodeNumber(value) {
|
|
94
|
+
let number = value.toString(16);
|
|
95
|
+
if (number.length % 2 === 1) {
|
|
96
|
+
number = '0' + number;
|
|
97
|
+
}
|
|
98
|
+
const array = new Uint8ArrayList();
|
|
99
|
+
for (let i = 0; i < number.length; i += 2) {
|
|
100
|
+
array.append(Uint8Array.from([parseInt(`${number[i]}${number[i + 1]}`, 16)]));
|
|
101
|
+
}
|
|
102
|
+
return array;
|
|
103
|
+
}
|
|
104
|
+
function encodeLength(bytes) {
|
|
105
|
+
if (bytes.byteLength < 128) {
|
|
106
|
+
return Uint8Array.from([bytes.byteLength]);
|
|
107
|
+
}
|
|
108
|
+
// long length
|
|
109
|
+
const length = encodeNumber(bytes.byteLength);
|
|
110
|
+
return new Uint8ArrayList(Uint8Array.from([
|
|
111
|
+
length.byteLength | LONG_LENGTH_MASK
|
|
112
|
+
]), length);
|
|
113
|
+
}
|
|
114
|
+
export function encodeInteger(value) {
|
|
115
|
+
const contents = new Uint8ArrayList();
|
|
116
|
+
const mask = parseInt('10000000', 2);
|
|
117
|
+
const positive = (value.subarray()[0] & mask) === mask;
|
|
118
|
+
if (positive) {
|
|
119
|
+
contents.append(Uint8Array.from([0]));
|
|
120
|
+
}
|
|
121
|
+
contents.append(value);
|
|
122
|
+
return new Uint8ArrayList(Uint8Array.from([0x02]), encodeLength(contents), contents);
|
|
123
|
+
}
|
|
124
|
+
export function encodeBitString(value) {
|
|
125
|
+
// unused bits is always 0 with full-byte-only values
|
|
126
|
+
const unusedBits = Uint8Array.from([0]);
|
|
127
|
+
const contents = new Uint8ArrayList(unusedBits, value);
|
|
128
|
+
return new Uint8ArrayList(Uint8Array.from([0x03]), encodeLength(contents), contents);
|
|
129
|
+
}
|
|
130
|
+
export function encodeSequence(values) {
|
|
131
|
+
const output = new Uint8ArrayList();
|
|
132
|
+
for (const buf of values) {
|
|
133
|
+
output.append(buf);
|
|
134
|
+
}
|
|
135
|
+
return new Uint8ArrayList(Uint8Array.from([0x30]), encodeLength(output), output);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=der.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"der.js","sourceRoot":"","sources":["../../../../src/keys/rsa/der.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAM/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AACrC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;AAChD,MAAM,sBAAsB,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;AAMtD,MAAM,QAAQ,GAA4B;IACxC,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,oBAAoB;IACzB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;CACnB,CAAA;AAED,MAAM,UAAU,SAAS,CAAE,GAAe,EAAE,UAAmB,EAAE,MAAM,EAAE,CAAC,EAAE;IAC1E,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAA;IAC1C,OAAO,CAAC,MAAM,EAAE,CAAA;IAEhB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,GAAG,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,UAAU,CAAE,GAAe,EAAE,OAAgB;IACpD,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,gBAAgB,EAAE,CAAC;QAClE,cAAc;QACd,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,sBAAsB,CAAA;QAC1D,IAAI,GAAG,GAAG,IAAI,CAAA;QACd,OAAO,CAAC,MAAM,EAAE,CAAA;QAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC1D,CAAC;QAED,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC5B,OAAO,CAAC,MAAM,EAAE,CAAA;IAClB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,YAAY,CAAE,GAAe,EAAE,OAAgB;IACtD,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACxB,MAAM,OAAO,GAAU,EAAE,CAAA;IAEzB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACrC,MAAK;QACP,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAEtC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAK;QACP,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtB,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,WAAW,CAAE,GAAe,EAAE,OAAgB;IACrD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAA;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;IAEnC,MAAM,IAAI,GAAa,EAAE,CAAA;IAEzB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED,OAAO,CAAC,MAAM,IAAI,MAAM,CAAA;IAExB,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,oBAAoB,CAAE,GAAe,EAAE,OAAgB;IAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAEtC,WAAW;IACX,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;IAEvB,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAE,GAAe,EAAE,OAAgB;IAClD,OAAO,CAAC,MAAM,EAAE,CAAA;IAEhB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,aAAa,CAAE,GAAe,EAAE,OAAgB;IACvD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACvC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,OAAO,CAAC,MAAM,EAAE,CAAA;IAChB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IACnE,OAAO,CAAC,MAAM,IAAI,MAAM,CAAA;IAExB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,kDAAkD;QAClD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,SAAS,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,CAAC;KACV,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAE,KAAa;IAClC,IAAI,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE/B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,cAAc,EAAE,CAAA;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/E,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,YAAY,CAAE,KAA6B;IAClD,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,cAAc;IACd,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAE7C,OAAO,IAAI,cAAc,CACvB,UAAU,CAAC,IAAI,CAAC;QACd,MAAM,CAAC,UAAU,GAAG,gBAAgB;KACrC,CAAC,EACF,MAAM,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAE,KAAkC;IAC/D,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAA;IAErC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAA;IAEtD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEtB,OAAO,IAAI,cAAc,CACvB,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EACvB,YAAY,CAAC,QAAQ,CAAC,EACtB,QAAQ,CACT,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAE,KAAkC;IACjE,qDAAqD;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEvC,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,UAAU,EACV,KAAK,CACN,CAAA;IAED,OAAO,IAAI,cAAc,CACvB,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EACvB,YAAY,CAAC,QAAQ,CAAC,EACtB,QAAQ,CACT,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAE,MAA0C;IACxE,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;IAEnC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,CACX,GAAG,CACJ,CAAA;IACH,CAAC;IAED,OAAO,IAAI,cAAc,CACvB,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EACvB,YAAY,CAAC,MAAM,CAAC,EACpB,MAAM,CACP,CAAA;AACH,CAAC"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import type { JWKKeyPair } from '../interface.js';
|
|
2
2
|
import type { RSAPrivateKey, RSAPublicKey } from '@libp2p/interface';
|
|
3
|
+
import type { Digest } from 'multiformats/hashes/digest';
|
|
3
4
|
export declare const MAX_RSA_KEY_SIZE = 8192;
|
|
4
5
|
/**
|
|
5
|
-
* Convert a PKCS#1 in ASN1 DER format to a JWK key
|
|
6
|
+
* Convert a PKCS#1 in ASN1 DER format to a JWK private key
|
|
6
7
|
*/
|
|
7
8
|
export declare function pkcs1ToJwk(bytes: Uint8Array): JsonWebKey;
|
|
8
9
|
/**
|
|
9
|
-
* Convert a JWK key into PKCS#1 in ASN1 DER format
|
|
10
|
+
* Convert a JWK private key into PKCS#1 in ASN1 DER format
|
|
10
11
|
*/
|
|
11
12
|
export declare function jwkToPkcs1(jwk: JsonWebKey): Uint8Array;
|
|
12
13
|
/**
|
|
13
|
-
* Convert a PKIX in ASN1 DER format to a JWK key
|
|
14
|
+
* Convert a PKIX in ASN1 DER format to a JWK public key
|
|
14
15
|
*/
|
|
15
16
|
export declare function pkixToJwk(bytes: Uint8Array): JsonWebKey;
|
|
16
17
|
/**
|
|
17
|
-
* Convert a JWK key to PKIX in ASN1 DER format
|
|
18
|
+
* Convert a JWK public key to PKIX in ASN1 DER format
|
|
18
19
|
*/
|
|
19
20
|
export declare function jwkToPkix(jwk: JsonWebKey): Uint8Array;
|
|
20
21
|
/**
|
|
@@ -24,7 +25,7 @@ export declare function pkcs1ToRSAPrivateKey(bytes: Uint8Array): RSAPrivateKey;
|
|
|
24
25
|
/**
|
|
25
26
|
* Turn PKIX bytes to a PublicKey
|
|
26
27
|
*/
|
|
27
|
-
export declare function pkixToRSAPublicKey(bytes: Uint8Array): RSAPublicKey;
|
|
28
|
+
export declare function pkixToRSAPublicKey(bytes: Uint8Array, digest?: Digest<18, number>): RSAPublicKey;
|
|
28
29
|
export declare function jwkToRSAPrivateKey(jwk: JsonWebKey): RSAPrivateKey;
|
|
29
30
|
export declare function generateRSAKeyPair(bits: number): Promise<RSAPrivateKey>;
|
|
30
31
|
/**
|
|
@@ -1 +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;
|
|
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;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAExD,eAAO,MAAM,gBAAgB,OAAO,CAAA;AAQpC;;GAEG;AACH,wBAAgB,UAAU,CAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CAczD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAgBvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CAkBxD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAgBtD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAItE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,YAAY,CAgBhG;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"}
|
|
@@ -1,124 +1,84 @@
|
|
|
1
1
|
import { InvalidParametersError, InvalidPublicKeyError } from '@libp2p/interface';
|
|
2
2
|
import { sha256 } from '@noble/hashes/sha256';
|
|
3
|
-
import * as asn1js from 'asn1js';
|
|
4
3
|
import { create } from 'multiformats/hashes/digest';
|
|
5
4
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
6
5
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
7
6
|
import * as pb from '../keys.js';
|
|
7
|
+
import { decodeDer, encodeBitString, encodeInteger, encodeSequence } from './der.js';
|
|
8
8
|
import { RSAPrivateKey as RSAPrivateKeyClass, RSAPublicKey as RSAPublicKeyClass } from './rsa.js';
|
|
9
9
|
import { generateRSAKey, rsaKeySize } from './index.js';
|
|
10
10
|
export const MAX_RSA_KEY_SIZE = 8192;
|
|
11
11
|
const SHA2_256_CODE = 0x12;
|
|
12
|
+
const MAX_RSA_JWK_SIZE = 1062;
|
|
13
|
+
const RSA_ALGORITHM_IDENTIFIER = Uint8Array.from([
|
|
14
|
+
0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00
|
|
15
|
+
]);
|
|
12
16
|
/**
|
|
13
|
-
* Convert a PKCS#1 in ASN1 DER format to a JWK key
|
|
17
|
+
* Convert a PKCS#1 in ASN1 DER format to a JWK private key
|
|
14
18
|
*/
|
|
15
19
|
export function pkcs1ToJwk(bytes) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
dq: asn1jsIntegerToBase64(values[7]),
|
|
28
|
-
qi: asn1jsIntegerToBase64(values[8]),
|
|
29
|
-
kty: 'RSA',
|
|
30
|
-
alg: 'RS256'
|
|
20
|
+
const values = decodeDer(bytes);
|
|
21
|
+
return {
|
|
22
|
+
n: uint8ArrayToString(values[1], 'base64url'),
|
|
23
|
+
e: uint8ArrayToString(values[2], 'base64url'),
|
|
24
|
+
d: uint8ArrayToString(values[3], 'base64url'),
|
|
25
|
+
p: uint8ArrayToString(values[4], 'base64url'),
|
|
26
|
+
q: uint8ArrayToString(values[5], 'base64url'),
|
|
27
|
+
dp: uint8ArrayToString(values[6], 'base64url'),
|
|
28
|
+
dq: uint8ArrayToString(values[7], 'base64url'),
|
|
29
|
+
qi: uint8ArrayToString(values[8], 'base64url'),
|
|
30
|
+
kty: 'RSA'
|
|
31
31
|
};
|
|
32
|
-
return key;
|
|
33
32
|
}
|
|
34
33
|
/**
|
|
35
|
-
* Convert a JWK key into PKCS#1 in ASN1 DER format
|
|
34
|
+
* Convert a JWK private key into PKCS#1 in ASN1 DER format
|
|
36
35
|
*/
|
|
37
36
|
export function jwkToPkcs1(jwk) {
|
|
38
37
|
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
38
|
throw new InvalidParametersError('JWK was missing components');
|
|
40
39
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
]
|
|
53
|
-
});
|
|
54
|
-
const der = root.toBER();
|
|
55
|
-
return new Uint8Array(der, 0, der.byteLength);
|
|
40
|
+
return encodeSequence([
|
|
41
|
+
encodeInteger(Uint8Array.from([0])),
|
|
42
|
+
encodeInteger(uint8ArrayFromString(jwk.n, 'base64url')),
|
|
43
|
+
encodeInteger(uint8ArrayFromString(jwk.e, 'base64url')),
|
|
44
|
+
encodeInteger(uint8ArrayFromString(jwk.d, 'base64url')),
|
|
45
|
+
encodeInteger(uint8ArrayFromString(jwk.p, 'base64url')),
|
|
46
|
+
encodeInteger(uint8ArrayFromString(jwk.q, 'base64url')),
|
|
47
|
+
encodeInteger(uint8ArrayFromString(jwk.dp, 'base64url')),
|
|
48
|
+
encodeInteger(uint8ArrayFromString(jwk.dq, 'base64url')),
|
|
49
|
+
encodeInteger(uint8ArrayFromString(jwk.qi, 'base64url'))
|
|
50
|
+
]).subarray();
|
|
56
51
|
}
|
|
57
52
|
/**
|
|
58
|
-
* Convert a PKIX in ASN1 DER format to a JWK key
|
|
53
|
+
* Convert a PKIX in ASN1 DER format to a JWK public key
|
|
59
54
|
*/
|
|
60
55
|
export function pkixToJwk(bytes) {
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
56
|
+
const decoded = decodeDer(bytes, {
|
|
57
|
+
offset: 0
|
|
58
|
+
});
|
|
59
|
+
// this looks fragile but DER is a canonical format so we are safe to have
|
|
60
|
+
// deeply property chains like this
|
|
65
61
|
return {
|
|
66
62
|
kty: 'RSA',
|
|
67
|
-
n:
|
|
68
|
-
e:
|
|
63
|
+
n: uint8ArrayToString(decoded[1][0], 'base64url'),
|
|
64
|
+
e: uint8ArrayToString(decoded[1][1], 'base64url')
|
|
69
65
|
};
|
|
70
66
|
}
|
|
71
67
|
/**
|
|
72
|
-
* Convert a JWK key to PKIX in ASN1 DER format
|
|
68
|
+
* Convert a JWK public key to PKIX in ASN1 DER format
|
|
73
69
|
*/
|
|
74
70
|
export function jwkToPkix(jwk) {
|
|
75
71
|
if (jwk.n == null || jwk.e == null) {
|
|
76
72
|
throw new InvalidParametersError('JWK was missing components');
|
|
77
73
|
}
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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 asn1jsIntegerToBase64(int) {
|
|
105
|
-
let buf = int.valueBlock.valueHexView;
|
|
106
|
-
// chrome rejects values with leading 0s
|
|
107
|
-
while (buf[0] === 0) {
|
|
108
|
-
buf = buf.subarray(1);
|
|
109
|
-
}
|
|
110
|
-
return uint8ArrayToString(buf, 'base64url');
|
|
111
|
-
}
|
|
112
|
-
function bufToBn(u8) {
|
|
113
|
-
const hex = [];
|
|
114
|
-
u8.forEach(function (i) {
|
|
115
|
-
let h = i.toString(16);
|
|
116
|
-
if (h.length % 2 > 0) {
|
|
117
|
-
h = `0${h}`;
|
|
118
|
-
}
|
|
119
|
-
hex.push(h);
|
|
120
|
-
});
|
|
121
|
-
return BigInt('0x' + hex.join(''));
|
|
74
|
+
const subjectPublicKeyInfo = encodeSequence([
|
|
75
|
+
RSA_ALGORITHM_IDENTIFIER,
|
|
76
|
+
encodeBitString(encodeSequence([
|
|
77
|
+
encodeInteger(uint8ArrayFromString(jwk.n, 'base64url')),
|
|
78
|
+
encodeInteger(uint8ArrayFromString(jwk.e, 'base64url'))
|
|
79
|
+
]))
|
|
80
|
+
]);
|
|
81
|
+
return subjectPublicKeyInfo.subarray();
|
|
122
82
|
}
|
|
123
83
|
/**
|
|
124
84
|
* Turn PKCS#1 DER bytes to a PrivateKey
|
|
@@ -130,16 +90,18 @@ export function pkcs1ToRSAPrivateKey(bytes) {
|
|
|
130
90
|
/**
|
|
131
91
|
* Turn PKIX bytes to a PublicKey
|
|
132
92
|
*/
|
|
133
|
-
export function pkixToRSAPublicKey(bytes) {
|
|
134
|
-
|
|
135
|
-
if (rsaKeySize(jwk) > MAX_RSA_KEY_SIZE) {
|
|
93
|
+
export function pkixToRSAPublicKey(bytes, digest) {
|
|
94
|
+
if (bytes.byteLength >= MAX_RSA_JWK_SIZE) {
|
|
136
95
|
throw new InvalidPublicKeyError('Key size is too large');
|
|
137
96
|
}
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
97
|
+
const jwk = pkixToJwk(bytes);
|
|
98
|
+
if (digest == null) {
|
|
99
|
+
const hash = sha256(pb.PublicKey.encode({
|
|
100
|
+
Type: pb.KeyType.RSA,
|
|
101
|
+
Data: bytes
|
|
102
|
+
}));
|
|
103
|
+
digest = create(SHA2_256_CODE, hash);
|
|
104
|
+
}
|
|
143
105
|
return new RSAPublicKeyClass(jwk, digest);
|
|
144
106
|
}
|
|
145
107
|
export function jwkToRSAPrivateKey(jwk) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/keys/rsa/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/keys/rsa/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/crypto",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.14",
|
|
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/main/packages/crypto#readme",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
],
|
|
49
49
|
"exports": {
|
|
50
50
|
".": {
|
|
51
|
-
"types": "./src/index.d.ts",
|
|
51
|
+
"types": "./dist/src/index.d.ts",
|
|
52
52
|
"import": "./dist/src/index.js"
|
|
53
53
|
},
|
|
54
54
|
"./ciphers": {
|
|
@@ -95,7 +95,6 @@
|
|
|
95
95
|
"@libp2p/interface": "^2.6.1",
|
|
96
96
|
"@noble/curves": "^1.7.0",
|
|
97
97
|
"@noble/hashes": "^1.6.1",
|
|
98
|
-
"asn1js": "^3.0.5",
|
|
99
98
|
"multiformats": "^13.3.1",
|
|
100
99
|
"protons-runtime": "^5.5.0",
|
|
101
100
|
"uint8arraylist": "^2.4.8",
|
|
@@ -104,6 +103,7 @@
|
|
|
104
103
|
"devDependencies": {
|
|
105
104
|
"@types/mocha": "^10.0.10",
|
|
106
105
|
"aegir": "^45.1.1",
|
|
106
|
+
"asn1js": "^3.0.5",
|
|
107
107
|
"benchmark": "^2.1.4",
|
|
108
108
|
"protons": "^7.6.0"
|
|
109
109
|
},
|
package/src/keys/index.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { pkcs1ToRSAPrivateKey, pkixToRSAPublicKey, generateRSAKeyPair } from './
|
|
|
15
15
|
import { generateSecp256k1KeyPair, unmarshalSecp256k1PrivateKey, unmarshalSecp256k1PublicKey } from './secp256k1/utils.js'
|
|
16
16
|
import type { PrivateKey, PublicKey, KeyType, RSAPrivateKey, Secp256k1PrivateKey, Ed25519PrivateKey, Secp256k1PublicKey, Ed25519PublicKey } from '@libp2p/interface'
|
|
17
17
|
import type { MultihashDigest } from 'multiformats'
|
|
18
|
+
import type { Digest } from 'multiformats/hashes/digest'
|
|
18
19
|
|
|
19
20
|
export { generateEphemeralKeyPair } from './ecdh/index.js'
|
|
20
21
|
export type { Curve } from './ecdh/index.js'
|
|
@@ -61,15 +62,21 @@ export async function generateKeyPairFromSeed (type: string, seed: Uint8Array):
|
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
/**
|
|
64
|
-
* Converts a protobuf serialized public key into its representative object
|
|
65
|
+
* Converts a protobuf serialized public key into its representative object.
|
|
66
|
+
*
|
|
67
|
+
* For RSA public keys optionally pass the multihash digest of the public key if
|
|
68
|
+
* it is known. If the digest is omitted it will be calculated which can be
|
|
69
|
+
* expensive.
|
|
70
|
+
*
|
|
71
|
+
* For other key types the digest option is ignored.
|
|
65
72
|
*/
|
|
66
|
-
export function publicKeyFromProtobuf (buf: Uint8Array): PublicKey {
|
|
73
|
+
export function publicKeyFromProtobuf (buf: Uint8Array, digest?: Digest<18, number>): PublicKey {
|
|
67
74
|
const { Type, Data } = pb.PublicKey.decode(buf)
|
|
68
75
|
const data = Data ?? new Uint8Array()
|
|
69
76
|
|
|
70
77
|
switch (Type) {
|
|
71
78
|
case pb.KeyType.RSA:
|
|
72
|
-
return pkixToRSAPublicKey(data)
|
|
79
|
+
return pkixToRSAPublicKey(data, digest)
|
|
73
80
|
case pb.KeyType.Ed25519:
|
|
74
81
|
return unmarshalEd25519PublicKey(data)
|
|
75
82
|
case pb.KeyType.secp256k1:
|