Sample code for 30+ languages & platforms
Visual FoxPro

How to Generate a JSON Web Key (JWK)

See more JSON Web Signatures (JWS) Examples

Demonstrates how to generate the following types of JSON Web Keys:
  • RSA key pair
  • EC key pair
  • Octet sequence key (HMAC-256)
  • 192-bit AES GCM key

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loRsa
LOCAL loRsaKey
LOCAL lcRsaJwkStr
LOCAL loJson
LOCAL loPrng
LOCAL loEcc
LOCAL loEcKey
LOCAL lcEcJwkStr
LOCAL loCrypt
LOCAL loJwkHmac
LOCAL loJwkAes

lnSuccess = 0

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

* ----------------------------------------------
* Generate an RSA key pair in JWK format.
* (Examples for generating other key types are shown below...)
loRsa = CreateObject('Chilkat.Rsa')
loRsaKey = CreateObject('Chilkat.PrivateKey')
lnSuccess = loRsa.GenKey(2048,loRsaKey)
IF (lnSuccess = 0) THEN
    ? loRsa.LastErrorText
    RELEASE loRsa
    RELEASE loRsaKey
    CANCEL
ENDIF

lcRsaJwkStr = loRsaKey.GetJwk()

* The string returned is the most compact possible, and therefore it is not
* very readable.  To pretty-print, load into a JSON object and emit..
loJson = CreateObject('Chilkat.JsonObject')
loJson.EmitCompact = 0
loJson.Load(lcRsaJwkStr)
? loJson.Emit()

* Sample RSA JWK:

* { 
*   "kty": "RSA",
*   "n": "6w1Xpof7gKmytJ3yc_yjI5_K3MvVXnBYBDy5Oh2W6Xqu_fOl3W18SjS2AU5xJrTHlB_j84yQjPyXJh_ixjACK4K4dCSYqlLmn3R7QJ84vnHLIEkqwUICqOHdCBjK5xhMrdZxIhuNlJzbARY-3u9RqjsT3HYTjA6JNHUWTYBBRou4gYGm4cJgvX4uexdikqxnze014RmZMaOV_4MR--WL4G8QfNJ2pRBEXQeKyije89H6M5oTSK7KZqFTIqu9hwNtx2oGpGAIcS0Jv5xVl-hDtwXZNwQJaOxMzLw1nwnb2kMliJa67EabQFrQY_xthQNsfzcHJJlpqYiMprW8wRkzmQ",
*   "e": "AQAB",
*   "d": "1_bnXMw-SeYhmxAwb19lqVqtMpdaES5ZwHLmoT4EpbsiQ5T1BfENrMSnoaWoEy8w3Kk8cU7qlY-TdOUBIKWFqOKvhY8GciA_Y6zLfgGNSnYVczGmxfBXr0HvKvxUmWZbNbH9OqBkQnKoSmRdGcp7l1Q2mG4o4ZuNdxRJjKXV0_DTrNLUJzst0hsfoZ6mWUrQcn39XGvvLjz9ySS-DYGI1vli3ayx8jVNuw0rU8UXVs9WmPQLvZO_ZDMhoLEeKsdejnNkUNPAUjqxcSOZRojt4BfCmbt-_1slFb0NsoaqnDVZGezd9J9ocxGuyIWHAJu9GGZEcdaFyiDDs_WA1IS_fQ",
*   "p": "9dU8f6yOklRcpV6ayVMKpyQ6AMuBTF3rZmB498eAvvTkVG1-upm8IkikTVNpPjEalc82Sxuq8oF4N5x1-F33sgVEoCZG-1WFZTn-rnPnXSALES9hqSaVYEwnh61EiY8ckjBVr9jD2nL1JKdbfgVVeo69-9PdjnKYYDVL8eLNPwM",
*   "q": "9MX2sW0GyaOsZ86AYe3eG2ZgcgKHvhJa573gih5Jvi2e-Nv-L0EVK29_DA7n0Pjm-gl9zVAsGsMMkphJyEF9QgyUlJ-59XLqWnECS5gO6WZdtHrJxVvcO-_AOrLIxeYnYcwhmaVaxs_UEpqGzupKHCWgf4cfXe49lrIsqGKH4jM",
*   "dp": "IQgj9uvSxGq9gCL0HXUhC1Bc0tqFZyN_i-QOnQybig0R2R5VVvFtTBYCrbk1fPvQHK0ZGIKBN9CZvK8zUsodjDgU_ofmJcNaBz4BsKM2RVcW5Zo-PyJGFAhnj12CxhEKv8Hq4ZP4zROBSQmLy6Uf1TX05S-Up51SSCshJ0FYXs0",
*   "dq": "RijsMiUfGfL5OvP85pUI4e-xW1yQThHyzpQlZVGTL5jiBVEBhcfw6ndWAj3Pgp2ljyvjTFNboPwhgW93Tpg-8AytFgDGi605sVzNHJ_kPlBiMZY0eYaAFQn-npSaaecziJu7UdAMugneLsruMycCwRij7Ynsmr7sFmLR3B4J9vM",
*   "qi": "jZE-a1pa8YjflpCSH5oqp1f6f6I6-hpZcLdamLCoAcjVSIPk86gtXtOFES4411-DqYzYIZM6B_g_SRYY6JpKAOuZ40mmMTlnIEoVf8BHiGl3g6bBAiN1yQGXrwXJsg2OYnocyRA-xWNdcMSSFA52SwEdar2Mmw29qVzxtC1QbpA"
* }

* ----------------------------------------------
* Generate an EC P-256 key pair in JWK format

loPrng = CreateObject('Chilkat.Prng')
loEcc = CreateObject('Chilkat.Ecc')
loEcKey = CreateObject('Chilkat.PrivateKey')
loEcc.GenKey("P-256",loPrng,loEcKey)

lcEcJwkStr = loEcKey.GetJwk()
loJson.Load(lcEcJwkStr)
? loJson.Emit()

* Sample EC JWK Key:
* { 
*   "kty": "EC",
*   "crv": "P-256",
*   "x": "tDeeYABgKEAbWicYPCEEI8sP4SRIhHKcHDW7VqrB4LA",
*   "y": "J08HOoIZ0rX2Me3bNFZUltfxIk1Hrc8FsLu8VaSxsMI",
*   "d": "-bqt1T0wNAN8sP5ruycQZRVlMlt3V_dSwlJ60xAX5io"
* }

* ----------------------------------------------
* Octet sequence keys are intended for representing secret keys, such as HMAC keys and AES keys.

* We'll use crypt to generate a random UUID..
loCrypt = CreateObject('Chilkat.Crypt2')

* AES and HMAC keys are simply random arrays of bytes
* For these, we can just build the JSON directly,
* with the help of the PRNG object.

loJwkHmac = CreateObject('Chilkat.JsonObject')
loJwkHmac.EmitCompact = 0

* Generate a 256-bit HMAK key (32 bytes)
loJwkHmac.AppendString("kty","oct")
* Give the key an optional ID, which can be anything, even strings as simple as "1", "2", etc.
loJwkHmac.AppendString("kid",loCrypt.GenerateUuid())
* Indicate the intended key alg (optional)
loJwkHmac.AppendString("alg","HS256")
* Generate the actual key bytes
loJwkHmac.AppendString("k",loPrng.GenRandom(32,"base64url"))

? loJwkHmac.Emit()

* Sample HMAC-256 JWK:

* { 
*   "kty": "oct",
*   "kid": "06c2515d-41fb-e436-e405-3abb361f5f7a",
*   "alg": "HS256",
*   "k": "wR32w7yiMe5Lhb1vkW2koBpoMxpXTFYuxOYCCIEKjdE"
* }

* ----------------------------------------------
* Now generate a 192-bit (24 byte) key that could be used with AES192GCM

loJwkAes = CreateObject('Chilkat.JsonObject')
loJwkAes.EmitCompact = 0

loJwkAes.AppendString("kty","oct")
loJwkAes.AppendString("kid","2")
loJwkAes.AppendString("k",loPrng.GenRandom(24,"base64url"))

? loJwkAes.Emit()

* Sample AES key:
* { 
*   "kty": "oct",
*   "kid": "2",
*   "k": "akAkq-L_ZTZ6-tEIhDUMtU2ENhsEgL-p"
* }

RELEASE loRsa
RELEASE loRsaKey
RELEASE loJson
RELEASE loPrng
RELEASE loEcc
RELEASE loEcKey
RELEASE loCrypt
RELEASE loJwkHmac
RELEASE loJwkAes