@shard-auth/client
Version:
Next-generation API authentication without secret keys - MPC-based authentication with FROST threshold signatures
104 lines • 4.57 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SignatureAPIClient = void 0;
const signature_1 = require("../frost/signature");
const frost_api_signature_1 = require("./frost-api-signature");
const crypto_1 = __importDefault(require("crypto"));
class SignatureAPIClient {
clientShare;
clientNonce;
serverNonceCommitment;
httpClient;
constructor(clientShare, httpClient) {
this.clientShare = clientShare;
this.httpClient = httpClient;
}
async startSignatureSession(requestDetails, serverEndpoint) {
// 検証
if (!requestDetails.method || !requestDetails.path || !requestDetails.bodyHash || !requestDetails.timestamp) {
throw new Error('Invalid request');
}
// クライアント側のノンス生成
this.clientNonce = (0, signature_1.generateNonce)();
const clientNonceCommitment = (0, signature_1.computeNonceCommitment)(this.clientNonce);
// サーバーAPIを呼び出す(実際の実装ではHTTPリクエスト)
const request = {
...requestDetails,
clientNonceCommitment
};
// HTTPクライアントが設定されている場合はそれを使用
let response;
if (this.httpClient) {
response = await this.httpClient.post(`${serverEndpoint}/signature/session`, request);
}
else {
// シミュレーション:サーバーのレスポンスを受け取る
response = await this.simulateServerCall(serverEndpoint, request);
}
// サーバーのノンスコミットメントを保存
this.serverNonceCommitment = response.serverNonceCommitment;
return response;
}
async completeSignature(sessionId, requestDetails, publicKey, serverEndpoint) {
if (!this.clientNonce) {
throw new Error('No active signature session');
}
// メッセージ生成
const message = this.createSigningMessage(requestDetails);
// クライアント側の部分署名を生成
const partialSignature = await this.createPartialSignature(message, publicKey);
// サーバーAPIを呼び出す
const request = {
sessionId,
partialSignature
};
// HTTPクライアントが設定されている場合はそれを使用
if (this.httpClient) {
return await this.httpClient.post(`${serverEndpoint}/signature/complete`, request);
}
else {
// シミュレーション:サーバーのレスポンスを受け取る
return await this.simulateServerCompleteCall(serverEndpoint, request, requestDetails, publicKey);
}
}
async createPartialSignature(message, publicKey) {
if (!this.clientNonce || !this.serverNonceCommitment) {
throw new Error('No active session');
}
// クライアント側の部分署名を生成
const { partialSignature } = await (0, frost_api_signature_1.createAPIPartialSignature)(this.clientShare, message, this.clientNonce, this.serverNonceCommitment, publicKey);
return partialSignature;
}
createSigningMessage(details) {
const parts = [
details.method,
details.path,
details.bodyHash.toString('base64'),
details.timestamp
];
const combined = parts.join('|');
return crypto_1.default.createHash('sha256').update(combined).digest();
}
// テスト用:実際のHTTPリクエストの代わり
async simulateServerCall(endpoint, request) {
// 実際の実装では、ここでHTTPリクエストを送信
// テストではサーバーインスタンスを直接呼び出す
const server = global.__testServer;
if (!server) {
throw new Error('Test server not initialized');
}
return await server.handleSessionStart(request);
}
async simulateServerCompleteCall(endpoint, request, requestDetails, publicKey) {
const server = global.__testServer;
if (!server) {
throw new Error('Test server not initialized');
}
return await server.handleCompleteSignature(request, publicKey);
}
}
exports.SignatureAPIClient = SignatureAPIClient;
//# sourceMappingURL=signature-client.js.map