1
1
#[ cfg( feature = "pem" ) ]
2
2
use pem:: Pem ;
3
3
#[ cfg( feature = "crypto" ) ]
4
+ use pki_types:: { PrivateKeyDer , PrivatePkcs8KeyDer } ;
5
+ #[ cfg( feature = "crypto" ) ]
4
6
use std:: convert:: TryFrom ;
5
7
use std:: fmt;
6
8
use yasna:: DERWriter ;
@@ -116,8 +118,8 @@ impl KeyPair {
116
118
///
117
119
/// Equivalent to using the [`TryFrom`] implementation.
118
120
#[ cfg( feature = "crypto" ) ]
119
- pub fn from_der ( der : & [ u8 ] ) -> Result < Self , Error > {
120
- Ok ( der. try_into ( ) ? )
121
+ pub fn from_der < ' a > ( der : impl Into < PrivateKeyDer < ' a > > ) -> Result < Self , Error > {
122
+ der. into ( ) . try_into ( )
121
123
}
122
124
123
125
/// Returns the key pair's signature algorithm
@@ -128,9 +130,12 @@ impl KeyPair {
128
130
/// Parses the key pair from the ASCII PEM format
129
131
#[ cfg( all( feature = "pem" , feature = "crypto" ) ) ]
130
132
pub fn from_pem ( pem_str : & str ) -> Result < Self , Error > {
131
- let private_key = pem:: parse ( pem_str) . _err ( ) ?;
132
- let private_key_der: & [ _ ] = private_key. contents ( ) ;
133
- Ok ( private_key_der. try_into ( ) ?)
133
+ let mut reader = std:: io:: BufReader :: new ( pem_str. as_bytes ( ) ) ;
134
+ let private_key = rustls_pemfile:: private_key ( & mut reader)
135
+ . ok ( )
136
+ . flatten ( )
137
+ . ok_or_else ( || Error :: CouldNotParseKeyPair ) ?;
138
+ private_key. try_into ( )
134
139
}
135
140
136
141
/// Obtains the key pair from a raw public key and a remote private key
@@ -151,9 +156,12 @@ impl KeyPair {
151
156
pem_str : & str ,
152
157
alg : & ' static SignatureAlgorithm ,
153
158
) -> Result < Self , Error > {
154
- let private_key = pem:: parse ( pem_str) . _err ( ) ?;
155
- let private_key_der: & [ _ ] = private_key. contents ( ) ;
156
- Ok ( Self :: from_der_and_sign_algo ( private_key_der, alg) ?)
159
+ let mut reader = std:: io:: BufReader :: new ( pem_str. as_bytes ( ) ) ;
160
+ let private_key = rustls_pemfile:: private_key ( & mut reader)
161
+ . ok ( )
162
+ . flatten ( )
163
+ . ok_or_else ( || Error :: CouldNotParseKeyPair ) ?;
164
+ Ok ( Self :: from_der_and_sign_algo ( private_key, alg) ?)
157
165
}
158
166
159
167
/// Obtains the key pair from a DER formatted key
@@ -166,38 +174,42 @@ impl KeyPair {
166
174
/// same der key. In that instance, you can use this function to precisely
167
175
/// specify the `SignatureAlgorithm`.
168
176
#[ cfg( feature = "crypto" ) ]
169
- pub fn from_der_and_sign_algo (
170
- pkcs8 : & [ u8 ] ,
177
+ pub fn from_der_and_sign_algo < ' a > (
178
+ der : impl Into < PrivateKeyDer < ' a > > ,
171
179
alg : & ' static SignatureAlgorithm ,
172
180
) -> Result < Self , Error > {
173
181
let rng = & SystemRandom :: new ( ) ;
174
- let pkcs8_vec = pkcs8. to_vec ( ) ;
182
+ let pkcs8_vec = match & der. into ( ) {
183
+ PrivateKeyDer :: Pkcs8 ( private_key) => Ok ( private_key. secret_pkcs8_der ( ) ) ,
184
+ _ => Err ( Error :: CouldNotParseKeyPair ) ,
185
+ } ?
186
+ . to_vec ( ) ;
175
187
176
188
let kind = if alg == & PKCS_ED25519 {
177
- KeyPairKind :: Ed ( Ed25519KeyPair :: from_pkcs8_maybe_unchecked ( pkcs8 ) . _err ( ) ?)
189
+ KeyPairKind :: Ed ( Ed25519KeyPair :: from_pkcs8_maybe_unchecked ( & pkcs8_vec ) . _err ( ) ?)
178
190
} else if alg == & PKCS_ECDSA_P256_SHA256 {
179
191
KeyPairKind :: Ec ( ecdsa_from_pkcs8 (
180
192
& signature:: ECDSA_P256_SHA256_ASN1_SIGNING ,
181
- pkcs8 ,
193
+ & pkcs8_vec ,
182
194
rng,
183
195
) ?)
184
196
} else if alg == & PKCS_ECDSA_P384_SHA384 {
185
197
KeyPairKind :: Ec ( ecdsa_from_pkcs8 (
186
198
& signature:: ECDSA_P384_SHA384_ASN1_SIGNING ,
187
- pkcs8 ,
199
+ & pkcs8_vec ,
188
200
rng,
189
201
) ?)
190
202
} else if alg == & PKCS_RSA_SHA256 {
191
- let rsakp = RsaKeyPair :: from_pkcs8 ( pkcs8 ) . _err ( ) ?;
203
+ let rsakp = RsaKeyPair :: from_pkcs8 ( & pkcs8_vec ) . _err ( ) ?;
192
204
KeyPairKind :: Rsa ( rsakp, & signature:: RSA_PKCS1_SHA256 )
193
205
} else if alg == & PKCS_RSA_SHA384 {
194
- let rsakp = RsaKeyPair :: from_pkcs8 ( pkcs8 ) . _err ( ) ?;
206
+ let rsakp = RsaKeyPair :: from_pkcs8 ( & pkcs8_vec ) . _err ( ) ?;
195
207
KeyPairKind :: Rsa ( rsakp, & signature:: RSA_PKCS1_SHA384 )
196
208
} else if alg == & PKCS_RSA_SHA512 {
197
- let rsakp = RsaKeyPair :: from_pkcs8 ( pkcs8 ) . _err ( ) ?;
209
+ let rsakp = RsaKeyPair :: from_pkcs8 ( & pkcs8_vec ) . _err ( ) ?;
198
210
KeyPairKind :: Rsa ( rsakp, & signature:: RSA_PKCS1_SHA512 )
199
211
} else if alg == & PKCS_RSA_PSS_SHA256 {
200
- let rsakp = RsaKeyPair :: from_pkcs8 ( pkcs8 ) . _err ( ) ?;
212
+ let rsakp = RsaKeyPair :: from_pkcs8 ( & pkcs8_vec ) . _err ( ) ?;
201
213
KeyPairKind :: Rsa ( rsakp, & signature:: RSA_PSS_SHA256 )
202
214
} else {
203
215
panic ! ( "Unknown SignatureAlgorithm specified!" ) ;
@@ -212,8 +224,9 @@ impl KeyPair {
212
224
213
225
#[ cfg( feature = "crypto" ) ]
214
226
pub ( crate ) fn from_raw (
215
- pkcs8 : & [ u8 ] ,
227
+ pkcs8 : & PrivatePkcs8KeyDer ,
216
228
) -> Result < ( KeyPairKind , & ' static SignatureAlgorithm ) , Error > {
229
+ let pkcs8 = pkcs8. secret_pkcs8_der ( ) ;
217
230
let rng = SystemRandom :: new ( ) ;
218
231
let ( kind, alg) = if let Ok ( edkp) = Ed25519KeyPair :: from_pkcs8_maybe_unchecked ( pkcs8) {
219
232
( KeyPairKind :: Ed ( edkp) , & PKCS_ED25519 )
@@ -352,29 +365,18 @@ impl KeyPair {
352
365
}
353
366
354
367
#[ cfg( feature = "crypto" ) ]
355
- impl TryFrom < & [ u8 ] > for KeyPair {
356
- type Error = Error ;
357
-
358
- fn try_from ( pkcs8 : & [ u8 ] ) -> Result < KeyPair , Error > {
359
- let ( kind, alg) = KeyPair :: from_raw ( pkcs8) ?;
360
- Ok ( KeyPair {
361
- kind,
362
- alg,
363
- serialized_der : pkcs8. to_vec ( ) ,
364
- } )
365
- }
366
- }
367
-
368
- #[ cfg( feature = "crypto" ) ]
369
- impl TryFrom < Vec < u8 > > for KeyPair {
368
+ impl TryFrom < PrivateKeyDer < ' _ > > for KeyPair {
370
369
type Error = Error ;
371
370
372
- fn try_from ( pkcs8 : Vec < u8 > ) -> Result < KeyPair , Error > {
373
- let ( kind, alg) = KeyPair :: from_raw ( pkcs8. as_slice ( ) ) ?;
371
+ fn try_from ( private_key : PrivateKeyDer ) -> Result < KeyPair , Error > {
372
+ let ( kind, alg) = match & private_key {
373
+ PrivateKeyDer :: Pkcs8 ( private_key) => KeyPair :: from_raw ( private_key) ,
374
+ _ => Err ( Error :: CouldNotParseKeyPair ) ,
375
+ } ?;
374
376
Ok ( KeyPair {
375
377
kind,
376
378
alg,
377
- serialized_der : pkcs8 ,
379
+ serialized_der : private_key . secret_der ( ) . to_vec ( ) ,
378
380
} )
379
381
}
380
382
}
0 commit comments