Skip to content

Commit 17d6a4b

Browse files
authoredFeb 13, 2023
feat(transport): added support for EC keys (#1145)
* tonic: allow TLS to read ECKeys. Fixes: #1143 Signed-off-by: Yu Juncen <yu745514916@live.com> * tonic: minimize the scope of published function. Signed-off-by: Yu Juncen <yu745514916@live.com> --------- Signed-off-by: Yu Juncen <yu745514916@live.com>
1 parent 69ec5df commit 17d6a4b

File tree

1 file changed

+82
-13
lines changed
  • tonic/src/transport/service

1 file changed

+82
-13
lines changed
 

‎tonic/src/transport/service/tls.rs

+82-13
Original file line numberDiff line numberDiff line change
@@ -178,21 +178,15 @@ mod rustls_keys {
178178
use crate::transport::service::tls::TlsError;
179179
use crate::transport::Identity;
180180

181-
fn load_rustls_private_key(
181+
pub(super) fn load_rustls_private_key(
182182
mut cursor: std::io::Cursor<&[u8]>,
183183
) -> 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,
196190
}
197191
}
198192

@@ -235,3 +229,78 @@ mod rustls_keys {
235229
}
236230
}
237231
}
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

Comments
 (0)
Please sign in to comment.