+/* Initiator signature callback */
+
+static void silc_ske_initiator_sign_cb(SilcBool success,
+ const unsigned char *signature,
+ SilcUInt32 signature_len,
+ void *context)
+{
+ SilcSKE ske = context;
+
+ ske->key_op = NULL;
+
+ if (ske->aborted) {
+ silc_fsm_next(&ske->fsm, silc_ske_st_initiator_failure);
+ SILC_FSM_CALL_CONTINUE(&ske->fsm);
+ return;
+ }
+
+ ske->ke1_payload->sign_data = silc_memdup(signature, signature_len);
+ if (ske->ke1_payload->sign_data)
+ ske->ke1_payload->sign_len = signature_len;
+
+ SILC_FSM_CALL_CONTINUE(&ske->fsm);
+}
+
+/* Responder signature callback */
+
+static void silc_ske_responder_sign_cb(SilcBool success,
+ const unsigned char *signature,
+ SilcUInt32 signature_len,
+ void *context)
+{
+ SilcSKE ske = context;
+
+ ske->key_op = NULL;
+
+ if (ske->aborted) {
+ silc_fsm_next(&ske->fsm, silc_ske_st_responder_failure);
+ SILC_FSM_CALL_CONTINUE(&ske->fsm);
+ return;
+ }
+
+ ske->ke2_payload->sign_data = silc_memdup(signature, signature_len);
+ if (ske->ke2_payload->sign_data)
+ ske->ke2_payload->sign_len = signature_len;
+
+ SILC_FSM_CALL_CONTINUE(&ske->fsm);
+}
+
+/* Verify callback */
+
+static void silc_ske_verify_cb(SilcBool success, void *context)
+{
+ SilcSKE ske = context;
+
+ ske->key_op = NULL;
+
+ if (ske->aborted) {
+ if (ske->responder)
+ silc_fsm_next(&ske->fsm, silc_ske_st_responder_failure);
+ else
+ silc_fsm_next(&ske->fsm, silc_ske_st_initiator_failure);
+ SILC_FSM_CALL_CONTINUE(&ske->fsm);
+ return;
+ }
+
+ if (!success) {
+ SILC_LOG_ERROR(("Signature verification failed, incorrect signature"));
+ ske->status = SILC_SKE_STATUS_INCORRECT_SIGNATURE;
+ if (ske->responder)
+ silc_fsm_next(&ske->fsm, silc_ske_st_responder_error);
+ else
+ silc_fsm_next(&ske->fsm, silc_ske_st_initiator_error);
+ SILC_FSM_CALL_CONTINUE(&ske->fsm);
+ return;
+ }
+
+ SILC_LOG_DEBUG(("Signature is Ok"));
+ SILC_FSM_CALL_CONTINUE(&ske->fsm);
+}
+