Skip to content

Commit ceb83f0

Browse files
authored
ecdsa,dsa,ed25519,ed448: pkcs8 API changes (#851)
Signed-off-by: Arthur Gautier <[email protected]>
1 parent 3ecc89e commit ceb83f0

File tree

8 files changed

+62
-39
lines changed

8 files changed

+62
-39
lines changed

Cargo.lock

Lines changed: 7 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,9 @@ members = [
1313

1414
[profile.dev]
1515
opt-level = 2
16+
17+
[patch.crates-io]
18+
sec1 = { git = "https://github.com/RustCrypto/formats.git" }
19+
pkcs8 = { git = "https://github.com/RustCrypto/formats.git" }
20+
# https://github.com/RustCrypto/traits/pull/1650
21+
elliptic-curve = { git = "https://github.com/baloo/traits.git", branch = "baloo/elliptic-curve/pkcs8-API-break" }

dsa/src/signing_key.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ use digest::{core_api::BlockSizeUser, Digest, FixedOutputReset};
1111
use num_bigint::BigUint;
1212
use num_traits::Zero;
1313
use pkcs8::{
14-
der::{asn1::UintRef, AnyRef, Decode, Encode},
15-
AlgorithmIdentifierRef, EncodePrivateKey, PrivateKeyInfo, SecretDocument,
14+
der::{
15+
asn1::{OctetStringRef, UintRef},
16+
AnyRef, Decode, Encode,
17+
},
18+
AlgorithmIdentifierRef, EncodePrivateKey, PrivateKeyInfoRef, SecretDocument,
1619
};
1720
use signature::{
1821
hazmat::{PrehashSigner, RandomizedPrehashSigner},
@@ -182,7 +185,8 @@ impl EncodePrivateKey for SigningKey {
182185
let x = UintRef::new(&x_bytes)?;
183186
let mut signing_key = x.to_der()?;
184187

185-
let signing_key_info = PrivateKeyInfo::new(algorithm, &signing_key);
188+
let signing_key_info =
189+
PrivateKeyInfoRef::new(algorithm, OctetStringRef::new(&signing_key)?);
186190
let secret_document = signing_key_info.try_into()?;
187191

188192
signing_key.zeroize();
@@ -192,19 +196,19 @@ impl EncodePrivateKey for SigningKey {
192196
}
193197
}
194198

195-
impl<'a> TryFrom<PrivateKeyInfo<'a>> for SigningKey {
199+
impl<'a> TryFrom<PrivateKeyInfoRef<'a>> for SigningKey {
196200
type Error = pkcs8::Error;
197201

198-
fn try_from(value: PrivateKeyInfo<'a>) -> Result<Self, Self::Error> {
202+
fn try_from(value: PrivateKeyInfoRef<'a>) -> Result<Self, Self::Error> {
199203
value.algorithm.assert_algorithm_oid(OID)?;
200204

201205
let parameters = value.algorithm.parameters_any()?;
202206
let components = parameters.decode_as::<Components>()?;
203207

204-
let x = UintRef::from_der(value.private_key)?;
208+
let x = UintRef::from_der(value.private_key.as_bytes())?;
205209
let x = BigUint::from_bytes_be(x.as_bytes());
206210

207-
let y = if let Some(y_bytes) = value.public_key {
211+
let y = if let Some(y_bytes) = value.public_key.as_ref().and_then(|bs| bs.as_bytes()) {
208212
let y = UintRef::from_der(y_bytes)?;
209213
BigUint::from_bytes_be(y.as_bytes())
210214
} else {

ecdsa/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ elliptic-curve = { version = "=0.14.0-pre.6", default-features = false, features
2121
signature = { version = "=2.3.0-pre.4", default-features = false, features = ["rand_core"] }
2222

2323
# optional dependencies
24-
der = { version = "0.8.0-rc.0", optional = true }
24+
der = { version = "0.8.0-rc.1", optional = true }
2525
digest = { version = "=0.11.0-pre.9", optional = true, default-features = false, features = ["oid"] }
2626
rfc6979 = { version = "=0.5.0-pre.4", optional = true, path = "../rfc6979" }
2727
serdect = { version = "0.2", optional = true, default-features = false, features = ["alloc"] }

ecdsa/src/der.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use core::{
88
fmt::{self, Debug},
99
ops::{Add, Range},
1010
};
11-
use der::{asn1::UintRef, Decode, Encode, FixedTag, Length, Reader, Tag, Writer};
11+
use der::{asn1::UintRef, Decode, Encode, FixedTag, Header, Length, Reader, Tag, Writer};
1212
use elliptic_curve::{
1313
array::{typenum::Unsigned, Array, ArraySize},
1414
consts::U9,
@@ -206,7 +206,7 @@ where
206206
type Error = der::Error;
207207

208208
fn decode<R: Reader<'a>>(reader: &mut R) -> der::Result<Self> {
209-
let header = reader.peek_header()?;
209+
let header = Header::peek(reader)?;
210210
header.tag.assert_eq(Tag::Sequence)?;
211211

212212
let mut buf = SignatureBytes::<C>::default();
@@ -359,7 +359,7 @@ where
359359
/// Decode the `r` and `s` components of a DER-encoded ECDSA signature.
360360
fn decode_der(der_bytes: &[u8]) -> der::Result<(UintRef<'_>, UintRef<'_>)> {
361361
let mut reader = der::SliceReader::new(der_bytes)?;
362-
let header = der::Header::decode(&mut reader)?;
362+
let header = Header::decode(&mut reader)?;
363363
header.tag.assert_eq(Tag::Sequence)?;
364364

365365
let ret = reader.read_nested::<_, _, der::Error>(header.length, |reader| {

ecdsa/src/signing.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ where
545545
}
546546

547547
#[cfg(feature = "pkcs8")]
548-
impl<C> TryFrom<pkcs8::PrivateKeyInfo<'_>> for SigningKey<C>
548+
impl<C> TryFrom<pkcs8::PrivateKeyInfoRef<'_>> for SigningKey<C>
549549
where
550550
C: EcdsaCurve + AssociatedOid + CurveArithmetic,
551551
AffinePoint<C>: FromEncodedPoint<C> + ToEncodedPoint<C>,
@@ -555,7 +555,7 @@ where
555555
{
556556
type Error = pkcs8::Error;
557557

558-
fn try_from(private_key_info: pkcs8::PrivateKeyInfo<'_>) -> pkcs8::Result<Self> {
558+
fn try_from(private_key_info: pkcs8::PrivateKeyInfoRef<'_>) -> pkcs8::Result<Self> {
559559
SecretKey::try_from(private_key_info).map(Into::into)
560560
}
561561
}

ed25519/src/pkcs8.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@
1515
//! breaking changes when using this module.
1616
1717
pub use pkcs8::{
18-
spki, DecodePrivateKey, DecodePublicKey, Error, ObjectIdentifier, PrivateKeyInfo, Result,
18+
spki, DecodePrivateKey, DecodePublicKey, Error, ObjectIdentifier, PrivateKeyInfoRef, Result,
1919
};
2020

2121
#[cfg(feature = "alloc")]
2222
pub use pkcs8::{spki::EncodePublicKey, EncodePrivateKey};
2323

2424
#[cfg(feature = "alloc")]
25-
pub use pkcs8::der::{asn1::BitStringRef, Document, SecretDocument};
25+
pub use pkcs8::der::{
26+
asn1::{BitStringRef, OctetStringRef},
27+
Document, SecretDocument,
28+
};
2629

2730
use core::fmt;
2831

@@ -128,10 +131,14 @@ impl EncodePrivateKey for KeypairBytes {
128131
private_key[1] = 0x20;
129132
private_key[2..].copy_from_slice(&self.secret_key);
130133

131-
let private_key_info = PrivateKeyInfo {
134+
let private_key_info = PrivateKeyInfoRef {
132135
algorithm: ALGORITHM_ID,
133-
private_key: &private_key,
134-
public_key: self.public_key.as_ref().map(|pk| pk.0.as_slice()),
136+
private_key: OctetStringRef::new(&private_key)?,
137+
public_key: self
138+
.public_key
139+
.as_ref()
140+
.map(|pk| BitStringRef::new(0, &pk.0))
141+
.transpose()?,
135142
};
136143

137144
let result = SecretDocument::encode_msg(&private_key_info)?;
@@ -143,10 +150,10 @@ impl EncodePrivateKey for KeypairBytes {
143150
}
144151
}
145152

146-
impl TryFrom<PrivateKeyInfo<'_>> for KeypairBytes {
153+
impl TryFrom<PrivateKeyInfoRef<'_>> for KeypairBytes {
147154
type Error = Error;
148155

149-
fn try_from(private_key: PrivateKeyInfo<'_>) -> Result<Self> {
156+
fn try_from(private_key: PrivateKeyInfoRef<'_>) -> Result<Self> {
150157
private_key.algorithm.assert_algorithm_oid(ALGORITHM_OID)?;
151158

152159
if private_key.algorithm.parameters.is_some() {
@@ -161,13 +168,14 @@ impl TryFrom<PrivateKeyInfo<'_>> for KeypairBytes {
161168
//
162169
// - 0x04: OCTET STRING tag
163170
// - 0x20: 32-byte length
164-
let secret_key = match private_key.private_key {
171+
let secret_key = match private_key.private_key.as_bytes() {
165172
[0x04, 0x20, rest @ ..] => rest.try_into().map_err(|_| Error::KeyMalformed),
166173
_ => Err(Error::KeyMalformed),
167174
}?;
168175

169176
let public_key = private_key
170177
.public_key
178+
.and_then(|bs| bs.as_bytes())
171179
.map(|bytes| bytes.try_into().map_err(|_| Error::KeyMalformed))
172180
.transpose()?
173181
.map(PublicKeyBytes);

ed448/src/pkcs8.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@
1515
//! breaking changes when using this module.
1616
1717
pub use pkcs8::{
18-
spki, DecodePrivateKey, DecodePublicKey, Error, ObjectIdentifier, PrivateKeyInfo, Result,
18+
spki, DecodePrivateKey, DecodePublicKey, Error, ObjectIdentifier, PrivateKeyInfoRef, Result,
1919
};
2020

2121
#[cfg(feature = "alloc")]
2222
pub use pkcs8::{spki::EncodePublicKey, EncodePrivateKey};
2323

2424
#[cfg(feature = "alloc")]
25-
pub use pkcs8::der::{asn1::BitStringRef, Document, SecretDocument};
25+
pub use pkcs8::der::{
26+
asn1::{BitStringRef, OctetStringRef},
27+
Document, SecretDocument,
28+
};
2629

2730
#[cfg(feature = "zeroize")]
2831
use zeroize::Zeroize;
@@ -122,10 +125,14 @@ impl EncodePrivateKey for KeypairBytes {
122125
private_key[1] = 0x39;
123126
private_key[2..].copy_from_slice(&self.secret_key);
124127

125-
let private_key_info = PrivateKeyInfo {
128+
let private_key_info = PrivateKeyInfoRef {
126129
algorithm: ALGORITHM_ID,
127-
private_key: &private_key,
128-
public_key: self.public_key.as_ref().map(|pk| pk.0.as_slice()),
130+
private_key: OctetStringRef::new(&private_key)?,
131+
public_key: self
132+
.public_key
133+
.as_ref()
134+
.map(|pk| BitStringRef::new(0, &pk.0))
135+
.transpose()?,
129136
};
130137
let result = SecretDocument::encode_msg(&private_key_info)?;
131138

@@ -136,10 +143,10 @@ impl EncodePrivateKey for KeypairBytes {
136143
}
137144
}
138145

139-
impl TryFrom<PrivateKeyInfo<'_>> for KeypairBytes {
146+
impl TryFrom<PrivateKeyInfoRef<'_>> for KeypairBytes {
140147
type Error = Error;
141148

142-
fn try_from(private_key: PrivateKeyInfo<'_>) -> Result<Self> {
149+
fn try_from(private_key: PrivateKeyInfoRef<'_>) -> Result<Self> {
143150
private_key.algorithm.assert_algorithm_oid(ALGORITHM_OID)?;
144151

145152
if private_key.algorithm.parameters.is_some() {
@@ -154,13 +161,14 @@ impl TryFrom<PrivateKeyInfo<'_>> for KeypairBytes {
154161
//
155162
// - 0x04: OCTET STRING tag
156163
// - 0x39: 57-byte length
157-
let secret_key = match private_key.private_key {
164+
let secret_key = match private_key.private_key.as_bytes() {
158165
[0x04, 0x39, rest @ ..] => rest.try_into().map_err(|_| Error::KeyMalformed),
159166
_ => Err(Error::KeyMalformed),
160167
}?;
161168

162169
let public_key = private_key
163170
.public_key
171+
.and_then(|bs| bs.as_bytes())
164172
.map(|bytes| bytes.try_into().map_err(|_| Error::KeyMalformed))
165173
.transpose()?
166174
.map(PublicKeyBytes);

0 commit comments

Comments
 (0)