Sample code for 30+ languages & platforms
Visual FoxPro

Get Ed25519 Key in Different Formats

See more Ed25519 Examples

Demonstrates how to get/save an Ed25519 private key to different formats.

Converting a private key from one format to another is done by loading in one format and saving/getting in another.

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

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loEddsa
LOCAL loPrng
LOCAL loPrivKey
LOCAL lcPkcs1Base64
LOCAL lcPkcs8Base64
LOCAL lcPassword
LOCAL lcPkcs8EncBase64
LOCAL lcEd25519Pem
LOCAL lcJwk
LOCAL loJson
LOCAL lcEd25519_xml
LOCAL loSbPubKeyHex
LOCAL lcPrivKeyHex

lnSuccess = 0

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

loEddsa = CreateObject('Chilkat.EdDSA')
loPrng = CreateObject('Chilkat.Prng')
loPrivKey = CreateObject('Chilkat.PrivateKey')

* Generates a new ed25519 key and stores it in privKey.
lnSuccess = loEddsa.GenEd25519Key(loPrng,loPrivKey)
IF (lnSuccess = 0) THEN
    ? loEddsa.LastErrorText
    RELEASE loEddsa
    RELEASE loPrng
    RELEASE loPrivKey
    CANCEL
ENDIF

* ----------------------------------------------------------
* Ed25519 PKCS1 format
* 
* This is the format created by:  openssl genpkey -algorithm X25519 -out xkey.pem
lcPkcs1Base64 = loPrivKey.GetPkcs1ENC("base64")
? lcPkcs1Base64

* Sample output:  MC4CAQAwBQYDK2VuBCIEIB1mwirs+eC6XGbkjPIiZyBwQ7768uSd9v5PHOLFbIXo

* PKCS1 is a binary ASN.1 DER format.  You can examine the contents with two online tools:
* 1) Go to ASN.1 Decoder  and paste the base64 into the online form.
* 2) Or Decode Base64 ASN.1 to XML 

* The PKCS1 ASN.1 format for an Ed25519 key look like this:
*   SEQUENCE
*     INTEGER 0
*     SEQUENCE
*       OBJECT IDENTIFIER 1.3.101.110 curveX25519 (ECDH 25519 key agreement algorithm)
*     OCTET STRING 
*       OCTET STRING (32 byte) 1D66C...

* Save it directly to a file.
lnSuccess = loPrivKey.SavePkcs1File("qa_output/ed25519.key")

* ----------------------------------------------------------
* Ed25519 Unencrypted PKCS8 format
* 
* For ed25519, the ASN.1 output is the same as for PKCS1.
lcPkcs8Base64 = loPrivKey.GetPkcs8ENC("base64")
? lcPkcs8Base64

* PKCS8 is a binary ASN.1 DER format.  You can examine the contents with two online tools:
* 1) Go to ASN.1 Decoder  and paste the base64 into the online form.
* 2) Or Decode Base64 ASN.1 to XML 

* ----------------------------------------------------------
* Ed25519 Encrypted PKCS8 format
* 
* Note: The encrypted output cannot be examined using the above online tools because the ASN.1 is encrypted.
lcPassword = "secret"
lcPkcs8EncBase64 = loPrivKey.GetPkcs8EncryptedENC("base64",lcPassword)
? lcPkcs8EncBase64

* ----------------------------------------------------------
* Ed25519 in PEM format:
* 
lcEd25519Pem = loPrivKey.GetPkcs1Pem()
? lcEd25519Pem

* Sample output:

* -----BEGIN PRIVATE KEY-----
* MC4CAQAwBQYDK2VuBCIEIOKPhbULJagBAi7hbRdn1f4AAzh1RqqCHqCAvau7N6yO
* -----END PRIVATE KEY-----

* ----------------------------------------------------------
* Ed25519 in JWK Format
* 
lcJwk = loPrivKey.GetJwk()

loJson = CreateObject('Chilkat.JsonObject')
loJson.Load(lcJwk)
loJson.EmitCompact = 0
? loJson.Emit()

* Sample output:
* {
*   "kty": "OKP",
*   "crv": "Ed25519",
*   "x": "SE2Kne5xt51z1eciMH2T2ftDQp96Gl6FhY6zSQujiP0",
*   "d": "O-eRXewadF0sNyB0U9omcnt8Qg2ZmeK3WSXPYgqe570",
*   "use": "sig"
* }

* In the above JWK, x is the public key, y is the private key.
* Both are 32 bytes and are base64-url encoded.

* ----------------------------------------------------------
* Ed25519 in XML Format
* 
lcEd25519_xml = loPrivKey.GetXml()
? lcEd25519_xml

* Sample output:  <Ed25519KeyValue>w4b/gI0zgYKgjtfWLjNfc4issmP7Qap84uesYNgEefP/WoY3jNOhOzgTYsMtOnuyGn3MdA4NZtsUXVNI1NiTlA==</Ed25519KeyValue>

* The base64 content is composed of the concatenation of the 32-byte private key with the 32-byte public key and then base64 encoded.
* In other words:  Base64(privKey || pubKey)

* ----------------------------------------------------------
* Ed25519 in Raw Hex Format
* 
loSbPubKeyHex = CreateObject('Chilkat.StringBuilder')
lcPrivKeyHex = loPrivKey.GetRawHex(loSbPubKeyHex)

* We should have a 32-byte private key (a 64 character hex string).
? "private key = " + lcPrivKeyHex

* We should have a 32-byte public key (a 64 character hex string).
? "public key = " + loSbPubKeyHex.GetAsString()

* Sample output:
* key type = ed25519
* size in bits = 256
* private key = d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842
* public key = 19bf44096984cdfe8541bac167dc3b96c85086aa30b6b6cb0c5c38ad703166e1

RELEASE loEddsa
RELEASE loPrng
RELEASE loPrivKey
RELEASE loJson
RELEASE loSbPubKeyHex