ytls_rustcrypto/sign/
sign_p256.rs1use p256::ecdsa::{signature::Signer, Signature, SigningKey};
4use ytls_traits::CryptoSignerP256Processor;
5
6pub struct SignP256 {
8 signing_key: SigningKey,
9}
10
11impl SignP256 {
12 #[inline]
13 pub fn sign_p256_init(key: &[u8]) -> Option<Self> {
14 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}