blob: f9d54884f093a246fa4944b76b1106ee38a6e34f [file] [log] [blame]
/*
Test AES-256 encryption and decryption in GCM mode
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <amcl/utils.h>
#include <amcl/randapi.h>
#include <pqnist/pqnist.h>
#define Keylen 32
#define IVlen 12
#define Taglen 12
int main()
{
int i;
// Seed value for CSPRNG
// Seed value for CSPRNG
char seed[PQNIST_SEED_LENGTH];
octet SEED = {sizeof(seed),sizeof(seed),seed};
csprng RNG;
// Alice's authentication Tag
char t1[Taglen];
octet T1= {sizeof(t1),sizeof(t1),t1};
// Bob's authentication Tag
char t2[Taglen];
octet T2= {sizeof(t2),sizeof(t2),t2};
// AES Key
char k[Keylen];
octet K= {0,sizeof(k),k};
// Initialization vector
char iv[IVlen];
octet IV= {0,sizeof(iv),iv};
// Ciphertext
char c[256];
octet C= {0,sizeof(c),c};
// Recovered plaintext
char p2[256];
octet P2= {0,sizeof(p2),p2};
// Message to be sent to Bob
char p1[256];
octet P1 = {0, sizeof(p1), p1};
OCT_jstring(&P1,"Hello Bob!");
// Additional authenticated data (AAD)
char aad[256];
octet AAD = {0, sizeof(aad), aad};
OCT_jstring(&AAD,"Header info");
// non random seed value
for (i=0; i<PQNIST_SEED_LENGTH; i++) SEED.val[i]=i+1;
printf("SEED: ");
OCT_output(&SEED);
printf("\n");
// initialise random number generator
CREATE_CSPRNG(&RNG,&SEED);
// Generate 256 bit AES Key
K.len=Keylen;
generateRandom(&RNG,&K);
// Alice
printf("Alice Key: ");
amcl_print_hex(K.val, K.len);
// Random initialization value
IV.len=IVlen;
generateRandom(&RNG,&IV);
printf("Alice IV: ");
OCT_output(&IV);
printf("Alice AAD: ");
OCT_output(&AAD);
printf("Alice Plaintext: ");
OCT_output(&P1);
printf("Alice Plaintext: ");
OCT_output_string(&P1);
printf("\n");
// Encrypt plaintext
pqnist_aes_gcm_encrypt(K.val, K.len, IV.val, IV.len, AAD.val, AAD.len, P1.val, P1.len, C.val, T1.val);
C.len = P1.len;
printf("Alice: Ciphertext: ");
OCT_output(&C);
T1.len = Taglen;
printf("Alice Tag: ");
OCT_output(&T1);
printf("\n");
// Bob
printf("Bob Key: ");
amcl_print_hex(K.val, K.len);
printf("Bob IV ");
OCT_output(&IV);
printf("Bob AAD: ");
OCT_output(&AAD);
printf("Bob Ciphertext: ");
OCT_output(&C);
pqnist_aes_gcm_decrypt(K.val, K.len, IV.val, IVlen, AAD.val, AAD.len, C.val, C.len, P2.val, T2.val);
printf("Bob Plaintext: ");
P2.len = C.len;
OCT_output(&P2);
printf("Bob Plaintext: ");
OCT_output_string(&P2);
printf("\n");
printf("Bob Tag: ");
T2.len = Taglen;
OCT_output(&T2);
if (!OCT_comp(&P1,&P2))
{
printf("FAILURE Decryption");
exit(EXIT_FAILURE);
}
if (!OCT_comp(&T1,&T2))
{
printf("FAILURE TAG mismatch");
exit(EXIT_FAILURE);
}
/* clear memory */
OCT_clear(&T1);
OCT_clear(&T2);
OCT_clear(&K);
OCT_clear(&IV);
OCT_clear(&C);
OCT_clear(&P1);
OCT_clear(&P2);
KILL_CSPRNG(&RNG);
printf("SUCCESS\n");
exit(EXIT_SUCCESS);
}