Sample code for 30+ languages & platforms
Java

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 Java Downloads

Chilkat2 Java
import com.chilkatsoft.chilkat2.Asn;
import com.chilkatsoft.chilkat2.BinData;
import com.chilkatsoft.chilkat2.ChilkatException;
import com.chilkatsoft.chilkat2.Crypt2;
import com.chilkatsoft.chilkat2.Ecc;
import com.chilkatsoft.chilkat2.PrivateKey;
import com.chilkatsoft.chilkat2.Prng;
import com.chilkatsoft.chilkat2.Xml;

public class ChilkatExample {

    public static void main(String[] args) {
        // 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.

        Crypt2 crypt = new Crypt2();
        crypt.setHashAlgorithm("SHA256");
        crypt.setCharset("utf-8");
        crypt.setEncodingMode("base64");

        // Hash a string.
        String hash1 = crypt.hashStringENC("The quick brown fox jumps over the lazy dog");
        System.out.println("hash1 = " + hash1);

        // -----------------------------------------------------------
        // 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-----

        PrivateKey privKey = new PrivateKey();
        try {
            privKey.loadPemFile("qa_data/ecc/secp256r1-key-pkcs8.pem");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // Sign the hash..
        Prng prng = new Prng();
        Ecc ecdsa = new Ecc();
        String ecdsaSigBase64;
        try {
            ecdsaSigBase64 = ecdsa.signHashENC(hash1, "base64", privKey, prng);
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // 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

        System.out.println("Base64 ECDSA signature = " + ecdsaSigBase64);

        // If the raw R and S values are needed, here's how to get them:
        Asn asn = new Asn();
        try {
            asn.loadEncoded(ecdsaSigBase64, "base64");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // The R and X will be in hexidecimal in the XML.
        Xml xml = new Xml();
        xml.loadXml(asn.asnToXml());
        System.out.println(xml.getXml());

        // 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.
        BinData bd = new BinData();
        String r = xml.getChildContent("int[0]");
        String s = xml.getChildContent("int[1]");
        bd.appendEncoded(r, "hex");
        bd.appendEncoded(s, "hex");

        System.out.println("Number of bytes in bd: " + bd.getNumBytes());
    }
}