Implement as_vec for OID
Change-Id: I29d59b77b541454007343488f8f809c3052ad3e3
This commit is contained in:
35
src/lib.rs
35
src/lib.rs
@@ -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>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user