int ret = dco_new_key(multi->dco, multi->dco_peer_id, ks->key_id, slot, encrypt_key, encrypt_iv,
decrypt_key, decrypt_iv, ciphername, epoch);
- if ((ret == 0) && (multi->dco_keys_installed < 2))
+ if (ret == 0)
{
- multi->dco_keys_installed++;
+ if (multi->dco_keys_installed < 2)
+ {
+ multi->dco_keys_installed++;
+ }
ks->dco_status =
(slot == OVPN_KEY_SLOT_PRIMARY) ? DCO_INSTALLED_PRIMARY : DCO_INSTALLED_SECONDARY;
}
/* if we have a primary key, it must have been installed already (keys
* are installed upon generation in the TLS code)
*/
- ASSERT(primary->dco_status != DCO_NOT_INSTALLED);
+ if (primary->dco_status == DCO_NOT_INSTALLED)
+ {
+ msg(D_DCO, "DCO key state mismatch: selected primary key is not installed "
+ "(peer_id=%d, key_id=%d, dco_keys_installed=%d)",
+ multi->dco_peer_id, primary->key_id, multi->dco_keys_installed);
+ return false;
+ }
struct key_state *secondary = dco_get_secondary_key(multi, primary);
/* if the current primary key was installed as secondary in DCO,
primary->key_id);
}
+ if (secondary && secondary->dco_status != DCO_INSTALLED_PRIMARY)
+ {
+ msg(D_DCO, "DCO key state mismatch: expected old primary key is not installed as DCO primary before swap "
+ "(peer_id=%d, new_primary_key_id=%d, old_primary_key_id=%d, old_primary_dco_status=%d, dco_keys_installed=%d)",
+ multi->dco_peer_id, primary->key_id, secondary->key_id, secondary->dco_status, multi->dco_keys_installed);
+ return false;
+ }
+
int ret = dco_swap_keys(dco, multi->dco_peer_id);
if (ret < 0)
{
primary->dco_status = DCO_INSTALLED_PRIMARY;
if (secondary)
{
- ASSERT(secondary->dco_status == DCO_INSTALLED_PRIMARY);
secondary->dco_status = DCO_INSTALLED_SECONDARY;
}
}