aboutsummaryrefslogtreecommitdiff
path: root/src/algorithm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/algorithm.rs')
-rw-r--r--src/algorithm.rs134
1 files changed, 36 insertions, 98 deletions
diff --git a/src/algorithm.rs b/src/algorithm.rs
index 5f4b5e8..2a8b6c7 100644
--- a/src/algorithm.rs
+++ b/src/algorithm.rs
@@ -2,14 +2,8 @@
use crate::{Error, Result};
use core::cmp::Ordering;
-use der::{
- asn1::{AnyRef, Choice, ObjectIdentifier},
- Decode, DecodeValue, DerOrd, Encode, EncodeValue, Header, Length, Reader, Sequence, ValueOrd,
- Writer,
-};
-
-#[cfg(feature = "alloc")]
-use der::asn1::Any;
+use der::asn1::{AnyRef, ObjectIdentifier};
+use der::{Decode, DecodeValue, DerOrd, Encode, Header, Reader, Sequence, ValueOrd};
/// X.509 `AlgorithmIdentifier` as defined in [RFC 5280 Section 4.1.1.2].
///
@@ -20,82 +14,17 @@ use der::asn1::Any;
/// ```
///
/// [RFC 5280 Section 4.1.1.2]: https://tools.ietf.org/html/rfc5280#section-4.1.1.2
-#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
-pub struct AlgorithmIdentifier<Params> {
+pub struct AlgorithmIdentifier<'a> {
/// Algorithm OID, i.e. the `algorithm` field in the `AlgorithmIdentifier`
/// ASN.1 schema.
pub oid: ObjectIdentifier,
/// Algorithm `parameters`.
- pub parameters: Option<Params>,
-}
-
-impl<'a, Params> DecodeValue<'a> for AlgorithmIdentifier<Params>
-where
- Params: Choice<'a>,
-{
- fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> der::Result<Self> {
- reader.read_nested(header.length, |reader| {
- Ok(Self {
- oid: reader.decode()?,
- parameters: reader.decode()?,
- })
- })
- }
-}
-
-impl<Params> EncodeValue for AlgorithmIdentifier<Params>
-where
- Params: Encode,
-{
- fn value_len(&self) -> der::Result<Length> {
- self.oid.encoded_len()? + self.parameters.encoded_len()?
- }
-
- fn encode_value(&self, writer: &mut impl Writer) -> der::Result<()> {
- self.oid.encode(writer)?;
- self.parameters.encode(writer)?;
- Ok(())
- }
+ pub parameters: Option<AnyRef<'a>>,
}
-impl<'a, Params> Sequence<'a> for AlgorithmIdentifier<Params> where Params: Choice<'a> + Encode {}
-
-impl<'a, Params> TryFrom<&'a [u8]> for AlgorithmIdentifier<Params>
-where
- Params: Choice<'a> + Encode,
-{
- type Error = Error;
-
- fn try_from(bytes: &'a [u8]) -> Result<Self> {
- Ok(Self::from_der(bytes)?)
- }
-}
-
-impl<Params> ValueOrd for AlgorithmIdentifier<Params>
-where
- Params: DerOrd,
-{
- fn value_cmp(&self, other: &Self) -> der::Result<Ordering> {
- match self.oid.der_cmp(&other.oid)? {
- Ordering::Equal => self.parameters.der_cmp(&other.parameters),
- other => Ok(other),
- }
- }
-}
-
-/// `AlgorithmIdentifier` reference which has `AnyRef` parameters.
-pub type AlgorithmIdentifierRef<'a> = AlgorithmIdentifier<AnyRef<'a>>;
-
-/// `AlgorithmIdentifier` with `ObjectIdentifier` parameters.
-pub type AlgorithmIdentifierWithOid = AlgorithmIdentifier<ObjectIdentifier>;
-
-/// `AlgorithmIdentifier` reference which has `Any` parameters.
-#[cfg(feature = "alloc")]
-pub type AlgorithmIdentifierOwned = AlgorithmIdentifier<Any>;
-
-impl<Params> AlgorithmIdentifier<Params> {
+impl<'a> AlgorithmIdentifier<'a> {
/// Assert the `algorithm` OID is an expected value.
pub fn assert_algorithm_oid(&self, expected_oid: ObjectIdentifier) -> Result<ObjectIdentifier> {
if self.oid == expected_oid {
@@ -104,9 +33,7 @@ impl<Params> AlgorithmIdentifier<Params> {
Err(Error::OidUnknown { oid: expected_oid })
}
}
-}
-impl<'a> AlgorithmIdentifierRef<'a> {
/// Assert `parameters` is an OID and has the expected value.
pub fn assert_parameters_oid(
&self,
@@ -160,35 +87,46 @@ impl<'a> AlgorithmIdentifierRef<'a> {
None => None,
Some(p) => match p {
AnyRef::NULL => None,
- _ => Some(p.decode_as::<ObjectIdentifier>()?),
+ _ => Some(p.oid()?),
},
},
))
}
}
-#[cfg(feature = "alloc")]
-mod allocating {
- use super::*;
- use der::referenced::*;
+impl<'a> DecodeValue<'a> for AlgorithmIdentifier<'a> {
+ fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> der::Result<Self> {
+ reader.read_nested(header.length, |reader| {
+ Ok(Self {
+ oid: reader.decode()?,
+ parameters: reader.decode()?,
+ })
+ })
+ }
+}
- impl<'a> RefToOwned<'a> for AlgorithmIdentifierRef<'a> {
- type Owned = AlgorithmIdentifierOwned;
- fn ref_to_owned(&self) -> Self::Owned {
- AlgorithmIdentifier {
- oid: self.oid,
- parameters: self.parameters.ref_to_owned(),
- }
- }
+impl<'a> Sequence<'a> for AlgorithmIdentifier<'a> {
+ fn fields<F, T>(&self, f: F) -> der::Result<T>
+ where
+ F: FnOnce(&[&dyn Encode]) -> der::Result<T>,
+ {
+ f(&[&self.oid, &self.parameters])
+ }
+}
+
+impl<'a> TryFrom<&'a [u8]> for AlgorithmIdentifier<'a> {
+ type Error = Error;
+
+ fn try_from(bytes: &'a [u8]) -> Result<Self> {
+ Ok(Self::from_der(bytes)?)
}
+}
- impl OwnedToRef for AlgorithmIdentifierOwned {
- type Borrowed<'a> = AlgorithmIdentifierRef<'a>;
- fn owned_to_ref(&self) -> Self::Borrowed<'_> {
- AlgorithmIdentifier {
- oid: self.oid,
- parameters: self.parameters.owned_to_ref(),
- }
+impl ValueOrd for AlgorithmIdentifier<'_> {
+ fn value_cmp(&self, other: &Self) -> der::Result<Ordering> {
+ match self.oid.der_cmp(&other.oid)? {
+ Ordering::Equal => self.parameters.der_cmp(&other.parameters),
+ other => Ok(other),
}
}
}