Sample code for 30+ languages & platforms
Objective-C

SII XML Digital Signature

See more uncategorized Examples

Example for SII XML Digital Signature.

Chilkat Objective-C Downloads

Objective-C
#import <CkoXml.h>
#import <CkoXmlDSigGen.h>
#import <CkoCert.h>
#import <CkoStringBuilder.h>
#import <CkoXmlDSig.h>

BOOL success = NO;

success = YES;

// Load the XML to be signed.
CkoXml *xmlToSign = [[CkoXml alloc] init];
success = [xmlToSign LoadXmlFile: @"c:/aaworkarea/eduardo/sii_unsigned.xml"];
if (success == NO) {
    NSLog(@"%@",xmlToSign.LastErrorText);
    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>

CkoXmlDSigGen *gen = [[CkoXmlDSigGen alloc] init];

gen.SigLocation = @"EnvioDTE|SetDTE|DTE";
gen.SigLocationMod = [NSNumber numberWithInt:0];
gen.SigNamespacePrefix = @"";
gen.SigNamespaceUri = @"http://www.w3.org/2000/09/xmldsig#";
gen.SignedInfoCanonAlg = @"C14N";
gen.SignedInfoDigestMethod = @"sha1";

// -------- Reference 1 --------
CkoXml *xml1 = [[CkoXml alloc] init];
xml1.Tag = @"Transforms";
[xml1 UpdateAttrAt: @"Transform" autoCreate: YES attrName: @"Algorithm" attrValue: @"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"];

[gen AddSameDocRef2: @"F511T33" digestMethod: @"sha1" transforms: xml1 refType: @""];

// Provide a certificate + private key. (PFX password is test123)
CkoCert *cert = [[CkoCert alloc] init];
success = [cert LoadPfxFile: @"qa_data/pfx/cert_test123.pfx" password: @"test123"];
if (success != YES) {
    NSLog(@"%@",cert.LastErrorText);
    return;
}

[gen SetX509Cert: cert usePrivateKey: YES];

gen.KeyInfoType = @"X509Data+KeyValue";
gen.X509Type = @"Certificate";

// Load XML to be signed...
CkoStringBuilder *sbXml = [[CkoStringBuilder alloc] init];
[xmlToSign GetXmlSb: sbXml];

gen.Behaviors = @"IndentedSignature";

// Sign the XML...
success = [gen CreateXmlDSigSb: sbXml];
if (success != YES) {
    NSLog(@"%@",gen.LastErrorText);
    return;
}

// -----------------------------------------------

// Save the signed XML to a file.
success = [sbXml WriteFile: @"c:/temp/qa_output/signedXml.xml" charset: @"utf-8" emitBom: NO];

NSLog(@"%@",[sbXml GetAsString]);

// ----------------------------------------
// Verify the signatures we just produced...
CkoXmlDSig *verifier = [[CkoXmlDSig alloc] init];
success = [verifier LoadSignatureSb: sbXml];
if (success != YES) {
    NSLog(@"%@",verifier.LastErrorText);
    return;
}

int numSigs = [verifier.NumSignatures intValue];
int verifyIdx = 0;
while (verifyIdx < numSigs) {
    verifier.Selector = [NSNumber numberWithInt: verifyIdx];
    BOOL verified = [verifier VerifySignature: YES];
    if (verified != YES) {
        NSLog(@"%@",verifier.LastErrorText);
        return;
    }

    verifyIdx = verifyIdx + 1;
}

NSLog(@"%@",@"All signatures were successfully verified.");