Sample code for 30+ languages & platforms
Unicode 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 Unicode C Downloads

Unicode C
#include <C_CkBinDataW.h>
#include <C_CkJweW.h>
#include <C_CkJsonObjectW.h>
#include <C_CkStringBuilderW.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkBinDataW jpgBytes;
    HCkJweW jwe;
    HCkJsonObjectW jweProtHdr;
    const wchar_t *aesWrappingKey;
    HCkStringBuilderW sbJwe;
    HCkJweW jwe2;
    HCkBinDataW 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 = CkBinDataW_Create();
    success = CkBinDataW_LoadFile(jpgBytes,L"qa_data/jpg/starfish.jpg");
    // Make sure your app checks the success/failure of the call to LoadFile..
    wprintf(L"Original JPG size = %d\n",CkBinDataW_getNumBytes(jpgBytes));

    jwe = CkJweW_Create();

    jweProtHdr = CkJsonObjectW_Create();
    CkJsonObjectW_AppendString(jweProtHdr,L"alg",L"A128KW");
    CkJsonObjectW_AppendString(jweProtHdr,L"enc",L"A128CBC-HS256");
    CkJweW_SetProtectedHeader(jwe,jweProtHdr);

    aesWrappingKey = L"GawgguFyGrWKav7AX4VKUg";
    CkJweW_SetWrappingKey(jwe,0,aesWrappingKey,L"base64url");

    // Encrypt and return the JWE in sbJwe:
    sbJwe = CkStringBuilderW_Create();
    success = CkJweW_EncryptBd(jwe,jpgBytes,sbJwe);
    if (success != TRUE) {
        wprintf(L"%s\n",CkJweW_lastErrorText(jwe));
        CkBinDataW_Dispose(jpgBytes);
        CkJweW_Dispose(jwe);
        CkJsonObjectW_Dispose(jweProtHdr);
        CkStringBuilderW_Dispose(sbJwe);
        return;
    }

    // Show the JWE:
    wprintf(L"%s\n",CkStringBuilderW_getAsString(sbJwe));
    wprintf(L"size of JWE: %d\n",CkStringBuilderW_getLength(sbJwe));

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

    jwe2 = CkJweW_Create();
    success = CkJweW_LoadJweSb(jwe2,sbJwe);
    if (success != TRUE) {
        wprintf(L"%s\n",CkJweW_lastErrorText(jwe2));
        CkBinDataW_Dispose(jpgBytes);
        CkJweW_Dispose(jwe);
        CkJsonObjectW_Dispose(jweProtHdr);
        CkStringBuilderW_Dispose(sbJwe);
        CkJweW_Dispose(jwe2);
        return;
    }

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

    // Decrypt.
    jpgOriginal = CkBinDataW_Create();
    success = CkJweW_DecryptBd(jwe2,0,jpgOriginal);
    if (success != TRUE) {
        wprintf(L"%s\n",CkJweW_lastErrorText(jwe2));
        CkBinDataW_Dispose(jpgBytes);
        CkJweW_Dispose(jwe);
        CkJsonObjectW_Dispose(jweProtHdr);
        CkStringBuilderW_Dispose(sbJwe);
        CkJweW_Dispose(jwe2);
        CkBinDataW_Dispose(jpgOriginal);
        return;
    }

    wprintf(L"Decrypted JPG size = %d\n",CkBinDataW_getNumBytes(jpgOriginal));

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

    wprintf(L"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


    CkBinDataW_Dispose(jpgBytes);
    CkJweW_Dispose(jwe);
    CkJsonObjectW_Dispose(jweProtHdr);
    CkStringBuilderW_Dispose(sbJwe);
    CkJweW_Dispose(jwe2);
    CkBinDataW_Dispose(jpgOriginal);

    }