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) ECDSA Sign Data and Get Raw R and S ValuesDemonstrates getting the raw R and S value of an ECDSA signature.
Use ChilkatAx-win32.pkg Procedure Test Handle hoCrypt String sHash1 Variant vPrivKey Handle hoPrivKey Boolean iSuccess Variant vPrng Handle hoPrng Handle hoEcdsa String sEcdsaSigBase64 Handle hoAsn Handle hoXml Handle hoBd String r String s String sTemp1 Integer iTemp1 Boolean bTemp1 // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // To create an ECDSA signature, the data first needs to be hashed. Then the hash // is signed. Get Create (RefClass(cComChilkatCrypt2)) To hoCrypt If (Not(IsComObjectCreated(hoCrypt))) Begin Send CreateComObject of hoCrypt End Set ComHashAlgorithm Of hoCrypt To "SHA256" Set ComCharset Of hoCrypt To "utf-8" Set ComEncodingMode Of hoCrypt To "base64" // Hash a string. Get ComHashStringENC Of hoCrypt "The quick brown fox jumps over the lazy dog" To sHash1 Showln "hash1 = " sHash1 // ----------------------------------------------------------- // An ECDSA private key is used for signing. The public key is for signature verification. // Load our ECC private key. // Our private key file contains this: // // -----BEGIN PRIVATE KEY----- // MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg3J8q/24D1sEKGdP9 // 72MGYElLGpw/a56Y3t6pfON3uhShRANCAATlSmoizyhAwoYZAOuFBATl07/1RR54 // a1Dzfm16grxJe666AGKR+bSs24hk7TEpaeCTvT8YOOM3l+xKFg7zq6Q9 // -----END PRIVATE KEY----- Get Create (RefClass(cComChilkatPrivateKey)) To hoPrivKey If (Not(IsComObjectCreated(hoPrivKey))) Begin Send CreateComObject of hoPrivKey End Get ComLoadPemFile Of hoPrivKey "qa_data/ecc/secp256r1-key-pkcs8.pem" To iSuccess If (iSuccess <> True) Begin Get ComLastErrorText Of hoPrivKey To sTemp1 Showln sTemp1 Procedure_Return End // Sign the hash.. Get Create (RefClass(cComChilkatPrng)) To hoPrng If (Not(IsComObjectCreated(hoPrng))) Begin Send CreateComObject of hoPrng End Get Create (RefClass(cComChilkatEcc)) To hoEcdsa If (Not(IsComObjectCreated(hoEcdsa))) Begin Send CreateComObject of hoEcdsa End Get pvComObject of hoPrivKey to vPrivKey Get pvComObject of hoPrng to vPrng Get ComSignHashENC Of hoEcdsa sHash1 "base64" vPrivKey vPrng To sEcdsaSigBase64 Get ComLastMethodSuccess Of hoEcdsa To bTemp1 If (bTemp1 <> True) Begin Get ComLastErrorText Of hoEcdsa To sTemp1 Showln sTemp1 Procedure_Return End // The ECDSA signature is ASN.1 that contains a sequence of 2 large integers (r and s) // For example: // SEQUENCE (2 elem) // INTEGER (255 bit) 792134D9B4AD82D5431ED03835A88E2596EB35E5B13054BD9B05A0069281ACC9 // INTEGER (255 bit) 481E758CC1E3CBF825537EC3D9A2CA627E5FAD1137BBEA65DF38658DCB0A9ED5 Showln "Base64 ECDSA signature = " sEcdsaSigBase64 // If the raw R and S values are needed, here's how to get them: Get Create (RefClass(cComChilkatAsn)) To hoAsn If (Not(IsComObjectCreated(hoAsn))) Begin Send CreateComObject of hoAsn End Get ComLoadEncoded Of hoAsn sEcdsaSigBase64 "base64" To iSuccess If (iSuccess = False) Begin Get ComLastErrorText Of hoAsn To sTemp1 Showln sTemp1 Procedure_Return End // The R and X will be in hexidecimal in the XML. Get Create (RefClass(cComChilkatXml)) To hoXml If (Not(IsComObjectCreated(hoXml))) Begin Send CreateComObject of hoXml End Get ComAsnToXml Of hoAsn To sTemp1 Get ComLoadXml Of hoXml sTemp1 To iSuccess Get ComGetXml Of hoXml To sTemp1 Showln sTemp1 // The XML looks like this: // <sequence> // <int>792134D9B4AD82D5431ED03835A88E2596EB35E5B13054BD9B05A0069281ACC9</int> // <int>481E758CC1E3CBF825537EC3D9A2CA627E5FAD1137BBEA65DF38658DCB0A9ED5</int> // </sequence> // Copy raw R and S hex values into a Chilkat BinData object. Get Create (RefClass(cComChilkatBinData)) To hoBd If (Not(IsComObjectCreated(hoBd))) Begin Send CreateComObject of hoBd End Get ComGetChildContent Of hoXml "int[0]" To r Get ComGetChildContent Of hoXml "int[1]" To s Get ComAppendEncoded Of hoBd r "hex" To iSuccess Get ComAppendEncoded Of hoBd s "hex" To iSuccess Get ComNumBytes Of hoBd To iTemp1 Showln "Number of bytes in bd: " iTemp1 End_Procedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.