Tcl
Tcl
Cape Verde Fatura Eletrónica XML Digital Signature
See more XML Digital Signatures Examples
Demonstrates how to sign XML to create a signed invoice compatible with the Cape Verde Fatura Eletrónica requirements.Note: This example requires Chilkat v9.5.0.89 or greater for a small feature to provide the ability produce mult-line base64 signature ending with
Chilkat Tcl Downloads
load ./chilkat.dll
set success 0
# This example assumes the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
# First create the following XML to be signed. This can be created programmatically as shown in the code below, or
# you can simply load the XML to be signed from a file..
# <?xml version="1.0" encoding="utf-8"?>
# <Dfe xmlns="urn:cv:efatura:xsd:v1.0" DocumentTypeCode="1" Id="CV2210818123456789000010100000000546735014601" Version="1.0">
# <Invoice>
# <LedCode>1</LedCode>
# <Serie>SL</Serie>
# <DocumentNumber>5</DocumentNumber>
# <IssueDate>2021-08-30</IssueDate>
# <IssueTime>00:01:00</IssueTime>
# <TaxPointDate>2021-08-18</TaxPointDate>
# <EmitterParty>
# <TaxId CountryCode="CV">123456789</TaxId>
# <Name>Maria</Name>
# <Address CountryCode="CV">
# <State>Estado do Emissor</State>
# <City>Cidade do Emissor</City>
# <Region>Regi�o do Emissor</Region>
# <Street>Rua do Emissor</Street>
# <StreetDetail>Detalhe da rua do Emissor</StreetDetail>
# <BuildingName>Pr�dio do Emissor</BuildingName>
# <BuildingNumber>1</BuildingNumber>
# <BuildingFloor>2</BuildingFloor>
# <PostalCode>7600</PostalCode>
# <AddressDetail>Detalhe de endere�o do Emissor</AddressDetail>
# <AddressCode>CV774999999999999319</AddressCode>
# </Address>
# <Contacts>
# <Telephone>1234567</Telephone>
# <Mobilephone>1234568</Mobilephone>
# <Telefax>1234569</Telefax>
# <Email>somebody@example.com</Email>
# <Website>emissor.efatura.cv</Website>
# </Contacts>
# </EmitterParty>
# <ReceiverParty>
# <TaxId CountryCode="CV">123456789</TaxId>
# <Name>Nome do Recetor</Name>
# <Address CountryCode="CV">
# <State>Estado do Recetor</State>
# <City>Cidade do Recetor</City>
# <Region>Regi�o do Recetor</Region>
# <Street>Rua do Recetor</Street>
# <StreetDetail>Detalhe da rua do Recetor</StreetDetail>
# <BuildingName>Pr�dio do Recetor</BuildingName>
# <BuildingNumber>2</BuildingNumber>
# <BuildingFloor>3</BuildingFloor>
# <PostalCode>7601</PostalCode>
# <AddressDetail>Detalhe de endere�o do Recetor</AddressDetail>
# <AddressCode>CV774999999999999319</AddressCode>
# </Address>
# <Contacts>
# <Telephone>2234567</Telephone>
# <Mobilephone>2234568</Mobilephone>
# <Telefax>2234569</Telefax>
# <Email>rector@efatura.cv</Email>
# <Website>rector.efatura.cv</Website>
# </Contacts>
# </ReceiverParty>
# <Lines>
# <Line LineTypeCode="N">
# <Id>01</Id>
# <OrderLineReference>1</OrderLineReference>
# <Quantity UnitCode="EA">3.15</Quantity>
# <Price>123456</Price>
# <PriceExtension>388886</PriceExtension>
# <Discount>15</Discount>
# <NetTotal>252776</NetTotal>
# <Tax TaxTypeCode="IVA">
# <TaxPercentage>15</TaxPercentage>
# </Tax>
# <Item>
# <Description>Telem�vel</Description>
# <Name>Telem�vel</Name>
# <BrandName>Apple</BrandName>
# <ModelName>iPhone X</ModelName>
# <EmitterIdentification>TLMV</EmitterIdentification>
# <StandardIdentification>
# <GTIN>12345</GTIN>
# </StandardIdentification>
# <HazardousRiskIndicator>false</HazardousRiskIndicator>
# </Item>
# </Line>
# </Lines>
# <Totals>
# <PriceExtensionTotalAmount>388886</PriceExtensionTotalAmount>
# <ChargeTotalAmount>0</ChargeTotalAmount>
# <DiscountTotalAmount>136110</DiscountTotalAmount>
# <NetTotalAmount>252776</NetTotalAmount>
# <Discount ValueType="P">20</Discount>
# <TaxTotalAmount>37916</TaxTotalAmount>
# <PayableAmount>290692</PayableAmount>
# </Totals>
# <References>
# <Reference>
# <FiscalDocument IsOldDocument="false">CV1200520123456789000112345678901112345678901</FiscalDocument>
# <PaymentAmount>12345</PaymentAmount>
# <Tax TaxTypeCode="IR">
# <TaxPercentage>10</TaxPercentage>
# </Tax>
# </Reference>
# <Reference>
# <FiscalDocument IsOldDocument="false">CV1200520123456789000112345678901112345678903</FiscalDocument>
# <PaymentAmount>98765</PaymentAmount>
# <Tax TaxTypeCode="IVA">
# <TaxPercentage>15</TaxPercentage>
# </Tax>
# </Reference>
# </References>
# <Payments>
# <PaymentDueDate>2021-12-31</PaymentDueDate>
# <PaymentTerms>
# <Note>Juros de 12% a partir da data de vencimento</Note>
# </PaymentTerms>
# <PayeeFinancialAccount>
# <NIB>123456789012345678901</NIB>
# <Name>Nome da Conta 1</Name>
# </PayeeFinancialAccount>
# <PayeeFinancialAccount>
# <NIB>123456789012345678902</NIB>
# <Name>Nome da Conta 2</Name>
# </PayeeFinancialAccount>
# </Payments>
# <Note>Texto livre</Note>
# </Invoice>
# <Transmission>
# <IssueMode>2</IssueMode>
# <TransmitterTaxId CountryCode="CV">123456789</TransmitterTaxId>
# <Software>
# <Code>EMIPUB</Code>
# <Name>DNRE Emissor P�blico</Name>
# <Version>Build #53 12-07-2021 14:00:47 CVT - master</Version>
# </Software>
# <Contingency>
# <LedCode>1</LedCode>
# <IssueDate>2020-01-01</IssueDate>
# <IssueTime>01:02:03</IssueTime>
# <ReasonTypeCode>1</ReasonTypeCode>
# </Contingency>
# </Transmission>
# <RepositoryCode>2</RepositoryCode>
# </Dfe>
set success 1
# Create the XML to be signed...
# Use this online tool to generate code from sample XML:
# Generate Code to Create XML
set xmlToSign [new_CkXml]
CkXml_put_Tag $xmlToSign "Dfe"
CkXml_AddAttribute $xmlToSign "xmlns" "urn:cv:efatura:xsd:v1.0"
CkXml_AddAttribute $xmlToSign "DocumentTypeCode" "1"
CkXml_AddAttribute $xmlToSign "Id" "CV2210818123456789000010100000000546735014601"
CkXml_AddAttribute $xmlToSign "Version" "1.0"
CkXml_UpdateChildContent $xmlToSign "Invoice|LedCode" "1"
CkXml_UpdateChildContent $xmlToSign "Invoice|Serie" "SL"
CkXml_UpdateChildContent $xmlToSign "Invoice|DocumentNumber" "5"
CkXml_UpdateChildContent $xmlToSign "Invoice|IssueDate" "2021-08-30"
CkXml_UpdateChildContent $xmlToSign "Invoice|IssueTime" "00:01:00"
CkXml_UpdateChildContent $xmlToSign "Invoice|TaxPointDate" "2021-08-18"
CkXml_UpdateAttrAt $xmlToSign "Invoice|EmitterParty|TaxId" 1 "CountryCode" "CV"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|TaxId" "123456789"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Name" "Maria"
CkXml_UpdateAttrAt $xmlToSign "Invoice|EmitterParty|Address" 1 "CountryCode" "CV"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|State" "Estado do Emissor"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|City" "Cidade do Emissor"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|Region" "Regi�o do Emissor"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|Street" "Rua do Emissor"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|StreetDetail" "Detalhe da rua do Emissor"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|BuildingName" "Pr�dio do Emissor"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|BuildingNumber" "1"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|BuildingFloor" "2"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|PostalCode" "7600"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|AddressDetail" "Detalhe de endere�o do Emissor"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Address|AddressCode" "CV774999999999999319"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Contacts|Telephone" "1234567"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Contacts|Mobilephone" "1234568"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Contacts|Telefax" "1234569"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Contacts|Email" "somebody@example.com"
CkXml_UpdateChildContent $xmlToSign "Invoice|EmitterParty|Contacts|Website" "emissor.efatura.cv"
CkXml_UpdateAttrAt $xmlToSign "Invoice|ReceiverParty|TaxId" 1 "CountryCode" "CV"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|TaxId" "123456789"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Name" "Nome do Recetor"
CkXml_UpdateAttrAt $xmlToSign "Invoice|ReceiverParty|Address" 1 "CountryCode" "CV"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|State" "Estado do Recetor"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|City" "Cidade do Recetor"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|Region" "Regi�o do Recetor"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|Street" "Rua do Recetor"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|StreetDetail" "Detalhe da rua do Recetor"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|BuildingName" "Pr�dio do Recetor"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|BuildingNumber" "2"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|BuildingFloor" "3"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|PostalCode" "7601"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|AddressDetail" "Detalhe de endere�o do Recetor"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Address|AddressCode" "CV774999999999999319"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Contacts|Telephone" "2234567"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Contacts|Mobilephone" "2234568"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Contacts|Telefax" "2234569"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Contacts|Email" "rector@efatura.cv"
CkXml_UpdateChildContent $xmlToSign "Invoice|ReceiverParty|Contacts|Website" "rector.efatura.cv"
CkXml_UpdateAttrAt $xmlToSign "Invoice|Lines|Line" 1 "LineTypeCode" "N"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Id" "01"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|OrderLineReference" "1"
CkXml_UpdateAttrAt $xmlToSign "Invoice|Lines|Line|Quantity" 1 "UnitCode" "EA"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Quantity" "3.15"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Price" "123456"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|PriceExtension" "388886"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Discount" "15"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|NetTotal" "252776"
CkXml_UpdateAttrAt $xmlToSign "Invoice|Lines|Line|Tax" 1 "TaxTypeCode" "IVA"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Tax|TaxPercentage" "15"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Item|Description" "Telem�vel"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Item|Name" "Telem�vel"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Item|BrandName" "Apple"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Item|ModelName" "iPhone X"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Item|EmitterIdentification" "TLMV"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Item|StandardIdentification|GTIN" "12345"
CkXml_UpdateChildContent $xmlToSign "Invoice|Lines|Line|Item|HazardousRiskIndicator" "false"
CkXml_UpdateChildContent $xmlToSign "Invoice|Totals|PriceExtensionTotalAmount" "388886"
CkXml_UpdateChildContent $xmlToSign "Invoice|Totals|ChargeTotalAmount" "0"
CkXml_UpdateChildContent $xmlToSign "Invoice|Totals|DiscountTotalAmount" "136110"
CkXml_UpdateChildContent $xmlToSign "Invoice|Totals|NetTotalAmount" "252776"
CkXml_UpdateAttrAt $xmlToSign "Invoice|Totals|Discount" 1 "ValueType" "P"
CkXml_UpdateChildContent $xmlToSign "Invoice|Totals|Discount" "20"
CkXml_UpdateChildContent $xmlToSign "Invoice|Totals|TaxTotalAmount" "37916"
CkXml_UpdateChildContent $xmlToSign "Invoice|Totals|PayableAmount" "290692"
CkXml_UpdateAttrAt $xmlToSign "Invoice|References|Reference|FiscalDocument" 1 "IsOldDocument" "false"
CkXml_UpdateChildContent $xmlToSign "Invoice|References|Reference|FiscalDocument" "CV1200520123456789000112345678901112345678901"
CkXml_UpdateChildContent $xmlToSign "Invoice|References|Reference|PaymentAmount" "12345"
CkXml_UpdateAttrAt $xmlToSign "Invoice|References|Reference|Tax" 1 "TaxTypeCode" "IR"
CkXml_UpdateChildContent $xmlToSign "Invoice|References|Reference|Tax|TaxPercentage" "10"
CkXml_UpdateAttrAt $xmlToSign "Invoice|References|Reference[1]|FiscalDocument" 1 "IsOldDocument" "false"
CkXml_UpdateChildContent $xmlToSign "Invoice|References|Reference[1]|FiscalDocument" "CV1200520123456789000112345678901112345678903"
CkXml_UpdateChildContent $xmlToSign "Invoice|References|Reference[1]|PaymentAmount" "98765"
CkXml_UpdateAttrAt $xmlToSign "Invoice|References|Reference[1]|Tax" 1 "TaxTypeCode" "IVA"
CkXml_UpdateChildContent $xmlToSign "Invoice|References|Reference[1]|Tax|TaxPercentage" "15"
CkXml_UpdateChildContent $xmlToSign "Invoice|Payments|PaymentDueDate" "2021-12-31"
CkXml_UpdateChildContent $xmlToSign "Invoice|Payments|PaymentTerms|Note" "Juros de 12% a partir da data de vencimento"
CkXml_UpdateChildContent $xmlToSign "Invoice|Payments|PayeeFinancialAccount|NIB" "123456789012345678901"
CkXml_UpdateChildContent $xmlToSign "Invoice|Payments|PayeeFinancialAccount|Name" "Nome da Conta 1"
CkXml_UpdateChildContent $xmlToSign "Invoice|Payments|PayeeFinancialAccount[1]|NIB" "123456789012345678902"
CkXml_UpdateChildContent $xmlToSign "Invoice|Payments|PayeeFinancialAccount[1]|Name" "Nome da Conta 2"
CkXml_UpdateChildContent $xmlToSign "Invoice|Note" "Texto livre"
CkXml_UpdateChildContent $xmlToSign "Transmission|IssueMode" "2"
CkXml_UpdateAttrAt $xmlToSign "Transmission|TransmitterTaxId" 1 "CountryCode" "CV"
CkXml_UpdateChildContent $xmlToSign "Transmission|TransmitterTaxId" "123456789"
CkXml_UpdateChildContent $xmlToSign "Transmission|Software|Code" "EMIPUB"
CkXml_UpdateChildContent $xmlToSign "Transmission|Software|Name" "DNRE Emissor P�blico"
CkXml_UpdateChildContent $xmlToSign "Transmission|Software|Version" "Build #53 12-07-2021 14:00:47 CVT - master"
CkXml_UpdateChildContent $xmlToSign "Transmission|Contingency|LedCode" "1"
CkXml_UpdateChildContent $xmlToSign "Transmission|Contingency|IssueDate" "2020-01-01"
CkXml_UpdateChildContent $xmlToSign "Transmission|Contingency|IssueTime" "01:02:03"
CkXml_UpdateChildContent $xmlToSign "Transmission|Contingency|ReasonTypeCode" "1"
CkXml_UpdateChildContent $xmlToSign "RepositoryCode" "2"
set gen [new_CkXmlDSigGen]
CkXmlDSigGen_put_SigLocation $gen "Dfe"
CkXmlDSigGen_put_SigLocationMod $gen 0
CkXmlDSigGen_put_SigId $gen "xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac"
CkXmlDSigGen_put_SigNamespacePrefix $gen "ds"
CkXmlDSigGen_put_SigNamespaceUri $gen "http://www.w3.org/2000/09/xmldsig#"
CkXmlDSigGen_put_SigValueId $gen "xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac-sigvalue"
CkXmlDSigGen_put_SignedInfoCanonAlg $gen "C14N"
CkXmlDSigGen_put_SignedInfoDigestMethod $gen "sha256"
# Set the KeyInfoId before adding references..
CkXmlDSigGen_put_KeyInfoId $gen "xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac-keyinfo"
# Create an Object to be added to the Signature.
set object1 [new_CkXml]
CkXml_put_Tag $object1 "xades:QualifyingProperties"
CkXml_AddAttribute $object1 "xmlns:xades" "http://uri.etsi.org/01903/v1.3.2#"
CkXml_AddAttribute $object1 "xmlns:xades141" "http://uri.etsi.org/01903/v1.4.1#"
CkXml_AddAttribute $object1 "Target" "#xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac"
CkXml_UpdateAttrAt $object1 "xades:SignedProperties" 1 "Id" "xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac-signedprops"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime" "TO BE GENERATED BY CHILKAT"
CkXml_UpdateAttrAt $object1 "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestMethod" 1 "Algorithm" "http://www.w3.org/2001/04/xmlenc#sha256"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestValue" "TO BE GENERATED BY CHILKAT"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:IssuerSerialV2" "TO BE GENERATED BY CHILKAT"
CkXml_UpdateAttrAt $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat" 1 "ObjectReference" "#xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac-ref0"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Description" "DFE Signature"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier" "efatura-uri"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:DocumentationReferences|xades:DocumentationReference" "https://efatura.cv"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:MimeType" "text/xml"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Encoding" "UTF-8"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:CommitmentTypeIndication|xades:CommitmentTypeId|xades:Identifier" "http://uri.etsi.org/01903/v1.2.2#ProofOfApproval"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:CommitmentTypeIndication|xades:CommitmentTypeId|xades:Description" "Indicates that the signer has approved the content of the signed data object"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:CommitmentTypeIndication|xades:AllSignedDataObjects" ""
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:CommitmentTypeIndication[1]|xades:CommitmentTypeId|xades:Identifier" "http://uri.etsi.org/01903/v1.2.2#ProofOfOrigin"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:CommitmentTypeIndication[1]|xades:CommitmentTypeId|xades:Description" "Indicates that the signer recognizes to have created, approved and sent the signed data object"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:CommitmentTypeIndication[1]|xades:ObjectReference" "#xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac-ref0"
CkXml_UpdateChildContent $object1 "xades:SignedProperties|xades:SignedDataObjectProperties|xades:CommitmentTypeIndication[1]|xades:CommitmentTypeQualifiers|xades:CommitmentTypeQualifier" "CV-FE-123456789"
CkXmlDSigGen_AddObject $gen "" [CkXml_getXml $object1] "" ""
# -------- Reference 1 --------
CkXmlDSigGen_AddSameDocRef $gen "CV2210818123456789000010100000000546735014601" "sha256" "" "" ""
CkXmlDSigGen_SetRefIdAttr $gen "CV2210818123456789000010100000000546735014601" "xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac-ref0"
# -------- Reference 2 --------
CkXmlDSigGen_AddSameDocRef $gen "xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac-keyinfo" "sha256" "C14N" "" ""
# -------- Reference 3 --------
CkXmlDSigGen_AddObjectRef $gen "xmldsig-cbd86598-e75e-4ae4-9a27-3b4ee2a789ac-signedprops" "sha256" "C14N" "" "http://uri.etsi.org/01903#SignedProperties"
# Provide a certificate + private key. (PFX password is test123)
set cert [new_CkCert]
set success [CkCert_LoadPfxFile $cert "qa_data/pfx/cert_test123.pfx" "test123"]
if {$success != 1} then {
puts [CkCert_lastErrorText $cert]
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkXml $object1
delete_CkCert $cert
exit
}
CkXmlDSigGen_SetX509Cert $gen $cert 1
CkXmlDSigGen_put_KeyInfoType $gen "X509Data"
CkXmlDSigGen_put_X509Type $gen "IssuerSerial,SubjectName,Certificate"
# Load XML to be signed...
set sbXml [new_CkStringBuilder]
CkXml_GetXmlSb $xmlToSign $sbXml
# Note: The last keyword (Base64Cr13Entity) requires Chilkat v9.5.0.89 or later.
CkXmlDSigGen_put_Behaviors $gen "IndentedSignature,Base64Cr13Entity,ForceAddEnvelopedSignatureTransform,Base64Cr13Entity"
# Sign the XML...
set success [CkXmlDSigGen_CreateXmlDSigSb $gen $sbXml]
if {$success != 1} then {
puts [CkXmlDSigGen_lastErrorText $gen]
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkXml $object1
delete_CkCert $cert
delete_CkStringBuilder $sbXml
exit
}
# -----------------------------------------------
# Save the signed XML to a file.
set success [CkStringBuilder_WriteFile $sbXml "qa_output/signedXml.xml" "utf-8" 0]
puts [CkStringBuilder_getAsString $sbXml]
# ----------------------------------------
# Verify the signatures we just produced...
set verifier [new_CkXmlDSig]
set success [CkXmlDSig_LoadSignatureSb $verifier $sbXml]
if {$success != 1} then {
puts [CkXmlDSig_lastErrorText $verifier]
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkXml $object1
delete_CkCert $cert
delete_CkStringBuilder $sbXml
delete_CkXmlDSig $verifier
exit
}
set numSigs [CkXmlDSig_get_NumSignatures $verifier]
set verifyIdx 0
while {$verifyIdx < $numSigs} {
CkXmlDSig_put_Selector $verifier $verifyIdx
set verified [CkXmlDSig_VerifySignature $verifier 1]
if {$verified != 1} then {
puts [CkXmlDSig_lastErrorText $verifier]
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkXml $object1
delete_CkCert $cert
delete_CkStringBuilder $sbXml
delete_CkXmlDSig $verifier
exit
}
set verifyIdx [expr $verifyIdx + 1]
}
puts "All signatures were successfully verified."
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkXml $object1
delete_CkCert $cert
delete_CkStringBuilder $sbXml
delete_CkXmlDSig $verifier