From 018770f711aa7c9506b50b893fba3e96b97bcd26 Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Tue, 14 Nov 2017 14:55:01 -0800 Subject: [PATCH] Generic traits for dealing with ASN1. --- src/lib.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 5cfd4e1..46bfb9c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -527,6 +527,45 @@ fn encode_len(x: usize) -> Vec { } } +// ---------------------------------------------------------------------------- + +pub trait FromASN1 : Sized { + type Error : From; + + fn from_asn1(v: &[ASN1Block]) -> Result<(Self,&[ASN1Block]),Self::Error>; +} + +pub fn der_decode(v: &[u8]) -> Result +{ + let vs = from_der(v)?; + T::from_asn1(&vs).and_then(|(a,_)| Ok(a)) +} + +pub trait ToASN1 { + type Error : From; + + fn to_asn1(&self) -> Result,Self::Error> { + self.to_asn1_class(ASN1Class::Universal) + } + fn to_asn1_class(&self, c: ASN1Class) + -> Result,Self::Error>; +} + +pub fn der_encode(v: &T) -> Result,T::Error> +{ + let blocks = T::to_asn1(&v)?; + let mut res = Vec::new(); + + for block in blocks { + let mut x = to_der(&block)?; + res.append(&mut x); + } + + Ok(res) +} + +// ---------------------------------------------------------------------------- + #[cfg(test)] mod tests { use quickcheck::{Arbitrary,Gen};