Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Objective-C) XML-DSig Add Reference with Transforms Specified ExplicitlyDemonstrates how to use the new AddSameDocRef2 method to explicitly specify the XML Transforms fragment.
#import <CkoXml.h> #import <CkoXmlDSigGen.h> #import <CkoCert.h> #import <CkoStringBuilder.h> #import <CkoXmlDSig.h> // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. BOOL success = YES; // Create the following XML to be signed: // <doc> // <s id="s1">Some text...</s> // <p>Some text...</p> // <p class="note">A note...</p> // </doc> // Use this online tool to generate code from sample XML: // Generate Code to Create XML CkoXml *xmlToSign = [[CkoXml alloc] init]; xmlToSign.Tag = @"doc"; [xmlToSign UpdateAttrAt: @"s" autoCreate: YES attrName: @"id" attrValue: @"s1"]; [xmlToSign UpdateChildContent: @"s" value: @"Some text..."]; [xmlToSign UpdateChildContent: @"p" value: @"Some text..."]; [xmlToSign UpdateAttrAt: @"p[1]" autoCreate: YES attrName: @"class" attrValue: @"note"]; [xmlToSign UpdateChildContent: @"p[1]" value: @"A note..."]; NSLog(@"%@",[xmlToSign GetXml]); CkoXmlDSigGen *gen = [[CkoXmlDSigGen alloc] init]; gen.SigLocation = @"doc"; gen.SigLocationMod = [NSNumber numberWithInt:0]; gen.SigId = @"Signature-78f29839-06af-448f-b479-ca46457fab1b-Signature"; gen.SigNamespacePrefix = @"ds"; gen.SigNamespaceUri = @"http://www.w3.org/2000/09/xmldsig#"; gen.SigValueId = @"Signature-78f29839-06af-448f-b479-ca46457fab1b-SignatureValue"; gen.SignedInfoCanonAlg = @"C14N"; gen.SignedInfoDigestMethod = @"sha1"; // Set the KeyInfoId before adding references.. gen.KeyInfoId = @"Signature-78f29839-06af-448f-b479-ca46457fab1b-KeyInfo"; // The following XML to be added as an Object to the Signature // Use this online tool to generate code from sample XML: // Generate Code to Create XML // <xades:QualifyingProperties Id="Signature-78f29839-06af-448f-b479-ca46457fab1b-QualifyingProperties" Target="#Signature-78f29839-06af-448f-b479-ca46457fab1b-Signature" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#"> // <xades:SignedProperties Id="Signature-78f29839-06af-448f-b479-ca46457fab1b-SignedProperties"> // <xades:SignedSignatureProperties> // <xades:SigningTime>TO BE GENERATED BY CHILKAT</xades:SigningTime> // <xades:SigningCertificate> // <xades:Cert> // <xades:CertDigest> // <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> // <ds:DigestValue>TO BE GENERATED BY CHILKAT</ds:DigestValue> // </xades:CertDigest> // <xades:IssuerSerial> // <ds:X509IssuerName>TO BE GENERATED BY CHILKAT</ds:X509IssuerName> // <ds:X509SerialNumber>TO BE GENERATED BY CHILKAT</ds:X509SerialNumber> // </xades:IssuerSerial> // </xades:Cert> // </xades:SigningCertificate> // </xades:SignedSignatureProperties> // <xades:SignedDataObjectProperties> // <xades:DataObjectFormat ObjectReference="#Reference-24eb6003-d41c-442c-a731-d4c58f94790b"> // <xades:Description/> // <xades:ObjectIdentifier> // <xades:Identifier Qualifier="OIDAsURN">urn:oid:1.2.840.10003.5.109.10</xades:Identifier> // <xades:Description/> // </xades:ObjectIdentifier> // <xades:MimeType>text/xml</xades:MimeType> // <xades:Encoding/> // </xades:DataObjectFormat> // </xades:SignedDataObjectProperties> // </xades:SignedProperties> // </xades:QualifyingProperties> CkoXml *object1 = [[CkoXml alloc] init]; object1.Tag = @"xades:QualifyingProperties"; [object1 AddAttribute: @"Id" value: @"Signature-78f29839-06af-448f-b479-ca46457fab1b-QualifyingProperties"]; [object1 AddAttribute: @"Target" value: @"#Signature-78f29839-06af-448f-b479-ca46457fab1b-Signature"]; [object1 AddAttribute: @"xmlns:ds" value: @"http://www.w3.org/2000/09/xmldsig#"]; [object1 AddAttribute: @"xmlns:xades" value: @"http://uri.etsi.org/01903/v1.3.2#"]; [object1 UpdateAttrAt: @"xades:SignedProperties" autoCreate: YES attrName: @"Id" attrValue: @"Signature-78f29839-06af-448f-b479-ca46457fab1b-SignedProperties"]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime" value: @"TO BE GENERATED BY CHILKAT"]; // Note: It may be that http://www.w3.org/2001/04/xmlenc#sha256 is needed in the following line instead of http://www.w3.org/2000/09/xmldsig#sha1 [object1 UpdateAttrAt: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestMethod" autoCreate: YES attrName: @"Algorithm" attrValue: @"http://www.w3.org/2000/09/xmldsig#sha1"]; [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"]; [object1 UpdateAttrAt: @"xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat" autoCreate: YES attrName: @"ObjectReference" attrValue: @"#Reference-24eb6003-d41c-442c-a731-d4c58f94790b"]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Description" value: @""]; [object1 UpdateAttrAt: @"xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier" autoCreate: YES attrName: @"Qualifier" attrValue: @"OIDAsURN"]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier" value: @"urn:oid:1.2.840.10003.5.109.10"]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Description" value: @""]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:MimeType" value: @"text/xml"]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Encoding" value: @""]; NSLog(@"%@",[object1 GetXml]); [gen AddObject: @"" content: [object1 GetXml] mimeType: @"" encoding: @""]; // -------- Reference 1 -------- // Create the following Transforms fragment: // Use this online tool to generate code from sample XML: // Generate Code to Create XML // <ds:Transforms> // <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> // <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> // <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> // <ds:XPath xmlns:ds="http://www.w3.org/2000/09/xmldsig#">not(ancestor-or-self::ds:Signature)</ds:XPath> // </ds:Transform> // </ds:Transforms> CkoXml *xml1 = [[CkoXml alloc] init]; xml1.Tag = @"ds:Transforms"; [xml1 UpdateAttrAt: @"ds:Transform" autoCreate: YES attrName: @"Algorithm" attrValue: @"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"]; [xml1 UpdateAttrAt: @"ds:Transform[1]" autoCreate: YES attrName: @"Algorithm" attrValue: @"http://www.w3.org/2000/09/xmldsig#enveloped-signature"]; [xml1 UpdateAttrAt: @"ds:Transform[2]" autoCreate: YES attrName: @"Algorithm" attrValue: @"http://www.w3.org/TR/1999/REC-xpath-19991116"]; [xml1 UpdateAttrAt: @"ds:Transform[2]|ds:XPath" autoCreate: YES attrName: @"xmlns:ds" attrValue: @"http://www.w3.org/2000/09/xmldsig#"]; [xml1 UpdateChildContent: @"ds:Transform[2]|ds:XPath" value: @"not(ancestor-or-self::ds:Signature)"]; // This is the "Transforms" XML fragment passed to AddSameDocRef2. NSLog(@"%@",[xml1 GetXml]); [gen AddSameDocRef2: @"" digestMethod: @"sha1" transforms: xml1 refType: @""]; [gen SetRefIdAttr: @"" value: @"Reference-24eb6003-d41c-442c-a731-d4c58f94790b"]; // -------- Reference 2 -------- [gen AddObjectRef: @"Signature-78f29839-06af-448f-b479-ca46457fab1b-SignedProperties" digestMethod: @"sha1" canonMethod: @"" prefixList: @"" refType: @"http://uri.etsi.org/01903#SignedProperties"]; // -------- Reference 3 -------- [gen AddSameDocRef: @"Signature-78f29839-06af-448f-b479-ca46457fab1b-KeyInfo" digestMethod: @"sha1" canonMethod: @"" prefixList: @"" 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 = @"CertChain"; // 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: @"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."); |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.