use super::PublicKeyInfo;
use crate::algorithm::ml_dsa::{self, ParameterSet};
use crate::{Error, ErrorCode, Result};
use structured_asn1::memory::Work;
#[derive(Debug, Clone, Copy)]
pub struct PublicKey<'a> {
parameter_set: ParameterSet,
bytes: &'a [u8],
offset: u64,
}
impl<'a> PublicKey<'a> {
#[must_use]
pub fn parameter_set(&self) -> ParameterSet {
self.parameter_set
}
#[must_use]
pub fn as_bytes(&self) -> &'a [u8] {
self.bytes
}
#[must_use]
pub fn offset(&self) -> u64 {
self.offset
}
}
pub fn read<'a, W: Work>(key: PublicKeyInfo<'a>, execution: &W) -> Result<PublicKey<'a>> {
let identifier = key.algorithm();
let parameter_set = ml_dsa::resolve(identifier, execution)?.ok_or_else(|| {
Error::new(
ErrorCode::UnexpectedField,
"subjectPublicKey.mlDsa",
identifier.offset(),
)
})?;
let bytes = key.whole_octets("subjectPublicKey.mlDsa")?;
let offset = key.key_offset();
if bytes.len() != parameter_set.public_key_len() {
return Err(Error::new(
ErrorCode::MalformedValue,
"subjectPublicKey.mlDsa",
offset,
));
}
Ok(PublicKey {
parameter_set,
bytes,
offset,
})
}