Implement as_vec for OID

Change-Id: I29d59b77b541454007343488f8f809c3052ad3e3
This commit is contained in:
Oleksandr Kravchenko
2021-05-17 19:48:18 +03:00
parent 19a466bb07
commit 2d2d9a3bbb

View File

@@ -31,6 +31,7 @@ pub use num_bigint::{BigInt, BigUint};
use num_traits::{FromPrimitive, One, ToPrimitive, Zero}; use num_traits::{FromPrimitive, One, ToPrimitive, Zero};
#[cfg(test)] #[cfg(test)]
use quickcheck::quickcheck; use quickcheck::quickcheck;
use std::convert::TryFrom;
use std::iter::FromIterator; use std::iter::FromIterator;
use std::mem::size_of; use std::mem::size_of;
use std::str::Utf8Error; use std::str::Utf8Error;
@@ -241,6 +242,19 @@ impl OID {
_ => Err(ASN1EncodeErr::ObjectIdentHasTooFewFields), _ => Err(ASN1EncodeErr::ObjectIdentHasTooFewFields),
} }
} }
pub fn as_vec<'a, T: TryFrom<&'a BigUint>>(&'a self) -> Result<Vec<T>, ASN1DecodeErr> {
let mut vec = Vec::new();
for val in self.0.iter() {
let ul = match T::try_from(val) {
Ok(a) => a,
Err(_) => return Err(ASN1DecodeErr::Overflow),
};
vec.push(ul);
}
Ok(vec)
}
} }
impl<'a> PartialEq<OID> for &'a OID { impl<'a> PartialEq<OID> for &'a OID {
@@ -313,6 +327,8 @@ pub enum ASN1DecodeErr {
/// Invalid ASN.1 input can lead to this error. /// Invalid ASN.1 input can lead to this error.
#[error("Incomplete data or invalid ASN1")] #[error("Incomplete data or invalid ASN1")]
Incomplete, Incomplete,
#[error("Value overflow")]
Overflow,
} }
/// An error that can arise encoding ASN.1 primitive blocks. /// An error that can arise encoding ASN.1 primitive blocks.
@@ -1534,4 +1550,23 @@ mod tests {
assert_eq!(raw_oid, &expected[6..(expected.len() - 4)]); assert_eq!(raw_oid, &expected[6..(expected.len() - 4)]);
} }
} }
#[test]
fn vec_oid() {
let vec_u64: Vec<u64> = vec![1, 2, 840, 10045, 4, 3, 2];
let vec_i64: Vec<i64> = vec![1, 2, 840, 10045, 4, 3, 2];
let vec_usize: Vec<usize> = vec![1, 2, 840, 10045, 4, 3, 2];
let mut o = Vec::new();
for val in vec_u64.iter() {
o.push(BigUint::from(*val));
}
let oid = OID::new(o);
assert_eq!(Ok(vec_u64), oid.as_vec());
assert_eq!(Ok(vec_i64), oid.as_vec());
assert_eq!(Ok(vec_usize), oid.as_vec());
assert_eq!(Err(ASN1DecodeErr::Overflow), oid.as_vec::<u8>());
}
} }