signInner2 method
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 {}
}