Перейти к содержанию

SignerClient

SignerClient

class SignerClient(val url: String, val auth: AuthorizationSession, crypto: Crypto, timeout: UInt?, val transport: SSETransportDriver = SSETransportDriver( url, auth )) : SpatiumProtocol

Предварительно настроенный протокол, направленный на коммуникацию с Spatium Signer Service

  • Для транспортировки он использует HTTP(S) + SSE двунаправленный транспорт.
  • Для кэша использует in-memory хранилище
  • Для крипто-драйвера использует предоставленный Crypto

Так как внутренне он использует SSETransportDriver, нужно помнить что клиент начинает слушать события как только вызван метод connect(timeout =) и не прекращает, пока не вызван метод disconnect().

См. также

  • См. также = SpatiumSDKSwift/ProtocolKotlin

Параметры

androidJvm

url = signer service эндпоинт (HTTP(S))
auth = сессия авторизации AuthorizationSession к использованию
crypto = любой валидный Crypto для обработки данных и вычислений
timeout = (опционально) таймаут запроса на каждое сообщение, по истечению которого выполнение процедуры останавливается

Заметьте

запросы относятся к accountId сессии авторизации, тем самым хранят данные независимо для каждого авторизированного пользователя

Пример

 // Считаем, что Crypto уже инициализирован
val auth = AuthorizationSession(
    url = "https://api-cloud-dev.spatium.io/authorization/v1",
    tokenId = UUID.randomUUID().toString(),
    permissions = listOf("read", "secret")
)

val clientCache = MemoryStorageDriver()
val clientStorage = MemoryStorageDriver()

val clientCrypto = SpatiumCrypto(cache = clientCache, storage = clientStorage)

val clientProtocol = SignerClient(
    url = "https://api-cloud-dev.spatium.io/signer/v1",
    auth = auth,
    crypto = clientCrypto,
    timeout = (60 * 1000).toUInt()
)

// Подключение к SignerService (с 10-секундным таймаутом)
clientProtocol.connect((60 * 1000).toUInt())

// Генерируем случаный secretId для нового секрета (он должен быть сгенерирован единожды и сохранен)
val secretId = UUID.randomUUID().toString()

// Генерируем оба секрата (первый на подлюченном сервере и второй локально) (производится единожды для каждого secretId) 
clientProtocol.generateDistributedSecret(secretId = secretId)

// Генерируем рандомный session ID для новой сессии синхронизации 
val syncSessionId = UUID.randomUUID().toString()

// Выполняем ECDSA-over-secp256k1 процедуру синхронизации для ключа с путем ```m/44'/0'/0'/0'/0'```
val publicKey = syncDistributedEcdsaKey(
    driver = clientProtocol,
    secretId = secretId,
    syncSessionId = syncSessionId,
    curve = EcdsaCurve.secp256k1,
    derivationCoin = 0U,
    derivationAccount = 0U
)

// К этому моменту данные синхронизации уже сохранены в хранилище и составной ключ доступен к получению 
val _publicKey = getEcdsaPublicKey(
    driver = clientProtocol,
    secretId = secretId,
    syncSessionId = syncSessionId
)

// Этот ключ, очевидно, является тем же ключом, который мы получаем из самой процедуры синхронизации 
assertEquals(publicKey, _publicKey)

// Генерируем рандомный session ID для новой сессии подписания 
val signSessionId = UUID.randomUUID().toString()

// Сообщение к подписанию
val message = "7hJ9yN2OdIQo2kJu0arZgw2EKnMX5FGtQ6jlCWuLXCM="

// Генерируем ECDSA подпись
val signature = signEcdsaMessage(
    driver = clientProtocol,
    secretId = secretId,
    syncSessionId = syncSessionId,
    signSessionId = signSessionId,
    message = message
)

// Верифицируем подпись к составному ключу
print(
    mapOf(
        "curve" to EddsaCurve.ed25519,
        "publicKey" to publicKey,
        "message" to message,
        "signature" to mapOf("R" to signature.r, "s" to signature.s) as Map<String, Any>
    ) as Map<String, Any>
)

Конструкторы

SignerClient [androidJvm]
constructor(url: String, auth: AuthorizationSession, crypto: Crypto, timeout: UInt?, transport: SSETransportDriver = SSETransportDriver( url, auth ))

Свойства

Имя Описание
auth [androidJvm]
val auth: AuthorizationSession
crypto [androidJvm]
val crypto: Crypto
timeout [androidJvm]
val timeout: UInt?
transport [androidJvm]
open override val transport: SSETransportDriver
url [androidJvm]
val url: String

Функции

Имя Описание
connect [androidJvm]
suspend fun connect(timeout: UInt?)
Подключение и прослушивание событий
disconnect [androidJvm]
fun disconnect()
Прекращение прослушивания событий и отключение
generateDistributedSecret [androidJvm]
suspend fun generateDistributedSecret(secretId: String)
Одновременная генерация распределенного секрета с тем же secretId