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
(DataFlex) Create XML Signature with External XML ReferenceDemonstrates how to create an XML digital signature where the referenced data is external. In this case, the data is an XML file located at the following URL: https://www.chilkatsoft.com/data/helloWorld.xml
Use ChilkatAx-win32.pkg Procedure Test Handle hoXml Variant vCert Handle hoCert Boolean iSuccess Handle hoGen Handle hoHttp Variant vSbExternalXml Handle hoSbExternalXml Boolean iBUsePrivateKey Variant vSbXml Handle hoSbXml Handle hoVerifier Variant vSbExternalData Handle hoSbExternalData Integer iNumRefs Integer i Boolean iBExternal String sUri String sCanonXml Boolean iBVerified String sTemp1 // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // This example inserts an XML signature in the following XML: // <?xml version="1.0" encoding="UTF-8" standalone="no"?> // <abc> // <xyz> // <name>helloWorld.xml</name> // <url>https://www.chilkatsoft.com/data/helloWorld.xml</url> // </xyz> // </abc> // Build the above XML to be signed. Get Create (RefClass(cComChilkatXml)) To hoXml If (Not(IsComObjectCreated(hoXml))) Begin Send CreateComObject of hoXml End Set ComTag Of hoXml To "abc" Send ComUpdateChildContent To hoXml "xyz|name" "helloWorld.xml" Send ComUpdateChildContent To hoXml "xyz|url" "https://www.chilkatsoft.com/data/helloWorld.xml" Get Create (RefClass(cComChilkatCert)) To hoCert If (Not(IsComObjectCreated(hoCert))) Begin Send CreateComObject of hoCert End Get ComLoadPfxFile Of hoCert "qa_data/pfx/test_secret.pfx" "secret" To iSuccess If (iSuccess = False) Begin Get ComLastErrorText Of hoCert To sTemp1 Showln sTemp1 Procedure_Return End Get Create (RefClass(cComChilkatXmlDSigGen)) To hoGen If (Not(IsComObjectCreated(hoGen))) Begin Send CreateComObject of hoGen End // Indicate the location within the XML the Signature will be inserted. Set ComSigLocation Of hoGen To "abc|xyz" // Get the content of the XML data to be referenced. Get Create (RefClass(cComChilkatHttp)) To hoHttp If (Not(IsComObjectCreated(hoHttp))) Begin Send CreateComObject of hoHttp End Get Create (RefClass(cComChilkatStringBuilder)) To hoSbExternalXml If (Not(IsComObjectCreated(hoSbExternalXml))) Begin Send CreateComObject of hoSbExternalXml End Get pvComObject of hoSbExternalXml to vSbExternalXml Get ComQuickGetSb Of hoHttp "https://www.chilkatsoft.com/data/helloWorld.xml" vSbExternalXml To iSuccess If (iSuccess = False) Begin Get ComLastErrorText Of hoHttp To sTemp1 Showln sTemp1 Procedure_Return End Get pvComObject of hoSbExternalXml to vSbExternalXml Get ComAddExternalXmlRef Of hoGen "https://www.chilkatsoft.com/data/helloWorld.xml" vSbExternalXml "sha256" "EXCL_C14N" "" To iSuccess If (iSuccess = False) Begin Get ComLastErrorText Of hoGen To sTemp1 Showln sTemp1 Procedure_Return End // Provide the private key for signing via the certificate, and indicate that // we want the base64 of the certificate embedded in the KeyInfo. Set ComKeyInfoType Of hoGen To "X509Data" Set ComX509Type Of hoGen To "Certificate" Move True To iBUsePrivateKey Get pvComObject of hoCert to vCert Get ComSetX509Cert Of hoGen vCert iBUsePrivateKey To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoGen To sTemp1 Showln sTemp1 Procedure_Return End // Indicate we want an indented signature for readability. // This can be removed after debugging is finished.. Set ComBehaviors Of hoGen To "IndentedSignature" // Now create and insert the Signature Get Create (RefClass(cComChilkatStringBuilder)) To hoSbXml If (Not(IsComObjectCreated(hoSbXml))) Begin Send CreateComObject of hoSbXml End Get pvComObject of hoSbXml to vSbXml Get ComGetXmlSb Of hoXml vSbXml To iSuccess Get pvComObject of hoSbXml to vSbXml Get ComCreateXmlDSigSb Of hoGen vSbXml To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoGen To sTemp1 Showln sTemp1 Procedure_Return End // Examine the XML with the digital signature inserted Get ComGetAsString Of hoSbXml To sTemp1 Showln sTemp1 // Here is the output: // <?xml version="1.0" encoding="utf-8"?> // <abc> // <xyz> // <name>helloWorld.xml</name> // <url>https://www.chilkatsoft.com/data/helloWorld.xml</url> // <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> // <ds:SignedInfo> // <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> // <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> // <ds:Reference URI="https://www.chilkatsoft.com/data/helloWorld.xml"> // <ds:Transforms> // <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> // </ds:Transforms> // <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> // <ds:DigestValue>H/s775OZhel6wdBhe02l4LK6m0lkplOisKxAbVwWxp0=</ds:DigestValue> // </ds:Reference> // </ds:SignedInfo> // <ds:SignatureValue>UruwnBqh..Ll4IzUA==</ds:SignatureValue> // <ds:KeyInfo> // <ds:X509Data> // <ds:X509Certificate>MIIHAz...nUZWCaDE=</ds:X509Certificate> // </ds:X509Data> // </ds:KeyInfo> // </ds:Signature></xyz> // </abc> // Let's verify the signature... Get Create (RefClass(cComChilkatXmlDSig)) To hoVerifier If (Not(IsComObjectCreated(hoVerifier))) Begin Send CreateComObject of hoVerifier End Get pvComObject of hoSbXml to vSbXml Get ComLoadSignatureSb Of hoVerifier vSbXml To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoVerifier To sTemp1 Showln sTemp1 Procedure_Return End // Let's examine the external references, and fetch the data for each.. Get Create (RefClass(cComChilkatStringBuilder)) To hoSbExternalData If (Not(IsComObjectCreated(hoSbExternalData))) Begin Send CreateComObject of hoSbExternalData End Get ComNumReferences Of hoVerifier To iNumRefs Move 0 To i While (i < iNumRefs) Get ComIsReferenceExternal Of hoVerifier i To iBExternal If (iBExternal = True) Begin Get ComReferenceUri Of hoVerifier i To sUri // We're assuming the URI is an https:// or http:// URL... // Let's also assume we know that the referenced data is text and we want the utf-8 byte representation. Send ComClear To hoSbExternalData Get pvComObject of hoSbExternalData to vSbExternalData Get ComQuickGetSb Of hoHttp sUri vSbExternalData To iSuccess If (iSuccess = False) Begin Get ComLastErrorText Of hoHttp To sTemp1 Showln sTemp1 Procedure_Return End // Because the referenced external data was explicitly XML, it was the canonicalized XML that was digested. // We need to canonicalize the XML in the same way as when signed. Get ComGetAsString Of hoSbExternalData To sTemp1 Get ComCanonicalizeXml Of hoVerifier sTemp1 "EXCL_C14N" False To sCanonXml Get ComSetString Of hoSbExternalData sCanonXml To iSuccess Get pvComObject of hoSbExternalData to vSbExternalData Get ComSetRefDataSb Of hoVerifier i vSbExternalData "utf-8" To iSuccess If (iSuccess = False) Begin Get ComLastErrorText Of hoVerifier To sTemp1 Showln sTemp1 Procedure_Return End End Move (i + 1) To i Loop // Now that we have the external data available, we can verify the reference digest(s) and the signature. Get ComVerifySignature Of hoVerifier True To iBVerified If (iBVerified <> True) Begin Get ComLastErrorText Of hoVerifier To sTemp1 Showln sTemp1 Procedure_Return End Showln "Signature verified!" End_Procedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.