uselesskey_rustcrypto/
lib.rs1#![forbid(unsafe_code)]
2
3#![cfg_attr(feature = "rsa", doc = "```")]
22#![cfg_attr(not(feature = "rsa"), doc = "```ignore")]
23#[cfg(feature = "rsa")]
67pub trait RustCryptoRsaExt {
68 fn rsa_private_key(&self) -> rsa::RsaPrivateKey;
70
71 fn rsa_public_key(&self) -> rsa::RsaPublicKey;
73}
74
75#[cfg(feature = "rsa")]
76impl RustCryptoRsaExt for uselesskey_rsa::RsaKeyPair {
77 fn rsa_private_key(&self) -> rsa::RsaPrivateKey {
78 use rsa::pkcs8::DecodePrivateKey;
79 rsa::RsaPrivateKey::from_pkcs8_der(self.private_key_pkcs8_der())
80 .expect("valid RSA PKCS#8 DER")
81 }
82
83 fn rsa_public_key(&self) -> rsa::RsaPublicKey {
84 rsa::RsaPublicKey::from(self.rsa_private_key())
85 }
86}
87
88#[cfg(feature = "ecdsa")]
115pub trait RustCryptoEcdsaExt {
116 fn p256_signing_key(&self) -> p256::ecdsa::SigningKey;
118
119 fn p256_verifying_key(&self) -> p256::ecdsa::VerifyingKey;
121
122 fn p384_signing_key(&self) -> p384::ecdsa::SigningKey;
124
125 fn p384_verifying_key(&self) -> p384::ecdsa::VerifyingKey;
127}
128
129#[cfg(feature = "ecdsa")]
130impl RustCryptoEcdsaExt for uselesskey_ecdsa::EcdsaKeyPair {
131 fn p256_signing_key(&self) -> p256::ecdsa::SigningKey {
132 assert!(
133 matches!(self.spec(), uselesskey_ecdsa::EcdsaSpec::Es256),
134 "expected P-256 key, got {:?}",
135 self.spec()
136 );
137 use p256::pkcs8::DecodePrivateKey;
138 p256::ecdsa::SigningKey::from_pkcs8_der(self.private_key_pkcs8_der())
139 .expect("valid P-256 PKCS#8 DER")
140 }
141
142 fn p256_verifying_key(&self) -> p256::ecdsa::VerifyingKey {
143 *self.p256_signing_key().verifying_key()
144 }
145
146 fn p384_signing_key(&self) -> p384::ecdsa::SigningKey {
147 assert!(
148 matches!(self.spec(), uselesskey_ecdsa::EcdsaSpec::Es384),
149 "expected P-384 key, got {:?}",
150 self.spec()
151 );
152 use p384::pkcs8::DecodePrivateKey;
153 p384::ecdsa::SigningKey::from_pkcs8_der(self.private_key_pkcs8_der())
154 .expect("valid P-384 PKCS#8 DER")
155 }
156
157 fn p384_verifying_key(&self) -> p384::ecdsa::VerifyingKey {
158 *self.p384_signing_key().verifying_key()
159 }
160}
161
162#[cfg(feature = "ed25519")]
186pub trait RustCryptoEd25519Ext {
187 fn ed25519_signing_key(&self) -> ed25519_dalek::SigningKey;
189
190 fn ed25519_verifying_key(&self) -> ed25519_dalek::VerifyingKey;
192}
193
194#[cfg(feature = "ed25519")]
195impl RustCryptoEd25519Ext for uselesskey_ed25519::Ed25519KeyPair {
196 fn ed25519_signing_key(&self) -> ed25519_dalek::SigningKey {
197 use ed25519_dalek::pkcs8::DecodePrivateKey;
198 ed25519_dalek::SigningKey::from_pkcs8_der(self.private_key_pkcs8_der())
199 .expect("valid Ed25519 PKCS#8 DER")
200 }
201
202 fn ed25519_verifying_key(&self) -> ed25519_dalek::VerifyingKey {
203 self.ed25519_signing_key().verifying_key()
204 }
205}
206
207#[cfg(feature = "hmac")]
230pub trait RustCryptoHmacExt {
231 fn hmac_sha256(&self) -> hmac::Hmac<sha2::Sha256>;
233
234 fn hmac_sha384(&self) -> hmac::Hmac<sha2::Sha384>;
236
237 fn hmac_sha512(&self) -> hmac::Hmac<sha2::Sha512>;
239}
240
241#[cfg(feature = "hmac")]
242impl RustCryptoHmacExt for uselesskey_hmac::HmacSecret {
243 fn hmac_sha256(&self) -> hmac::Hmac<sha2::Sha256> {
244 use hmac::KeyInit;
245 hmac::Hmac::<sha2::Sha256>::new_from_slice(self.secret_bytes())
246 .expect("HMAC accepts any key length")
247 }
248
249 fn hmac_sha384(&self) -> hmac::Hmac<sha2::Sha384> {
250 use hmac::KeyInit;
251 hmac::Hmac::<sha2::Sha384>::new_from_slice(self.secret_bytes())
252 .expect("HMAC accepts any key length")
253 }
254
255 fn hmac_sha512(&self) -> hmac::Hmac<sha2::Sha512> {
256 use hmac::KeyInit;
257 hmac::Hmac::<sha2::Sha512>::new_from_slice(self.secret_bytes())
258 .expect("HMAC accepts any key length")
259 }
260}
261
262#[cfg(test)]
267mod tests {
268 use std::sync::OnceLock;
269 use uselesskey_core::{Factory, Seed};
270
271 static FX: OnceLock<Factory> = OnceLock::new();
272
273 fn fx() -> Factory {
274 FX.get_or_init(|| {
275 let seed = Seed::from_env_value("uselesskey-rustcrypto-inline-test-seed-v1")
276 .expect("test seed should always parse");
277 Factory::deterministic(seed)
278 })
279 .clone()
280 }
281
282 #[cfg(feature = "rsa")]
283 mod rsa_tests {
284 use crate::RustCryptoRsaExt;
285 use rsa::pkcs1v15::{SigningKey, VerifyingKey};
286 use rsa::sha2::Sha256;
287 use rsa::signature::{Signer, Verifier};
288 use uselesskey_core::Factory;
289 use uselesskey_rsa::{RsaFactoryExt, RsaSpec};
290
291 #[test]
292 fn test_rsa_sign_verify() {
293 let fx = super::fx();
294 let keypair = fx.rsa("test", RsaSpec::rs256());
295
296 let private_key = keypair.rsa_private_key();
297 let signing_key = SigningKey::<Sha256>::new_unprefixed(private_key);
298 let signature = signing_key.sign(b"test message");
299
300 let public_key = keypair.rsa_public_key();
301 let verifying_key = VerifyingKey::<Sha256>::new_unprefixed(public_key);
302 verifying_key
303 .verify(b"test message", &signature)
304 .expect("verify");
305 }
306
307 #[test]
308 fn test_rsa_deterministic() {
309 use uselesskey_core::Seed;
310
311 let seed = Seed::from_env_value("test-seed").unwrap();
312 let fx = Factory::deterministic(seed);
313 let keypair = fx.rsa("det-test", RsaSpec::rs256());
314
315 let private_key = keypair.rsa_private_key();
316 let signing_key = SigningKey::<Sha256>::new_unprefixed(private_key);
317 let signature = signing_key.sign(b"deterministic");
318
319 let public_key = keypair.rsa_public_key();
320 let verifying_key = VerifyingKey::<Sha256>::new_unprefixed(public_key);
321 verifying_key
322 .verify(b"deterministic", &signature)
323 .expect("verify");
324 }
325 }
326
327 #[cfg(feature = "ecdsa")]
328 mod ecdsa_tests {
329 use crate::RustCryptoEcdsaExt;
330 use uselesskey_core::Factory;
331 use uselesskey_ecdsa::{EcdsaFactoryExt, EcdsaSpec};
332
333 #[test]
334 fn test_p256_sign_verify() {
335 use p256::ecdsa::signature::{Signer, Verifier};
336
337 let fx = Factory::random();
338 let keypair = fx.ecdsa("test", EcdsaSpec::es256());
339
340 let signing_key = keypair.p256_signing_key();
341 let signature: p256::ecdsa::Signature = signing_key.sign(b"test message");
342
343 let verifying_key = keypair.p256_verifying_key();
344 verifying_key
345 .verify(b"test message", &signature)
346 .expect("verify");
347 }
348
349 #[test]
350 fn test_p384_sign_verify() {
351 use p384::ecdsa::signature::{Signer, Verifier};
352
353 let fx = Factory::random();
354 let keypair = fx.ecdsa("test", EcdsaSpec::es384());
355
356 let signing_key = keypair.p384_signing_key();
357 let signature: p384::ecdsa::Signature = signing_key.sign(b"test message");
358
359 let verifying_key = keypair.p384_verifying_key();
360 verifying_key
361 .verify(b"test message", &signature)
362 .expect("verify");
363 }
364
365 #[test]
366 #[should_panic(expected = "expected P-384")]
367 fn test_p384_on_p256_key_panics() {
368 let fx = Factory::random();
369 let keypair = fx.ecdsa("test", EcdsaSpec::es256());
370 let _ = keypair.p384_signing_key();
371 }
372
373 #[test]
374 #[should_panic(expected = "expected P-256")]
375 fn test_p256_on_p384_key_panics() {
376 let fx = Factory::random();
377 let keypair = fx.ecdsa("test", EcdsaSpec::es384());
378 let _ = keypair.p256_signing_key();
379 }
380 }
381
382 #[cfg(feature = "ed25519")]
383 mod ed25519_tests {
384 use crate::RustCryptoEd25519Ext;
385 use ed25519_dalek::Signer;
386 use ed25519_dalek::Verifier;
387 use uselesskey_core::Factory;
388 use uselesskey_ed25519::{Ed25519FactoryExt, Ed25519Spec};
389
390 #[test]
391 fn test_ed25519_sign_verify() {
392 let fx = Factory::random();
393 let keypair = fx.ed25519("test", Ed25519Spec::new());
394
395 let signing_key = keypair.ed25519_signing_key();
396 let signature = signing_key.sign(b"test message");
397
398 let verifying_key = keypair.ed25519_verifying_key();
399 verifying_key
400 .verify(b"test message", &signature)
401 .expect("verify");
402 }
403 }
404
405 #[cfg(feature = "hmac")]
406 mod hmac_tests {
407 use crate::RustCryptoHmacExt;
408 use hmac::Mac;
409 use uselesskey_core::Factory;
410 use uselesskey_hmac::{HmacFactoryExt, HmacSpec};
411
412 #[test]
413 fn test_hmac_sha256() {
414 let fx = Factory::random();
415 let secret = fx.hmac("test", HmacSpec::hs256());
416
417 let mut mac = secret.hmac_sha256();
418 mac.update(b"test message");
419 let result = mac.finalize();
420
421 let mut mac2 = secret.hmac_sha256();
423 mac2.update(b"test message");
424 mac2.verify(&result.into_bytes()).expect("verify");
425 }
426
427 #[test]
428 fn test_hmac_sha384() {
429 let fx = Factory::random();
430 let secret = fx.hmac("test", HmacSpec::hs384());
431
432 let mut mac = secret.hmac_sha384();
433 mac.update(b"test message");
434 let result = mac.finalize();
435
436 let mut mac2 = secret.hmac_sha384();
437 mac2.update(b"test message");
438 mac2.verify(&result.into_bytes()).expect("verify");
439 }
440
441 #[test]
442 fn test_hmac_sha512() {
443 let fx = Factory::random();
444 let secret = fx.hmac("test", HmacSpec::hs512());
445
446 let mut mac = secret.hmac_sha512();
447 mac.update(b"test message");
448 let result = mac.finalize();
449
450 let mut mac2 = secret.hmac_sha512();
451 mac2.update(b"test message");
452 mac2.verify(&result.into_bytes()).expect("verify");
453 }
454 }
455}