Skip to content

Commit b0292bb

Browse files
authored
Make PSS/OAEP params use generic AlgorithmIdentifier (#799)
Moves assert_algorithm_oid to generic impl: The assert_algorithm_oid() method doesn't depend on the actual AlgorithmIdentifier's Params type and thus can be a part of the generic AlgorithmIdentifier<Params> implementation rather than being specific to AlgorithmIdentifierRef only. Params: switch to generic AlgorithmIdentifier implementation The AlgorithmIdentifier for the MGF uses another AlgorithmIdentifier as params field. Implement this in the code rater than using the generic AlgorithmIdentifierRef. Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent 72ef39a commit b0292bb

File tree

3 files changed

+34
-53
lines changed

3 files changed

+34
-53
lines changed

pkcs1/src/params.rs

+6-12
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,12 @@ use der::{
66
asn1::ContextSpecificRef, Decode, DecodeValue, Encode, EncodeValue, FixedTag, Reader, Sequence,
77
Tag, TagMode, TagNumber, Writer,
88
};
9-
use spki::AlgorithmIdentifierRef;
9+
use spki::{AlgorithmIdentifier, 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");
1313
const OID_PSPECIFIED: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.113549.1.1.9");
1414

15-
// TODO(tarcieri): make `AlgorithmIdentifier` generic around params; use `OID_SHA_1`
16-
const SEQ_OID_SHA_1_DER: &[u8] = &[0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a];
17-
1815
const SHA_1_AI: AlgorithmIdentifierRef<'_> = AlgorithmIdentifierRef {
1916
oid: OID_SHA_1,
2017
parameters: None,
@@ -84,7 +81,7 @@ pub struct RsaPssParams<'a> {
8481
pub hash: AlgorithmIdentifierRef<'a>,
8582

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

8986
/// Salt length
9087
pub salt_len: u8,
@@ -180,13 +177,10 @@ impl<'a> TryFrom<&'a [u8]> for RsaPssParams<'a> {
180177
}
181178

182179
/// Default Mask Generation Function (MGF): SHA-1.
183-
fn default_mgf1_sha1<'a>() -> AlgorithmIdentifierRef<'a> {
184-
AlgorithmIdentifierRef {
180+
fn default_mgf1_sha1<'a>() -> AlgorithmIdentifier<AlgorithmIdentifierRef<'a>> {
181+
AlgorithmIdentifier::<AlgorithmIdentifierRef<'a>> {
185182
oid: OID_MGF_1,
186-
parameters: Some(
187-
AnyRef::new(Tag::Sequence, SEQ_OID_SHA_1_DER)
188-
.expect("error creating default MGF1 params"),
189-
),
183+
parameters: Some(SHA_1_AI),
190184
}
191185
}
192186

@@ -211,7 +205,7 @@ pub struct RsaOaepParams<'a> {
211205
pub hash: AlgorithmIdentifierRef<'a>,
212206

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

216210
/// The source (and possibly the value) of the label L
217211
pub p_source: AlgorithmIdentifierRef<'a>,

pkcs1/tests/params.rs

+25-40
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
//! PKCS#1 algorithm params tests
22
33
use const_oid::db;
4-
use der::{
5-
asn1::{ObjectIdentifier, OctetStringRef},
6-
Decode, Encode,
7-
};
4+
use der::{asn1::OctetStringRef, Encode};
85
use hex_literal::hex;
96
use pkcs1::{RsaOaepParams, RsaPssParams, TrailerField};
107

@@ -31,15 +28,12 @@ fn decode_pss_param() {
3128
.mask_gen
3229
.assert_algorithm_oid(db::rfc5912::ID_MGF_1)
3330
.is_ok());
34-
assert_eq!(
35-
param
36-
.mask_gen
37-
.parameters_any()
38-
.unwrap()
39-
.sequence(|reader| Ok(ObjectIdentifier::decode(reader)?))
40-
.unwrap(),
41-
db::rfc5912::ID_SHA_256
42-
);
31+
assert!(param
32+
.mask_gen
33+
.parameters
34+
.unwrap()
35+
.assert_algorithm_oid(db::rfc5912::ID_SHA_256)
36+
.is_ok());
4337
assert_eq!(param.salt_len, 32);
4438
assert_eq!(param.trailer_field, TrailerField::BC);
4539
}
@@ -67,15 +61,12 @@ fn decode_pss_param_default() {
6761
.mask_gen
6862
.assert_algorithm_oid(db::rfc5912::ID_MGF_1)
6963
.is_ok());
70-
assert_eq!(
71-
param
72-
.mask_gen
73-
.parameters_any()
74-
.unwrap()
75-
.sequence(|reader| Ok(ObjectIdentifier::decode(reader)?))
76-
.unwrap(),
77-
db::rfc5912::ID_SHA_1
78-
);
64+
assert!(param
65+
.mask_gen
66+
.parameters
67+
.unwrap()
68+
.assert_algorithm_oid(db::rfc5912::ID_SHA_1)
69+
.is_ok());
7970
assert_eq!(param.salt_len, 20);
8071
assert_eq!(param.trailer_field, TrailerField::BC);
8172
assert_eq!(param, Default::default())
@@ -103,15 +94,12 @@ fn decode_oaep_param() {
10394
.mask_gen
10495
.assert_algorithm_oid(db::rfc5912::ID_MGF_1)
10596
.is_ok());
106-
assert_eq!(
107-
param
108-
.mask_gen
109-
.parameters_any()
110-
.unwrap()
111-
.sequence(|reader| Ok(ObjectIdentifier::decode(reader)?))
112-
.unwrap(),
113-
db::rfc5912::ID_SHA_256
114-
);
97+
assert!(param
98+
.mask_gen
99+
.parameters
100+
.unwrap()
101+
.assert_algorithm_oid(db::rfc5912::ID_SHA_256)
102+
.is_ok());
115103
assert!(param
116104
.p_source
117105
.assert_algorithm_oid(db::rfc5912::ID_P_SPECIFIED)
@@ -145,15 +133,12 @@ fn decode_oaep_param_default() {
145133
.mask_gen
146134
.assert_algorithm_oid(db::rfc5912::ID_MGF_1)
147135
.is_ok());
148-
assert_eq!(
149-
param
150-
.mask_gen
151-
.parameters_any()
152-
.unwrap()
153-
.sequence(|reader| Ok(ObjectIdentifier::decode(reader)?))
154-
.unwrap(),
155-
db::rfc5912::ID_SHA_1
156-
);
136+
assert!(param
137+
.mask_gen
138+
.parameters
139+
.unwrap()
140+
.assert_algorithm_oid(db::rfc5912::ID_SHA_1)
141+
.is_ok());
157142
assert!(param
158143
.p_source
159144
.assert_algorithm_oid(db::rfc5912::ID_P_SPECIFIED)

spki/src/algorithm.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ where
7878
/// `AlgorithmIdentifier` reference which has `AnyRef` parameters.
7979
pub type AlgorithmIdentifierRef<'a> = AlgorithmIdentifier<AnyRef<'a>>;
8080

81-
impl<'a> AlgorithmIdentifierRef<'a> {
81+
impl<Params> AlgorithmIdentifier<Params> {
8282
/// Assert the `algorithm` OID is an expected value.
8383
pub fn assert_algorithm_oid(&self, expected_oid: ObjectIdentifier) -> Result<ObjectIdentifier> {
8484
if self.oid == expected_oid {
@@ -87,7 +87,9 @@ impl<'a> AlgorithmIdentifierRef<'a> {
8787
Err(Error::OidUnknown { oid: expected_oid })
8888
}
8989
}
90+
}
9091

92+
impl<'a> AlgorithmIdentifierRef<'a> {
9193
/// Assert `parameters` is an OID and has the expected value.
9294
pub fn assert_parameters_oid(
9395
&self,

0 commit comments

Comments
 (0)