@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.
@@ -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
@@ -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
- }