1 //! PKCS#1 algorithm params tests
2 
3 use const_oid::db;
4 use der::{
5     asn1::{AnyRef, ObjectIdentifier, OctetStringRef},
6     oid::AssociatedOid,
7     Encode,
8 };
9 use hex_literal::hex;
10 use pkcs1::{RsaOaepParams, RsaPssParams, TrailerField};
11 
12 /// Default PSS parameters using all default values (SHA1, MGF1)
13 const RSA_PSS_PARAMETERS_DEFAULTS: &[u8] = &hex!("3000");
14 /// Example PSS parameters using SHA256 instead of SHA1
15 const RSA_PSS_PARAMETERS_SHA2_256: &[u8] = &hex!("3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a203020120");
16 
17 /// Default OAEP parameters using all default values (SHA1, MGF1, Empty)
18 const RSA_OAEP_PARAMETERS_DEFAULTS: &[u8] = &hex!("3000");
19 /// Example OAEP parameters using SHA256 instead of SHA1
20 const RSA_OAEP_PARAMETERS_SHA2_256: &[u8] = &hex!("302fa00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500");
21 
22 struct Sha1Mock {}
23 impl AssociatedOid for Sha1Mock {
24     const OID: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.3.14.3.2.26");
25 }
26 
27 struct Sha256Mock {}
28 impl AssociatedOid for Sha256Mock {
29     const OID: ObjectIdentifier = ObjectIdentifier::new_unwrap("2.16.840.1.101.3.4.2.1");
30 }
31 
32 #[test]
decode_pss_param()33 fn decode_pss_param() {
34     let param = RsaPssParams::try_from(RSA_PSS_PARAMETERS_SHA2_256).unwrap();
35 
36     assert!(param
37         .hash
38         .assert_algorithm_oid(db::rfc5912::ID_SHA_256)
39         .is_ok());
40     assert_eq!(param.hash.parameters, Some(AnyRef::NULL));
41     assert!(param
42         .mask_gen
43         .assert_algorithm_oid(db::rfc5912::ID_MGF_1)
44         .is_ok());
45     assert!(param
46         .mask_gen
47         .parameters
48         .unwrap()
49         .assert_algorithm_oid(db::rfc5912::ID_SHA_256)
50         .is_ok());
51     assert_eq!(param.salt_len, 32);
52     assert_eq!(param.trailer_field, TrailerField::BC);
53 }
54 
55 #[test]
encode_pss_param()56 fn encode_pss_param() {
57     let mut buf = [0_u8; 256];
58     let param = RsaPssParams::try_from(RSA_PSS_PARAMETERS_SHA2_256).unwrap();
59     assert_eq!(
60         param.encode_to_slice(&mut buf).unwrap(),
61         RSA_PSS_PARAMETERS_SHA2_256
62     );
63 }
64 
65 #[test]
decode_pss_param_default()66 fn decode_pss_param_default() {
67     let param = RsaPssParams::try_from(RSA_PSS_PARAMETERS_DEFAULTS).unwrap();
68 
69     assert!(param
70         .hash
71         .assert_algorithm_oid(db::rfc5912::ID_SHA_1)
72         .is_ok());
73     assert_eq!(param.hash.parameters, Some(AnyRef::NULL));
74     assert!(param
75         .mask_gen
76         .assert_algorithm_oid(db::rfc5912::ID_MGF_1)
77         .is_ok());
78     assert!(param
79         .mask_gen
80         .parameters
81         .unwrap()
82         .assert_algorithm_oid(db::rfc5912::ID_SHA_1)
83         .is_ok());
84     assert_eq!(
85         param.mask_gen.parameters.unwrap().parameters,
86         Some(AnyRef::NULL)
87     );
88     assert_eq!(param.salt_len, 20);
89     assert_eq!(param.trailer_field, TrailerField::BC);
90     assert_eq!(param, Default::default())
91 }
92 
93 #[test]
encode_pss_param_default()94 fn encode_pss_param_default() {
95     let mut buf = [0_u8; 256];
96     assert_eq!(
97         RsaPssParams::default().encode_to_slice(&mut buf).unwrap(),
98         RSA_PSS_PARAMETERS_DEFAULTS
99     );
100 }
101 
102 #[test]
new_pss_param()103 fn new_pss_param() {
104     let mut buf = [0_u8; 256];
105 
106     let param = RsaPssParams::new::<Sha1Mock>(20);
107     assert_eq!(
108         param.encode_to_slice(&mut buf).unwrap(),
109         RSA_PSS_PARAMETERS_DEFAULTS
110     );
111 
112     let param = RsaPssParams::new::<Sha256Mock>(32);
113     assert_eq!(
114         param.encode_to_slice(&mut buf).unwrap(),
115         RSA_PSS_PARAMETERS_SHA2_256
116     );
117 }
118 
119 #[test]
decode_oaep_param()120 fn decode_oaep_param() {
121     let param = RsaOaepParams::try_from(RSA_OAEP_PARAMETERS_SHA2_256).unwrap();
122 
123     assert!(param
124         .hash
125         .assert_algorithm_oid(db::rfc5912::ID_SHA_256)
126         .is_ok());
127     assert_eq!(param.hash.parameters, Some(AnyRef::NULL));
128     assert!(param
129         .mask_gen
130         .assert_algorithm_oid(db::rfc5912::ID_MGF_1)
131         .is_ok());
132     assert!(param
133         .mask_gen
134         .parameters
135         .unwrap()
136         .assert_algorithm_oid(db::rfc5912::ID_SHA_256)
137         .is_ok());
138     assert!(param
139         .p_source
140         .assert_algorithm_oid(db::rfc5912::ID_P_SPECIFIED)
141         .is_ok());
142     assert!(param
143         .p_source
144         .parameters_any()
145         .unwrap()
146         .decode_as::<OctetStringRef<'_>>()
147         .unwrap()
148         .is_empty(),);
149 }
150 
151 #[test]
encode_oaep_param()152 fn encode_oaep_param() {
153     let mut buf = [0_u8; 256];
154     let param = RsaOaepParams::try_from(RSA_OAEP_PARAMETERS_SHA2_256).unwrap();
155     assert_eq!(
156         param.encode_to_slice(&mut buf).unwrap(),
157         RSA_OAEP_PARAMETERS_SHA2_256
158     );
159 }
160 
161 #[test]
decode_oaep_param_default()162 fn decode_oaep_param_default() {
163     let param = RsaOaepParams::try_from(RSA_OAEP_PARAMETERS_DEFAULTS).unwrap();
164 
165     assert!(param
166         .hash
167         .assert_algorithm_oid(db::rfc5912::ID_SHA_1)
168         .is_ok());
169     assert_eq!(param.hash.parameters, Some(AnyRef::NULL));
170     assert!(param
171         .mask_gen
172         .assert_algorithm_oid(db::rfc5912::ID_MGF_1)
173         .is_ok());
174     assert!(param
175         .mask_gen
176         .parameters
177         .unwrap()
178         .assert_algorithm_oid(db::rfc5912::ID_SHA_1)
179         .is_ok());
180     assert_eq!(
181         param.mask_gen.parameters.unwrap().parameters,
182         Some(AnyRef::NULL)
183     );
184     assert!(param
185         .p_source
186         .assert_algorithm_oid(db::rfc5912::ID_P_SPECIFIED)
187         .is_ok());
188     assert!(param
189         .p_source
190         .parameters_any()
191         .unwrap()
192         .decode_as::<OctetStringRef<'_>>()
193         .unwrap()
194         .is_empty(),);
195     assert_eq!(param, Default::default())
196 }
197 
198 #[test]
encode_oaep_param_default()199 fn encode_oaep_param_default() {
200     let mut buf = [0_u8; 256];
201     assert_eq!(
202         RsaOaepParams::default().encode_to_slice(&mut buf).unwrap(),
203         RSA_OAEP_PARAMETERS_DEFAULTS
204     );
205 }
206 
207 #[test]
new_oaep_param()208 fn new_oaep_param() {
209     let mut buf = [0_u8; 256];
210 
211     let param = RsaOaepParams::new::<Sha1Mock>();
212     assert_eq!(
213         param.encode_to_slice(&mut buf).unwrap(),
214         RSA_OAEP_PARAMETERS_DEFAULTS
215     );
216 
217     let param = RsaOaepParams::new::<Sha256Mock>();
218     println!("{:02x?}", param.encode_to_slice(&mut buf).unwrap());
219     assert_eq!(
220         param.encode_to_slice(&mut buf).unwrap(),
221         RSA_OAEP_PARAMETERS_SHA2_256
222     );
223 }
224