fn load_inner()

in key/aziot-keys/src/key.rs [511:551]


fn load_inner(
    locations: &[crate::implementation::Location],
    treat_malformed_as_missing: bool,
) -> Result<Option<Key>, crate::AZIOT_KEYS_RC> {
    for location in locations {
        match location {
            crate::implementation::Location::Filesystem(path) => match std::fs::read(path) {
                Ok(key_bytes) => {
                    if !key_bytes.is_empty() {
                        return Ok(Some(Key::FileSystem(key_bytes)));
                    } else if !treat_malformed_as_missing {
                        return Err(crate::implementation::err_external("key file is empty"));
                    }
                }
                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)?;

                match pkcs11_session.get_key(uri.object_label.as_deref()) {
                    Ok(key_pair) => return Ok(Some(Key::Pkcs11(key_pair))),

                    Err(pkcs11::GetKeyError::KeyDoesNotExist) => (),

                    Err(err) => return Err(crate::implementation::err_external(err)),
                }
            }
        }
    }

    Ok(None)
}