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) TicketBAI Sign XML Example 2See more TicketBAI ExamplesSecond example to demonstrate how to sign XML for TicketBAI.
#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 XML to be signed... CkoXml *xmlToSign = [[CkoXml alloc] init]; xmlToSign.Tag = @"T:TicketBai"; [xmlToSign AddAttribute: @"xmlns:T" value: @"urn:ticketbai:emision"]; [xmlToSign UpdateChildContent: @"Cabecera|IDVersionTBAI" value: @"1.2"]; [xmlToSign UpdateChildContent: @"Sujetos|Emisor|NIF" value: @"79732487C"]; [xmlToSign UpdateChildContent: @"Sujetos|Emisor|ApellidosNombreRazonSocial" value: @"ARRIOLA LEJARDI ANE"]; [xmlToSign UpdateChildContent: @"Sujetos|Destinatarios|IDDestinatario|NIF" value: @"A48012363"]; [xmlToSign UpdateChildContent: @"Sujetos|Destinatarios|IDDestinatario|ApellidosNombreRazonSocial" value: @"ACADEMIA ESKOLA"]; [xmlToSign UpdateChildContent: @"Factura|CabeceraFactura|SerieFactura" value: @"A2022"]; [xmlToSign UpdateChildContent: @"Factura|CabeceraFactura|NumFactura" value: @"0400"]; [xmlToSign UpdateChildContent: @"Factura|CabeceraFactura|FechaExpedicionFactura" value: @"12-05-2022"]; [xmlToSign UpdateChildContent: @"Factura|CabeceraFactura|HoraExpedicionFactura" value: @"12:20:15"]; [xmlToSign UpdateChildContent: @"Factura|DatosFactura|DescripcionFactura" value: @"Venta maquinaria y existencias"]; [xmlToSign UpdateChildContent: @"Factura|DatosFactura|ImporteTotalFactura" value: @"1936.00"]; [xmlToSign UpdateChildContent: @"Factura|DatosFactura|Claves|IDClave|ClaveRegimenIvaOpTrascendencia" value: @"01"]; [xmlToSign UpdateChildContent: @"Factura|TipoDesglose|DesgloseFactura|Sujeta|NoExenta|DetalleNoExenta|TipoNoExenta" value: @"S1"]; [xmlToSign UpdateChildContent: @"Factura|TipoDesglose|DesgloseFactura|Sujeta|NoExenta|DetalleNoExenta|DesgloseIVA|DetalleIVA|BaseImponible" value: @"1600.00"]; [xmlToSign UpdateChildContent: @"Factura|TipoDesglose|DesgloseFactura|Sujeta|NoExenta|DetalleNoExenta|DesgloseIVA|DetalleIVA|TipoImpositivo" value: @"21.00"]; [xmlToSign UpdateChildContent: @"Factura|TipoDesglose|DesgloseFactura|Sujeta|NoExenta|DetalleNoExenta|DesgloseIVA|DetalleIVA|CuotaImpuesto" value: @"336.00"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|EncadenamientoFacturaAnterior|SerieFacturaAnterior" value: @"A2022"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|EncadenamientoFacturaAnterior|NumFacturaAnterior" value: @"0399"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|EncadenamientoFacturaAnterior|FechaExpedicionFacturaAnterior" value: @"06-05-2022"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|EncadenamientoFacturaAnterior|SignatureValueFirmaFacturaAnterior" value: @"KdxKFNXeNJuBZNjgvKEa9lICamXs9MHuin6R+yuFHZw9aMewuBvdhaMr7g0eUz8aNYEa1elpCTr7aLgVZjQrFQK/TjIg353iAVxA"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|Software|LicenciaTBAI" value: @"TBAIPRUEBA"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|Software|EntidadDesarrolladora|NIF" value: @"A48119820"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|Software|Nombre" value: @"DFBTBAI"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|Software|Version" value: @"1.04.00"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|NumSerieDispositivo" value: @"GP4FC5J"]; CkoXmlDSigGen *gen = [[CkoXmlDSigGen alloc] init]; gen.SigLocation = @"T:TicketBai"; gen.SigLocationMod = [NSNumber numberWithInt:0]; gen.SigId = @"Signature-43861174-a0e6-45f9-afbf-8b48c46c6c13-Signature"; gen.SigNamespacePrefix = @"ds"; gen.SigNamespaceUri = @"http://www.w3.org/2000/09/xmldsig#"; gen.SigValueId = @"Signature-43861174-a0e6-45f9-afbf-8b48c46c6c13-SignatureValue"; gen.SignedInfoCanonAlg = @"C14N"; gen.SignedInfoDigestMethod = @"sha256"; // Set the KeyInfoId before adding references.. gen.KeyInfoId = @"Signature-43861174-a0e6-45f9-afbf-8b48c46c6c13-KeyInfo"; // Create an Object to be added to the Signature. CkoXml *object1 = [[CkoXml alloc] init]; object1.Tag = @"xades:QualifyingProperties"; [object1 AddAttribute: @"xmlns:xades" value: @"http://uri.etsi.org/01903/v1.3.2#"]; [object1 AddAttribute: @"Id" value: @"Signature-43861174-a0e6-45f9-afbf-8b48c46c6c13-QualifyingProperties"]; [object1 AddAttribute: @"Target" value: @"#Signature-43861174-a0e6-45f9-afbf-8b48c46c6c13-Signature"]; [object1 AddAttribute: @"xmlns:ds" value: @"http://www.w3.org/2000/09/xmldsig#"]; [object1 UpdateAttrAt: @"xades:SignedProperties" autoCreate: YES attrName: @"Id" attrValue: @"Signature-43861174-a0e6-45f9-afbf-8b48c46c6c13-SignedProperties"]; [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#sha512"]; [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 UpdateChildContent: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Identifier" value: @"https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf"]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Description" value: @""]; [object1 UpdateAttrAt: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestMethod" autoCreate: YES attrName: @"Algorithm" attrValue: @"http://www.w3.org/2001/04/xmlenc#sha256"]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestValue" value: @"Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es="]; [object1 UpdateChildContent: @"xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyQualifiers|xades:SigPolicyQualifier|xades:SPURI" value: @"https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf"]; [object1 UpdateAttrAt: @"xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat" autoCreate: YES attrName: @"ObjectReference" attrValue: @"#Reference-43b5c8a3-7ce0-4056-bdbe-d2076d8ac825"]; [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: @""]; [gen AddObject: @"" content: [object1 GetXml] mimeType: @"" encoding: @""]; // -------- Reference 1 -------- [gen AddSameDocRef: @"" digestMethod: @"sha512" canonMethod: @"C14N" prefixList: @"" refType: @"http://www.w3.org/2000/09/xmldsig#Object"]; [gen SetRefIdAttr: @"" value: @"Reference-43b5c8a3-7ce0-4056-bdbe-d2076d8ac825"]; // -------- Reference 2 -------- [gen AddObjectRef: @"Signature-43861174-a0e6-45f9-afbf-8b48c46c6c13-SignedProperties" digestMethod: @"sha512" canonMethod: @"" prefixList: @"" refType: @"http://uri.etsi.org/01903#SignedProperties"]; // -------- Reference 3 -------- [gen AddSameDocRef: @"Signature-43861174-a0e6-45f9-afbf-8b48c46c6c13-KeyInfo" digestMethod: @"sha512" 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 = @"Certificate"; // Load XML to be signed... CkoStringBuilder *sbXml = [[CkoStringBuilder alloc] init]; [xmlToSign GetXmlSb: sbXml]; gen.Behaviors = @"IndentedSignature,TransformSignatureXPath"; // 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_2.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.