Sample code for 30+ languages & platforms
Lua Requires Chilkat v11.0.0+

How to Generate an Elliptic Curve Shared Secret

See more ECC Examples

Demonstrates how to generate an ECC (Elliptic Curve Cryptography) shared secret. Imagine a cilent has one ECC private key, the server has another. A shared secret is computed by each side providing it's public key to the other. The private keys are kept private.

Chilkat Lua Downloads

Lua
local chilkat = require("chilkat")

-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.

-- This example includes both client-side and server-side code.
-- Each code segment is marked as client-side or server-side.
-- Imagine these segments are running on separate computers...

-- -----------------------------------------------------------------
-- (Client-Side) Generate an ECC key, save the public part to a file.
-- -----------------------------------------------------------------
local prngClient = chilkat.Prng.new()
local eccClient = chilkat.Ecc.new()
local privKeyClient = chilkat.PrivateKey.new()
local success = eccClient:gen_key("secp256r1", prngClient, privKeyClient)
if not success then
    print(eccClient.last_error_text)
    return
end

local pubKeyClient = chilkat.PublicKey.new()
privKeyClient:to_public_key(pubKeyClient)
pubKeyClient:save_pem_file(false, "qa_output/eccClientPub.pem")

-- -----------------------------------------------------------------
-- (Server-Side) Generate an ECC key, save the public part to a file.
-- -----------------------------------------------------------------
local prngServer = chilkat.Prng.new()
local eccServer = chilkat.Ecc.new()
local privKeyServer = chilkat.PrivateKey.new()
eccServer:gen_key("secp256r1", prngServer, privKeyServer)

local pubKeyServer = chilkat.PublicKey.new()
privKeyServer:to_public_key(pubKeyServer)
pubKeyServer:save_pem_file(false, "qa_output/eccServerPub.pem")

-- -----------------------------------------------------------------
-- (Client-Side) Generate the shared secret using our private key, and the other's public key.
-- -----------------------------------------------------------------

-- Imagine that the server sent the public key PEM to the client.
-- (This is simulated by loading the server's public key from the file.
local pubKeyFromServer = chilkat.PublicKey.new()
pubKeyFromServer:load_from_file("qa_output/eccServerPub.pem")
local sharedSecret1 = eccClient:shared_secret_enc(privKeyClient, pubKeyFromServer, "base64")

-- -----------------------------------------------------------------
-- (Server-Side) Generate the shared secret using our private key, and the other's public key.
-- -----------------------------------------------------------------

-- Imagine that the client sent the public key PEM to the server.
-- (This is simulated by loading the client's public key from the file.
local pubKeyFromClient = chilkat.PublicKey.new()
pubKeyFromClient:load_from_file("qa_output/eccClientPub.pem")
local sharedSecret2 = eccServer:shared_secret_enc(privKeyServer, pubKeyFromClient, "base64")

-- ---------------------------------------------------------
-- Examine the shared secrets.  They should be the same.
-- Both sides now have a secret that only they know.
-- ---------------------------------------------------------
print(sharedSecret1)
print(sharedSecret2)