@@ -178,21 +178,15 @@ mod rustls_keys {
178
178
use crate :: transport:: service:: tls:: TlsError ;
179
179
use crate :: transport:: Identity ;
180
180
181
- fn load_rustls_private_key (
181
+ pub ( super ) fn load_rustls_private_key (
182
182
mut cursor : std:: io:: Cursor < & [ u8 ] > ,
183
183
) -> Result < PrivateKey , crate :: Error > {
184
- // First attempt to load the private key assuming it is PKCS8-encoded
185
- if let Ok ( mut keys) = rustls_pemfile:: pkcs8_private_keys ( & mut cursor) {
186
- if let Some ( key) = keys. pop ( ) {
187
- return Ok ( PrivateKey ( key) ) ;
188
- }
189
- }
190
-
191
- // If it not, try loading the private key as an RSA key
192
- cursor. set_position ( 0 ) ;
193
- if let Ok ( mut keys) = rustls_pemfile:: rsa_private_keys ( & mut cursor) {
194
- if let Some ( key) = keys. pop ( ) {
195
- return Ok ( PrivateKey ( key) ) ;
184
+ while let Ok ( Some ( item) ) = rustls_pemfile:: read_one ( & mut cursor) {
185
+ match item {
186
+ rustls_pemfile:: Item :: RSAKey ( key)
187
+ | rustls_pemfile:: Item :: PKCS8Key ( key)
188
+ | rustls_pemfile:: Item :: ECKey ( key) => return Ok ( PrivateKey ( key) ) ,
189
+ _ => continue ,
196
190
}
197
191
}
198
192
@@ -235,3 +229,78 @@ mod rustls_keys {
235
229
}
236
230
}
237
231
}
232
+
233
+ #[ cfg( test) ]
234
+ mod tests {
235
+ use std:: io:: Cursor ;
236
+
237
+ // generated by: openssl ecparam -keygen -name 'prime256v1'
238
+ const SIMPLE_EC_KEY : & str = r#"-----BEGIN EC PARAMETERS-----
239
+ BggqhkjOPQMBBw==
240
+ -----END EC PARAMETERS-----
241
+ -----BEGIN EC PRIVATE KEY-----
242
+ MHcCAQEEICIDyh40kMVWGDAYr1gXnMfeMeO3zXYigOaWrg5SNB+zoAoGCCqGSM49
243
+ AwEHoUQDQgAEacJyVg299dkPTzUaMbOmACUfF67yp+ZrDhXVjn/5WxBAgjcmFBHg
244
+ Tw8dfwpMzaJPXX5lWYzP276fcmbRO25CXw==
245
+ -----END EC PRIVATE KEY-----"# ;
246
+
247
+ // generated by: openssl genpkey -algorithm rsa
248
+ const SIMPLE_PKCS8_KEY : & str = r#"-----BEGIN PRIVATE KEY-----
249
+ MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKHkX1YIvqOIAllD
250
+ 5fKcIxu2kYjIxxAAQrOBRTloGZUKdPFQY1RANB4t/LEaI5/NJ6NK4915pTn35QAQ
251
+ zHJl+X4rNFMgVt+o/nY40PgrQxyyv5A0/URp+iS8Yn3GKt3q6p4zguiO9uNXhiiD
252
+ b+VKIFRDm4bHR2yM7pNJ0kMdoattAgMBAAECgYAMpw6UaMaNfVnBpD7agT11MwWY
253
+ zShRpdOQt++zFuG49kJBgejhcssf+LQhG0vhd2U7q+S3MISrTSaGpMl1v2aKR/nV
254
+ G7X4Bb6X8vrVSMrfze2loT0aNri9jKDZkD/muy6+9JkhRa03NOdhDdseokmcqF3L
255
+ xsU4BUOOFYb23ycoeQJBANOGxbZu/3BqsPJMQmXWo1CXuaviZ83lTczPtrz9mJVl
256
+ Zs/KmGnJ8I2Azu/dlYXsHRvbIbqA93l1M3GnsWl5IxsCQQDD7hKvOY6qzUNyj+R4
257
+ vul/3xaqjiTj59f3jN7Fh6+9AY+WfvEkWfyUUAXY74z43wBgtORfMXnZnjFO96tJ
258
+ sswXAkBDYDtb19E/cox4MTg5DfwpMJrwmAYufCqi4Uq4uiI++/SanVKc57jaqbvA
259
+ hZkZ9lJzTAJbULcDFgTT3/FPwkkfAkEAqbSDMIzdGuox2n/x9/f8jcpweogmQdUl
260
+ xgCZUGSnfkFk2ojXW5Ip6Viqx+0toL6fOCRWjnFvRmPz958kGPCqPwJBAID4y7XV
261
+ peOO6Yadu0YbSmFNluRebia6410p5jR21LhG1ty2h22xVhlBWjOC+TyDuKwhmiYT
262
+ ed50S3LR1PWt4zE=
263
+ -----END PRIVATE KEY-----"# ;
264
+
265
+ // generated by: openssl genrsa
266
+ const SIMPLE_RSA_KEY : & str = r#"-----BEGIN RSA PRIVATE KEY-----
267
+ MIIEogIBAAKCAQEAoEILGds1/RGBHT7jM4R+EL24sQ6Bsn14GgTHc7WoZ7lainEH
268
+ H/n+DtHCYUXYyJnN5AMIi3pkigCP1hdXXBQga3zs3lXoi/mAMkT6vjuqQ7Xg5/95
269
+ ABx5Ztyy25mZNaXm77glyAzSscKHxWYooXVJYG4C3SGuBJJ1zVjxen6Rkzse5Lpr
270
+ yZOUUeqeV3M6KbJ/dkR37HFQVwmlctQukFnb4kozFBQDDnkXi9jT/PH00g6JpW3z
271
+ YMzdMq2RMadJ0dzYv62OtdtqmQpVz0dRu/yODV4DkhrWwgPRj2uY4DnYthzILESB
272
+ x41gxHj+jqo6NW+C+0fr6uh2CXtD0p+ZVANtBQIDAQABAoIBAE7IaOCrLV1dr5WL
273
+ BvKancbpHdSdBxGSMOrJkqvFkCZ9ro8EhbYolcb/Q4nCZpInWlpPS3IWFzroj811
274
+ 6BJyKoXtAh1DKnE1lNohowrGFiv3S7uBkiCF3wC8Wokud20yQ9dxNdGkzCdrNIfM
275
+ cwj8ubfYHTxMhFnnDlaG9R98/V/dFy0FLxL37eMP/heMbcwKKm9P/G2FqvuCn8a4
276
+ FoPbAfvaR64IGCybjoiTjUD7xMHIV4Gr5K07br2TzG2zVlFTacoqXyGBbVVy+ibt
277
+ QMh0sn+rMkAy+cFse+yCYZeAFa4FzwGz43sdFviU7uvLG7yXpvZ+uDACFzxlxUVg
278
+ v57r1cECgYEA1MMJEe6IunDUyuzRaFNTfQX16QcAv/xLN/1TtVB3HUX5p2bIZKDr
279
+ XEl0NCVOrCoz5RsYqbtGmp8B4Yxl3DeX+WeWeD9/f2ZTVGWyBx1N6dZ5hRsyfzG/
280
+ xVBUqYxkChjXQ20cNtf8u7JKdnVjOJen9M92nXhFRTwgH83Id4gPp70CgYEAwNN8
281
+ lvVJnd05ekyf1qIKOSyKiSGnGa5288PpqsjYMZisXy12y4n8cK2pX5Z5PICHeJVu
282
+ K99WdTtO7Q4ghCXRB1jR5pTd4/3/3089SQyDnWz9jlA3pGWcSLDTB1dBJXpMQ6yG
283
+ cR2dX5hPDNIdKsc+9Bl/OF5PScvGVUYv4SLF6ukCgYAVhh2WyNDgO6XrWYXdzgA2
284
+ N7Im/uReh8F8So57W0aRmZCmFMnVFEp7LZsp41RQKnzRgqo+EYoU/l0MWk27t4wS
285
+ WR5pz9KwKsPnV9poydgl/eKRSq0THQ9PgM7v0BoWw2iTk6g1DCivPFw4G6wL/5uo
286
+ MozHZXFsjaaaUREktokO6QKBgC3Dg7RILtqaoIOYH+9OseJz4cU+CWyc7XpZKuHv
287
+ nO/YbkCAh8syyojrjmEzUz66umwx+t3KubhFBSxZx/nVB9EYkWiKOEdeBxY2tjLa
288
+ F3qLXXojK7GGtBrEbLE3UizU47jD/3xlLO59NXWzgFygwR4p1vnH2EWJaV7fs4lZ
289
+ OWPRAoGAL0nX0vZ0N9qPETiQan1uHjKYuuFiSP+cwRXVSUYIQM9qDRlKG9zjugwO
290
+ az+B6uiR4TrgbwG+faCQwcGk9B8QbcoIb8IigwrWe3XpVaEtcsqFORX0r+tJNDoY
291
+ I0O2DOQVPKSK2N5AZzXY4IkybWTV4Yxc7rdXEO3dOOpHGKbpwFQ=
292
+ -----END RSA PRIVATE KEY-----"# ;
293
+
294
+ #[ test]
295
+ fn test_parse_ec_key ( ) {
296
+ for ( n, key) in [ SIMPLE_EC_KEY , SIMPLE_PKCS8_KEY , SIMPLE_RSA_KEY ]
297
+ . iter ( )
298
+ . enumerate ( )
299
+ {
300
+ let c = Cursor :: new ( key. as_bytes ( ) ) ;
301
+ let key = super :: rustls_keys:: load_rustls_private_key ( c) ;
302
+
303
+ assert ! ( key. is_ok( ) , "at the {}-th case" , n) ;
304
+ }
305
+ }
306
+ }
0 commit comments