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)
}