acp-ws
Version:
基于 WebSocket 的智能体通信库,提供智能体身份管理和实时通信功能
68 lines (67 loc) • 2.36 kB
JavaScript
import { CertAndKeyStore } from './datamanager';
import { createSignedCertificateAsync } from './cert';
import { KEYUTIL, KJUR } from 'jsrsasign';
import { signCert } from './api';
// 解密私钥数据
function decryptPrivateKey(encryptedData, password) {
try {
const hashPWD = getSha256(password);
const privateKeyObj = KEYUTIL.getKey(encryptedData, hashPWD);
const privateKeyPEM = KEYUTIL.getPEM(privateKeyObj, 'PKCS8PRV');
return privateKeyPEM;
}
catch (err) {
console.error('私钥解密失败:', err);
return null;
}
}
// 加密私钥数据
function encryptPrivateKey(privateKeyPEM, password) {
try {
const hashPWD = getSha256(password);
const prvKeyObj = KEYUTIL.getKey(privateKeyPEM);
const encryptedPEM = KEYUTIL.getPEM(prvKeyObj, 'PKCS8PRV', hashPWD);
return encryptedPEM;
}
catch (err) {
console.error('私钥加密失败:', err);
return null;
}
}
function getSha256(inputStr) {
const hash = KJUR.crypto.Util.sha256(inputStr);
return hash;
}
function handleError(error, customMessage) {
const errorMessage = error instanceof Error ? error.message : String(error);
throw new Error(`${customMessage || '操作失败'}: ${errorMessage}`);
}
export async function getDecryptKey(aid, password) {
const privateKey = await CertAndKeyStore.getPrivateKey(aid);
if (!privateKey) {
handleError("privateKey 不应为空");
}
const decryptedPrivateKey = decryptPrivateKey(privateKey, password);
return decryptedPrivateKey;
}
export async function savePrivateKey(aid, privateKey, password) {
const encryptedPrivateKey = encryptPrivateKey(privateKey, password);
if (!encryptedPrivateKey) {
handleError("encryptedPrivateKey 不应为空");
}
await CertAndKeyStore.savePrivateKey(aid, encryptedPrivateKey);
}
export async function createAid(aid, apiUrl, seedPassword) {
const { csrPEM, prvKeyPEM } = await createSignedCertificateAsync(aid);
const cert = await signCert(aid, apiUrl, csrPEM);
if (cert) {
CertAndKeyStore.saveAid(aid);
CertAndKeyStore.saveCertificate(aid, cert);
CertAndKeyStore.saveCsr(aid, csrPEM);
savePrivateKey(aid, prvKeyPEM, seedPassword);
return true;
}
else {
return false;
}
}