Sample code for 30+ languages & platforms
Visual FoxPro

Create ECSDA Signature using Raw r and s Format (not ASN.1)

See more ECC Examples

Demonstrates how to create an ECDSA signature using the raw r/s format.

ECDSA signatures have two equal sized parts, r and s. There are two common formats for encoding the signature:

(a) Concatenating the raw byte array of r and s
(b) Encoding both into a structured ASN.1 / DER sequence.

This example demonstrates how to create a signature that is a byte array of r and s concatenated.

Note: This example requires Chilkat v9.5.0.97 or greater.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loSb
LOCAL lcHash
LOCAL loPrivKey
LOCAL loPrng
LOCAL loEcdsa
LOCAL lcEcdsaSigBase64
LOCAL loPubKey
LOCAL lnResult

lnSuccess = 0

* 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.

loSb = CreateObject('Chilkat.StringBuilder')
loSb.Append("The quick brown fox jumps over the lazy dog")
lcHash = loSb.GetHash("sha256","base64","utf-8")

* Load the ECDSA key to be used for signing.
loPrivKey = CreateObject('Chilkat.PrivateKey')
lnSuccess = loPrivKey.LoadPemFile("qa_data/ecc/secp256r1-key-pkcs8.pem")
IF (lnSuccess <> 1) THEN
    ? loPrivKey.LastErrorText
    RELEASE loSb
    RELEASE loPrivKey
    CANCEL
ENDIF

loPrng = CreateObject('Chilkat.Prng')
loEcdsa = CreateObject('Chilkat.Ecc')

* Produce a signature that is not ASN.1, but is instead the concatenation
* of the raw r and s signature parts.
* This feature was added in Chilkat v9.5.0.97
loEcdsa.AsnFormat = 0

lcEcdsaSigBase64 = loEcdsa.SignHashENC(lcHash,"base64",loPrivKey,loPrng)
IF (loEcdsa.LastMethodSuccess <> 1) THEN
    ? loEcdsa.LastErrorText
    RELEASE loSb
    RELEASE loPrivKey
    RELEASE loPrng
    RELEASE loEcdsa
    CANCEL
ENDIF

? "ECDSA signature = " + lcEcdsaSigBase64

* -----------------------------------------------------------
* Now let's verify the signature using the public key.

loPubKey = CreateObject('Chilkat.PublicKey')
lnSuccess = loPubKey.LoadFromFile("qa_data/ecc/secp256r1-pubkey.pem")
IF (lnSuccess <> 1) THEN
    ? loPubKey.LastErrorText
    RELEASE loSb
    RELEASE loPrivKey
    RELEASE loPrng
    RELEASE loEcdsa
    RELEASE loPubKey
    CANCEL
ENDIF

* Note: When verifying, Chilkat will auto-detect the format for both kinds of ECDSA signatures (ASN.1 or binary r+s)
lnResult = loEcdsa.VerifyHashENC(lcHash,lcEcdsaSigBase64,"base64",loPubKey)
IF (lnResult = 1) THEN
    ? "Signature is valid."
    RELEASE loSb
    RELEASE loPrivKey
    RELEASE loPrng
    RELEASE loEcdsa
    RELEASE loPubKey
    CANCEL
ENDIF

IF (lnResult = 0) THEN
    ? "Signature is invalid."
    RELEASE loSb
    RELEASE loPrivKey
    RELEASE loPrng
    RELEASE loEcdsa
    RELEASE loPubKey
    CANCEL
ENDIF

IF (lnResult < 0) THEN
    ? loEcdsa.LastErrorText
    ? "The VerifyHashENC method call failed."
    RELEASE loSb
    RELEASE loPrivKey
    RELEASE loPrng
    RELEASE loEcdsa
    RELEASE loPubKey
    CANCEL
ENDIF

RELEASE loSb
RELEASE loPrivKey
RELEASE loPrng
RELEASE loEcdsa
RELEASE loPubKey