DataFlex
DataFlex
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 DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoEddsa
Variant vPrng
Handle hoPrng
Variant vPrivKey
Handle hoPrivKey
String sPkcs1Base64
String sPkcs8Base64
String sPassword
String sPkcs8EncBase64
String sEd25519Pem
String sJwk
Handle hoJson
String sEd25519_xml
Variant vSbPubKeyHex
Handle hoSbPubKeyHex
String sPrivKeyHex
String sTemp1
Move False To iSuccess
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
Get Create (RefClass(cComChilkatEdDSA)) To hoEddsa
If (Not(IsComObjectCreated(hoEddsa))) Begin
Send CreateComObject of hoEddsa
End
Get Create (RefClass(cComChilkatPrng)) To hoPrng
If (Not(IsComObjectCreated(hoPrng))) Begin
Send CreateComObject of hoPrng
End
Get Create (RefClass(cComChilkatPrivateKey)) To hoPrivKey
If (Not(IsComObjectCreated(hoPrivKey))) Begin
Send CreateComObject of hoPrivKey
End
// Generates a new ed25519 key and stores it in privKey.
Get pvComObject of hoPrng to vPrng
Get pvComObject of hoPrivKey to vPrivKey
Get ComGenEd25519Key Of hoEddsa vPrng vPrivKey To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoEddsa To sTemp1
Showln sTemp1
Procedure_Return
End
// ----------------------------------------------------------
// Ed25519 PKCS1 format
//
// This is the format created by: openssl genpkey -algorithm X25519 -out xkey.pem
Get ComGetPkcs1ENC Of hoPrivKey "base64" To sPkcs1Base64
Showln sPkcs1Base64
// 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.
Get ComSavePkcs1File Of hoPrivKey "qa_output/ed25519.key" To iSuccess
// ----------------------------------------------------------
// Ed25519 Unencrypted PKCS8 format
//
// For ed25519, the ASN.1 output is the same as for PKCS1.
Get ComGetPkcs8ENC Of hoPrivKey "base64" To sPkcs8Base64
Showln sPkcs8Base64
// 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.
Move "secret" To sPassword
Get ComGetPkcs8EncryptedENC Of hoPrivKey "base64" sPassword To sPkcs8EncBase64
Showln sPkcs8EncBase64
// ----------------------------------------------------------
// Ed25519 in PEM format:
//
Get ComGetPkcs1Pem Of hoPrivKey To sEd25519Pem
Showln sEd25519Pem
// Sample output:
// -----BEGIN PRIVATE KEY-----
// MC4CAQAwBQYDK2VuBCIEIOKPhbULJagBAi7hbRdn1f4AAzh1RqqCHqCAvau7N6yO
// -----END PRIVATE KEY-----
// ----------------------------------------------------------
// Ed25519 in JWK Format
//
Get ComGetJwk Of hoPrivKey To sJwk
Get Create (RefClass(cComChilkatJsonObject)) To hoJson
If (Not(IsComObjectCreated(hoJson))) Begin
Send CreateComObject of hoJson
End
Get ComLoad Of hoJson sJwk To iSuccess
Set ComEmitCompact Of hoJson To False
Get ComEmit Of hoJson To sTemp1
Showln sTemp1
// 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
//
Get ComGetXml Of hoPrivKey To sEd25519_xml
Showln sEd25519_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
//
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbPubKeyHex
If (Not(IsComObjectCreated(hoSbPubKeyHex))) Begin
Send CreateComObject of hoSbPubKeyHex
End
Get pvComObject of hoSbPubKeyHex to vSbPubKeyHex
Get ComGetRawHex Of hoPrivKey vSbPubKeyHex To sPrivKeyHex
// We should have a 32-byte private key (a 64 character hex string).
Showln "private key = " sPrivKeyHex
// We should have a 32-byte public key (a 64 character hex string).
Get ComGetAsString Of hoSbPubKeyHex To sTemp1
Showln "public key = " sTemp1
// Sample output:
// key type = ed25519
// size in bits = 256
// private key = d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842
// public key = 19bf44096984cdfe8541bac167dc3b96c85086aa30b6b6cb0c5c38ad703166e1
End_Procedure