@diap/sdk 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +86 -86
- package/dist/agent-auth.d.ts +96 -0
- package/dist/agent-auth.d.ts.map +1 -0
- package/dist/agent-auth.js +343 -0
- package/dist/agent-auth.js.map +1 -0
- package/dist/agent-verification.d.ts +158 -0
- package/dist/agent-verification.d.ts.map +1 -0
- package/dist/agent-verification.js +237 -0
- package/dist/agent-verification.js.map +1 -0
- package/dist/config-manager.d.ts +156 -0
- package/dist/config-manager.d.ts.map +1 -0
- package/dist/config-manager.js +241 -0
- package/dist/config-manager.js.map +1 -0
- package/dist/did-builder.d.ts +62 -0
- package/dist/did-builder.d.ts.map +1 -0
- package/dist/did-builder.js +315 -0
- package/dist/did-builder.js.map +1 -0
- package/dist/did-cache.d.ts +133 -0
- package/dist/did-cache.d.ts.map +1 -0
- package/dist/did-cache.js +273 -0
- package/dist/did-cache.js.map +1 -0
- package/dist/identity-manager.d.ts +87 -0
- package/dist/identity-manager.d.ts.map +1 -0
- package/dist/identity-manager.js +196 -0
- package/dist/identity-manager.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/ipfs-bidirectional-verification.d.ts +201 -0
- package/dist/ipfs-bidirectional-verification.d.ts.map +1 -0
- package/dist/ipfs-bidirectional-verification.js +298 -0
- package/dist/ipfs-bidirectional-verification.js.map +1 -0
- package/dist/ipfs-client.d.ts +151 -0
- package/dist/ipfs-client.d.ts.map +1 -0
- package/dist/ipfs-client.js +623 -0
- package/dist/ipfs-client.js.map +1 -0
- package/dist/ipfs-node-manager.d.ts +136 -0
- package/dist/ipfs-node-manager.d.ts.map +1 -0
- package/dist/ipfs-node-manager.js +232 -0
- package/dist/ipfs-node-manager.js.map +1 -0
- package/dist/ipns-manager.d.ts +182 -0
- package/dist/ipns-manager.d.ts.map +1 -0
- package/dist/ipns-manager.js +268 -0
- package/dist/ipns-manager.js.map +1 -0
- package/dist/key-manager.d.ts +48 -0
- package/dist/key-manager.d.ts.map +1 -0
- package/dist/key-manager.js +231 -0
- package/dist/key-manager.js.map +1 -0
- package/dist/kubo-installer.d.ts +115 -0
- package/dist/kubo-installer.d.ts.map +1 -0
- package/dist/kubo-installer.js +205 -0
- package/dist/kubo-installer.js.map +1 -0
- package/dist/libp2p/encrypted-peer-id.d.ts +24 -0
- package/dist/libp2p/encrypted-peer-id.d.ts.map +1 -0
- package/dist/libp2p/encrypted-peer-id.js +134 -0
- package/dist/libp2p/encrypted-peer-id.js.map +1 -0
- package/dist/nonce-manager.d.ts +176 -0
- package/dist/nonce-manager.d.ts.map +1 -0
- package/dist/nonce-manager.js +382 -0
- package/dist/nonce-manager.js.map +1 -0
- package/dist/p2p/hyperswarm-communicator.d.ts +252 -0
- package/dist/p2p/hyperswarm-communicator.d.ts.map +1 -0
- package/dist/p2p/hyperswarm-communicator.js +469 -0
- package/dist/p2p/hyperswarm-communicator.js.map +1 -0
- package/dist/p2p/iroh-communicator.d.ts +216 -0
- package/dist/p2p/iroh-communicator.d.ts.map +1 -0
- package/dist/p2p/iroh-communicator.js +408 -0
- package/dist/p2p/iroh-communicator.js.map +1 -0
- package/dist/pubsub-authenticator.d.ts +246 -0
- package/dist/pubsub-authenticator.d.ts.map +1 -0
- package/dist/pubsub-authenticator.js +384 -0
- package/dist/pubsub-authenticator.js.map +1 -0
- package/dist/real-name-auth.d.ts +238 -0
- package/dist/real-name-auth.d.ts.map +1 -0
- package/dist/real-name-auth.js +259 -0
- package/dist/real-name-auth.js.map +1 -0
- package/dist/types/did.d.ts +76 -0
- package/dist/types/did.d.ts.map +1 -0
- package/dist/types/did.js +5 -0
- package/dist/types/did.js.map +1 -0
- package/dist/types/errors.d.ts +42 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +69 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/key.d.ts +43 -0
- package/dist/types/key.d.ts.map +1 -0
- package/dist/types/key.js +5 -0
- package/dist/types/key.js.map +1 -0
- package/dist/types/zkp.d.ts +80 -0
- package/dist/types/zkp.d.ts.map +1 -0
- package/dist/types/zkp.js +16 -0
- package/dist/types/zkp.js.map +1 -0
- package/dist/utils/crypto.d.ts +24 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +65 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/encoding.d.ts +36 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +80 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +37 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/zkp/key-generator.d.ts +56 -0
- package/dist/zkp/key-generator.d.ts.map +1 -0
- package/dist/zkp/key-generator.js +165 -0
- package/dist/zkp/key-generator.js.map +1 -0
- package/dist/zkp/simplified-backend.d.ts +23 -0
- package/dist/zkp/simplified-backend.d.ts.map +1 -0
- package/dist/zkp/simplified-backend.js +77 -0
- package/dist/zkp/simplified-backend.js.map +1 -0
- package/dist/zkp/snarkjs-backend.d.ts +150 -0
- package/dist/zkp/snarkjs-backend.d.ts.map +1 -0
- package/dist/zkp/snarkjs-backend.js +218 -0
- package/dist/zkp/snarkjs-backend.js.map +1 -0
- package/dist/zkp/universal-manager.d.ts +44 -0
- package/dist/zkp/universal-manager.d.ts.map +1 -0
- package/dist/zkp/universal-manager.js +181 -0
- package/dist/zkp/universal-manager.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DIAP TypeScript SDK - IPNS 管理器
|
|
3
|
+
* 负责 IPNS 记录的发布、解析和 Key 管理
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from './utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* IPNS 记录状态
|
|
8
|
+
*/
|
|
9
|
+
export var IpnsRecordStatus;
|
|
10
|
+
(function (IpnsRecordStatus) {
|
|
11
|
+
/** 待发布 */
|
|
12
|
+
IpnsRecordStatus["Pending"] = "pending";
|
|
13
|
+
/** 已发布 */
|
|
14
|
+
IpnsRecordStatus["Published"] = "published";
|
|
15
|
+
/** 已过期 */
|
|
16
|
+
IpnsRecordStatus["Expired"] = "expired";
|
|
17
|
+
/** 失败 */
|
|
18
|
+
IpnsRecordStatus["Failed"] = "failed";
|
|
19
|
+
})(IpnsRecordStatus || (IpnsRecordStatus = {}));
|
|
20
|
+
/**
|
|
21
|
+
* IPNS 管理器
|
|
22
|
+
*/
|
|
23
|
+
export class IpnsManager {
|
|
24
|
+
/** 配置 */
|
|
25
|
+
config;
|
|
26
|
+
/** Key 列表 */
|
|
27
|
+
keys;
|
|
28
|
+
/** 记录缓存 */
|
|
29
|
+
recordCache;
|
|
30
|
+
/** 使用 w3name */
|
|
31
|
+
useW3name;
|
|
32
|
+
/**
|
|
33
|
+
* 创建 IPNS 管理器
|
|
34
|
+
*/
|
|
35
|
+
static async create(config) {
|
|
36
|
+
logger.info('🚀 创建 IPNS 管理器');
|
|
37
|
+
const manager = new IpnsManager(config);
|
|
38
|
+
await manager.initialize();
|
|
39
|
+
return manager;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 构造函数
|
|
43
|
+
*/
|
|
44
|
+
constructor(config) {
|
|
45
|
+
this.config = {
|
|
46
|
+
useW3name: config?.useW3name ?? true,
|
|
47
|
+
useIpfsNode: config?.useIpfsNode ?? true,
|
|
48
|
+
validityDays: config?.validityDays ?? 365,
|
|
49
|
+
defaultTtl: config?.defaultTtl ?? 3600,
|
|
50
|
+
};
|
|
51
|
+
this.keys = new Map();
|
|
52
|
+
this.recordCache = new Map();
|
|
53
|
+
this.useW3name = this.config.useW3name;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 初始化管理器
|
|
57
|
+
*/
|
|
58
|
+
async initialize() {
|
|
59
|
+
logger.info('💾 IPNS 管理器已初始化');
|
|
60
|
+
logger.info(` 使用 w3name: ${this.config.useW3name}`);
|
|
61
|
+
logger.info(` 使用 IPFS 节点: ${this.config.useIpfsNode}`);
|
|
62
|
+
logger.info(` 有效期: ${this.config.validityDays} 天`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 发布 IPNS 记录
|
|
66
|
+
*/
|
|
67
|
+
async publish(cid, keyName = 'self', lifetime = 86400, ttl) {
|
|
68
|
+
logger.info(`📤 发布 IPNS 记录: ${cid}`);
|
|
69
|
+
const keyInfo = this.keys.get(keyName);
|
|
70
|
+
if (!keyInfo) {
|
|
71
|
+
throw new Error(`Key not found: ${keyName}`);
|
|
72
|
+
}
|
|
73
|
+
const name = `/ipns/${keyInfo.id}`;
|
|
74
|
+
const sequence = this.getNextSequence(name);
|
|
75
|
+
const validity = Date.now() + this.config.validityDays * 24 * 60 * 60 * 1000;
|
|
76
|
+
// 创建 IPNS 记录
|
|
77
|
+
const record = {
|
|
78
|
+
name,
|
|
79
|
+
value: cid,
|
|
80
|
+
sequence,
|
|
81
|
+
validity,
|
|
82
|
+
signature: new Uint8Array(64), // 模拟签名
|
|
83
|
+
ttl: ttl || this.config.defaultTtl,
|
|
84
|
+
};
|
|
85
|
+
// 发布到 IPNS
|
|
86
|
+
if (this.useW3name) {
|
|
87
|
+
await this.publishToW3name(record);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
await this.publishToIpfs(record);
|
|
91
|
+
}
|
|
92
|
+
// 缓存记录
|
|
93
|
+
this.recordCache.set(name, record);
|
|
94
|
+
const result = {
|
|
95
|
+
name,
|
|
96
|
+
value: cid,
|
|
97
|
+
sequence,
|
|
98
|
+
validity,
|
|
99
|
+
signature: Buffer.from(record.signature).toString('base64'),
|
|
100
|
+
publishedAt: new Date().toISOString(),
|
|
101
|
+
};
|
|
102
|
+
logger.info(`✅ IPNS 记录已发布: ${name}`);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 发布到 w3name
|
|
107
|
+
*/
|
|
108
|
+
async publishToW3name(record) {
|
|
109
|
+
logger.debug('发布到 w3name...');
|
|
110
|
+
// 模拟 w3name 发布
|
|
111
|
+
return new Promise((resolve) => setTimeout(resolve, 100));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 发布到 IPFS 节点
|
|
115
|
+
*/
|
|
116
|
+
async publishToIpfs(record) {
|
|
117
|
+
logger.debug('发布到 IPFS 节点...');
|
|
118
|
+
// 模拟 IPFS 发布
|
|
119
|
+
return new Promise((resolve) => setTimeout(resolve, 100));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 解析 IPNS 名称
|
|
123
|
+
*/
|
|
124
|
+
async resolve(ipnsName) {
|
|
125
|
+
logger.info(`🔍 解析 IPNS: ${ipnsName}`);
|
|
126
|
+
// 检查缓存
|
|
127
|
+
const cached = this.recordCache.get(ipnsName);
|
|
128
|
+
if (cached && cached.validity > Date.now()) {
|
|
129
|
+
logger.debug('使用缓存的 IPNS 记录');
|
|
130
|
+
return {
|
|
131
|
+
name: ipnsName,
|
|
132
|
+
value: cached.value,
|
|
133
|
+
sequence: cached.sequence,
|
|
134
|
+
ttl: cached.ttl,
|
|
135
|
+
cachedAt: new Date().toISOString(),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// 从网络解析
|
|
139
|
+
if (this.useW3name) {
|
|
140
|
+
return await this.resolveFromW3name(ipnsName);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
return await this.resolveFromIpfs(ipnsName);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 从 w3name 解析
|
|
148
|
+
*/
|
|
149
|
+
async resolveFromW3name(ipnsName) {
|
|
150
|
+
logger.debug('从 w3name 解析...');
|
|
151
|
+
// 模拟 w3name 解析
|
|
152
|
+
return {
|
|
153
|
+
name: ipnsName,
|
|
154
|
+
value: 'QmDefaultResolvedCid',
|
|
155
|
+
sequence: 1,
|
|
156
|
+
ttl: this.config.defaultTtl,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 从 IPFS 节点解析
|
|
161
|
+
*/
|
|
162
|
+
async resolveFromIpfs(ipnsName) {
|
|
163
|
+
logger.debug('从 IPFS 节点解析...');
|
|
164
|
+
// 模拟 IPFS 解析
|
|
165
|
+
return {
|
|
166
|
+
name: ipnsName,
|
|
167
|
+
value: 'QmDefaultResolvedCid',
|
|
168
|
+
sequence: 1,
|
|
169
|
+
ttl: this.config.defaultTtl,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 确保 Key 存在
|
|
174
|
+
*/
|
|
175
|
+
async ensureKeyExists(keyName) {
|
|
176
|
+
let keyInfo = this.keys.get(keyName);
|
|
177
|
+
if (!keyInfo) {
|
|
178
|
+
keyInfo = await this.createKey(keyName);
|
|
179
|
+
}
|
|
180
|
+
return keyInfo;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 创建新的 IPNS Key
|
|
184
|
+
*/
|
|
185
|
+
async createKey(keyName) {
|
|
186
|
+
logger.info(`🔑 创建 IPNS Key: ${keyName}`);
|
|
187
|
+
// 生成 Key ID
|
|
188
|
+
const id = this.generateKeyId();
|
|
189
|
+
const keyInfo = {
|
|
190
|
+
name: keyName,
|
|
191
|
+
id,
|
|
192
|
+
};
|
|
193
|
+
this.keys.set(keyName, keyInfo);
|
|
194
|
+
logger.info(`✅ Key 创建成功: ${id}`);
|
|
195
|
+
return keyInfo;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 列出所有 Key
|
|
199
|
+
*/
|
|
200
|
+
listKeys() {
|
|
201
|
+
return Array.from(this.keys.values());
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 删除 Key
|
|
205
|
+
*/
|
|
206
|
+
async removeKey(keyName) {
|
|
207
|
+
if (this.keys.has(keyName)) {
|
|
208
|
+
this.keys.delete(keyName);
|
|
209
|
+
logger.info(`🗑️ Key 已删除: ${keyName}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 获取下一个序列号
|
|
214
|
+
*/
|
|
215
|
+
getNextSequence(name) {
|
|
216
|
+
const record = this.recordCache.get(name);
|
|
217
|
+
return record ? record.sequence + 1 : 1;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* 生成 Key ID
|
|
221
|
+
*/
|
|
222
|
+
generateKeyId() {
|
|
223
|
+
const chars = '0123456789abcdef';
|
|
224
|
+
let result = 'k51';
|
|
225
|
+
for (let i = 0; i < 50; i++) {
|
|
226
|
+
result += chars[Math.floor(Math.random() * chars.length)];
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 获取配置
|
|
232
|
+
*/
|
|
233
|
+
getConfig() {
|
|
234
|
+
return { ...this.config };
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* 清空缓存
|
|
238
|
+
*/
|
|
239
|
+
clearCache() {
|
|
240
|
+
this.recordCache.clear();
|
|
241
|
+
logger.info('🧹 IPNS 缓存已清空');
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* 获取缓存的记录数
|
|
245
|
+
*/
|
|
246
|
+
getCacheSize() {
|
|
247
|
+
return this.recordCache.size;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 获取 Key 数量
|
|
251
|
+
*/
|
|
252
|
+
getKeyCount() {
|
|
253
|
+
return this.keys.size;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// ============================================================================
|
|
257
|
+
// 便捷函数
|
|
258
|
+
// ============================================================================
|
|
259
|
+
/**
|
|
260
|
+
* 创建 IPNS 管理器(便捷函数)
|
|
261
|
+
*/
|
|
262
|
+
export async function createIpnsManager(config) {
|
|
263
|
+
return IpnsManager.create(config);
|
|
264
|
+
}
|
|
265
|
+
// ============================================================================
|
|
266
|
+
// 导出
|
|
267
|
+
// ============================================================================
|
|
268
|
+
//# sourceMappingURL=ipns-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipns-manager.js","sourceRoot":"","sources":["../src/ipns-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 密钥管理模块
|
|
3
|
+
* 负责密钥的生成、存储、加载和管理
|
|
4
|
+
*/
|
|
5
|
+
import type { KeyPair, KeyBackup } from './types/key.js';
|
|
6
|
+
/**
|
|
7
|
+
* 密钥管理器
|
|
8
|
+
*/
|
|
9
|
+
export declare class KeyManager {
|
|
10
|
+
/**
|
|
11
|
+
* 生成新的 Ed25519 密钥对
|
|
12
|
+
*/
|
|
13
|
+
static generate(): KeyPair;
|
|
14
|
+
/**
|
|
15
|
+
* 从私钥加载密钥对
|
|
16
|
+
*/
|
|
17
|
+
static fromPrivateKey(privateKey: Uint8Array): KeyPair;
|
|
18
|
+
/**
|
|
19
|
+
* 从文件加载密钥对
|
|
20
|
+
*/
|
|
21
|
+
static fromFile(path: string): Promise<KeyPair>;
|
|
22
|
+
/**
|
|
23
|
+
* 保存密钥对到文件
|
|
24
|
+
*/
|
|
25
|
+
static saveToFile(keypair: KeyPair, path: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 导出密钥备份(加密)
|
|
28
|
+
*/
|
|
29
|
+
static exportBackup(keypair: KeyPair, password?: string): KeyBackup;
|
|
30
|
+
/**
|
|
31
|
+
* 从备份导入密钥
|
|
32
|
+
*/
|
|
33
|
+
static importFromBackup(backup: KeyBackup, password?: string): KeyPair;
|
|
34
|
+
/**
|
|
35
|
+
* 使用 Ed25519 签名数据
|
|
36
|
+
*/
|
|
37
|
+
static sign(keypair: KeyPair, data: Uint8Array): Promise<Uint8Array>;
|
|
38
|
+
/**
|
|
39
|
+
* 验证 Ed25519 签名
|
|
40
|
+
*/
|
|
41
|
+
static verify(keypair: KeyPair, data: Uint8Array, signature: Uint8Array): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* 派生 did:key 格式的 DID
|
|
44
|
+
* 参考: https://w3c-ccg.github.io/did-method-key/#ed25519-x25519
|
|
45
|
+
*/
|
|
46
|
+
private static deriveDIDKey;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=key-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../src/key-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAW,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAOlE;;GAEG;AACH,qBAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,QAAQ,IAAI,OAAO;IAuB1B;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;IAsBtD;;OAEG;WACU,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBrD;;OAEG;WACU,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BtE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS;IAmDnE;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAsCtE;;OAEG;WACU,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAS1E;;OAEG;WACU,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhG;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;CAiB5B"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 密钥管理模块
|
|
3
|
+
* 负责密钥的生成、存储、加载和管理
|
|
4
|
+
*/
|
|
5
|
+
import * as ed25519 from '@noble/ed25519';
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { KeyManagementError } from './types/errors.js';
|
|
9
|
+
import { encodeHex, decodeHex } from './utils/encoding.js';
|
|
10
|
+
import { encryptAES256GCM, decryptAES256GCM, deriveKey, generateRandomBytes } from './utils/crypto.js';
|
|
11
|
+
import { encodeBase58 } from './utils/encoding.js';
|
|
12
|
+
import { logger } from './utils/logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* 密钥管理器
|
|
15
|
+
*/
|
|
16
|
+
export class KeyManager {
|
|
17
|
+
/**
|
|
18
|
+
* 生成新的 Ed25519 密钥对
|
|
19
|
+
*/
|
|
20
|
+
static generate() {
|
|
21
|
+
try {
|
|
22
|
+
// 生成32字节随机私钥
|
|
23
|
+
const privateKey = ed25519.utils.randomPrivateKey();
|
|
24
|
+
// 从私钥派生公钥
|
|
25
|
+
const publicKey = ed25519.getPublicKey(privateKey);
|
|
26
|
+
// 派生 did:key 格式的 DID
|
|
27
|
+
const did = KeyManager.deriveDIDKey(publicKey);
|
|
28
|
+
logger.debug('Generated new Ed25519 keypair', { did });
|
|
29
|
+
return {
|
|
30
|
+
privateKey,
|
|
31
|
+
publicKey,
|
|
32
|
+
did,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
throw new KeyManagementError('Failed to generate keypair', { originalError: error });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 从私钥加载密钥对
|
|
41
|
+
*/
|
|
42
|
+
static fromPrivateKey(privateKey) {
|
|
43
|
+
if (privateKey.length !== 32) {
|
|
44
|
+
throw new KeyManagementError('Private key must be 32 bytes');
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
// 从私钥派生公钥
|
|
48
|
+
const publicKey = ed25519.getPublicKey(privateKey);
|
|
49
|
+
// 派生 did:key 格式的 DID
|
|
50
|
+
const did = KeyManager.deriveDIDKey(publicKey);
|
|
51
|
+
return {
|
|
52
|
+
privateKey,
|
|
53
|
+
publicKey,
|
|
54
|
+
did,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new KeyManagementError('Failed to load keypair from private key', { originalError: error });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 从文件加载密钥对
|
|
63
|
+
*/
|
|
64
|
+
static async fromFile(path) {
|
|
65
|
+
try {
|
|
66
|
+
const content = await fs.readFile(path, 'utf-8');
|
|
67
|
+
const keyFile = JSON.parse(content);
|
|
68
|
+
// 解码私钥
|
|
69
|
+
const privateKeyBytes = decodeHex(keyFile.privateKey);
|
|
70
|
+
if (privateKeyBytes.length !== 32) {
|
|
71
|
+
throw new KeyManagementError('Invalid private key length in file');
|
|
72
|
+
}
|
|
73
|
+
return KeyManager.fromPrivateKey(privateKeyBytes);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error instanceof KeyManagementError) {
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
throw new KeyManagementError(`Failed to load keypair from file: ${path}`, { originalError: error });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 保存密钥对到文件
|
|
84
|
+
*/
|
|
85
|
+
static async saveToFile(keypair, path) {
|
|
86
|
+
try {
|
|
87
|
+
const keyFile = {
|
|
88
|
+
keyType: 'Ed25519',
|
|
89
|
+
privateKey: encodeHex(keypair.privateKey),
|
|
90
|
+
publicKey: encodeHex(keypair.publicKey),
|
|
91
|
+
did: keypair.did,
|
|
92
|
+
createdAt: new Date().toISOString(),
|
|
93
|
+
version: '2.0',
|
|
94
|
+
};
|
|
95
|
+
const content = JSON.stringify(keyFile, null, 2);
|
|
96
|
+
// 确保目录存在
|
|
97
|
+
const dir = join(path, '..');
|
|
98
|
+
await fs.mkdir(dir, { recursive: true });
|
|
99
|
+
// 写入文件
|
|
100
|
+
await fs.writeFile(path, content, { mode: 0o600 }); // 设置权限为 600
|
|
101
|
+
logger.debug('Saved keypair to file', { path });
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw new KeyManagementError(`Failed to save keypair to file: ${path}`, { originalError: error });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 导出密钥备份(加密)
|
|
109
|
+
*/
|
|
110
|
+
static exportBackup(keypair, password) {
|
|
111
|
+
try {
|
|
112
|
+
const keyFile = {
|
|
113
|
+
keyType: 'Ed25519',
|
|
114
|
+
privateKey: encodeHex(keypair.privateKey),
|
|
115
|
+
publicKey: encodeHex(keypair.publicKey),
|
|
116
|
+
did: keypair.did,
|
|
117
|
+
createdAt: new Date().toISOString(),
|
|
118
|
+
version: '2.0',
|
|
119
|
+
};
|
|
120
|
+
const jsonData = JSON.stringify(keyFile);
|
|
121
|
+
let encryptedData;
|
|
122
|
+
if (password) {
|
|
123
|
+
// 使用密码加密
|
|
124
|
+
const salt = generateRandomBytes(16);
|
|
125
|
+
const key = deriveKey(password, salt);
|
|
126
|
+
const { ciphertext, nonce, tag } = encryptAES256GCM(new TextEncoder().encode(jsonData), key, generateRandomBytes(12));
|
|
127
|
+
// 组合: salt + nonce + tag + ciphertext
|
|
128
|
+
const combined = new Uint8Array(salt.length + nonce.length + tag.length + ciphertext.length);
|
|
129
|
+
let offset = 0;
|
|
130
|
+
combined.set(salt, offset);
|
|
131
|
+
offset += salt.length;
|
|
132
|
+
combined.set(nonce, offset);
|
|
133
|
+
offset += nonce.length;
|
|
134
|
+
combined.set(tag, offset);
|
|
135
|
+
offset += tag.length;
|
|
136
|
+
combined.set(ciphertext, offset);
|
|
137
|
+
encryptedData = Buffer.from(combined).toString('base64');
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// 无密码时使用 base64 编码
|
|
141
|
+
encryptedData = Buffer.from(jsonData).toString('base64');
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
encryptedData,
|
|
145
|
+
exportedAt: new Date().toISOString(),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw new KeyManagementError('Failed to export key backup', { originalError: error });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 从备份导入密钥
|
|
154
|
+
*/
|
|
155
|
+
static importFromBackup(backup, password) {
|
|
156
|
+
try {
|
|
157
|
+
const encryptedBuffer = Buffer.from(backup.encryptedData, 'base64');
|
|
158
|
+
let jsonData;
|
|
159
|
+
if (password) {
|
|
160
|
+
// 解密数据
|
|
161
|
+
const salt = new Uint8Array(encryptedBuffer.slice(0, 16));
|
|
162
|
+
const nonce = new Uint8Array(encryptedBuffer.slice(16, 28));
|
|
163
|
+
const tag = new Uint8Array(encryptedBuffer.slice(28, 44));
|
|
164
|
+
const ciphertext = new Uint8Array(encryptedBuffer.slice(44));
|
|
165
|
+
const key = deriveKey(password, salt);
|
|
166
|
+
const decrypted = decryptAES256GCM(ciphertext, key, nonce, tag);
|
|
167
|
+
jsonData = new TextDecoder().decode(decrypted);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// 直接解码 base64
|
|
171
|
+
jsonData = encryptedBuffer.toString('utf-8');
|
|
172
|
+
}
|
|
173
|
+
const keyFile = JSON.parse(jsonData);
|
|
174
|
+
const privateKeyBytes = decodeHex(keyFile.privateKey);
|
|
175
|
+
if (privateKeyBytes.length !== 32) {
|
|
176
|
+
throw new KeyManagementError('Invalid private key length in backup');
|
|
177
|
+
}
|
|
178
|
+
return KeyManager.fromPrivateKey(privateKeyBytes);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (error instanceof KeyManagementError) {
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
throw new KeyManagementError('Failed to import key from backup', { originalError: error });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 使用 Ed25519 签名数据
|
|
189
|
+
*/
|
|
190
|
+
static async sign(keypair, data) {
|
|
191
|
+
try {
|
|
192
|
+
const signature = await ed25519.sign(data, keypair.privateKey);
|
|
193
|
+
return signature;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
throw new KeyManagementError('Failed to sign data', { originalError: error });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* 验证 Ed25519 签名
|
|
201
|
+
*/
|
|
202
|
+
static async verify(keypair, data, signature) {
|
|
203
|
+
try {
|
|
204
|
+
const isValid = await ed25519.verify(signature, data, keypair.publicKey);
|
|
205
|
+
return isValid;
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
logger.warn('Signature verification failed', { error });
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 派生 did:key 格式的 DID
|
|
214
|
+
* 参考: https://w3c-ccg.github.io/did-method-key/#ed25519-x25519
|
|
215
|
+
*/
|
|
216
|
+
static deriveDIDKey(publicKey) {
|
|
217
|
+
if (publicKey.length !== 32) {
|
|
218
|
+
throw new KeyManagementError('Public key must be 32 bytes for Ed25519');
|
|
219
|
+
}
|
|
220
|
+
// 构造 multicodec 前缀: 0xed01 (Ed25519 public key)
|
|
221
|
+
// multibase base58btc编码: z
|
|
222
|
+
const prefix = new Uint8Array([0xed, 0x01]);
|
|
223
|
+
const combined = new Uint8Array(prefix.length + publicKey.length);
|
|
224
|
+
combined.set(prefix, 0);
|
|
225
|
+
combined.set(publicKey, prefix.length);
|
|
226
|
+
// Base58 编码
|
|
227
|
+
const encoded = encodeBase58(combined);
|
|
228
|
+
return `did:key:z${encoded}`;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=key-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-manager.js","sourceRoot":"","sources":["../src/key-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DIAP TypeScript SDK - Kubo 安装器
|
|
3
|
+
* 自动下载和安装 Kubo(Go-IPFS)二进制文件
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Kubo 安装状态
|
|
7
|
+
*/
|
|
8
|
+
export declare enum InstallationStatus {
|
|
9
|
+
/** 未知 */
|
|
10
|
+
Unknown = "unknown",
|
|
11
|
+
/** 检查中 */
|
|
12
|
+
Checking = "checking",
|
|
13
|
+
/** 已安装 */
|
|
14
|
+
Installed = "installed",
|
|
15
|
+
/** 下载中 */
|
|
16
|
+
Downloading = "downloading",
|
|
17
|
+
/** 安装中 */
|
|
18
|
+
Installing = "installing",
|
|
19
|
+
/** 安装失败 */
|
|
20
|
+
Failed = "failed"
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Kubo 安装结果
|
|
24
|
+
*/
|
|
25
|
+
export interface InstallationResult {
|
|
26
|
+
/** 是否成功 */
|
|
27
|
+
success: boolean;
|
|
28
|
+
/** Kubo 路径 */
|
|
29
|
+
path?: string;
|
|
30
|
+
/** 版本 */
|
|
31
|
+
version?: string;
|
|
32
|
+
/** 错误信息 */
|
|
33
|
+
error?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Kubo 版本信息
|
|
37
|
+
*/
|
|
38
|
+
export interface KuboVersion {
|
|
39
|
+
/** 版本号 */
|
|
40
|
+
version: string;
|
|
41
|
+
/** 发布日期 */
|
|
42
|
+
releaseDate: string;
|
|
43
|
+
/** 下载链接 */
|
|
44
|
+
downloadUrl: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Kubo 安装器配置
|
|
48
|
+
*/
|
|
49
|
+
export interface KuboInstallerConfig {
|
|
50
|
+
/** 安装目录 */
|
|
51
|
+
installDir?: string;
|
|
52
|
+
/** 是否强制重新安装 */
|
|
53
|
+
forceReinstall?: boolean;
|
|
54
|
+
/** 下载超时(毫秒) */
|
|
55
|
+
downloadTimeout?: number;
|
|
56
|
+
/** 代理 URL */
|
|
57
|
+
proxyUrl?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Kubo 安装器
|
|
61
|
+
*/
|
|
62
|
+
export declare class KuboInstaller {
|
|
63
|
+
private config;
|
|
64
|
+
private platform;
|
|
65
|
+
private arch;
|
|
66
|
+
/**
|
|
67
|
+
* 创建 Kubo 安装器
|
|
68
|
+
*/
|
|
69
|
+
constructor(config?: KuboInstallerConfig);
|
|
70
|
+
/**
|
|
71
|
+
* 检查 Kubo 是否已安装
|
|
72
|
+
*/
|
|
73
|
+
checkInstalled(): Promise<boolean>;
|
|
74
|
+
/**
|
|
75
|
+
* 获取 Kubo 版本
|
|
76
|
+
*/
|
|
77
|
+
getVersion(): Promise<string | null>;
|
|
78
|
+
/**
|
|
79
|
+
* 安装 Kubo
|
|
80
|
+
*/
|
|
81
|
+
install(): Promise<InstallationResult>;
|
|
82
|
+
/**
|
|
83
|
+
* 卸载 Kubo
|
|
84
|
+
*/
|
|
85
|
+
uninstall(): Promise<boolean>;
|
|
86
|
+
/**
|
|
87
|
+
* 获取下载链接
|
|
88
|
+
*/
|
|
89
|
+
getDownloadUrl(): string;
|
|
90
|
+
/**
|
|
91
|
+
* 获取默认安装目录
|
|
92
|
+
*/
|
|
93
|
+
private getDefaultInstallDir;
|
|
94
|
+
/**
|
|
95
|
+
* 检测平台
|
|
96
|
+
*/
|
|
97
|
+
private detectPlatform;
|
|
98
|
+
/**
|
|
99
|
+
* 检测架构
|
|
100
|
+
*/
|
|
101
|
+
private detectArch;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 创建 Kubo 安装器
|
|
105
|
+
*/
|
|
106
|
+
export declare function createKuboInstaller(config?: KuboInstallerConfig): KuboInstaller;
|
|
107
|
+
/**
|
|
108
|
+
* 检查 Kubo 是否已安装
|
|
109
|
+
*/
|
|
110
|
+
export declare function isKuboInstalled(): Promise<boolean>;
|
|
111
|
+
/**
|
|
112
|
+
* 安装 Kubo
|
|
113
|
+
*/
|
|
114
|
+
export declare function installKubo(config?: KuboInstallerConfig): Promise<InstallationResult>;
|
|
115
|
+
//# sourceMappingURL=kubo-installer.d.ts.map
|