signInner2 method

Future<Uint8List> signInner2({
  1. required String instanceId,
  2. required String otherVk,
  3. required KeyType keyType,
  4. required String messageHex,
  5. required String messageHash,
  6. required String? derivationPath,
  7. required DklsKeyshare keyshare,
})

Peform keygen, if refreshKeyshare is provided then do keyrefresh

Implementation

Future<Uint8List> signInner2({
  required String instanceId,
  required String otherVk,
  required dkls.KeyType keyType,
  required String messageHex,
  required String messageHash,
  required String? derivationPath,
  required dkls.DklsKeyshare keyshare,
}) async {
  try {
    print('sign');
    final instanceIdBytes = base64Decode(instanceId);
    final instanceIdBuffer = dkls.allocateTssBufferFromBytes(instanceIdBytes);
    final signingKey = this.signingKey;
    final type = dkls.KeyType.values.indexOf(keyType) + 1;
    final masterVkBuffer =
        dkls.allocateTssBufferFromBytes(base64Decode(otherVk));
    final otherVkHandle = dkls.dklsMessageVerifyingKey(type, masterVkBuffer);

    print('signInner2.2');

    final askMsg =
        await dkls.dklsAskSetupMsg(instanceIdBuffer, otherVkHandle.ref, 300);

    print('signInner2.3 ${askMsg}');

    final askMsgBytes = dkls.toBytesUnsafe(askMsg);

    print('signInner2.3 ${askMsgBytes}');

    await cloudClient.sendData(askMsgBytes);

    print('signInner2.4');

    final Uint8List rawSetupMsg = await cloudClient.readData();
    final setupMessage = await dkls.SignSetupMessage.decodeMessage(
      instanceId: instanceIdBytes,
      vkHandle: otherVkHandle,
      setupMessage: rawSetupMsg,
    );

    dkls.SignSession session = dkls.SignSession.fromMobileSignSetupMessage(
      setupMessage: setupMessage,
      p2SkHandle: signingKey.skHandle,
      keyshare: keyshare,
    );

    final signature = await _processSign(session);

    print('signature: ${signature}');

    await cloudClient.close();
    await cloudClient.waitRemoteClose();
    return signature;
  } catch (error) {
    await cloudClient.close();
    final closeCode = await cloudClient.waitRemoteClose();

    if (closeCode == 4002) {
      throw 'Keygen failed, the keyshare are not in sync, try reconcile again';
    } else if (closeCode != null && closeCode > 1005) {
      throw 'Keygen failed, server abnormal closing $closeCode';
    }
    throw error;
  } finally {}
}