summaryrefslogtreecommitdiffstats
path: root/vendor/elliptic-curve/src/secret_key
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:41:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:41:35 +0000
commit7e5d7eea9c580ef4b41a765bde624af431942b96 (patch)
tree2c0d9ca12878fc4525650aa4e54d77a81a07cc09 /vendor/elliptic-curve/src/secret_key
parentAdding debian version 1.70.0+dfsg1-9. (diff)
downloadrustc-7e5d7eea9c580ef4b41a765bde624af431942b96.tar.xz
rustc-7e5d7eea9c580ef4b41a765bde624af431942b96.zip
Merging upstream version 1.70.0+dfsg2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/elliptic-curve/src/secret_key')
-rw-r--r--vendor/elliptic-curve/src/secret_key/pkcs8.rs92
1 files changed, 92 insertions, 0 deletions
diff --git a/vendor/elliptic-curve/src/secret_key/pkcs8.rs b/vendor/elliptic-curve/src/secret_key/pkcs8.rs
new file mode 100644
index 000000000..3c1a509bf
--- /dev/null
+++ b/vendor/elliptic-curve/src/secret_key/pkcs8.rs
@@ -0,0 +1,92 @@
+//! PKCS#8 encoding/decoding support.
+
+use super::SecretKey;
+use crate::{
+ pkcs8::{self, AssociatedOid, DecodePrivateKey},
+ sec1::{ModulusSize, ValidatePublicKey},
+ Curve, FieldSize, ALGORITHM_OID,
+};
+use der::Decode;
+use sec1::EcPrivateKey;
+
+// Imports for the `EncodePrivateKey` impl
+// TODO(tarcieri): use weak activation of `pkcs8/alloc` for gating `EncodePrivateKey` impl
+#[cfg(all(feature = "arithmetic", feature = "pem"))]
+use {
+ crate::{
+ sec1::{FromEncodedPoint, ToEncodedPoint},
+ AffinePoint, ProjectiveArithmetic,
+ },
+ pkcs8::EncodePrivateKey,
+};
+
+// Imports for actual PEM support
+#[cfg(feature = "pem")]
+use {
+ crate::{error::Error, Result},
+ core::str::FromStr,
+};
+
+#[cfg_attr(docsrs, doc(cfg(feature = "pkcs8")))]
+impl<C> TryFrom<pkcs8::PrivateKeyInfo<'_>> for SecretKey<C>
+where
+ C: Curve + AssociatedOid + ValidatePublicKey,
+ FieldSize<C>: ModulusSize,
+{
+ type Error = pkcs8::Error;
+
+ fn try_from(private_key_info: pkcs8::PrivateKeyInfo<'_>) -> pkcs8::Result<Self> {
+ private_key_info
+ .algorithm
+ .assert_oids(ALGORITHM_OID, C::OID)?;
+
+ let ec_private_key = EcPrivateKey::from_der(private_key_info.private_key)?;
+ Ok(Self::try_from(ec_private_key)?)
+ }
+}
+
+#[cfg_attr(docsrs, doc(cfg(feature = "pkcs8")))]
+impl<C> DecodePrivateKey for SecretKey<C>
+where
+ C: Curve + AssociatedOid + ValidatePublicKey,
+ FieldSize<C>: ModulusSize,
+{
+}
+
+// TODO(tarcieri): use weak activation of `pkcs8/alloc` for this when possible
+// It doesn't strictly depend on `pkcs8/pem` but we can't easily activate `pkcs8/alloc`
+// without adding a separate crate feature just for this functionality.
+#[cfg(all(feature = "arithmetic", feature = "pem"))]
+#[cfg_attr(docsrs, doc(cfg(feature = "arithmetic")))]
+#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
+impl<C> EncodePrivateKey for SecretKey<C>
+where
+ C: Curve + AssociatedOid + ProjectiveArithmetic,
+ AffinePoint<C>: FromEncodedPoint<C> + ToEncodedPoint<C>,
+ FieldSize<C>: ModulusSize,
+{
+ fn to_pkcs8_der(&self) -> pkcs8::Result<der::SecretDocument> {
+ let algorithm_identifier = pkcs8::AlgorithmIdentifier {
+ oid: ALGORITHM_OID,
+ parameters: Some((&C::OID).into()),
+ };
+
+ let ec_private_key = self.to_sec1_der()?;
+ let pkcs8_key = pkcs8::PrivateKeyInfo::new(algorithm_identifier, &ec_private_key);
+ Ok(der::SecretDocument::encode_msg(&pkcs8_key)?)
+ }
+}
+
+#[cfg(feature = "pem")]
+#[cfg_attr(docsrs, doc(cfg(feature = "pem")))]
+impl<C> FromStr for SecretKey<C>
+where
+ C: Curve + AssociatedOid + ValidatePublicKey,
+ FieldSize<C>: ModulusSize,
+{
+ type Err = Error;
+
+ fn from_str(s: &str) -> Result<Self> {
+ Self::from_pkcs8_pem(s).map_err(|_| Error)
+ }
+}