1use std::sync::Arc;
2
3use puffin::algebra::error::FnError;
4use ring::signature::RsaKeyPair;
5
6use crate::tls::rustls::key::PrivateKey;
7use crate::tls::rustls::msgs::enums::SignatureScheme;
8use crate::tls::rustls::sign::{EcdsaSigningKey, RsaSigner, SigningKey};
9
10pub fn rsa_sign(
11 message: &[u8],
12 private_key: &[u8],
13 scheme: &SignatureScheme,
14) -> Result<Vec<u8>, FnError> {
15 let invalid_scheme = !matches!(
16 scheme,
17 SignatureScheme::RSA_PKCS1_SHA256
18 | SignatureScheme::RSA_PKCS1_SHA384
19 | SignatureScheme::RSA_PKCS1_SHA512
20 | SignatureScheme::RSA_PSS_SHA256
21 | SignatureScheme::RSA_PSS_SHA384
22 | SignatureScheme::RSA_PSS_SHA512
23 );
24
25 if invalid_scheme {
26 return Err(FnError::Crypto("Unknown signature scheme".to_string()));
27 }
28
29 let key = RsaKeyPair::from_der(private_key)
30 .map_err(|_| FnError::Crypto("Failed to parse rsa key.".to_string()))?;
31
32 let signer = RsaSigner::new(
33 Arc::new(key),
34 *scheme,
35 Box::new(ring::test::rand::FixedByteRandom { byte: 43 }),
36 );
37 signer
38 .sign(message)
39 .map_err(|_err| FnError::Crypto("Failed to sign using RSA key".to_string()))
40}
41
42pub fn ecdsa_sign(message: &[u8], private_key: &[u8]) -> Result<Vec<u8>, FnError> {
43 let key = EcdsaSigningKey::new(
44 &PrivateKey(private_key.to_vec()),
45 SignatureScheme::ECDSA_NISTP256_SHA256,
46 &ring::signature::ECDSA_P256_SHA256_ASN1_SIGNING,
47 )
48 .map_err(|_| FnError::Crypto("Failed to parse ecdsa key.".to_string()))?;
49
50 let signer = key
51 .choose_scheme(
52 &[SignatureScheme::ECDSA_NISTP256_SHA256],
53 Box::new(ring::test::rand::FixedByteRandom { byte: 43 }),
54 )
55 .ok_or_else(|| FnError::Crypto("Failed to find signature scheme.".to_string()))?;
56
57 signer
58 .sign(message)
59 .map_err(|_err| FnError::Crypto("Failed to sign using ECDHE key".to_string()))
60}