use crate::{asn1, Error, ObjectIdentifier, Result};
use core::convert::TryFrom;
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct AlgorithmIdentifier {
pub oid: ObjectIdentifier,
pub parameters: Option<ObjectIdentifier>,
}
impl AlgorithmIdentifier {
pub fn from_der(mut bytes: &[u8]) -> Result<Self> {
let algorithm = asn1::decoder::decode_algorithm_identifier(&mut bytes)?;
if bytes.is_empty() {
Ok(algorithm)
} else {
Err(Error::Decode)
}
}
pub fn write_der<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a [u8]> {
let offset = asn1::encoder::encode_algorithm_identifier(buffer, self)?;
Ok(&buffer[..offset])
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub fn to_der(&self) -> alloc::vec::Vec<u8> {
let len = asn1::encoder::algorithm_identifier_len(self).unwrap();
let mut buffer = vec![0u8; len];
self.write_der(&mut buffer).unwrap();
buffer
}
}
impl TryFrom<&[u8]> for AlgorithmIdentifier {
type Error = Error;
fn try_from(bytes: &[u8]) -> Result<Self> {
Self::from_der(bytes)
}
}