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