diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-18 02:49:50 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-18 02:49:50 +0000 |
commit | 9835e2ae736235810b4ea1c162ca5e65c547e770 (patch) | |
tree | 3fcebf40ed70e581d776a8a4c65923e8ec20e026 /vendor/spki | |
parent | Releasing progress-linux version 1.70.0+dfsg2-1~progress7.99u1. (diff) | |
download | rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.tar.xz rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.zip |
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/spki')
-rw-r--r-- | vendor/spki/.cargo-checksum.json | 2 | ||||
-rw-r--r-- | vendor/spki/CHANGELOG.md | 29 | ||||
-rw-r--r-- | vendor/spki/Cargo.toml | 20 | ||||
-rw-r--r-- | vendor/spki/LICENSE-MIT | 2 | ||||
-rw-r--r-- | vendor/spki/README.md | 4 | ||||
-rw-r--r-- | vendor/spki/src/algorithm.rs | 131 | ||||
-rw-r--r-- | vendor/spki/src/fingerprint.rs | 1 | ||||
-rw-r--r-- | vendor/spki/src/lib.rs | 39 | ||||
-rw-r--r-- | vendor/spki/src/spki.rs | 150 | ||||
-rw-r--r-- | vendor/spki/src/traits.rs | 119 | ||||
-rw-r--r-- | vendor/spki/tests/spki.rs | 47 | ||||
-rw-r--r-- | vendor/spki/tests/traits.rs | 14 |
12 files changed, 407 insertions, 151 deletions
diff --git a/vendor/spki/.cargo-checksum.json b/vendor/spki/.cargo-checksum.json index b9ffbdae9..469b1b2b4 100644 --- a/vendor/spki/.cargo-checksum.json +++ b/vendor/spki/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"f1d990e95d496dbb2c4dee0b486ef44df8402768f461c5572f3aa8467d4831e2","Cargo.toml":"e6432d40fb16fb01a54e1fd8a29fc07573a36dd64d7140ad4fe9d9a6410c1e1c","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"4a883ecc3bb1010faed542bf63d53e530fea5e5e12cf676aed588784298ba929","README.md":"e2fee03d66193bb5a5c82137f879cd5011f7f9d21d157765f87d614b4506a4cd","src/algorithm.rs":"9bc057fd99b8511b5356fdcf9834d6d5c892fa0d5a30020fdb4c7cf97f095f33","src/error.rs":"ce99da5f369ae830bbac6a958ee0e93c8045df5ca7b7ea306e55bb3209c1f81f","src/fingerprint.rs":"bdfc1c1194d06bdb8b74ab7326f956e140968c1737cb407d0de8f29eaaf4bd8b","src/lib.rs":"f70bb8b6199790125ee0e84a0c3614cb42a76cc6f735c47648c9ffc197aeab29","src/spki.rs":"05e163cd33b6be54fa7dea9a2f462f1a73e06fc4eccfd3bd36238c775b57f81d","src/traits.rs":"740ac98d5106cceff14aea6e2b81c3724e240107339e36e5a19075b0e6590f87","tests/examples/ed25519-pub.der":"55dd4c74b0e48534e2f4e173ceceb50df8f27a7ac2aa8991cc7ae914e030bced","tests/examples/ed25519-pub.pem":"36d717203cbca1812f05f30e0415251c928b659882092e653221a028571c6853","tests/examples/p256-pub.der":"b9968d56ed8d6aa3fb43b15fa01e355d7a3a0203b1408b3fd2733637c4d1642c","tests/examples/p256-pub.pem":"d1ff198dc495da63f5f909db0254d6e49cff519487fcb26d055a762fc3ca47a1","tests/examples/rsa2048-pub.der":"efeda9bfead9fd0594f6a5cf6fdf6c163116a3b1fad6d73cea05295b68fd1794","tests/examples/rsa2048-pub.pem":"078c3983093e86784590a2a454547acad1d50992419334be697e442e954f02f8","tests/spki.rs":"f6e4baed201276901f13b9ce1b342e4a74b557f2bd553500398a70256bee5e75","tests/traits.rs":"8c6b79b648549e1f06612c80469ca0c73e200798eb314ca4b8c5a1507f23c585"},"package":"67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b"}
\ No newline at end of file +{"files":{"CHANGELOG.md":"e726085516c3067008fa753392aaeef43cece4065bd46511ffc652a57462066a","Cargo.toml":"588b6717991baeb3275d8a8d423b872792728d36325a6a20ffe8526a12845976","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"c995204cc6bad2ed67dd41f7d89bb9f1a9d48e0edd745732b30640d7912089a4","README.md":"0738222d834cb56592ce68453f1ce42687497fd9576cd5a1a2cbbe1be5ad7164","src/algorithm.rs":"97ea657a991c65477b17a8c447b469d9281ccb7e37c145af8a7e8ae5bda39926","src/error.rs":"ce99da5f369ae830bbac6a958ee0e93c8045df5ca7b7ea306e55bb3209c1f81f","src/fingerprint.rs":"4cb6f1e1d2ca0df933636ffcae30884fe029e2d581a42477081593271a6aa49b","src/lib.rs":"75dd58078144d0678335a03c1a550062603f0717bb33727351237627104f4525","src/spki.rs":"099e68939ade57dd9707e51f5c4191ac777e4afc22f21d197e0e4859f0967437","src/traits.rs":"68e2d6c4bedb0e1166241b392ebbd6b50929c32541a2e4d6ce769ce59b3c1270","tests/examples/ed25519-pub.der":"55dd4c74b0e48534e2f4e173ceceb50df8f27a7ac2aa8991cc7ae914e030bced","tests/examples/ed25519-pub.pem":"36d717203cbca1812f05f30e0415251c928b659882092e653221a028571c6853","tests/examples/p256-pub.der":"b9968d56ed8d6aa3fb43b15fa01e355d7a3a0203b1408b3fd2733637c4d1642c","tests/examples/p256-pub.pem":"d1ff198dc495da63f5f909db0254d6e49cff519487fcb26d055a762fc3ca47a1","tests/examples/rsa2048-pub.der":"efeda9bfead9fd0594f6a5cf6fdf6c163116a3b1fad6d73cea05295b68fd1794","tests/examples/rsa2048-pub.pem":"078c3983093e86784590a2a454547acad1d50992419334be697e442e954f02f8","tests/spki.rs":"ce90b576d072fe2ab91b57b0ecd256baf25b0597abc1790b8b03b4d948617ed4","tests/traits.rs":"8ccaa20167d1ada765bcc938b8636b722fd3fa17c5f185e216053306a21faa7e"},"package":"37a5be806ab6f127c3da44b7378837ebf01dadca8510a0e572460216b228bd0e"}
\ No newline at end of file diff --git a/vendor/spki/CHANGELOG.md b/vendor/spki/CHANGELOG.md index ce0f5b7db..b17b5cb98 100644 --- a/vendor/spki/CHANGELOG.md +++ b/vendor/spki/CHANGELOG.md @@ -4,6 +4,35 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 0.7.1 (2023-04-04) +### Added +- `AssociatedAlgorithmIdentifier` trait ([#962], [#966]) +- `DynAssociatedAlgorithmIdentifier` trait ([#962]) +- `SignatureAlgorithmIdentifier` trait ([#967]) +- `DynSignatureAlgorithmIdentifier` trait ([#967]) + +### Changed +- Bump `der` dependency to v0.7.2 ([#979]) + +[#962]: https://github.com/RustCrypto/formats/pull/962 +[#966]: https://github.com/RustCrypto/formats/pull/966 +[#967]: https://github.com/RustCrypto/formats/pull/967 +[#979]: https://github.com/RustCrypto/formats/pull/979 + +## 0.7.0 (2023-02-26) +### Changed +- Make `AlgorithmIdentifier` generic around `Params` ([#769]) +- Use blanket impls for `Decode*` traits ([#785]) +- Make `SubjectPublicKeyInfo` own the public key ([#790]) +- Rename `to_owned` method ([#835]) +- Bump `der` dependency to v0.7 ([#899]) + +[#769]: https://github.com/RustCrypto/formats/pull/769 +[#785]: https://github.com/RustCrypto/formats/pull/785 +[#790]: https://github.com/RustCrypto/formats/pull/790 +[#835]: https://github.com/RustCrypto/formats/pull/835 +[#899]: https://github.com/RustCrypto/formats/pull/899 + ## 0.6.0 (2022-05-08) ### Added - `AlgorithmIdentifier::oids()` helper function ([#443]) diff --git a/vendor/spki/Cargo.toml b/vendor/spki/Cargo.toml index 13205cb43..c5c2104a0 100644 --- a/vendor/spki/Cargo.toml +++ b/vendor/spki/Cargo.toml @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.57" +rust-version = "1.65" name = "spki" -version = "0.6.0" +version = "0.7.1" authors = ["RustCrypto Developers"] description = """ X.509 Subject Public Key Info (RFC5280) describing public keys as well as their @@ -32,7 +32,6 @@ categories = [ ] license = "Apache-2.0 OR MIT" repository = "https://github.com/RustCrypto/formats/tree/master/spki" -resolver = "2" [package.metadata.docs.rs] all-features = true @@ -41,13 +40,18 @@ rustdoc-args = [ "docsrs", ] +[dependencies.arbitrary] +version = "1.2" +features = ["derive"] +optional = true + [dependencies.base64ct] version = "1" optional = true default-features = false [dependencies.der] -version = "0.6" +version = "0.7.2" features = ["oid"] [dependencies.sha2] @@ -63,9 +67,15 @@ version = "3" [features] alloc = [ - "base64ct/alloc", + "base64ct?/alloc", "der/alloc", ] +arbitrary = [ + "std", + "dep:arbitrary", + "der/arbitrary", +] +base64 = ["dep:base64ct"] fingerprint = ["sha2"] pem = [ "alloc", diff --git a/vendor/spki/LICENSE-MIT b/vendor/spki/LICENSE-MIT index 68ddaa3c9..3294d7434 100644 --- a/vendor/spki/LICENSE-MIT +++ b/vendor/spki/LICENSE-MIT @@ -1,4 +1,4 @@ -Copyright (c) 2021-2022 The RustCrypto Project Developers +Copyright (c) 2021-2023 The RustCrypto Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/vendor/spki/README.md b/vendor/spki/README.md index caa01cc8c..4ac8554bf 100644 --- a/vendor/spki/README.md +++ b/vendor/spki/README.md @@ -16,7 +16,7 @@ Specified in [RFC 5280 § 4.1]. ## Minimum Supported Rust Version -This crate requires **Rust 1.57** at a minimum. +This crate requires **Rust 1.65** at a minimum. We may change the MSRV in the future, but it will be accompanied by a minor version bump. @@ -45,7 +45,7 @@ dual licensed as above, without any additional terms or conditions. [build-image]: https://github.com/RustCrypto/formats/actions/workflows/spki.yml/badge.svg [build-link]: https://github.com/RustCrypto/formats/actions/workflows/spki.yml [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg -[rustc-image]: https://img.shields.io/badge/rustc-1.57+-blue.svg +[rustc-image]: https://img.shields.io/badge/rustc-1.65+-blue.svg [chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg [chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/300570-formats diff --git a/vendor/spki/src/algorithm.rs b/vendor/spki/src/algorithm.rs index 2a8b6c7f9..b0e08b5b3 100644 --- a/vendor/spki/src/algorithm.rs +++ b/vendor/spki/src/algorithm.rs @@ -2,8 +2,14 @@ use crate::{Error, Result}; use core::cmp::Ordering; -use der::asn1::{AnyRef, ObjectIdentifier}; -use der::{Decode, DecodeValue, DerOrd, Encode, Header, Reader, Sequence, ValueOrd}; +use der::{ + asn1::{AnyRef, Choice, ObjectIdentifier}, + Decode, DecodeValue, DerOrd, Encode, EncodeValue, Header, Length, Reader, Sequence, ValueOrd, + Writer, +}; + +#[cfg(feature = "alloc")] +use der::asn1::Any; /// X.509 `AlgorithmIdentifier` as defined in [RFC 5280 Section 4.1.1.2]. /// @@ -14,17 +20,79 @@ use der::{Decode, DecodeValue, DerOrd, Encode, Header, Reader, Sequence, ValueOr /// ``` /// /// [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<'a> { +pub struct AlgorithmIdentifier<Params> { /// Algorithm OID, i.e. the `algorithm` field in the `AlgorithmIdentifier` /// ASN.1 schema. pub oid: ObjectIdentifier, /// Algorithm `parameters`. - pub parameters: Option<AnyRef<'a>>, + 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(()) + } +} + +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), + } + } } -impl<'a> AlgorithmIdentifier<'a> { +/// `AlgorithmIdentifier` reference which has `AnyRef` parameters. +pub type AlgorithmIdentifierRef<'a> = AlgorithmIdentifier<AnyRef<'a>>; + +/// `AlgorithmIdentifier` reference which has `Any` parameters. +#[cfg(feature = "alloc")] +pub type AlgorithmIdentifierOwned = AlgorithmIdentifier<Any>; + +impl<Params> AlgorithmIdentifier<Params> { /// Assert the `algorithm` OID is an expected value. pub fn assert_algorithm_oid(&self, expected_oid: ObjectIdentifier) -> Result<ObjectIdentifier> { if self.oid == expected_oid { @@ -33,7 +101,9 @@ impl<'a> AlgorithmIdentifier<'a> { 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, @@ -87,46 +157,35 @@ impl<'a> AlgorithmIdentifier<'a> { None => None, Some(p) => match p { AnyRef::NULL => None, - _ => Some(p.oid()?), + _ => Some(p.decode_as::<ObjectIdentifier>()?), }, }, )) } } -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> 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]) - } -} +#[cfg(feature = "alloc")] +mod allocating { + use super::*; + use der::referenced::*; -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<'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 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), + 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(), + } } } } diff --git a/vendor/spki/src/fingerprint.rs b/vendor/spki/src/fingerprint.rs index 6a3901fb1..ba06e62e8 100644 --- a/vendor/spki/src/fingerprint.rs +++ b/vendor/spki/src/fingerprint.rs @@ -12,7 +12,6 @@ pub(crate) const SIZE: usize = 32; /// See [RFC7469 § 2.1.1] for more information. /// /// [RFC7469 § 2.1.1]: https://datatracker.ietf.org/doc/html/rfc7469#section-2.1.1 -#[cfg_attr(docsrs, doc(cfg(feature = "fingerprint")))] pub type FingerprintBytes = [u8; SIZE]; /// Writer newtype which accepts DER being serialized on-the-fly and computes a diff --git a/vendor/spki/src/lib.rs b/vendor/spki/src/lib.rs index f46675674..2ac8d9d12 100644 --- a/vendor/spki/src/lib.rs +++ b/vendor/spki/src/lib.rs @@ -1,13 +1,19 @@ #![no_std] -#![cfg_attr(docsrs, feature(doc_cfg))] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] #![doc = include_str!("../README.md")] #![doc( - html_logo_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg", - html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg" + html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/6ee8e381/logo.svg", + html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/6ee8e381/logo.svg" +)] +#![forbid(unsafe_code)] +#![warn( + clippy::mod_module_files, + clippy::unwrap_used, + missing_docs, + rust_2018_idioms, + unused_lifetimes, + unused_qualifications )] -#![forbid(unsafe_code, clippy::unwrap_used)] -#![warn(missing_docs, rust_2018_idioms, unused_qualifications)] - //! # Usage //! The following example demonstrates how to use an OID as the `parameters` //! of an [`AlgorithmIdentifier`]. @@ -15,14 +21,14 @@ //! Borrow the [`ObjectIdentifier`] first then use [`der::AnyRef::from`] or `.into()`: //! //! ``` -//! use spki::{AlgorithmIdentifier, ObjectIdentifier, der::AnyRef}; +//! use spki::{AlgorithmIdentifier, ObjectIdentifier}; //! //! let alg_oid = "1.2.840.10045.2.1".parse::<ObjectIdentifier>().unwrap(); //! let params_oid = "1.2.840.10045.3.1.7".parse::<ObjectIdentifier>().unwrap(); //! //! let alg_id = AlgorithmIdentifier { //! oid: alg_oid, -//! parameters: Some(AnyRef::from(¶ms_oid)) +//! parameters: Some(params_oid) //! }; //! ``` @@ -41,15 +47,24 @@ mod traits; mod fingerprint; pub use crate::{ - algorithm::AlgorithmIdentifier, + algorithm::{AlgorithmIdentifier, AlgorithmIdentifierRef}, error::{Error, Result}, - spki::SubjectPublicKeyInfo, - traits::DecodePublicKey, + spki::{SubjectPublicKeyInfo, SubjectPublicKeyInfoRef}, + traits::{AssociatedAlgorithmIdentifier, DecodePublicKey, SignatureAlgorithmIdentifier}, }; pub use der::{self, asn1::ObjectIdentifier}; #[cfg(feature = "alloc")] -pub use {crate::traits::EncodePublicKey, der::Document}; +pub use { + crate::{ + algorithm::AlgorithmIdentifierOwned, + spki::SubjectPublicKeyInfoOwned, + traits::{ + DynAssociatedAlgorithmIdentifier, DynSignatureAlgorithmIdentifier, EncodePublicKey, + }, + }, + der::Document, +}; #[cfg(feature = "fingerprint")] pub use crate::fingerprint::FingerprintBytes; diff --git a/vendor/spki/src/spki.rs b/vendor/spki/src/spki.rs index 9058e49c7..3d949f887 100644 --- a/vendor/spki/src/spki.rs +++ b/vendor/spki/src/spki.rs @@ -3,24 +3,30 @@ use crate::{AlgorithmIdentifier, Error, Result}; use core::cmp::Ordering; use der::{ - asn1::BitStringRef, Decode, DecodeValue, DerOrd, Encode, Header, Reader, Sequence, ValueOrd, + asn1::{AnyRef, BitStringRef}, + Choice, Decode, DecodeValue, DerOrd, Encode, EncodeValue, FixedTag, Header, Length, Reader, + Sequence, ValueOrd, Writer, }; #[cfg(feature = "alloc")] -use der::Document; +use der::{ + asn1::{Any, BitString}, + Document, +}; #[cfg(feature = "fingerprint")] use crate::{fingerprint, FingerprintBytes}; -#[cfg(all(feature = "alloc", feature = "fingerprint"))] -use { - alloc::string::String, - base64ct::{Base64, Encoding}, -}; - #[cfg(feature = "pem")] use der::pem::PemLabel; +/// [`SubjectPublicKeyInfo`] with [`AnyRef`] algorithm parameters, and [`BitStringRef`] params. +pub type SubjectPublicKeyInfoRef<'a> = SubjectPublicKeyInfo<AnyRef<'a>, BitStringRef<'a>>; + +/// [`SubjectPublicKeyInfo`] with [`Any`] algorithm parameters, and [`BitString`] params. +#[cfg(feature = "alloc")] +pub type SubjectPublicKeyInfoOwned = SubjectPublicKeyInfo<Any, BitString>; + /// X.509 `SubjectPublicKeyInfo` (SPKI) as defined in [RFC 5280 § 4.1.2.7]. /// /// ASN.1 structure containing an [`AlgorithmIdentifier`] and public key @@ -33,25 +39,32 @@ use der::pem::PemLabel; /// ``` /// /// [RFC 5280 § 4.1.2.7]: https://tools.ietf.org/html/rfc5280#section-4.1.2.7 -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub struct SubjectPublicKeyInfo<'a> { +#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct SubjectPublicKeyInfo<Params, Key> { /// X.509 [`AlgorithmIdentifier`] for the public key type - pub algorithm: AlgorithmIdentifier<'a>, + pub algorithm: AlgorithmIdentifier<Params>, /// Public key data - pub subject_public_key: &'a [u8], + pub subject_public_key: Key, } -impl<'a> SubjectPublicKeyInfo<'a> { +impl<'a, Params, Key> SubjectPublicKeyInfo<Params, Key> +where + Params: Choice<'a> + Encode, + // TODO: replace FixedTag with FixedTag<TAG = { Tag::BitString }> once + // https://github.com/rust-lang/rust/issues/92827 is fixed + Key: Decode<'a> + Encode + FixedTag, +{ /// Calculate the SHA-256 fingerprint of this [`SubjectPublicKeyInfo`] and /// encode it as a Base64 string. /// /// See [RFC7469 § 2.1.1] for more information. /// /// [RFC7469 § 2.1.1]: https://datatracker.ietf.org/doc/html/rfc7469#section-2.1.1 - #[cfg(all(feature = "fingerprint", feature = "alloc"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "fingerprint", feature = "alloc"))))] - pub fn fingerprint_base64(&self) -> Result<String> { + #[cfg(all(feature = "fingerprint", feature = "alloc", feature = "base64"))] + pub fn fingerprint_base64(&self) -> Result<alloc::string::String> { + use base64ct::{Base64, Encoding}; Ok(Base64::encode_string(&self.fingerprint_bytes()?)) } @@ -62,42 +75,56 @@ impl<'a> SubjectPublicKeyInfo<'a> { /// /// [RFC7469 § 2.1.1]: https://datatracker.ietf.org/doc/html/rfc7469#section-2.1.1 #[cfg(feature = "fingerprint")] - #[cfg_attr(docsrs, doc(cfg(feature = "fingerprint")))] pub fn fingerprint_bytes(&self) -> Result<FingerprintBytes> { let mut builder = fingerprint::Builder::new(); self.encode(&mut builder)?; Ok(builder.finish()) } - - /// Get a [`BitString`] representing the `subject_public_key` - fn bitstring(&self) -> der::Result<BitStringRef<'a>> { - BitStringRef::from_bytes(self.subject_public_key) - } } -impl<'a> DecodeValue<'a> for SubjectPublicKeyInfo<'a> { +impl<'a: 'k, 'k, Params, Key: 'k> DecodeValue<'a> for SubjectPublicKeyInfo<Params, Key> +where + Params: Choice<'a> + Encode, + Key: Decode<'a>, +{ fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> der::Result<Self> { reader.read_nested(header.length, |reader| { Ok(Self { algorithm: reader.decode()?, - subject_public_key: BitStringRef::decode(reader)? - .as_bytes() - .ok_or_else(|| der::Tag::BitString.value_error())?, + subject_public_key: Key::decode(reader)?, }) }) } } -impl<'a> Sequence<'a> for SubjectPublicKeyInfo<'a> { - fn fields<F, T>(&self, f: F) -> der::Result<T> - where - F: FnOnce(&[&dyn Encode]) -> der::Result<T>, - { - f(&[&self.algorithm, &self.bitstring()?]) +impl<'a, Params, Key> EncodeValue for SubjectPublicKeyInfo<Params, Key> +where + Params: Choice<'a> + Encode, + Key: Encode, +{ + fn value_len(&self) -> der::Result<Length> { + self.algorithm.encoded_len()? + self.subject_public_key.encoded_len()? + } + + fn encode_value(&self, writer: &mut impl Writer) -> der::Result<()> { + self.algorithm.encode(writer)?; + self.subject_public_key.encode(writer)?; + Ok(()) } } -impl<'a> TryFrom<&'a [u8]> for SubjectPublicKeyInfo<'a> { +impl<'a, Params, Key> Sequence<'a> for SubjectPublicKeyInfo<Params, Key> +where + Params: Choice<'a> + Encode, + Key: Decode<'a> + Encode + FixedTag, +{ +} + +impl<'a, Params, Key> TryFrom<&'a [u8]> for SubjectPublicKeyInfo<Params, Key> +where + Params: Choice<'a> + Encode, + Key: Decode<'a> + Encode + FixedTag, +{ type Error = Error; fn try_from(bytes: &'a [u8]) -> Result<Self> { @@ -105,37 +132,74 @@ impl<'a> TryFrom<&'a [u8]> for SubjectPublicKeyInfo<'a> { } } -impl ValueOrd for SubjectPublicKeyInfo<'_> { +impl<'a, Params, Key> ValueOrd for SubjectPublicKeyInfo<Params, Key> +where + Params: Choice<'a> + DerOrd + Encode, + Key: ValueOrd, +{ fn value_cmp(&self, other: &Self) -> der::Result<Ordering> { match self.algorithm.der_cmp(&other.algorithm)? { - Ordering::Equal => self.bitstring()?.der_cmp(&other.bitstring()?), + Ordering::Equal => self.subject_public_key.value_cmp(&other.subject_public_key), other => Ok(other), } } } #[cfg(feature = "alloc")] -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] -impl TryFrom<SubjectPublicKeyInfo<'_>> for Document { +impl<'a: 'k, 'k, Params, Key: 'k> TryFrom<SubjectPublicKeyInfo<Params, Key>> for Document +where + Params: Choice<'a> + Encode, + Key: Decode<'a> + Encode + FixedTag, + BitStringRef<'a>: From<&'k Key>, +{ type Error = Error; - fn try_from(spki: SubjectPublicKeyInfo<'_>) -> Result<Document> { + fn try_from(spki: SubjectPublicKeyInfo<Params, Key>) -> Result<Document> { Self::try_from(&spki) } } #[cfg(feature = "alloc")] -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] -impl TryFrom<&SubjectPublicKeyInfo<'_>> for Document { +impl<'a: 'k, 'k, Params, Key: 'k> TryFrom<&SubjectPublicKeyInfo<Params, Key>> for Document +where + Params: Choice<'a> + Encode, + Key: Decode<'a> + Encode + FixedTag, + BitStringRef<'a>: From<&'k Key>, +{ type Error = Error; - fn try_from(spki: &SubjectPublicKeyInfo<'_>) -> Result<Document> { + fn try_from(spki: &SubjectPublicKeyInfo<Params, Key>) -> Result<Document> { Ok(Self::encode_msg(spki)?) } } #[cfg(feature = "pem")] -#[cfg_attr(docsrs, doc(cfg(feature = "pem")))] -impl PemLabel for SubjectPublicKeyInfo<'_> { +impl<Params, Key> PemLabel for SubjectPublicKeyInfo<Params, Key> { const PEM_LABEL: &'static str = "PUBLIC KEY"; } + +#[cfg(feature = "alloc")] +mod allocating { + use super::*; + use der::referenced::*; + + impl<'a> RefToOwned<'a> for SubjectPublicKeyInfoRef<'a> { + type Owned = SubjectPublicKeyInfoOwned; + fn ref_to_owned(&self) -> Self::Owned { + SubjectPublicKeyInfo { + algorithm: self.algorithm.ref_to_owned(), + subject_public_key: self.subject_public_key.ref_to_owned(), + } + } + } + + impl OwnedToRef for SubjectPublicKeyInfoOwned { + type Borrowed<'a> = SubjectPublicKeyInfoRef<'a>; + fn owned_to_ref(&self) -> Self::Borrowed<'_> { + SubjectPublicKeyInfo { + algorithm: self.algorithm.owned_to_ref(), + subject_public_key: self.subject_public_key.owned_to_ref(), + } + } + } +} diff --git a/vendor/spki/src/traits.rs b/vendor/spki/src/traits.rs index c16e3974d..1126c7c40 100644 --- a/vendor/spki/src/traits.rs +++ b/vendor/spki/src/traits.rs @@ -1,9 +1,13 @@ //! Traits for encoding/decoding SPKI public keys. -use crate::{Error, Result, SubjectPublicKeyInfo}; +use crate::{AlgorithmIdentifier, Error, Result, SubjectPublicKeyInfoRef}; +use der::{EncodeValue, Tagged}; #[cfg(feature = "alloc")] -use der::Document; +use { + crate::AlgorithmIdentifierOwned, + der::{Any, Document}, +}; #[cfg(feature = "pem")] use { @@ -14,15 +18,14 @@ use { #[cfg(feature = "std")] use std::path::Path; +#[cfg(doc)] +use crate::SubjectPublicKeyInfo; + /// Parse a public key object from an encoded SPKI document. -pub trait DecodePublicKey: - for<'a> TryFrom<SubjectPublicKeyInfo<'a>, Error = Error> + Sized -{ +pub trait DecodePublicKey: Sized { /// Deserialize object from ASN.1 DER-encoded [`SubjectPublicKeyInfo`] /// (binary format). - fn from_public_key_der(bytes: &[u8]) -> Result<Self> { - Self::try_from(SubjectPublicKeyInfo::try_from(bytes)?) - } + fn from_public_key_der(bytes: &[u8]) -> Result<Self>; /// Deserialize PEM-encoded [`SubjectPublicKeyInfo`]. /// @@ -32,17 +35,15 @@ pub trait DecodePublicKey: /// -----BEGIN PUBLIC KEY----- /// ``` #[cfg(feature = "pem")] - #[cfg_attr(docsrs, doc(cfg(feature = "pem")))] fn from_public_key_pem(s: &str) -> Result<Self> { let (label, doc) = Document::from_pem(s)?; - SubjectPublicKeyInfo::validate_pem_label(label)?; + SubjectPublicKeyInfoRef::validate_pem_label(label)?; Self::from_public_key_der(doc.as_bytes()) } /// Load public key object from an ASN.1 DER-encoded file on the local /// filesystem (binary format). #[cfg(feature = "std")] - #[cfg_attr(docsrs, doc(cfg(feature = "std")))] fn read_public_key_der_file(path: impl AsRef<Path>) -> Result<Self> { let doc = Document::read_der_file(path)?; Self::from_public_key_der(doc.as_bytes()) @@ -50,45 +51,125 @@ pub trait DecodePublicKey: /// Load public key object from a PEM-encoded file on the local filesystem. #[cfg(all(feature = "pem", feature = "std"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "pem", feature = "std"))))] fn read_public_key_pem_file(path: impl AsRef<Path>) -> Result<Self> { let (label, doc) = Document::read_pem_file(path)?; - SubjectPublicKeyInfo::validate_pem_label(&label)?; + SubjectPublicKeyInfoRef::validate_pem_label(&label)?; Self::from_public_key_der(doc.as_bytes()) } } +impl<T> DecodePublicKey for T +where + T: for<'a> TryFrom<SubjectPublicKeyInfoRef<'a>, Error = Error>, +{ + fn from_public_key_der(bytes: &[u8]) -> Result<Self> { + Self::try_from(SubjectPublicKeyInfoRef::try_from(bytes)?) + } +} + /// Serialize a public key object to a SPKI-encoded document. #[cfg(feature = "alloc")] -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] pub trait EncodePublicKey { /// Serialize a [`Document`] containing a SPKI-encoded public key. fn to_public_key_der(&self) -> Result<Document>; /// Serialize this public key as PEM-encoded SPKI with the given [`LineEnding`]. #[cfg(feature = "pem")] - #[cfg_attr(docsrs, doc(cfg(feature = "pem")))] fn to_public_key_pem(&self, line_ending: LineEnding) -> Result<String> { let doc = self.to_public_key_der()?; - Ok(doc.to_pem(SubjectPublicKeyInfo::PEM_LABEL, line_ending)?) + Ok(doc.to_pem(SubjectPublicKeyInfoRef::PEM_LABEL, line_ending)?) } /// Write ASN.1 DER-encoded public key to the given path #[cfg(feature = "std")] - #[cfg_attr(docsrs, doc(cfg(feature = "std")))] fn write_public_key_der_file(&self, path: impl AsRef<Path>) -> Result<()> { Ok(self.to_public_key_der()?.write_der_file(path)?) } /// Write ASN.1 DER-encoded public key to the given path #[cfg(all(feature = "pem", feature = "std"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "pem", feature = "std"))))] fn write_public_key_pem_file( &self, path: impl AsRef<Path>, line_ending: LineEnding, ) -> Result<()> { let doc = self.to_public_key_der()?; - Ok(doc.write_pem_file(path, SubjectPublicKeyInfo::PEM_LABEL, line_ending)?) + Ok(doc.write_pem_file(path, SubjectPublicKeyInfoRef::PEM_LABEL, line_ending)?) + } +} + +/// Returns `AlgorithmIdentifier` associated with the structure. +/// +/// This is useful for e.g. keys for digital signature algorithms. +pub trait AssociatedAlgorithmIdentifier { + /// Algorithm parameters. + type Params: Tagged + EncodeValue; + + /// `AlgorithmIdentifier` for this structure. + const ALGORITHM_IDENTIFIER: AlgorithmIdentifier<Self::Params>; +} + +/// Returns `AlgorithmIdentifier` associated with the structure. +/// +/// This is useful for e.g. keys for digital signature algorithms. +#[cfg(feature = "alloc")] +pub trait DynAssociatedAlgorithmIdentifier { + /// `AlgorithmIdentifier` for this structure. + fn algorithm_identifier(&self) -> Result<AlgorithmIdentifierOwned>; +} + +#[cfg(feature = "alloc")] +impl<T> DynAssociatedAlgorithmIdentifier for T +where + T: AssociatedAlgorithmIdentifier, +{ + fn algorithm_identifier(&self) -> Result<AlgorithmIdentifierOwned> { + Ok(AlgorithmIdentifierOwned { + oid: T::ALGORITHM_IDENTIFIER.oid, + parameters: T::ALGORITHM_IDENTIFIER + .parameters + .as_ref() + .map(Any::encode_from) + .transpose()?, + }) + } +} + +/// Returns `AlgorithmIdentifier` associated with the signature system. +/// +/// Unlike AssociatedAlgorithmIdentifier this is intended to be implemented for public and/or +/// private keys. +pub trait SignatureAlgorithmIdentifier { + /// Algorithm parameters. + type Params: Tagged + EncodeValue; + + /// `AlgorithmIdentifier` for the corresponding singature system. + const SIGNATURE_ALGORITHM_IDENTIFIER: AlgorithmIdentifier<Self::Params>; +} + +/// Returns `AlgorithmIdentifier` associated with the signature system. +/// +/// Unlike AssociatedAlgorithmIdentifier this is intended to be implemented for public and/or +/// private keys. +#[cfg(feature = "alloc")] +pub trait DynSignatureAlgorithmIdentifier { + /// `AlgorithmIdentifier` for the corresponding singature system. + fn signature_algorithm_identifier(&self) -> Result<AlgorithmIdentifierOwned>; +} + +#[cfg(feature = "alloc")] +impl<T> DynSignatureAlgorithmIdentifier for T +where + T: SignatureAlgorithmIdentifier, +{ + fn signature_algorithm_identifier(&self) -> Result<AlgorithmIdentifierOwned> { + Ok(AlgorithmIdentifierOwned { + oid: T::SIGNATURE_ALGORITHM_IDENTIFIER.oid, + parameters: T::SIGNATURE_ALGORITHM_IDENTIFIER + .parameters + .as_ref() + .map(Any::encode_from) + .transpose()?, + }) } } diff --git a/vendor/spki/tests/spki.rs b/vendor/spki/tests/spki.rs index 3d6b19f48..abecdb8c6 100644 --- a/vendor/spki/tests/spki.rs +++ b/vendor/spki/tests/spki.rs @@ -1,7 +1,8 @@ //! `SubjectPublicKeyInfo` tests. +use der::asn1::ObjectIdentifier; use hex_literal::hex; -use spki::SubjectPublicKeyInfo; +use spki::SubjectPublicKeyInfoRef; #[cfg(feature = "alloc")] use der::Encode; @@ -34,7 +35,7 @@ const RSA_2048_PEM_EXAMPLE: &str = include_str!("examples/rsa2048-pub.pem"); /// The SPKI fingerprint for `ED25519_SPKI_FINGERPRINT` as a Base64 string /// /// Generated using `cat ed25519-pub.der | openssl dgst -binary -sha256 | base64` -#[cfg(all(feature = "fingerprint", feature = "alloc"))] +#[cfg(all(feature = "alloc", feature = "base64", feature = "fingerprint"))] const ED25519_SPKI_FINGERPRINT_BASE64: &str = "Vd1MdLDkhTTi9OFzzs61DfjyenrCqomRzHrpFOAwvO0="; /// The SPKI fingerprint for `ED25519_SPKI_FINGERPRINT` as straight hash bytes @@ -46,28 +47,32 @@ const ED25519_SPKI_FINGERPRINT: &[u8] = #[test] fn decode_ec_p256_der() { - let spki = SubjectPublicKeyInfo::try_from(EC_P256_DER_EXAMPLE).unwrap(); + let spki = SubjectPublicKeyInfoRef::try_from(EC_P256_DER_EXAMPLE).unwrap(); assert_eq!(spki.algorithm.oid, "1.2.840.10045.2.1".parse().unwrap()); assert_eq!( - spki.algorithm.parameters.unwrap().oid().unwrap(), + spki.algorithm + .parameters + .unwrap() + .decode_as::<ObjectIdentifier>() + .unwrap(), "1.2.840.10045.3.1.7".parse().unwrap() ); - assert_eq!(spki.subject_public_key, &hex!("041CACFFB55F2F2CEFD89D89EB374B2681152452802DEEA09916068137D839CF7FC481A44492304D7EF66AC117BEFE83A8D08F155F2B52F9F618DD447029048E0F")[..]); + assert_eq!(spki.subject_public_key.raw_bytes(), &hex!("041CACFFB55F2F2CEFD89D89EB374B2681152452802DEEA09916068137D839CF7FC481A44492304D7EF66AC117BEFE83A8D08F155F2B52F9F618DD447029048E0F")[..]); } #[test] #[cfg(feature = "fingerprint")] fn decode_ed25519_and_fingerprint_spki() { // Repeat the decode test from the pkcs8 crate - let spki = SubjectPublicKeyInfo::try_from(ED25519_DER_EXAMPLE).unwrap(); + let spki = SubjectPublicKeyInfoRef::try_from(ED25519_DER_EXAMPLE).unwrap(); assert_eq!(spki.algorithm.oid, "1.3.101.112".parse().unwrap()); assert_eq!(spki.algorithm.parameters, None); assert_eq!( - spki.subject_public_key, + spki.subject_public_key.raw_bytes(), &hex!("4D29167F3F1912A6F7ADFA293A051A15C05EC67B8F17267B1C5550DCE853BD0D")[..] ); @@ -79,15 +84,15 @@ fn decode_ed25519_and_fingerprint_spki() { } #[test] -#[cfg(all(feature = "fingerprint", feature = "alloc"))] +#[cfg(all(feature = "alloc", feature = "base64", feature = "fingerprint"))] fn decode_ed25519_and_fingerprint_base64() { // Repeat the decode test from the pkcs8 crate - let spki = SubjectPublicKeyInfo::try_from(ED25519_DER_EXAMPLE).unwrap(); + let spki = SubjectPublicKeyInfoRef::try_from(ED25519_DER_EXAMPLE).unwrap(); assert_eq!(spki.algorithm.oid, "1.3.101.112".parse().unwrap()); assert_eq!(spki.algorithm.parameters, None); assert_eq!( - spki.subject_public_key, + spki.subject_public_key.raw_bytes(), &hex!("4D29167F3F1912A6F7ADFA293A051A15C05EC67B8F17267B1C5550DCE853BD0D")[..] ); @@ -100,41 +105,41 @@ fn decode_ed25519_and_fingerprint_base64() { #[test] fn decode_rsa_2048_der() { - let spki = SubjectPublicKeyInfo::try_from(RSA_2048_DER_EXAMPLE).unwrap(); + let spki = SubjectPublicKeyInfoRef::try_from(RSA_2048_DER_EXAMPLE).unwrap(); assert_eq!(spki.algorithm.oid, "1.2.840.113549.1.1.1".parse().unwrap()); assert!(spki.algorithm.parameters.unwrap().is_null()); - assert_eq!(spki.subject_public_key, &hex!("3082010A0282010100B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEAC89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F0203010001")[..]); + assert_eq!(spki.subject_public_key.raw_bytes(), &hex!("3082010A0282010100B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEAC89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F0203010001")[..]); } #[test] #[cfg(feature = "alloc")] fn encode_ec_p256_der() { - let pk = SubjectPublicKeyInfo::try_from(EC_P256_DER_EXAMPLE).unwrap(); - let pk_encoded = pk.to_vec().unwrap(); + let pk = SubjectPublicKeyInfoRef::try_from(EC_P256_DER_EXAMPLE).unwrap(); + let pk_encoded = pk.to_der().unwrap(); assert_eq!(EC_P256_DER_EXAMPLE, pk_encoded.as_slice()); } #[test] #[cfg(feature = "alloc")] fn encode_ed25519_der() { - let pk = SubjectPublicKeyInfo::try_from(ED25519_DER_EXAMPLE).unwrap(); - let pk_encoded = pk.to_vec().unwrap(); + let pk = SubjectPublicKeyInfoRef::try_from(ED25519_DER_EXAMPLE).unwrap(); + let pk_encoded = pk.to_der().unwrap(); assert_eq!(ED25519_DER_EXAMPLE, pk_encoded.as_slice()); } #[test] #[cfg(feature = "alloc")] fn encode_rsa_2048_der() { - let pk = SubjectPublicKeyInfo::try_from(RSA_2048_DER_EXAMPLE).unwrap(); - let pk_encoded = pk.to_vec().unwrap(); + let pk = SubjectPublicKeyInfoRef::try_from(RSA_2048_DER_EXAMPLE).unwrap(); + let pk_encoded = pk.to_der().unwrap(); assert_eq!(RSA_2048_DER_EXAMPLE, pk_encoded.as_slice()); } #[test] #[cfg(feature = "pem")] fn encode_ec_p256_pem() { - let pk = SubjectPublicKeyInfo::try_from(EC_P256_DER_EXAMPLE).unwrap(); + let pk = SubjectPublicKeyInfoRef::try_from(EC_P256_DER_EXAMPLE).unwrap(); let pk_encoded = pk.to_pem(LineEnding::LF).unwrap(); assert_eq!(EC_P256_PEM_EXAMPLE, pk_encoded); } @@ -142,7 +147,7 @@ fn encode_ec_p256_pem() { #[test] #[cfg(feature = "pem")] fn encode_ed25519_pem() { - let pk = SubjectPublicKeyInfo::try_from(ED25519_DER_EXAMPLE).unwrap(); + let pk = SubjectPublicKeyInfoRef::try_from(ED25519_DER_EXAMPLE).unwrap(); let pk_encoded = pk.to_pem(LineEnding::LF).unwrap(); assert_eq!(ED25519_PEM_EXAMPLE, pk_encoded); } @@ -150,7 +155,7 @@ fn encode_ed25519_pem() { #[test] #[cfg(feature = "pem")] fn encode_rsa_2048_pem() { - let pk = SubjectPublicKeyInfo::try_from(RSA_2048_DER_EXAMPLE).unwrap(); + let pk = SubjectPublicKeyInfoRef::try_from(RSA_2048_DER_EXAMPLE).unwrap(); let pk_encoded = pk.to_pem(LineEnding::LF).unwrap(); assert_eq!(RSA_2048_PEM_EXAMPLE, pk_encoded); } diff --git a/vendor/spki/tests/traits.rs b/vendor/spki/tests/traits.rs index 597399e44..111433343 100644 --- a/vendor/spki/tests/traits.rs +++ b/vendor/spki/tests/traits.rs @@ -3,7 +3,7 @@ #![cfg(any(feature = "pem", feature = "std"))] use der::{Decode, Encode}; -use spki::{DecodePublicKey, Document, EncodePublicKey, Error, Result, SubjectPublicKeyInfo}; +use spki::{DecodePublicKey, Document, EncodePublicKey, Error, Result, SubjectPublicKeyInfoRef}; #[cfg(feature = "pem")] use spki::der::pem::LineEnding; @@ -30,23 +30,17 @@ impl AsRef<[u8]> for MockKey { } } -impl DecodePublicKey for MockKey { - fn from_public_key_der(bytes: &[u8]) -> Result<MockKey> { - Ok(MockKey(bytes.to_vec())) - } -} - impl EncodePublicKey for MockKey { fn to_public_key_der(&self) -> Result<Document> { Ok(Document::from_der(self.as_ref())?) } } -impl TryFrom<SubjectPublicKeyInfo<'_>> for MockKey { +impl TryFrom<SubjectPublicKeyInfoRef<'_>> for MockKey { type Error = Error; - fn try_from(spki: SubjectPublicKeyInfo<'_>) -> Result<MockKey> { - Ok(MockKey(spki.to_vec()?)) + fn try_from(spki: SubjectPublicKeyInfoRef<'_>) -> Result<MockKey> { + Ok(MockKey(spki.to_der()?)) } } |