fn delete_inner()

in key/aziot-keys/src/key.rs [685:719]


fn delete_inner(locations: &[crate::implementation::Location]) -> Result<(), crate::AZIOT_KEYS_RC> {
    for location in locations {
        match location {
            crate::implementation::Location::Filesystem(path) => match std::fs::remove_file(path) {
                Ok(()) => (),
                Err(err) if err.kind() == std::io::ErrorKind::NotFound => (),
                Err(err) => return Err(crate::implementation::err_external(err)),
            },

            crate::implementation::Location::Pkcs11 { lib_path, uri } => {
                let pkcs11_context = pkcs11::Context::load(lib_path.clone())
                    .map_err(crate::implementation::err_external)?;
                let pkcs11_slot = pkcs11_context
                    .find_slot(&uri.slot_identifier)
                    .map_err(crate::implementation::err_external)?;
                let pkcs11_session = pkcs11_context
                    .open_session(pkcs11_slot, uri.pin.clone())
                    .map_err(crate::implementation::err_external)?;
                let object_label =
                    uri.object_label.as_deref()
                    .ok_or_else(|| crate::implementation::err_invalid_parameter(
                        "id",
                        "key corresponding to this ID cannot be deleted because it is a PKCS#11 key without an object label",
                    ))?;

                match pkcs11_session.delete_key(object_label) {
                    Ok(()) => (),
                    Err(err) => return Err(crate::implementation::err_external(err)),
                }
            }
        }
    }

    Ok(())
}