Skip to content

Commit b5c715d

Browse files
committed
[WIP] spki: make AlgorithmIdentifier generic around Params
NOTE: breaking change. Previously `AlgorithmIdentifier::parameters` were always `AnyRef`. This commit changes them to a generic parameter `Params`. An alias `AlgorithmIdentifierRef` provides a type identical to the original with `AnyRef` as its `parameters`, which is used in all of the other crates in this repo.
1 parent c7c1fa7 commit b5c715d

File tree

19 files changed

+135
-115
lines changed

19 files changed

+135
-115
lines changed

pkcs1/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pub const ALGORITHM_OID: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.84
5252
/// `AlgorithmIdentifier` for RSA.
5353
#[cfg(feature = "pkcs8")]
5454
#[cfg_attr(docsrs, doc(cfg(feature = "pkcs8")))]
55-
pub const ALGORITHM_ID: pkcs8::AlgorithmIdentifier<'static> = pkcs8::AlgorithmIdentifier {
55+
pub const ALGORITHM_ID: pkcs8::AlgorithmIdentifierRef<'static> = pkcs8::AlgorithmIdentifierRef {
5656
oid: ALGORITHM_OID,
5757
parameters: Some(der::asn1::AnyRef::NULL),
5858
};

pkcs1/src/params.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use der::{
66
asn1::ContextSpecificRef, Decode, DecodeValue, Encode, EncodeValue, FixedTag, Reader, Sequence,
77
Tag, TagMode, TagNumber, Writer,
88
};
9-
use spki::AlgorithmIdentifier;
9+
use spki::AlgorithmIdentifierRef;
1010

1111
const OID_SHA_1: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.3.14.3.2.26");
1212
const OID_MGF_1: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.113549.1.1.8");
@@ -15,7 +15,7 @@ const OID_PSPECIFIED: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.1
1515
// TODO(tarcieri): make `AlgorithmIdentifier` generic around params; use `OID_SHA_1`
1616
const SEQ_OID_SHA_1_DER: &[u8] = &[0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a];
1717

18-
const SHA_1_AI: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
18+
const SHA_1_AI: AlgorithmIdentifierRef<'_> = AlgorithmIdentifierRef {
1919
oid: OID_SHA_1,
2020
parameters: None,
2121
};
@@ -81,10 +81,10 @@ impl FixedTag for TrailerField {
8181
#[derive(Clone, Debug, Eq, PartialEq)]
8282
pub struct RsaPssParams<'a> {
8383
/// Hash Algorithm
84-
pub hash: AlgorithmIdentifier<'a>,
84+
pub hash: AlgorithmIdentifierRef<'a>,
8585

8686
/// Mask Generation Function (MGF)
87-
pub mask_gen: AlgorithmIdentifier<'a>,
87+
pub mask_gen: AlgorithmIdentifierRef<'a>,
8888

8989
/// Salt length
9090
pub salt_len: u8,
@@ -180,8 +180,8 @@ impl<'a> TryFrom<&'a [u8]> for RsaPssParams<'a> {
180180
}
181181

182182
/// Default Mask Generation Function (MGF): SHA-1.
183-
fn default_mgf1_sha1<'a>() -> AlgorithmIdentifier<'a> {
184-
AlgorithmIdentifier {
183+
fn default_mgf1_sha1<'a>() -> AlgorithmIdentifierRef<'a> {
184+
AlgorithmIdentifierRef {
185185
oid: OID_MGF_1,
186186
parameters: Some(
187187
AnyRef::new(Tag::Sequence, SEQ_OID_SHA_1_DER)
@@ -208,13 +208,13 @@ fn default_mgf1_sha1<'a>() -> AlgorithmIdentifier<'a> {
208208
#[derive(Clone, Debug, Eq, PartialEq)]
209209
pub struct RsaOaepParams<'a> {
210210
/// Hash Algorithm
211-
pub hash: AlgorithmIdentifier<'a>,
211+
pub hash: AlgorithmIdentifierRef<'a>,
212212

213213
/// Mask Generation Function (MGF)
214-
pub mask_gen: AlgorithmIdentifier<'a>,
214+
pub mask_gen: AlgorithmIdentifierRef<'a>,
215215

216216
/// The source (and possibly the value) of the label L
217-
pub p_source: AlgorithmIdentifier<'a>,
217+
pub p_source: AlgorithmIdentifierRef<'a>,
218218
}
219219

220220
impl<'a> Default for RsaOaepParams<'a> {
@@ -291,8 +291,8 @@ impl<'a> TryFrom<&'a [u8]> for RsaOaepParams<'a> {
291291
}
292292

293293
/// Default Source Algorithm, empty string
294-
fn default_pempty_string<'a>() -> AlgorithmIdentifier<'a> {
295-
AlgorithmIdentifier {
294+
fn default_pempty_string<'a>() -> AlgorithmIdentifierRef<'a> {
295+
AlgorithmIdentifierRef {
296296
oid: OID_PSPECIFIED,
297297
parameters: Some(
298298
AnyRef::new(Tag::OctetString, &[]).expect("error creating default OAEP params"),

pkcs5/src/lib.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//!
1313
//! The main API for this crate is the [`EncryptionScheme`] enum, which impls
1414
//! the [`Decode`] and [`Encode`] traits from the [`der`] crate, and can be
15-
//! used for decoding/encoding PKCS#5 [`AlgorithmIdentifier`] fields.
15+
//! used for decoding/encoding PKCS#5 `AlgorithmIdentifier` fields.
1616
//!
1717
//! [RFC 8018]: https://tools.ietf.org/html/rfc8018
1818
@@ -26,7 +26,7 @@ pub mod pbes2;
2626

2727
pub use crate::error::{Error, Result};
2828
pub use der::{self, asn1::ObjectIdentifier};
29-
pub use spki::AlgorithmIdentifier;
29+
pub use spki::AlgorithmIdentifierRef;
3030

3131
use der::{Decode, DecodeValue, Encode, Header, Reader, Sequence, Tag};
3232

@@ -136,7 +136,7 @@ impl<'a> EncryptionScheme<'a> {
136136

137137
impl<'a> DecodeValue<'a> for EncryptionScheme<'a> {
138138
fn decode_value<R: Reader<'a>>(decoder: &mut R, header: Header) -> der::Result<Self> {
139-
AlgorithmIdentifier::decode_value(decoder, header)?.try_into()
139+
AlgorithmIdentifierRef::decode_value(decoder, header)?.try_into()
140140
}
141141
}
142142

@@ -164,10 +164,10 @@ impl<'a> From<pbes2::Parameters<'a>> for EncryptionScheme<'a> {
164164
}
165165
}
166166

167-
impl<'a> TryFrom<AlgorithmIdentifier<'a>> for EncryptionScheme<'a> {
167+
impl<'a> TryFrom<AlgorithmIdentifierRef<'a>> for EncryptionScheme<'a> {
168168
type Error = der::Error;
169169

170-
fn try_from(alg: AlgorithmIdentifier<'a>) -> der::Result<EncryptionScheme<'_>> {
170+
fn try_from(alg: AlgorithmIdentifierRef<'a>) -> der::Result<EncryptionScheme<'_>> {
171171
if alg.oid == pbes2::PBES2_OID {
172172
match alg.parameters {
173173
Some(params) => pbes2::Parameters::try_from(params).map(Into::into),
@@ -183,6 +183,6 @@ impl<'a> TryFrom<&'a [u8]> for EncryptionScheme<'a> {
183183
type Error = der::Error;
184184

185185
fn try_from(bytes: &'a [u8]) -> der::Result<EncryptionScheme<'a>> {
186-
AlgorithmIdentifier::from_der(bytes)?.try_into()
186+
AlgorithmIdentifierRef::from_der(bytes)?.try_into()
187187
}
188188
}

pkcs5/src/pbes1.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//!
33
//! [RFC 8018 Section 6.1]: https://tools.ietf.org/html/rfc8018#section-6.1
44
5-
use crate::AlgorithmIdentifier;
5+
use crate::AlgorithmIdentifierRef;
66
use der::{
77
asn1::{AnyRef, ObjectIdentifier, OctetStringRef},
88
Decode, Encode, ErrorKind, Length, Reader, Sequence, Tag, Writer,
@@ -68,7 +68,7 @@ impl Algorithm {
6868

6969
impl<'a> Decode<'a> for Algorithm {
7070
fn decode<R: Reader<'a>>(decoder: &mut R) -> der::Result<Self> {
71-
AlgorithmIdentifier::decode(decoder)?.try_into()
71+
AlgorithmIdentifierRef::decode(decoder)?.try_into()
7272
}
7373
}
7474

@@ -81,10 +81,10 @@ impl Sequence<'_> for Algorithm {
8181
}
8282
}
8383

84-
impl<'a> TryFrom<AlgorithmIdentifier<'a>> for Algorithm {
84+
impl<'a> TryFrom<AlgorithmIdentifierRef<'a>> for Algorithm {
8585
type Error = der::Error;
8686

87-
fn try_from(alg: AlgorithmIdentifier<'a>) -> der::Result<Self> {
87+
fn try_from(alg: AlgorithmIdentifierRef<'a>) -> der::Result<Self> {
8888
// Ensure that we have a supported PBES1 algorithm identifier
8989
let encryption = EncryptionScheme::try_from(alg.oid)
9090
.map_err(|_| der::Tag::ObjectIdentifier.value_error())?;

pkcs5/src/pbes2.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub use self::kdf::{
1212
PBKDF2_OID, SCRYPT_OID,
1313
};
1414

15-
use crate::{AlgorithmIdentifier, Error, Result};
15+
use crate::{AlgorithmIdentifierRef, Error, Result};
1616
use der::{
1717
asn1::{AnyRef, ObjectIdentifier, OctetStringRef},
1818
Decode, Encode, ErrorKind, Length, Reader, Sequence, Tag, Writer,
@@ -220,8 +220,8 @@ impl<'a> TryFrom<AnyRef<'a>> for Parameters<'a> {
220220

221221
fn try_from(any: AnyRef<'a>) -> der::Result<Self> {
222222
any.sequence(|params| {
223-
let kdf = AlgorithmIdentifier::decode(params)?;
224-
let encryption = AlgorithmIdentifier::decode(params)?;
223+
let kdf = AlgorithmIdentifierRef::decode(params)?;
224+
let encryption = AlgorithmIdentifierRef::decode(params)?;
225225

226226
Ok(Self {
227227
kdf: kdf.try_into()?,
@@ -305,14 +305,14 @@ impl<'a> EncryptionScheme<'a> {
305305

306306
impl<'a> Decode<'a> for EncryptionScheme<'a> {
307307
fn decode<R: Reader<'a>>(reader: &mut R) -> der::Result<Self> {
308-
AlgorithmIdentifier::decode(reader).and_then(TryInto::try_into)
308+
AlgorithmIdentifierRef::decode(reader).and_then(TryInto::try_into)
309309
}
310310
}
311311

312-
impl<'a> TryFrom<AlgorithmIdentifier<'a>> for EncryptionScheme<'a> {
312+
impl<'a> TryFrom<AlgorithmIdentifierRef<'a>> for EncryptionScheme<'a> {
313313
type Error = der::Error;
314314

315-
fn try_from(alg: AlgorithmIdentifier<'a>) -> der::Result<Self> {
315+
fn try_from(alg: AlgorithmIdentifierRef<'a>) -> der::Result<Self> {
316316
// TODO(tarcieri): support for non-AES algorithms?
317317
let iv = match alg.parameters {
318318
Some(params) => params.octet_string()?.as_bytes(),
@@ -352,7 +352,7 @@ impl<'a> TryFrom<AlgorithmIdentifier<'a>> for EncryptionScheme<'a> {
352352
}
353353
}
354354

355-
impl<'a> TryFrom<EncryptionScheme<'a>> for AlgorithmIdentifier<'a> {
355+
impl<'a> TryFrom<EncryptionScheme<'a>> for AlgorithmIdentifierRef<'a> {
356356
type Error = der::Error;
357357

358358
fn try_from(scheme: EncryptionScheme<'a>) -> der::Result<Self> {
@@ -366,7 +366,7 @@ impl<'a> TryFrom<EncryptionScheme<'a>> for AlgorithmIdentifier<'a> {
366366
EncryptionScheme::DesEde3Cbc { iv } => iv,
367367
})?;
368368

369-
Ok(AlgorithmIdentifier {
369+
Ok(AlgorithmIdentifierRef {
370370
oid: scheme.oid(),
371371
parameters: Some(parameters.into()),
372372
})
@@ -375,10 +375,10 @@ impl<'a> TryFrom<EncryptionScheme<'a>> for AlgorithmIdentifier<'a> {
375375

376376
impl<'a> Encode for EncryptionScheme<'a> {
377377
fn encoded_len(&self) -> der::Result<Length> {
378-
AlgorithmIdentifier::try_from(*self)?.encoded_len()
378+
AlgorithmIdentifierRef::try_from(*self)?.encoded_len()
379379
}
380380

381381
fn encode(&self, writer: &mut dyn Writer) -> der::Result<()> {
382-
AlgorithmIdentifier::try_from(*self)?.encode(writer)
382+
AlgorithmIdentifierRef::try_from(*self)?.encode(writer)
383383
}
384384
}

pkcs5/src/pbes2/kdf.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Key derivation functions.
22
3-
use crate::{AlgorithmIdentifier, Error, Result};
3+
use crate::{AlgorithmIdentifierRef, Error, Result};
44
use der::{
55
asn1::{AnyRef, ObjectIdentifier, OctetStringRef},
66
Decode, Encode, ErrorKind, Length, Reader, Sequence, Tag, Tagged, Writer,
@@ -100,7 +100,7 @@ impl<'a> Kdf<'a> {
100100

101101
impl<'a> Decode<'a> for Kdf<'a> {
102102
fn decode<R: Reader<'a>>(reader: &mut R) -> der::Result<Self> {
103-
AlgorithmIdentifier::decode(reader)?.try_into()
103+
AlgorithmIdentifierRef::decode(reader)?.try_into()
104104
}
105105
}
106106

@@ -128,10 +128,10 @@ impl<'a> From<ScryptParams<'a>> for Kdf<'a> {
128128
}
129129
}
130130

131-
impl<'a> TryFrom<AlgorithmIdentifier<'a>> for Kdf<'a> {
131+
impl<'a> TryFrom<AlgorithmIdentifierRef<'a>> for Kdf<'a> {
132132
type Error = der::Error;
133133

134-
fn try_from(alg: AlgorithmIdentifier<'a>) -> der::Result<Self> {
134+
fn try_from(alg: AlgorithmIdentifierRef<'a>) -> der::Result<Self> {
135135
if let Some(params) = alg.parameters {
136136
match alg.oid {
137137
PBKDF2_OID => params.try_into().map(Self::Pbkdf2),
@@ -242,7 +242,7 @@ impl<'a> TryFrom<AnyRef<'a>> for Pbkdf2Params<'a> {
242242
salt: OctetStringRef::decode(reader)?.as_bytes(),
243243
iteration_count: reader.decode()?,
244244
key_length: reader.decode()?,
245-
prf: Option::<AlgorithmIdentifier<'_>>::decode(reader)?
245+
prf: Option::<AlgorithmIdentifierRef<'_>>::decode(reader)?
246246
.map(TryInto::try_into)
247247
.transpose()?
248248
.unwrap_or_default(),
@@ -298,10 +298,10 @@ impl Default for Pbkdf2Prf {
298298
}
299299
}
300300

301-
impl<'a> TryFrom<AlgorithmIdentifier<'a>> for Pbkdf2Prf {
301+
impl<'a> TryFrom<AlgorithmIdentifierRef<'a>> for Pbkdf2Prf {
302302
type Error = der::Error;
303303

304-
fn try_from(alg: AlgorithmIdentifier<'a>) -> der::Result<Self> {
304+
fn try_from(alg: AlgorithmIdentifierRef<'a>) -> der::Result<Self> {
305305
if let Some(params) = alg.parameters {
306306
// TODO(tarcieri): support non-NULL parameters?
307307
if !params.is_null() {
@@ -323,12 +323,12 @@ impl<'a> TryFrom<AlgorithmIdentifier<'a>> for Pbkdf2Prf {
323323
}
324324
}
325325

326-
impl<'a> From<Pbkdf2Prf> for AlgorithmIdentifier<'a> {
326+
impl<'a> From<Pbkdf2Prf> for AlgorithmIdentifierRef<'a> {
327327
fn from(prf: Pbkdf2Prf) -> Self {
328328
// TODO(tarcieri): support non-NULL parameters?
329329
let parameters = der::asn1::Null;
330330

331-
AlgorithmIdentifier {
331+
AlgorithmIdentifierRef {
332332
oid: prf.oid(),
333333
parameters: Some(parameters.into()),
334334
}
@@ -337,11 +337,11 @@ impl<'a> From<Pbkdf2Prf> for AlgorithmIdentifier<'a> {
337337

338338
impl Encode for Pbkdf2Prf {
339339
fn encoded_len(&self) -> der::Result<Length> {
340-
AlgorithmIdentifier::try_from(*self)?.encoded_len()
340+
AlgorithmIdentifierRef::try_from(*self)?.encoded_len()
341341
}
342342

343343
fn encode(&self, writer: &mut dyn Writer) -> der::Result<()> {
344-
AlgorithmIdentifier::try_from(*self)?.encode(writer)
344+
AlgorithmIdentifierRef::try_from(*self)?.encode(writer)
345345
}
346346
}
347347

pkcs7/src/enveloped_data_content.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ use der::{
66
asn1::{ContextSpecific, OctetStringRef},
77
DecodeValue, Encode, Header, Reader, Sequence, TagMode, TagNumber,
88
};
9-
use spki::AlgorithmIdentifier;
9+
use spki::AlgorithmIdentifierRef;
1010

11-
type ContentEncryptionAlgorithmIdentifier<'a> = AlgorithmIdentifier<'a>;
11+
type ContentEncryptionAlgorithmIdentifier<'a> = AlgorithmIdentifierRef<'a>;
1212

1313
const ENCRYPTED_CONTENT_TAG: TagNumber = TagNumber::new(0);
1414

pkcs7/tests/content_tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use pkcs7::{
99
encrypted_data_content::EncryptedDataContent, enveloped_data_content::EncryptedContentInfo,
1010
ContentInfo, ContentType,
1111
};
12-
use spki::AlgorithmIdentifier;
12+
use spki::AlgorithmIdentifierRef;
1313
use std::fs;
1414

1515
fn encode_content_info<'a>(content_info: &ContentInfo<'a>, buf: &'a mut [u8]) -> &'a [u8] {
@@ -52,7 +52,7 @@ fn decode_encrypted_key_example() {
5252
EncryptedContentInfo {
5353
content_type: ContentType::Data,
5454
content_encryption_algorithm:
55-
AlgorithmIdentifier {
55+
AlgorithmIdentifierRef {
5656
oid,
5757
parameters: Some(any),
5858
},

pkcs8/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub use crate::{
8383
version::Version,
8484
};
8585
pub use der::{self, asn1::ObjectIdentifier, oid::AssociatedOid};
86-
pub use spki::{self, AlgorithmIdentifier, DecodePublicKey, SubjectPublicKeyInfo};
86+
pub use spki::{self, AlgorithmIdentifierRef, DecodePublicKey, SubjectPublicKeyInfo};
8787

8888
#[cfg(feature = "alloc")]
8989
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]

pkcs8/src/private_key_info.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! PKCS#8 `PrivateKeyInfo`.
22
3-
use crate::{AlgorithmIdentifier, Error, Result, Version};
3+
use crate::{AlgorithmIdentifierRef, Error, Result, Version};
44
use core::fmt;
55
use der::{
66
asn1::{AnyRef, BitStringRef, ContextSpecific, OctetStringRef},
@@ -91,7 +91,7 @@ const PUBLIC_KEY_TAG: TagNumber = TagNumber::N1;
9191
#[derive(Clone)]
9292
pub struct PrivateKeyInfo<'a> {
9393
/// X.509 [`AlgorithmIdentifier`] for the private key type.
94-
pub algorithm: AlgorithmIdentifier<'a>,
94+
pub algorithm: AlgorithmIdentifierRef<'a>,
9595

9696
/// Private key data.
9797
pub private_key: &'a [u8],
@@ -105,7 +105,7 @@ impl<'a> PrivateKeyInfo<'a> {
105105
///
106106
/// This is a helper method which initializes `attributes` and `public_key`
107107
/// to `None`, helpful if you aren't using those.
108-
pub fn new(algorithm: AlgorithmIdentifier<'a>, private_key: &'a [u8]) -> Self {
108+
pub fn new(algorithm: AlgorithmIdentifierRef<'a>, private_key: &'a [u8]) -> Self {
109109
Self {
110110
algorithm,
111111
private_key,

sec1/src/traits.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ impl<T: pkcs8::DecodePrivateKey> DecodeEcPrivateKey for T {
103103
.parameters
104104
.and_then(|params| params.named_curve());
105105

106-
let algorithm = pkcs8::AlgorithmIdentifier {
106+
let algorithm = pkcs8::AlgorithmIdentifierRef {
107107
oid: ALGORITHM_OID,
108108
parameters: params_oid.as_ref().map(Into::into),
109109
};

0 commit comments

Comments
 (0)