ske = silc_calloc(1, sizeof(*ske));
ske->status = SILC_SKE_STATUS_OK;
ske = silc_calloc(1, sizeof(*ske));
ske->status = SILC_SKE_STATUS_OK;
+ /* If the SKE was freed during the async call then free it really now,
+ otherwise just decrement the reference counter. */
+ if (ske->status == SILC_SKE_STATUS_FREED) {
+ silc_ske_free(ske);
+ return;
+ } else {
+ ske->users--;
+ }
+
+ payload = ske->ke2_payload;
+
/* If the caller returns PENDING status SKE library will assume that
the caller will re-call this callback when it is not anymore in
PENDING status. */
/* If the caller returns PENDING status SKE library will assume that
the caller will re-call this callback when it is not anymore in
PENDING status. */
if (silc_pkcs_verify(ske->prop->pkcs, payload->sign_data,
payload->sign_len, hash, hash_len) == FALSE) {
if (silc_pkcs_verify(ske->prop->pkcs, payload->sign_data,
payload->sign_len, hash, hash_len) == FALSE) {
(*verify_key)(ske, payload->pk_data, payload->pk_len,
payload->pk_type, verify_context,
silc_ske_initiator_finish_final, finish);
(*verify_key)(ske, payload->pk_data, payload->pk_len,
payload->pk_type, verify_context,
silc_ske_initiator_finish_final, finish);
recv_payload = ske->ke1_payload;
/* If the caller returns PENDING status SKE library will assume that
recv_payload = ske->ke1_payload;
/* If the caller returns PENDING status SKE library will assume that
if (silc_pkcs_verify(ske->prop->pkcs, recv_payload->sign_data,
recv_payload->sign_len, hash, hash_len) == FALSE) {
if (silc_pkcs_verify(ske->prop->pkcs, recv_payload->sign_data,
recv_payload->sign_len, hash, hash_len) == FALSE) {
(*verify_key)(ske, recv_payload->pk_data, recv_payload->pk_len,
recv_payload->pk_type, verify_context,
silc_ske_responder_phase2_final, finish);
(*verify_key)(ske, recv_payload->pk_data, recv_payload->pk_len,
recv_payload->pk_type, verify_context,
silc_ske_responder_phase2_final, finish);