1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use crate::key;
use base64;
use std::io;
fn extract<A>(
rd: &mut dyn io::BufRead,
start_mark: &str,
end_mark: &str,
f: &dyn Fn(Vec<u8>) -> A,
) -> Result<Vec<A>, ()> {
let mut ders = Vec::new();
let mut b64buf = String::new();
let mut take_base64 = false;
let mut raw_line = Vec::<u8>::new();
loop {
raw_line.clear();
let len = rd
.read_until(b'\n', &mut raw_line)
.map_err(|_| ())?;
if len == 0 {
return Ok(ders);
}
let line = String::from_utf8_lossy(&raw_line);
if line.starts_with(start_mark) {
take_base64 = true;
continue;
}
if line.starts_with(end_mark) {
take_base64 = false;
let der = base64::decode(&b64buf).map_err(|_| ())?;
ders.push(f(der));
b64buf = String::new();
continue;
}
if take_base64 {
b64buf.push_str(line.trim());
}
}
}
pub fn certs(rd: &mut dyn io::BufRead) -> Result<Vec<key::Certificate>, ()> {
extract(
rd,
"-----BEGIN CERTIFICATE-----",
"-----END CERTIFICATE-----",
&|v| key::Certificate(v),
)
}
pub fn rsa_private_keys(rd: &mut dyn io::BufRead) -> Result<Vec<key::PrivateKey>, ()> {
extract(
rd,
"-----BEGIN RSA PRIVATE KEY-----",
"-----END RSA PRIVATE KEY-----",
&|v| key::PrivateKey(v),
)
}
pub fn pkcs8_private_keys(rd: &mut dyn io::BufRead) -> Result<Vec<key::PrivateKey>, ()> {
extract(
rd,
"-----BEGIN PRIVATE KEY-----",
"-----END PRIVATE KEY-----",
&|v| key::PrivateKey(v),
)
}