@@ -35,67 +35,6 @@ lazy_static!{
35
35
} ;
36
36
}
37
37
38
- /// Convert PEM to DER. If `guard` is specified (e.g. as PEM_CERTIFICATE), then the guardlines are
39
- /// verified to match the expected string. Otherwise, the guardlines are verified to generally have
40
- /// the correct form.
41
- ///
42
- /// On failure (due to guardlines syntax or an illegal PEM character), returns None.
43
- pub fn pem_to_der < T : ?Sized + AsRef < [ u8 ] > > ( pem : & T , guard : Option < & PemGuard > ) -> Option < Vec < u8 > > {
44
- let pem = match std:: str:: from_utf8 ( pem. as_ref ( ) ) {
45
- Err ( _) => return None ,
46
- Ok ( p) => p,
47
- } ;
48
- let pem = match pem. find ( "-----" ) {
49
- Some ( i) => pem. split_at ( i) . 1 ,
50
- None => return None ,
51
- } ;
52
- let mut lines = pem. lines ( ) ;
53
-
54
- let begin = match lines. next ( ) {
55
- Some ( l) => l,
56
- None => return None ,
57
- } ;
58
- let end = match lines. last ( ) {
59
- Some ( l) => l,
60
- None => return None ,
61
- } ;
62
-
63
- if let Some ( g) = guard {
64
- if begin != g. begin || end != g. end {
65
- return None ;
66
- }
67
- } else {
68
- if !begin. starts_with ( "-----BEGIN " ) || !begin. ends_with ( "-----" ) ||
69
- !end. starts_with ( "-----END" ) || !end. ends_with ( "-----" ) {
70
- return None ;
71
- }
72
- }
73
-
74
- let body_start = pem. char_indices ( )
75
- . skip ( begin. len ( ) )
76
- . skip_while ( |t| t. 1 . is_whitespace ( ) )
77
- . next ( ) . unwrap ( ) . 0 ;
78
- let body_end = pem. rmatch_indices ( & end) . next ( ) . unwrap ( ) . 0 ;
79
- pem[ body_start..body_end] . from_base64 ( ) . ok ( )
80
- }
81
-
82
- /// Convert DER to PEM. The guardlines use the identifying string chosen by `guard`
83
- /// (e.g. PEM_CERTIFICATE).
84
- pub fn der_to_pem < T : ?Sized + AsRef < [ u8 ] > > ( der : & T , guard : & PemGuard ) -> String {
85
- let mut pem = String :: new ( ) ;
86
-
87
- pem. push_str ( guard. begin ) ;
88
- pem. push ( '\n' ) ;
89
- if der. as_ref ( ) . len ( ) > 0 {
90
- pem. push_str ( & der. as_ref ( ) . to_base64 ( * BASE64_PEM ) ) ;
91
- pem. push ( '\n' ) ;
92
- }
93
- pem. push_str ( guard. end ) ;
94
- pem. push ( '\n' ) ;
95
-
96
- pem
97
- }
98
-
99
38
/// Split data by PEM guard lines
100
39
pub struct PemBlock < ' a > {
101
40
pem_block : & ' a str ,
@@ -129,52 +68,6 @@ impl<'a> Iterator for PemBlock<'a> {
129
68
}
130
69
}
131
70
132
- #[ test]
133
- fn test_pem ( ) {
134
- assert ! ( pem_to_der( "" , None ) . is_none( ) ) ;
135
- assert ! ( pem_to_der( "-----BEGIN CERTIFICATE-----\n -----END JUNK-----\n " , Some ( PEM_CERTIFICATE ) ) . is_none( ) ) ;
136
- assert ! ( pem_to_der( "-----BEGIN JUNK-----\n -----END CERTIFICATE-----\n " , Some ( PEM_CERTIFICATE ) ) . is_none( ) ) ;
137
- assert_eq ! ( pem_to_der( "-----BEGIN JUNK-----\n -----END GARBAGE-----\n " , None ) . unwrap( ) , vec![ ] ) ;
138
- assert_eq ! ( pem_to_der( "-----BEGIN CERTIFICATE-----\n -----END CERTIFICATE-----\n " , None ) . unwrap( ) , vec![ ] ) ;
139
- assert ! ( pem_to_der( "-----EGIN CERTIFICATE-----\n -----END CERTIFICATE-----\n " , None ) . is_none( ) ) ;
140
- assert ! ( pem_to_der( "-----BEGIN CERTIFICATE-----\n -----ND CERTIFICATE-----\n " , None ) . is_none( ) ) ;
141
- assert ! ( pem_to_der( "-----BEGIN CERTIFICATE----\n -----END CERTIFICATE-----\n " , None ) . is_none( ) ) ;
142
- assert ! ( pem_to_der( "-----BEGIN CERTIFICATE-----\n -----END CERTIFICATE----\n " , None ) . is_none( ) ) ;
143
- assert_eq ! ( pem_to_der( "-----BEGIN JUNK-----\n \
144
- AAECAwQFBgcICQoLDA0ODw==\n \
145
- -----END GARBAGE-----\n ", None ) . unwrap( ) ,
146
- vec![ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] ) ;
147
- assert_eq ! ( pem_to_der( "-----BEGIN CERTIFICATE-----\n \
148
- AAECAwQFBgcICQoLDA0ODw==\n \
149
- -----END CERTIFICATE-----\n ", None ) . unwrap( ) ,
150
- vec![ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] ) ;
151
- }
152
-
153
- #[ test]
154
- fn test_roundtrip_whole_line ( ) {
155
- // Test the case where the PEM is a multiple of whole lines.
156
- let test_cert =
157
- "-----BEGIN CERTIFICATE-----
158
- MIIHBTCCBe2gAwIBAgIRAIFsdIAf8kR29DFR7K4znoIwDQYJKoZIhvcNAQELBQAw
159
- -----END CERTIFICATE-----
160
- " ;
161
-
162
- assert_eq ! ( der_to_pem( & pem_to_der( test_cert, Some ( PEM_CERTIFICATE ) ) . unwrap( ) , PEM_CERTIFICATE ) , test_cert) ;
163
- }
164
-
165
- #[ test]
166
- fn test_wrapping ( ) {
167
- let mut v: Vec < u8 > = vec ! [ ] ;
168
- let bytes_per_line = BASE64_PEM_WRAP * 3 / 4 ;
169
- for i in 0 ..2 * bytes_per_line {
170
- let pem = der_to_pem ( & v, PEM_CERTIFICATE ) ;
171
- // Check that we can do a round trip, and that we got the expected number of lines.
172
- assert_eq ! ( pem_to_der( & pem, Some ( PEM_CERTIFICATE ) ) . unwrap( ) , v) ;
173
- assert_eq ! ( pem. matches( "\n " ) . count( ) , 2 + ( i + bytes_per_line - 1 ) / bytes_per_line) ;
174
- v. push ( 0 ) ;
175
- }
176
- }
177
-
178
71
#[ test]
179
72
fn test_split ( ) {
180
73
// Split three certs, CRLF line terminators.
0 commit comments