#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "hex.h"
#include <assert.h>
char cipher(unsigned char block, char key)
{
return (key+11*block)%256;
}
char inv_cipher(unsigned char block, char key)
{
return (163*(block-key+256))%256;
}
unsigned char gmul(unsigned char a, unsigned char b) {
unsigned char p = 0;
unsigned char counter;
unsigned char hi_bit_set;
for(counter = 0; counter < 8; counter++) {
if((b & 1) == 1)
p ^= a;
hi_bit_set = (a & 0x80);
a <<= 1;
if(hi_bit_set == 0x80)
a ^= 0x1b;
b >>= 1;
}
return p;
}
unsigned char simple_gcm(char* pt, char key, char iv, int len, char aad)
{
iv &= 0xF8;
unsigned char g;
int i =0, ctr=0;
for(i=0; i < len;i++)
{
ctr &= 0x7;
ctr++;
}
return g;
}
#define VALID 1
#define INVALID 0
int gcm_decrypt_and_validate(char* ct, char key, char iv, int len, char aad, char tag)
{
return VALID;
}
void print_ct(char* ct,int len)
{
printf("ciphertext: 0x%s\n",bin2hex(ct,len));
}
int main()
{
char key = 8;
char iv = 0xaa;
int len;
int a = 6;
char ct[1000] = {0};
char pt[12][100] = {"wife", "mother", "soldier", "risk", "endless", "hair", "vote", "outside", "plate", "estate", "slow", "baby"};
char ct_ark[12][100] = {{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}};
char aad = 37;
len = strlen(pt[a]);
strncpy(ct,pt[a],len);
printf("plaintext: %s\n",pt[a]);
char tag = simple_gcm(ct,key,iv,len,aad);
printf("ciphertext: 0x%s\n",bin2hex(ct,len));
printf("tag: 0x%s\n",bin2hex(&tag,1));
strncpy(ct_ark[a],ct,len);
printf("validating tag: ");
int valid = gcm_decrypt_and_validate(ct,key,iv,len,aad,tag);
assert(valid==VALID);
assert(strncmp(ct,pt[a],len)==0);
printf(" valid\n");
a++;
iv = 0xc9;
aad = 22;
len = strlen(pt[a]);
strncpy(ct,pt[a],len);
printf("plaintext: %s\n",pt[a]);
tag = simple_gcm(ct,key,iv,len,aad);
printf("ciphertext: 0x%s\n",bin2hex(ct,len));
printf("tag: 0x%s\n",bin2hex(&tag,1));
strncpy(ct_ark[a],ct,len);
printf("validating tag: ");
valid = gcm_decrypt_and_validate(ct,key,iv,len,aad,tag);
assert(valid==VALID);
assert(strncmp(ct,pt[a],len)==0);
printf(" valid\n");
a++;
iv = 0x69;
aad = 200;
len = strlen(pt[a]);
strncpy(ct,pt[a],len);
printf("plaintext: %s\n",pt[a]);
tag = simple_gcm(ct,key,iv,len,aad);
printf("ciphertext: 0x%s\n",bin2hex(ct,len));
printf("tag: 0x%s\n",bin2hex(&tag,1));
strncpy(ct_ark[a],ct,len);
printf("validating tag: ");
valid = gcm_decrypt_and_validate(ct,key,iv,len,aad,tag);
assert(valid==VALID);
assert(strncmp(ct,pt[a],len)==0);
printf(" valid\n");
a++;
iv = 0x69;
aad = 200;
len = strlen(pt[a]);
strncpy(ct,pt[a],len);
printf("plaintext: %s\n",pt[a]);
tag = simple_gcm(ct,key,iv,len,aad);
printf("ciphertext: 0x%s\n",bin2hex(ct,len));
printf("tag: 0x%s\n",bin2hex(&tag,1));
strncpy(ct_ark[a],ct,len);
tag++;
printf("replacing tag with 0x%s\n",bin2hex(&tag,1));
printf("validating tag: ");
valid = gcm_decrypt_and_validate(ct,key,iv,len,aad,tag);
assert(valid==VALID);
assert(strncmp(ct,pt[a],len)==0);
printf(" valid\n");
}