tlspuffin/tls/
sign.rs

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}