From 2d2d9a3bbb1ee9b3be5b6c19674988bb84b7eb48 Mon Sep 17 00:00:00 2001 From: Oleksandr Kravchenko Date: Mon, 17 May 2021 19:48:18 +0300 Subject: [PATCH] Implement as_vec for OID Change-Id: I29d59b77b541454007343488f8f809c3052ad3e3 --- src/lib.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index c1bd391..895ce8a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,6 +31,7 @@ pub use num_bigint::{BigInt, BigUint}; use num_traits::{FromPrimitive, One, ToPrimitive, Zero}; #[cfg(test)] use quickcheck::quickcheck; +use std::convert::TryFrom; use std::iter::FromIterator; use std::mem::size_of; use std::str::Utf8Error; @@ -241,6 +242,19 @@ impl OID { _ => Err(ASN1EncodeErr::ObjectIdentHasTooFewFields), } } + + pub fn as_vec<'a, T: TryFrom<&'a BigUint>>(&'a self) -> Result, 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 for &'a OID { @@ -313,6 +327,8 @@ pub enum ASN1DecodeErr { /// Invalid ASN.1 input can lead to this error. #[error("Incomplete data or invalid ASN1")] Incomplete, + #[error("Value overflow")] + Overflow, } /// 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)]); } } + + #[test] + fn vec_oid() { + let vec_u64: Vec = vec![1, 2, 840, 10045, 4, 3, 2]; + let vec_i64: Vec = vec![1, 2, 840, 10045, 4, 3, 2]; + let vec_usize: Vec = 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::()); + } }