Rust
Rust
SII XML Digital Signature
See more uncategorized Examples
Example for SII XML Digital Signature.Chilkat Rust Downloads
let _ = true;
// Load the XML to be signed.
let xml_to_sign = chilkat::Xml::new();
if xml_to_sign.load_xml_file("c:/aaworkarea/eduardo/sii_unsigned.xml").is_err() {
println!("{}", xml_to_sign.last_error_text());
return;
}
// The sample XML to be signed looks like this:
// <?xml version="1.0" encoding="ISO-8859-1"?>
// <EnvioDTE xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE_v10.xsd" version="1.0">
// <SetDTE ID="SetDocF0T33_20240425_170512">
// <Caratula version="1.0">
// <RutEmisor>99999999-4</RutEmisor>
// <RutEnvia>12345678-6</RutEnvia>
// <RutReceptor>888888000-K</RutReceptor>
// <FchResol>2014-08-22</FchResol>
// <NroResol>80</NroResol>
// <TmstFirmaEnv>2024-04-25T17:05:13</TmstFirmaEnv>
// <SubTotDTE>
// <TpoDTE>33</TpoDTE>
// <NroDTE>1</NroDTE>
// </SubTotDTE>
// </Caratula>
// <DTE version="1.0">
// <Documento ID="F555T55">
// ...
// </Documento>
// </EnvioDTE>
let gen_ = chilkat::XmlDSigGen::new();
gen_.set_sig_location("EnvioDTE|SetDTE|DTE");
gen_.set_sig_location_mod(0);
gen_.set_sig_namespace_prefix("");
gen_.set_sig_namespace_uri("http://www.w3.org/2000/09/xmldsig#");
gen_.set_signed_info_canon_alg("C14N");
gen_.set_signed_info_digest_method("sha1");
// -------- Reference 1 --------
let xml1 = chilkat::Xml::new();
xml1.set_tag("Transforms");
let _ = xml1.update_attr_at("Transform", true, "Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315");
let _ = gen_.add_same_doc_ref2("F511T33", "sha1", &xml1, "");
// Provide a certificate + private key. (PFX password is test123)
let cert = chilkat::Cert::new();
if cert.load_pfx_file("qa_data/pfx/cert_test123.pfx", "test123").is_err() {
println!("{}", cert.last_error_text());
return;
}
let _ = gen_.set_x509_cert(&cert, true);
gen_.set_key_info_type("X509Data+KeyValue");
gen_.set_x509_type("Certificate");
// Load XML to be signed...
let sb_xml = chilkat::StringBuilder::new();
let _ = xml_to_sign.get_xml_sb(&sb_xml);
gen_.set_behaviors("IndentedSignature");
// Sign the XML...
if gen_.create_xml_d_sig_sb(&sb_xml).is_err() {
println!("{}", gen_.last_error_text());
return;
}
// -----------------------------------------------
// Save the signed XML to a file.
let _ = sb_xml.write_file("c:/temp/qa_output/signedXml.xml", "utf-8", false).is_ok();
println!("{}", sb_xml.get_as_string().unwrap_or_default());
// ----------------------------------------
// Verify the signatures we just produced...
let verifier = chilkat::XmlDSig::new();
if verifier.load_signature_sb(&sb_xml).is_err() {
println!("{}", verifier.last_error_text());
return;
}
let num_sigs = verifier.num_signatures();
let mut verify_idx = 0;
while verify_idx < num_sigs {
verifier.set_selector(verify_idx);
if verifier.verify_signature(true).is_err() {
println!("{}", verifier.last_error_text());
return;
}
verify_idx = verify_idx + 1;
}
println!("All signatures were successfully verified.");