Skip to content

Commit e841d14

Browse files
committed
Use PrivatePkcs8KeyDer consistently in API
1 parent 8028891 commit e841d14

File tree

2 files changed

+25
-23
lines changed

2 files changed

+25
-23
lines changed

src/account.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ impl Account {
233233
old_key: Jwk,
234234
}
235235

236-
let (new_key, new_key_pkcs8) = Key::generate()?;
236+
let (new_key, new_key_pkcs8) = Key::generate_pkcs8()?;
237237
let mut header = new_key.header(Some("nonce"), new_key_url);
238238
header.nonce = None;
239239
let payload = NewKey {
@@ -359,10 +359,7 @@ impl AccountInner {
359359
) -> Result<Self, Error> {
360360
Ok(Self {
361361
id: credentials.id,
362-
key: match credentials.key_pkcs8 {
363-
PrivateKeyDer::Pkcs8(inner) => Key::from_pkcs8_der(inner)?,
364-
_ => return Err("unsupported key format, expected PKCS#8".into()),
365-
},
362+
key: Key::from_pkcs8_der(credentials.key_pkcs8)?,
366363
client: Arc::new(match (credentials.directory, credentials.urls) {
367364
(Some(directory_url), _) => Client::new(directory_url, http).await?,
368365
(None, Some(directory)) => Client {
@@ -441,7 +438,7 @@ impl AccountBuilder {
441438
directory_url: String,
442439
external_account: Option<&ExternalAccountKey>,
443440
) -> Result<(Account, AccountCredentials), Error> {
444-
let (key, key_pkcs8) = Key::generate()?;
441+
let (key, key_pkcs8) = Key::generate_pkcs8()?;
445442
Self::create_inner(
446443
account,
447444
(key, key_pkcs8),
@@ -468,7 +465,10 @@ impl AccountBuilder {
468465
terms_of_service_agreed: true,
469466
only_return_existing: true,
470467
},
471-
key,
468+
match key {
469+
(key, PrivateKeyDer::Pkcs8(pkcs8)) => (key, pkcs8),
470+
_ => return Err("unsupported key format, expected PKCS#8".into()),
471+
},
472472
None,
473473
Client::new(directory_url, self.http).await?,
474474
)
@@ -497,7 +497,7 @@ impl AccountBuilder {
497497

498498
async fn create_inner(
499499
account: &NewAccount<'_>,
500-
(key, key_pkcs8): (Key, PrivateKeyDer<'static>),
500+
(key, key_pkcs8): (Key, PrivatePkcs8KeyDer<'static>),
501501
external_account: Option<&ExternalAccountKey>,
502502
client: Client,
503503
) -> Result<(Account, AccountCredentials), Error> {
@@ -562,14 +562,21 @@ pub struct Key {
562562

563563
impl Key {
564564
/// Generate a new ECDSA P-256 key pair
565+
#[deprecated(since = "0.8.3", note = "use `generate_pkcs8()` instead")]
565566
pub fn generate() -> Result<(Self, PrivateKeyDer<'static>), Error> {
567+
let (key, pkcs8) = Self::generate_pkcs8()?;
568+
Ok((key, PrivateKeyDer::Pkcs8(pkcs8)))
569+
}
570+
571+
/// Generate a new ECDSA P-256 key pair
572+
pub fn generate_pkcs8() -> Result<(Self, PrivatePkcs8KeyDer<'static>), Error> {
566573
let rng = crypto::SystemRandom::new();
567574
let pkcs8 =
568575
crypto::EcdsaKeyPair::generate_pkcs8(&crypto::ECDSA_P256_SHA256_FIXED_SIGNING, &rng)
569576
.map_err(|_| Error::Crypto)?;
570577
Ok((
571578
Self::new(pkcs8.as_ref(), rng)?,
572-
PrivatePkcs8KeyDer::from(pkcs8.as_ref().to_vec()).into(),
579+
PrivatePkcs8KeyDer::from(pkcs8.as_ref().to_vec()),
573580
))
574581
}
575582

src/types.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::time::Instant;
66

77
use base64::prelude::{BASE64_URL_SAFE_NO_PAD, Engine};
88
use bytes::Bytes;
9-
use rustls_pki_types::{CertificateDer, Der, PrivateKeyDer};
9+
use rustls_pki_types::{CertificateDer, Der, PrivatePkcs8KeyDer};
1010
use serde::de::{self, DeserializeOwned};
1111
use serde::ser::SerializeMap;
1212
use serde::{Deserialize, Serialize};
@@ -90,7 +90,7 @@ pub struct AccountCredentials {
9090
pub(crate) id: String,
9191
/// Stored in DER, serialized as base64
9292
#[serde(with = "pkcs8_serde")]
93-
pub(crate) key_pkcs8: PrivateKeyDer<'static>,
93+
pub(crate) key_pkcs8: PrivatePkcs8KeyDer<'static>,
9494
pub(crate) directory: Option<String>,
9595
/// We never serialize `urls` by default, but we support deserializing them
9696
/// in order to support serialized data from older versions of the library.
@@ -102,37 +102,32 @@ mod pkcs8_serde {
102102
use std::fmt;
103103

104104
use base64::prelude::{BASE64_URL_SAFE_NO_PAD, Engine};
105-
use rustls_pki_types::PrivateKeyDer;
105+
use rustls_pki_types::PrivatePkcs8KeyDer;
106106
use serde::{Deserializer, Serializer, de};
107107

108108
pub(crate) fn serialize<S: Serializer>(
109-
key_pkcs8: &PrivateKeyDer<'_>,
109+
key_pkcs8: &PrivatePkcs8KeyDer<'_>,
110110
serializer: S,
111111
) -> Result<S::Ok, S::Error> {
112-
let encoded = BASE64_URL_SAFE_NO_PAD.encode(key_pkcs8.secret_der());
112+
let encoded = BASE64_URL_SAFE_NO_PAD.encode(key_pkcs8.secret_pkcs8_der());
113113
serializer.serialize_str(&encoded)
114114
}
115115

116116
pub(crate) fn deserialize<'de, D: Deserializer<'de>>(
117117
deserializer: D,
118-
) -> Result<PrivateKeyDer<'static>, D::Error> {
118+
) -> Result<PrivatePkcs8KeyDer<'static>, D::Error> {
119119
struct Visitor;
120120

121121
impl de::Visitor<'_> for Visitor {
122-
type Value = PrivateKeyDer<'static>;
122+
type Value = PrivatePkcs8KeyDer<'static>;
123123

124124
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
125125
formatter.write_str("a base64-encoded PKCS#8 private key")
126126
}
127127

128128
fn visit_str<E: de::Error>(self, v: &str) -> Result<Self::Value, E> {
129-
let bytes = match BASE64_URL_SAFE_NO_PAD.decode(v) {
130-
Ok(bytes) => bytes,
131-
Err(err) => return Err(de::Error::custom(err)),
132-
};
133-
134-
match PrivateKeyDer::try_from(bytes) {
135-
Ok(key) => Ok(key),
129+
match BASE64_URL_SAFE_NO_PAD.decode(v) {
130+
Ok(bytes) => Ok(PrivatePkcs8KeyDer::from(bytes)),
136131
Err(err) => Err(de::Error::custom(err)),
137132
}
138133
}

0 commit comments

Comments
 (0)