Sample code for 30+ languages & platforms
Zig Requires Chilkat v11.0.0+

Create EBICS SignaturePubKeyOrderData XML

See more EBICS Examples

Demonstrates how to create the EBICS SignaturePubKeyOrderData XML. (EBICS is the Electronic Banking Internet Communication Standard)

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

    // This example assumes the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    // The goal of this example is to create the XML shown below from the certificate to be used for signing.

    // <?xml version="1.0" encoding="UTF-8"?>
    // <SignaturePubKeyOrderData xmlns="http://www.ebics.org/S001" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ebics.org/S002">
    //   <SignaturePubKeyInfo>
    //     <ds:X509Data>
    //       <X509IssuerSerial>
    //         <ds:X509IssuerName>C=FR, O=Example, OU=1234, CN=Example eID User, OrganizationID=SI:FR-1234</ds:X509IssuerName>
    //         <ds:X509SerialNumber>73FFFFB881F1629982F787DF161EFFFF</ds:X509SerialNumber>
    //       </X509IssuerSerial>
    //       <ds:X509Certificate>
    //         MIIJT...kE=
    //       </ds:X509Certificate>
    //     </ds:X509Data>
    //     <PubKeyValue>
    //       <ds:RSAPublicKey>
    //        <ds:Modulus>wedQ...22Kw==</ds:Modulus>
    //         <ds:Exponent>AQAB</ds:Exponent>
    //       </ds:RSAPublicKey>
    //     </PubKeyValue>
    //     <SignatureVersion>A005</SignatureVersion>
    //   </SignaturePubKeyInfo>
    //   <PartnerID/>
    //   <UserID/>
    // </SignaturePubKeyOrderData>

    const cert = try chilkat.Cert.init();
    defer cert.deinit();
    cert.loadPfxFile("qa_data/pfx/cert_test123.pfx", "test123") catch {
        std.debug.print("{s}\n", .{try cert.getLastErrorText(alloc)});
        return;
    };

    const xml = try chilkat.Xml.init();
    defer xml.deinit();
    xml.setTag("SignaturePubKeyOrderData");
    xml.addAttribute("xmlns", "http://www.ebics.org/S001") catch {};
    xml.addAttribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#") catch {};
    xml.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance") catch {};
    xml.addAttribute("xsi:schemaLocation", "http://www.ebics.org/S002") catch {};
    xml.updateChildContent("SignaturePubKeyInfo|ds:X509Data|X509IssuerSerial|ds:X509IssuerName", try cert.getIssuerDN(alloc));
    xml.updateChildContent("SignaturePubKeyInfo|ds:X509Data|X509IssuerSerial|ds:X509SerialNumber", try cert.getSerialNumber(alloc));
    xml.updateChildContent("SignaturePubKeyInfo|ds:X509Data|ds:X509Certificate", try cert.getEncoded(alloc));

    const pubkey = try chilkat.PublicKey.init();
    defer pubkey.deinit();
    cert.getPublicKey(pubkey) catch {};

    const xml_pub_key = try chilkat.Xml.init();
    defer xml_pub_key.deinit();
    xml_pub_key.loadXml(try pubkey.getXml(alloc)) catch {};

    // The public key XML will look like this:
    //
    // <RSAPublicKey>
    //   <Modulus>...</Modulus>
    //   <Exponent>...</Exponent>
    // </RSAPublicKey>

    xml.updateChildContent("SignaturePubKeyInfo|PubKeyValue|ds:RSAPublicKey|ds:Modulus", try xml_pub_key.getChildContent(alloc, "Modulus"));
    xml.updateChildContent("SignaturePubKeyInfo|PubKeyValue|ds:RSAPublicKey|ds:Exponent", try xml_pub_key.getChildContent(alloc, "Exponent"));
    xml.updateChildContent("SignaturePubKeyInfo|SignatureVersion", "A005");
    xml.updateChildContent("PartnerID", "");
    xml.updateChildContent("UserID", "");

    std.debug.print("{s}\n", .{try xml.getXml(alloc)});
}