@peerbit/crypto 1.0.9 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/bytes.js.map +1 -1
- package/lib/esm/ed25519-sign-browser.js.map +1 -1
- package/lib/esm/ed25519-sign.js.map +1 -1
- package/lib/esm/ed25519.js.map +1 -1
- package/lib/esm/encryption.d.ts +45 -9
- package/lib/esm/encryption.js +195 -99
- package/lib/esm/encryption.js.map +1 -1
- package/lib/esm/index.d.ts +0 -2
- package/lib/esm/index.js +1 -3
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/key.d.ts +8 -0
- package/lib/esm/key.js +30 -1
- package/lib/esm/key.js.map +1 -1
- package/lib/esm/libp2p.js.map +1 -1
- package/lib/esm/prehash.js.map +1 -1
- package/lib/esm/sepc256k1.d.ts +3 -1
- package/lib/esm/sepc256k1.js.map +1 -1
- package/lib/esm/signature.js.map +1 -1
- package/lib/esm/x25519.js.map +1 -1
- package/package.json +8 -7
- package/src/encryption.ts +327 -119
- package/src/index.ts +1 -3
- package/src/key.ts +24 -1
- package/src/sepc256k1.ts +5 -2
- package/lib/esm/keychain.d.ts +0 -30
- package/lib/esm/keychain.js +0 -142
- package/lib/esm/keychain.js.map +0 -1
- package/src/keychain.ts +0 -197
package/lib/esm/keychain.js
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { keysPBM } from "@libp2p/crypto/keys";
|
|
2
|
-
import { identity } from "multiformats/hashes/identity";
|
|
3
|
-
import { base58btc } from "multiformats/bases/base58";
|
|
4
|
-
import { Ed25519Keypair, Ed25519PublicKey } from "./ed25519.js";
|
|
5
|
-
import { Keypair, PublicSignKey } from "./key.js";
|
|
6
|
-
import { AccessError, X25519Keypair, X25519PublicKey } from "./x25519.js";
|
|
7
|
-
export class Libp2pKeychain {
|
|
8
|
-
keychain;
|
|
9
|
-
options;
|
|
10
|
-
constructor(keychain, options) {
|
|
11
|
-
this.keychain = keychain;
|
|
12
|
-
this.options = options;
|
|
13
|
-
}
|
|
14
|
-
keychainKeyIdFromPublicKey(publicKey) {
|
|
15
|
-
const bytes = keysPBM.PublicKey.encode({
|
|
16
|
-
Type: keysPBM.KeyType.Ed25519,
|
|
17
|
-
Data: publicKey.publicKey
|
|
18
|
-
}).subarray();
|
|
19
|
-
const encoding = identity.digest(bytes);
|
|
20
|
-
return base58btc.encode(encoding.bytes).substring(1);
|
|
21
|
-
}
|
|
22
|
-
cacheKey(key, id) {
|
|
23
|
-
this.options?.cache?.add(base58btc.encode(key.publicKey.bytes), key);
|
|
24
|
-
id && this.options?.cache?.add(base58btc.encode(id), key);
|
|
25
|
-
}
|
|
26
|
-
getCachedById(id) {
|
|
27
|
-
const key = base58btc.encode(id instanceof PublicSignKey ? id.bytes : id);
|
|
28
|
-
const cached = this.options?.cache?.get(key);
|
|
29
|
-
if (cached === null) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
else if (!cached) {
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
else if (cached instanceof Ed25519Keypair) {
|
|
36
|
-
return cached;
|
|
37
|
-
}
|
|
38
|
-
throw new Error("Unexpected cached keypair type: " + key?.constructor.name);
|
|
39
|
-
}
|
|
40
|
-
getCachedByKey(publicKey) {
|
|
41
|
-
const key = base58btc.encode(publicKey.bytes);
|
|
42
|
-
const cached = this.options?.cache?.get(key);
|
|
43
|
-
if (cached === null) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
else if (!cached) {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
else if (cached instanceof Keypair) {
|
|
50
|
-
return cached;
|
|
51
|
-
}
|
|
52
|
-
throw new Error("Unexpected cached keypair type: " + key?.constructor.name);
|
|
53
|
-
}
|
|
54
|
-
exportByKey = async (publicKey) => {
|
|
55
|
-
const cached = this.getCachedByKey(publicKey);
|
|
56
|
-
if (cached !== undefined) {
|
|
57
|
-
// if null, means key is deleted
|
|
58
|
-
return cached ? cached : undefined;
|
|
59
|
-
}
|
|
60
|
-
let keyInfo = undefined;
|
|
61
|
-
if (publicKey instanceof Ed25519PublicKey) {
|
|
62
|
-
try {
|
|
63
|
-
keyInfo = await this.keychain.findKeyById((await publicKey.toPeerId()).toString());
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
if (e.code !== "ERR_KEY_NOT_FOUND") {
|
|
67
|
-
throw e;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
keyInfo = await this.keychain.findKeyByName(base58btc.encode(publicKey.bytes));
|
|
73
|
-
}
|
|
74
|
-
catch (e) {
|
|
75
|
-
if (e.code !== "ERR_KEY_NOT_FOUND") {
|
|
76
|
-
throw e;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (!keyInfo) {
|
|
80
|
-
return undefined;
|
|
81
|
-
}
|
|
82
|
-
const peerId = await this.keychain.exportPeerId(keyInfo.name);
|
|
83
|
-
return (publicKey instanceof X25519PublicKey
|
|
84
|
-
? X25519Keypair.fromPeerId(peerId)
|
|
85
|
-
: Ed25519Keypair.fromPeerId(peerId));
|
|
86
|
-
};
|
|
87
|
-
async exportById(id, type) {
|
|
88
|
-
const cached = this.getCachedById(id);
|
|
89
|
-
if (cached !== undefined) {
|
|
90
|
-
// if null, means key is deleted
|
|
91
|
-
if (type === "x25519" && cached instanceof Ed25519Keypair) {
|
|
92
|
-
return X25519Keypair.from(cached); // TODO perf, don't do this all the time
|
|
93
|
-
}
|
|
94
|
-
return cached ? cached : undefined;
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
const keyInfo = await this.keychain.findKeyByName(base58btc.encode(id));
|
|
98
|
-
const peerId = await this.keychain.exportPeerId(keyInfo.name);
|
|
99
|
-
if (type === "x25519") {
|
|
100
|
-
return X25519Keypair.fromPeerId(peerId);
|
|
101
|
-
}
|
|
102
|
-
return Ed25519Keypair.fromPeerId(peerId);
|
|
103
|
-
}
|
|
104
|
-
catch (e) {
|
|
105
|
-
if (e.code !== "ERR_KEY_NOT_FOUND") {
|
|
106
|
-
throw e;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
import = async (keypair, id) => {
|
|
111
|
-
const receiverKeyPeerId = await keypair.toPeerId();
|
|
112
|
-
this.cacheKey(keypair, id);
|
|
113
|
-
// import as ed
|
|
114
|
-
await this.keychain.importPeer(base58btc.encode(id), receiverKeyPeerId);
|
|
115
|
-
// import as x so we can decrypt messages with this public key (if received any)
|
|
116
|
-
const xKeypair = await X25519Keypair.from(keypair);
|
|
117
|
-
this.cacheKey(xKeypair);
|
|
118
|
-
await this.keychain.importPeer(base58btc.encode(xKeypair.publicKey.bytes), receiverKeyPeerId);
|
|
119
|
-
};
|
|
120
|
-
// Arrow function is used so we can reference this function and use 'this' without .bind(self)
|
|
121
|
-
getAnyKeypair = async (publicKeys) => {
|
|
122
|
-
for (let i = 0; i < publicKeys.length; i++) {
|
|
123
|
-
try {
|
|
124
|
-
const key = await this.exportByKey(publicKeys[i]);
|
|
125
|
-
if (key && key instanceof X25519Keypair) {
|
|
126
|
-
return {
|
|
127
|
-
index: i,
|
|
128
|
-
keypair: key
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
// Key missing
|
|
134
|
-
if (error.code !== "ERR_NOT_FOUND") {
|
|
135
|
-
throw error;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
throw new AccessError("Failed to access key");
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=keychain.js.map
|
package/lib/esm/keychain.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/keychain.ts"],"names":[],"mappings":"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"}
|
package/src/keychain.ts
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { KeyChain as InternalKeychain } from "@libp2p/interface/keychain";
|
|
2
|
-
import { keysPBM } from "@libp2p/crypto/keys";
|
|
3
|
-
import { identity } from "multiformats/hashes/identity";
|
|
4
|
-
import { base58btc } from "multiformats/bases/base58";
|
|
5
|
-
import { Cache } from "@peerbit/cache";
|
|
6
|
-
import { Ed25519Keypair, Ed25519PublicKey } from "./ed25519.js";
|
|
7
|
-
import { Keypair, PublicSignKey } from "./key.js";
|
|
8
|
-
|
|
9
|
-
import { KeyInfo } from "@libp2p/interface/keychain";
|
|
10
|
-
import { AccessError, X25519Keypair, X25519PublicKey } from "./x25519.js";
|
|
11
|
-
|
|
12
|
-
export type KeypairFromPublicKey<T> = T extends X25519PublicKey
|
|
13
|
-
? X25519PublicKey extends T
|
|
14
|
-
? X25519Keypair
|
|
15
|
-
: Ed25519Keypair
|
|
16
|
-
: Ed25519Keypair;
|
|
17
|
-
|
|
18
|
-
export interface Keychain {
|
|
19
|
-
import(keypair: Ed25519Keypair, id: Uint8Array): Promise<void>;
|
|
20
|
-
|
|
21
|
-
exportByKey<
|
|
22
|
-
T extends Ed25519PublicKey | X25519PublicKey,
|
|
23
|
-
Q = KeypairFromPublicKey<T>
|
|
24
|
-
>(
|
|
25
|
-
publicKey: T
|
|
26
|
-
): Promise<Q | undefined>;
|
|
27
|
-
|
|
28
|
-
exportById<
|
|
29
|
-
T = "ed25519" | "x25519",
|
|
30
|
-
Q = T extends "ed25519" ? Ed25519Keypair : X25519Keypair
|
|
31
|
-
>(
|
|
32
|
-
id: Uint8Array,
|
|
33
|
-
type: T
|
|
34
|
-
): Promise<Q | undefined>;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export class Libp2pKeychain implements Keychain {
|
|
38
|
-
constructor(
|
|
39
|
-
readonly keychain: InternalKeychain,
|
|
40
|
-
readonly options?: { cache?: Cache<X25519Keypair | Ed25519Keypair | null> }
|
|
41
|
-
) {}
|
|
42
|
-
|
|
43
|
-
keychainKeyIdFromPublicKey(publicKey: X25519PublicKey) {
|
|
44
|
-
const bytes = keysPBM.PublicKey.encode({
|
|
45
|
-
Type: keysPBM.KeyType.Ed25519,
|
|
46
|
-
Data: publicKey.publicKey
|
|
47
|
-
}).subarray();
|
|
48
|
-
|
|
49
|
-
const encoding = identity.digest(bytes);
|
|
50
|
-
return base58btc.encode(encoding.bytes).substring(1);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
private cacheKey(key: Ed25519Keypair | X25519Keypair, id?: Uint8Array) {
|
|
54
|
-
this.options?.cache?.add(base58btc.encode(key.publicKey.bytes), key);
|
|
55
|
-
id && this.options?.cache?.add(base58btc.encode(id), key);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
private getCachedById(id: Uint8Array): Ed25519Keypair | null | undefined {
|
|
59
|
-
const key = base58btc.encode(id instanceof PublicSignKey ? id.bytes : id);
|
|
60
|
-
const cached = this.options?.cache?.get(key);
|
|
61
|
-
if (cached === null) {
|
|
62
|
-
return null;
|
|
63
|
-
} else if (!cached) {
|
|
64
|
-
return undefined;
|
|
65
|
-
} else if (cached instanceof Ed25519Keypair) {
|
|
66
|
-
return cached;
|
|
67
|
-
}
|
|
68
|
-
throw new Error("Unexpected cached keypair type: " + key?.constructor.name);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
private getCachedByKey<
|
|
72
|
-
T extends X25519PublicKey | Ed25519PublicKey,
|
|
73
|
-
Q = KeypairFromPublicKey<T>
|
|
74
|
-
>(publicKey: T): Q | null | undefined {
|
|
75
|
-
const key = base58btc.encode(publicKey.bytes);
|
|
76
|
-
const cached = this.options?.cache?.get(key);
|
|
77
|
-
if (cached === null) {
|
|
78
|
-
return null;
|
|
79
|
-
} else if (!cached) {
|
|
80
|
-
return undefined;
|
|
81
|
-
} else if (cached instanceof Keypair) {
|
|
82
|
-
return cached as Q;
|
|
83
|
-
}
|
|
84
|
-
throw new Error("Unexpected cached keypair type: " + key?.constructor.name);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
exportByKey = async <
|
|
88
|
-
T extends X25519PublicKey | Ed25519PublicKey,
|
|
89
|
-
Q = KeypairFromPublicKey<T>
|
|
90
|
-
>(
|
|
91
|
-
publicKey: T
|
|
92
|
-
): Promise<Q | undefined> => {
|
|
93
|
-
const cached = this.getCachedByKey<T, Q>(publicKey);
|
|
94
|
-
if (cached !== undefined) {
|
|
95
|
-
// if null, means key is deleted
|
|
96
|
-
return cached ? cached : undefined;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
let keyInfo: KeyInfo | undefined = undefined;
|
|
100
|
-
if (publicKey instanceof Ed25519PublicKey) {
|
|
101
|
-
try {
|
|
102
|
-
keyInfo = await this.keychain.findKeyById(
|
|
103
|
-
(await publicKey.toPeerId()).toString()
|
|
104
|
-
);
|
|
105
|
-
} catch (e: any) {
|
|
106
|
-
if (e.code !== "ERR_KEY_NOT_FOUND") {
|
|
107
|
-
throw e;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
try {
|
|
113
|
-
keyInfo = await this.keychain.findKeyByName(
|
|
114
|
-
base58btc.encode(publicKey.bytes)
|
|
115
|
-
);
|
|
116
|
-
} catch (e: any) {
|
|
117
|
-
if (e.code !== "ERR_KEY_NOT_FOUND") {
|
|
118
|
-
throw e;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (!keyInfo) {
|
|
123
|
-
return undefined;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const peerId = await this.keychain.exportPeerId(keyInfo.name);
|
|
127
|
-
|
|
128
|
-
return (
|
|
129
|
-
publicKey instanceof X25519PublicKey
|
|
130
|
-
? X25519Keypair.fromPeerId(peerId)
|
|
131
|
-
: Ed25519Keypair.fromPeerId(peerId)
|
|
132
|
-
) as Q;
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
async exportById<
|
|
136
|
-
T = "ed25519" | "x25519",
|
|
137
|
-
Q = T extends "ed25519" ? Ed25519Keypair : X25519Keypair
|
|
138
|
-
>(id: Uint8Array, type: T): Promise<Q | undefined> {
|
|
139
|
-
const cached = this.getCachedById(id) as Ed25519Keypair | undefined | null;
|
|
140
|
-
if (cached !== undefined) {
|
|
141
|
-
// if null, means key is deleted
|
|
142
|
-
if (type === "x25519" && cached instanceof Ed25519Keypair) {
|
|
143
|
-
return X25519Keypair.from(cached) as Q; // TODO perf, don't do this all the time
|
|
144
|
-
}
|
|
145
|
-
return cached ? (cached as Q) : undefined;
|
|
146
|
-
}
|
|
147
|
-
try {
|
|
148
|
-
const keyInfo = await this.keychain.findKeyByName(base58btc.encode(id));
|
|
149
|
-
const peerId = await this.keychain.exportPeerId(keyInfo.name);
|
|
150
|
-
if (type === "x25519") {
|
|
151
|
-
return X25519Keypair.fromPeerId(peerId) as Q;
|
|
152
|
-
}
|
|
153
|
-
return Ed25519Keypair.fromPeerId(peerId) as Q;
|
|
154
|
-
} catch (e: any) {
|
|
155
|
-
if (e.code !== "ERR_KEY_NOT_FOUND") {
|
|
156
|
-
throw e;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
import = async (keypair: Ed25519Keypair, id: Uint8Array) => {
|
|
162
|
-
const receiverKeyPeerId = await keypair.toPeerId();
|
|
163
|
-
this.cacheKey(keypair, id);
|
|
164
|
-
|
|
165
|
-
// import as ed
|
|
166
|
-
await this.keychain.importPeer(base58btc.encode(id), receiverKeyPeerId);
|
|
167
|
-
|
|
168
|
-
// import as x so we can decrypt messages with this public key (if received any)
|
|
169
|
-
const xKeypair = await X25519Keypair.from(keypair);
|
|
170
|
-
this.cacheKey(xKeypair);
|
|
171
|
-
await this.keychain.importPeer(
|
|
172
|
-
base58btc.encode(xKeypair.publicKey.bytes),
|
|
173
|
-
receiverKeyPeerId
|
|
174
|
-
);
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// Arrow function is used so we can reference this function and use 'this' without .bind(self)
|
|
178
|
-
getAnyKeypair = async (publicKeys) => {
|
|
179
|
-
for (let i = 0; i < publicKeys.length; i++) {
|
|
180
|
-
try {
|
|
181
|
-
const key = await this.exportByKey(publicKeys[i]);
|
|
182
|
-
if (key && key instanceof X25519Keypair) {
|
|
183
|
-
return {
|
|
184
|
-
index: i,
|
|
185
|
-
keypair: key as X25519Keypair
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
} catch (error: any) {
|
|
189
|
-
// Key missing
|
|
190
|
-
if (error.code !== "ERR_NOT_FOUND") {
|
|
191
|
-
throw error;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
throw new AccessError("Failed to access key");
|
|
196
|
-
};
|
|
197
|
-
}
|