Sample code for 30+ languages & platforms
C

JWE with Binary Data

See more JSON Web Encryption (JWE) Examples

Demonstrates how to create a JWE that contains a binary payload (such as a JPG image).

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

Chilkat C Downloads

C
#include <C_CkBinData.h>
#include <C_CkJwe.h>
#include <C_CkJsonObject.h>
#include <C_CkStringBuilder.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkBinData jpgBytes;
    HCkJwe jwe;
    HCkJsonObject jweProtHdr;
    const char *aesWrappingKey;
    HCkStringBuilder sbJwe;
    HCkJwe jwe2;
    HCkBinData jpgOriginal;

    success = FALSE;

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

    // Note: This example requires Chilkat v9.5.0.66 or greater.

    // Load a JPG file that will be the JWE payload.
    jpgBytes = CkBinData_Create();
    success = CkBinData_LoadFile(jpgBytes,"qa_data/jpg/starfish.jpg");
    // Make sure your app checks the success/failure of the call to LoadFile..
    printf("Original JPG size = %d\n",CkBinData_getNumBytes(jpgBytes));

    jwe = CkJwe_Create();

    jweProtHdr = CkJsonObject_Create();
    CkJsonObject_AppendString(jweProtHdr,"alg","A128KW");
    CkJsonObject_AppendString(jweProtHdr,"enc","A128CBC-HS256");
    CkJwe_SetProtectedHeader(jwe,jweProtHdr);

    aesWrappingKey = "GawgguFyGrWKav7AX4VKUg";
    CkJwe_SetWrappingKey(jwe,0,aesWrappingKey,"base64url");

    // Encrypt and return the JWE in sbJwe:
    sbJwe = CkStringBuilder_Create();
    success = CkJwe_EncryptBd(jwe,jpgBytes,sbJwe);
    if (success != TRUE) {
        printf("%s\n",CkJwe_lastErrorText(jwe));
        CkBinData_Dispose(jpgBytes);
        CkJwe_Dispose(jwe);
        CkJsonObject_Dispose(jweProtHdr);
        CkStringBuilder_Dispose(sbJwe);
        return;
    }

    // Show the JWE:
    printf("%s\n",CkStringBuilder_getAsString(sbJwe));
    printf("size of JWE: %d\n",CkStringBuilder_getLength(sbJwe));

    // ---------------------------------------------------------
    // Decrypt to get the original JPG file..

    jwe2 = CkJwe_Create();
    success = CkJwe_LoadJweSb(jwe2,sbJwe);
    if (success != TRUE) {
        printf("%s\n",CkJwe_lastErrorText(jwe2));
        CkBinData_Dispose(jpgBytes);
        CkJwe_Dispose(jwe);
        CkJsonObject_Dispose(jweProtHdr);
        CkStringBuilder_Dispose(sbJwe);
        CkJwe_Dispose(jwe2);
        return;
    }

    // Set the AES wrap key.
    CkJwe_SetWrappingKey(jwe2,0,aesWrappingKey,"base64url");

    // Decrypt.
    jpgOriginal = CkBinData_Create();
    success = CkJwe_DecryptBd(jwe2,0,jpgOriginal);
    if (success != TRUE) {
        printf("%s\n",CkJwe_lastErrorText(jwe2));
        CkBinData_Dispose(jpgBytes);
        CkJwe_Dispose(jwe);
        CkJsonObject_Dispose(jweProtHdr);
        CkStringBuilder_Dispose(sbJwe);
        CkJwe_Dispose(jwe2);
        CkBinData_Dispose(jpgOriginal);
        return;
    }

    printf("Decrypted JPG size = %d\n",CkBinData_getNumBytes(jpgOriginal));

    // Save the decrypted JPG to a file.
    success = CkBinData_WriteFile(jpgOriginal,"qa_output/jwe_decrypted_starfish.jpg");

    printf("success = %d\n",success);

    // The output of this program, when tested, was:
    // Original JPG size = 6229
    // eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.9YFz_wteV ... 7Et3hKhpxnKEXw
    // size of JWE: 8473
    // Decrypted JPG size = 6229
    // success = True


    CkBinData_Dispose(jpgBytes);
    CkJwe_Dispose(jwe);
    CkJsonObject_Dispose(jweProtHdr);
    CkStringBuilder_Dispose(sbJwe);
    CkJwe_Dispose(jwe2);
    CkBinData_Dispose(jpgOriginal);

    }