ytls_rustcrypto/sign/
sign_p256.rs

1//! yTLS RustCrypto ECDSA p256 Signer
2
3use p256::ecdsa::{signature::Signer, Signature, SigningKey};
4use ytls_traits::CryptoSignerP256Processor;
5
6/// RustCrypto ECDSA p256 Signer
7pub struct SignP256 {
8    signing_key: SigningKey,
9}
10
11impl SignP256 {
12    #[inline]
13    pub fn sign_p256_init(key: &[u8]) -> Option<Self> {
14        // SAFETY: The key input length is guarded to be correct
15        let signing_key = match SigningKey::try_from(key) {
16            Ok(k) => k,
17            Err(_) => return None,
18        };
19        Some(Self { signing_key })
20    }
21}
22
23impl CryptoSignerP256Processor for SignP256 {
24    #[inline]
25    fn sign_p256(&self, content: &[u8], output: &mut [u8]) -> Option<usize> {
26        let signature: Signature = self.signing_key.sign(content);
27        let der_bytes = signature.to_der();
28        let bytes = der_bytes.as_bytes();
29
30        if bytes.len() > output.len() {
31            return None;
32        }
33
34        output[0..bytes.len()].copy_from_slice(bytes);
35
36        Some(bytes.len())
37    }
38}