Class: SignerClient
Предварительно настроенный протокол, направленный на коммуникацию с Spatium Signer Service
- Для транспортировки он использует HTTP(S) + SSE двунаправленный транспорт.
- Для кэша использует in-memory хранилище
- Для крипто-драйвера использует предоставленный Crypto
Так как внутренне он использует SSETransport, нужно помнить что клиент начинает слушать события как только вызван метод connect и не прекращает, пока не вызван метод disconnect.
См. также
Иерархия
Protocol
↳ SignerClient
Имплементирует
Конструкторы
constructor
• new SignerClient(url
, auth
, crypto
, timeout?
)
Заметьте
запросы относятся к accountId сессии авторизации, тем самым хранят данные независимо для каждого авторизированного пользователя
Пример
// Считаем, что Crypto уже инициализирован
const auth = new AuthorizationSession('https://cloud.spatium.net/authorization/v1', uuid(randomBytes), ['read', 'secret']);
const signer = new SignerClient('https://cloud.spatium.net/signer/v1', auth, crypto, 10 * 1000);
// Подключение к SignerService (с 10-секундным таймаутом)
await signer.connect(10 * 1000);
// Генерируем случаный secretId для нового секрета (он должен быть сгенерирован единожды и сохранен)
const secretId = uuid(randomBytes);
// Генерируем оба секрата (первый на подлюченном сервере и второй локально) (производится единожды для каждого secretId)
await signer.generateDistributedSecret(secretId);
// Генерируем рандомный session ID для новой сессии синхронизации
const syncSessionId = uuid(randomBytes);
// Выполняем ECDSA-over-secp256k1 процедуру синхронизации для ключа с путем ```m/44'/0'/0'/0'/0'```
const publicKey = await syncDistributedEcdsaKey(signer, secretId, syncSessionId, 'secp256k1', 0, 0);
// К этому моменту данные синхронизации уже сохранены в хранилище и составной ключ доступен к получению
const _publicKey = await getEcdsaPublicKey(signer, syncSessionId);
// Этот ключ, очевидно, является тем же ключом, который мы получаем из самой процедуры синхронизации
expect(publicKey).toBe(_publicKey);
// Генерируем рандомный session ID для новой сессии подписания
const signSessionId = uuid(randomBytes);
// Сообщение к подписанию
const message = '7hJ9yN2OdIQo2kJu0arZgw2EKnMX5FGtQ6jlCWuLXCM='
// Получаем signingToken
const signingToken = await getSigningToken(message)
// Генерируем ECDSA подпись
const signature = await signEcdsaMessage(signer, secretId, syncSessionId, signSessionId, message, signingToken);
// Верифицируем подпись к составному ключу с внешней библиотекой (тут - elliptic.js)
expect(new ec('secp256k1').verify(
Buffer.from(message, 'base64'),
{
s: Buffer.from(signature.s, 'base64'),
r: Buffer.from(signature.r, 'base64'),
recoveryParam: signature.recovery,
},
Buffer.from(publicKey, 'base64'),
)).toBeTruthy();
// Отключаемся от SignerService
await signer.disconnect();
Параметры
Имя | Тип | Описание |
---|---|---|
url |
string |
signer service эндпоинт (HTTP(S)) |
auth |
AuthorizationSession |
сессия авторизации AuthorizationSession к использованию |
crypto |
Crypto |
любой валидный Crypto для обработки данных и вычислений |
timeout? |
number |
(опционально) таймаут запроса на каждое сообщение, по истечению которого выполнение процедуры останавливается |
Overrides
Свойства
auth
• auth: AuthorizationSession
сессия авторизации AuthorizationSession
Методы
connect
▸ connect(timeout?
): Promise
<void
>
Подключение и прослушивание событий
Параметры
Имя | Тип |
---|---|
timeout? |
number |
Возвращает
Promise
<void
>
disconnect
▸ disconnect(): Promise
<void
>
Прекращение прослушивания событий и отключение
Возвращает
Promise
<void
>
generateDistributedSecret
▸ generateDistributedSecret(secretId
): Promise
<void
>
Одновременная генерация распределенного секрета с тем же secretId
Этот метод не строго обязателен, т.к. возможна генерация секретов с одинаковыми ID независимо с помощью Crypto Driver, однако это может быть полезно в демонстрационных целях.
Результатом этой операции будут являться новые секреты, сохраненные в постоянное хранилище, доступные по предоставленному secretId
С данного момента можно свободно вызывать syncDistributedEcdsaKey и syncDistributedEddsaKey, в том случае если секрет доступен в хранилище.
Пример
// Считаем, что SignerClient уже инициализирован и подключен
// Генерируем случаный secretId для нового секрета
const secretId = uuid(randomBytes);
// Генерируем оба секрата (первый на подлюченном сервере и второй локально)
await client.generateDistributedSecret(secretId);
// К этому моменту секрет уже сгенерирован и готов к использованию MPC
Параметры
Имя | Тип | Описание |
---|---|---|
secretId |
string |
ID (UUID) данного секрета |
Возвращает
Promise
<void
>