Ask Your Question

Revision history [back]

Can i decrypt intial QUIC payload using libgcrypt.

Hey All, Just a newbie asking silly questions. I was trying to decrypt initial payload for quic . I tried using libgcrypt , but failed to decrypt another payload using a sample code.

include <gcrypt.h>

include <string.h>

void main() { #define GCRY_CIPHER GCRY_CIPHER_SHA256 // Pick the cipher here #define GCRY_C_MODE GCRY_CIPHER_MODE_OCB // Pick the cipher mode here

gcry_error_t     gcryError;
gcry_cipher_hd_t gcryCipherHd;

size_t index;
size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER);
size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER);
char * txtBuffer = "123456789 abcdefghijklmnopqrstuvwzyz ABCDEFGHIJKLMNOPQRSTUVWZYZ";
size_t txtLength = strlen(txtBuffer)+1; // string plus termination
char * encBuffer = malloc(txtLength);
char * outBuffer = malloc(txtLength);
char * aesSymKey = "one test AES key"; // 16 bytes
char * iniVector = "a test ini value"; // 16 bytes

gcryError = gcry_cipher_open(
    &gcryCipherHd, // gcry_cipher_hd_t *
    GCRY_CIPHER,   // int
    GCRY_C_MODE,   // int
    0);            // unsigned int
if (gcryError)
{
    printf("gcry_cipher_open failed:  %s/%s\n",
    gcry_strsource(gcryError),
    gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_open    worked\n");

gcryError = gcry_cipher_setkey(gcryCipherHd, aesSymKey, keyLength);
if (gcryError)
{
    printf("gcry_cipher_setkey failed:  %s/%s\n",
    gcry_strsource(gcryError),
    gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_setkey  worked\n");
gcryError = gcry_cipher_setiv(gcryCipherHd, iniVector, blkLength);
if (gcryError)
{
    printf("gcry_cipher_setiv failed:  %s/%s\n",
    gcry_strsource(gcryError),
    gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_setiv   worked\n");
gcryError = gcry_cipher_encrypt(gcryCipherHd, // gcry_cipher_hd_t
                encBuffer,    // void *
                txtLength,    // size_t
                txtBuffer,    // const void *
                txtLength );   // size_t

if (gcryError)
{
    printf("gcry_cipher_encrypt failed:  %s/%s\n",
    gcry_strsource(gcryError),
    gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_encrypt worked\n");
gcryError = gcry_cipher_setiv(gcryCipherHd, iniVector, blkLength);
if (gcryError)
{
    printf("gcry_cipher_setiv failed:  %s/%s\n",
    gcry_strsource(gcryError),
    gcry_strerror(gcryError));
    return;
}

printf("gcry_cipher_setiv   worked\n");

gcryError = gcry_cipher_decrypt(
    gcryCipherHd, // gcry_cipher_hd_t
    outBuffer,    // void *
    txtLength,    // size_t
    encBuffer,    // const void *
    txtLength);   // size_t
if (gcryError)
{
    printf("gcry_cipher_decrypt failed:  %s/%s\n",
    gcry_strsource(gcryError),
    gcry_strerror(gcryError));
    return;
}
printf("gcry_cipher_decrypt worked\n");

printf("keyLength = %zu\n", keyLength);
printf("blkLength = %zu\n", blkLength);
printf("txtLength = %zu\n", txtLength);
printf("aesSymKey = %s\n", aesSymKey);
printf("iniVector = %s\n", iniVector);
printf("txtBuffer = %s\n", txtBuffer);

printf("encBuffer = ");
for (index = 0; index<(strlen(txtBuffer)+1) index++)
printf("%02X", (unsigned char)encBuffer[index]);
printf("\n");

printf("outBuffer = %s\n", outBuffer);

// clean up after ourselves
gcry_cipher_close(gcryCipherHd);
free(encBuffer);
free(outBuffer);

}

This ample code works. but i would really like to know which cipher and cipher mode is used by QUIC version 0xfaceb00 and what are these aesSymKey , iniVector.

Kindly ignore my limited knowledge .

Can i decrypt intial QUIC payload using libgcrypt.

Hey All, Just a newbie asking silly questions. I was trying to decrypt initial payload for quic . I tried using libgcrypt , but failed to decrypt another payload using a sample code.

include <gcrypt.h>

include <string.h>

#include <gcrypt.h>
#include <string.h>

void main()
{
    #define GCRY_CIPHER GCRY_CIPHER_SHA256   // Pick the cipher here
    #define GCRY_C_MODE GCRY_CIPHER_MODE_OCB // Pick the cipher mode here

here

    gcry_error_t     gcryError;
 gcry_cipher_hd_t gcryCipherHd;

 size_t index;
 size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER);
 size_t blkLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER);
 char * txtBuffer = "123456789 abcdefghijklmnopqrstuvwzyz ABCDEFGHIJKLMNOPQRSTUVWZYZ";
 size_t txtLength = strlen(txtBuffer)+1; // string plus termination
 char * encBuffer = malloc(txtLength);
 char * outBuffer = malloc(txtLength);
 char * aesSymKey = "one test AES key"; // 16 bytes
 char * iniVector = "a test ini value"; // 16 bytes

 gcryError = gcry_cipher_open(
     &gcryCipherHd, // gcry_cipher_hd_t *
     GCRY_CIPHER,   // int
     GCRY_C_MODE,   // int
     0);            // unsigned int
 if (gcryError)
 {
     printf("gcry_cipher_open failed:  %s/%s\n",
     gcry_strsource(gcryError),
     gcry_strerror(gcryError));
     return;
 }
 printf("gcry_cipher_open    worked\n");

 gcryError = gcry_cipher_setkey(gcryCipherHd, aesSymKey, keyLength);
 if (gcryError)
 {
     printf("gcry_cipher_setkey failed:  %s/%s\n",
     gcry_strsource(gcryError),
     gcry_strerror(gcryError));
     return;
 }
 printf("gcry_cipher_setkey  worked\n");
 gcryError = gcry_cipher_setiv(gcryCipherHd, iniVector, blkLength);
 if (gcryError)
 {
     printf("gcry_cipher_setiv failed:  %s/%s\n",
     gcry_strsource(gcryError),
     gcry_strerror(gcryError));
     return;
 }
 printf("gcry_cipher_setiv   worked\n");
 gcryError = gcry_cipher_encrypt(gcryCipherHd, // gcry_cipher_hd_t
                 encBuffer,    // void *
                 txtLength,    // size_t
                 txtBuffer,    // const void *
                 txtLength );   // size_t

 if (gcryError)
 {
     printf("gcry_cipher_encrypt failed:  %s/%s\n",
     gcry_strsource(gcryError),
     gcry_strerror(gcryError));
     return;
 }
 printf("gcry_cipher_encrypt worked\n");
 gcryError = gcry_cipher_setiv(gcryCipherHd, iniVector, blkLength);
 if (gcryError)
 {
     printf("gcry_cipher_setiv failed:  %s/%s\n",
     gcry_strsource(gcryError),
     gcry_strerror(gcryError));
     return;
 }

 printf("gcry_cipher_setiv   worked\n");

 gcryError = gcry_cipher_decrypt(
     gcryCipherHd, // gcry_cipher_hd_t
     outBuffer,    // void *
     txtLength,    // size_t
     encBuffer,    // const void *
     txtLength);   // size_t
 if (gcryError)
 {
     printf("gcry_cipher_decrypt failed:  %s/%s\n",
     gcry_strsource(gcryError),
     gcry_strerror(gcryError));
     return;
 }
 printf("gcry_cipher_decrypt worked\n");

 printf("keyLength = %zu\n", keyLength);
 printf("blkLength = %zu\n", blkLength);
 printf("txtLength = %zu\n", txtLength);
 printf("aesSymKey = %s\n", aesSymKey);
 printf("iniVector = %s\n", iniVector);
 printf("txtBuffer = %s\n", txtBuffer);

 printf("encBuffer = ");
 for (index = 0; index<(strlen(txtBuffer)+1) index++)
 printf("%02X", (unsigned char)encBuffer[index]);
 printf("\n");

 printf("outBuffer = %s\n", outBuffer);

 // clean up after ourselves
 gcry_cipher_close(gcryCipherHd);
 free(encBuffer);
 free(outBuffer);
}

}

This ample code works. but i would really like to know which cipher and cipher mode is used by QUIC version 0xfaceb00 and what are these aesSymKey , iniVector.

Kindly ignore my limited knowledge . .