Objective-C
Objective-C
Create XAdES using Smart Card or USB Token
See more XAdES Examples
Demonstrates how to create an XAdES signed XML document using a certificate located on a smartcard or USB token.Chilkat Objective-C Downloads
#import <CkoXml.h>
#import <CkoXmlDSigGen.h>
#import <CkoCert.h>
#import <CkoStringBuilder.h>
#import <CkoXmlDSig.h>
BOOL success = NO;
// Load the XML to be signed.
CkoXml *xmlToSign = [[CkoXml alloc] init];
success = [xmlToSign LoadXmlFile: @"qa_data/fattura_electronica/docToSign.xml"];
if (success == NO) {
NSLog(@"%@",xmlToSign.LastErrorText);
return;
}
CkoXmlDSigGen *gen = [[CkoXmlDSigGen alloc] init];
gen.SigLocation = @"p:FatturaElettronica";
gen.SigId = @"xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504";
gen.SigNamespacePrefix = @"ds";
gen.SigNamespaceUri = @"http://www.w3.org/2000/09/xmldsig#";
gen.SigValueId = @"xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-sigvalue";
gen.SignedInfoCanonAlg = @"C14N";
gen.SignedInfoDigestMethod = @"sha256";
// Create an Object to be added to the Signature.
// Note: Chilkat will automatically populate the strings indicated by "TO BE GENERATED BY CHILKAT" with actual/correct values
// when the XML is signed.
CkoXml *object1 = [[CkoXml alloc] init];
object1.Tag = @"xades:QualifyingProperties";
[object1 AddAttribute: @"xmlns:xades" value: @"http://uri.etsi.org/01903/v1.3.2#"];
[object1 AddAttribute: @"xmlns:xades141" value: @"http://uri.etsi.org/01903/v1.4.1#"];
[object1 AddAttribute: @"Target" value: @"#xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504"];
[object1 UpdateAttrAt: @"xades:SignedProperties" autoCreate: YES attrName: @"Id" attrValue: @"xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-signedprops"];
[object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime" value: @"TO BE GENERATED BY CHILKAT"];
[object1 UpdateAttrAt: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestMethod" autoCreate: YES attrName: @"Algorithm" attrValue: @"http://www.w3.org/2001/04/xmlenc#sha256"];
[object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestValue" value: @"TO BE GENERATED BY CHILKAT"];
[object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:IssuerSerialV2" value: @"TO BE GENERATED BY CHILKAT"];
[gen AddObject: @"" content: [object1 GetXml] mimeType: @"" encoding: @""];
// -------- Reference 1 --------
gen.KeyInfoId = @"xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-keyinfo";
[gen AddSameDocRef: @"xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-keyinfo" digestMethod: @"sha256" canonMethod: @"" prefixList: @"" refType: @""];
// -------- Reference 2 --------
[gen AddSameDocRef: @"" digestMethod: @"sha256" canonMethod: @"" prefixList: @"" refType: @""];
[gen SetRefIdAttr: @"" value: @"xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-ref0"];
// -------- Reference 3 --------
[gen AddObjectRef: @"xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-signedprops" digestMethod: @"sha256" canonMethod: @"" prefixList: @"" refType: @"http://uri.etsi.org/01903#SignedProperties"];
// ----------------------------------------------------------------
// Load a certificate that has been pre-installed on the Windows system
// This includes certificates on smartcards and USB tokens
CkoCert *cert = [[CkoCert alloc] init];
// You may provide the PIN here..
cert.SmartCardPin = @"000000";
// Load the certificate on the smartcard currently in the reader (or on the USB token).
// Pass an empty string to allow Chilkat to automatically choose the CSP (Cryptographi Service Provider).
// See Load Certificate on Smartcard for information about explicitly selecting a particular CSP.
success = [cert LoadFromSmartcard: @""];
if (success == NO) {
NSLog(@"%@",cert.LastErrorText);
return;
}
[gen SetX509Cert: cert usePrivateKey: YES];
gen.KeyInfoType = @"X509Data";
gen.X509Type = @"Certificate";
// Load XML to be signed...
CkoStringBuilder *sbXml = [[CkoStringBuilder alloc] init];
[xmlToSign GetXmlSb: sbXml];
gen.Behaviors = @"IndentedSignature,ForceAddEnvelopedSignatureTransform";
// Sign the XML...
success = [gen CreateXmlDSigSb: sbXml];
if (success == NO) {
NSLog(@"%@",gen.LastErrorText);
return;
}
// Save the signed XMl to a file.
success = [sbXml WriteFile: @"qa_output/signedXml.xml" charset: @"utf-8" emitBom: NO];
NSLog(@"%@",[sbXml GetAsString]);
// ----------------------------------------
// Verify the signature we just produced...
CkoXmlDSig *verifier = [[CkoXmlDSig alloc] init];
success = [verifier LoadSignatureSb: sbXml];
if (success == NO) {
NSLog(@"%@",verifier.LastErrorText);
return;
}
BOOL verified = [verifier VerifySignature: YES];
if (verified != YES) {
NSLog(@"%@",verifier.LastErrorText);
return;
}
NSLog(@"%@",@"This signature was successfully verified.");