in src/vtok_srv/src/worker.rs [120:166]
fn describe_token(label: String, pin: String) -> ApiResponse {
let config = config::Config::load_ro().map_err(|_| ApiError::InternalError)?;
let (slot_id, token) = config
.slots()
.iter()
.enumerate()
.filter_map(|(idx, slot)| {
slot.as_ref()
.filter(|tok| tok.label == label)
.map(|tok| (idx, tok))
})
.next()
.ok_or(ApiError::TokenNotFound)?;
if token.pin != pin {
return Err(ApiError::AccessDenied);
}
let token_desc = schema::TokenDescription {
label: token.label.clone(),
slot_id,
ttl_secs: token
.expiry_ts
.checked_sub(util::time::monotonic_secs())
.unwrap_or(0),
keys: Some(
token
.private_keys
.iter()
.map(|key| schema::PrivateKeyDescription {
label: key.label.clone(),
id: key.id,
uri: format!(
"pkcs11:model={};manufacturer={};serial=EVT{:02X};token={};id=%{:02x};object={};type=private",
defs::TOKEN_MODEL,
defs::MANUFACTURER,
slot_id,
token.label.as_str(),
key.id,
key.label.as_str(),
)
})
.collect(),
),
};
Ok(ApiOk::TokenDescription(token_desc))
}