parco_ws_security/
sign.rs

1use base64::Engine;
2use parco_xml::Xml;
3use rsa::{
4    RsaPrivateKey,
5    pkcs1v15::SigningKey,
6    signature::{SignatureEncoding, Signer},
7};
8use sha1::Sha1;
9
10use crate::SignedInfo;
11
12impl SignedInfo {
13    /// Signs the canonicalized XML using an RSA private key.
14    pub fn sign_with_private_key(&self, private_key: RsaPrivateKey) -> String {
15        let signing_key = SigningKey::<Sha1>::new(private_key);
16        self.sign_with_signing_key(&signing_key)
17    }
18
19    /// Signs the canonicalized XML using an existing signing key.
20    pub fn sign_with_signing_key(&self, signing_key: &SigningKey<Sha1>) -> String {
21        let xml = self.xml();
22        let signature_bytes = signing_key.sign(xml.as_bytes());
23
24        base64::engine::general_purpose::STANDARD.encode(signature_bytes.to_bytes())
25    }
26}