Sample code for 30+ languages & platforms
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

Tcl

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