DataFlex
DataFlex
ECDSA Sign Data and Get Raw R and S Values
See more ECC Examples
Demonstrates getting the raw R and S value of an ECDSA signature.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoCrypt
String sHash1
Variant vPrivKey
Handle hoPrivKey
Variant vPrng
Handle hoPrng
Handle hoEcdsa
String sEcdsaSigBase64
Handle hoAsn
Handle hoXml
Handle hoBd
String r
String s
String sTemp1
Integer iTemp1
Boolean bTemp1
Move False To iSuccess
// 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