UNPKG

@shard-auth/client

Version:

Next-generation API authentication without secret keys - MPC-based authentication with FROST threshold signatures

104 lines 4.57 kB
"use strict"; 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