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 1See more TicketBAI ExamplesFirst 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: @"B00000034"]; [xmlToSign UpdateChildContent: @"Sujetos|Destinatarios|IDDestinatario|ApellidosNombreRazonSocial" value: @"CONSULTORIA GALDETU"]; [xmlToSign UpdateChildContent: @"Factura|CabeceraFactura|SerieFactura" value: @"A2022"]; [xmlToSign UpdateChildContent: @"Factura|CabeceraFactura|NumFactura" value: @"0399"]; [xmlToSign UpdateChildContent: @"Factura|CabeceraFactura|FechaExpedicionFactura" value: @"06-05-2022"]; [xmlToSign UpdateChildContent: @"Factura|CabeceraFactura|HoraExpedicionFactura" value: @"10:30:28"]; [xmlToSign UpdateChildContent: @"Factura|DatosFactura|DescripcionFactura" value: @"Venta Fotocopister�a"]; [xmlToSign UpdateChildContent: @"Factura|DatosFactura|ImporteTotalFactura" value: @"31.46"]; [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: @"26.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: @"5.46"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|EncadenamientoFacturaAnterior|SerieFacturaAnterior" value: @"A2022"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|EncadenamientoFacturaAnterior|NumFacturaAnterior" value: @"0398"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|EncadenamientoFacturaAnterior|FechaExpedicionFacturaAnterior" value: @"05-05-2022"]; [xmlToSign UpdateChildContent: @"HuellaTBAI|EncadenamientoFacturaAnterior|SignatureValueFirmaFacturaAnterior" value: @"KwXaQec65SKpVP7EU9o4nUXOx7SAftIToFsxH+2j2tXPXhpBUnS26dhdSpiMl2DlTuqRsFdZfWyYazaGHgSRQHZZAnFtpbi4BeMk"]; [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-63c35f38-2b5f-4600-b3da-3ddee86d62b3-Signature"; gen.SigNamespacePrefix = @"ds"; gen.SigNamespaceUri = @"http://www.w3.org/2000/09/xmldsig#"; gen.SigValueId = @"Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignatureValue"; gen.SignedInfoCanonAlg = @"C14N"; gen.SignedInfoDigestMethod = @"sha256"; // Set the KeyInfoId before adding references.. gen.KeyInfoId = @"Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-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-63c35f38-2b5f-4600-b3da-3ddee86d62b3-QualifyingProperties"]; [object1 AddAttribute: @"Target" value: @"#Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-Signature"]; [object1 AddAttribute: @"xmlns:ds" value: @"http://www.w3.org/2000/09/xmldsig#"]; [object1 UpdateAttrAt: @"xades:SignedProperties" autoCreate: YES attrName: @"Id" attrValue: @"Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-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-7e6f3481-4acc-47de-90fd-67878ad15e8e"]; [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-7e6f3481-4acc-47de-90fd-67878ad15e8e"]; // -------- Reference 2 -------- [gen AddObjectRef: @"Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignedProperties" digestMethod: @"sha512" canonMethod: @"" prefixList: @"" refType: @"http://uri.etsi.org/01903#SignedProperties"]; // -------- Reference 3 -------- [gen AddSameDocRef: @"Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-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 = @"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_1.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.