Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F121324234
main.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Thu, Jul 10, 01:46
Size
5 KB
Mime Type
text/x-c
Expires
Sat, Jul 12, 01:46 (2 d)
Engine
blob
Format
Raw Data
Handle
27289108
Attached To
R10499 Energy Analysis of Lightweight AEAD Circuit
main.c
View Options
#include "forkskinny.h"
#include<stdio.h>
#include <stdlib.h>
#include<time.h>
#include "api.h"
#include "paef.h"
void print_cell(unsigned char s[4][4]){
int j,k;
printf("\nResult: ");
for (j = 0; j < 4; j++)
for (k = 0; k < 4; k++)
printf("%02x ", s[j][k]);
}
void save_enc(FILE *in, FILE* out, unsigned char* tweakey, unsigned char* PT, unsigned char* C0, unsigned char* C1) {
int i;
for(i=0;i<16;i++) fprintf(in, "%02X", PT[i]); fprintf(in, "\n");
for(i=0;i<16;i++) fprintf(in, "%02X", tweakey[i]); fprintf(in, "\n");
for(i=16;i<36;i++) fprintf(in, "%02X", tweakey[i]); fprintf(in, "\n");
fprintf(in, "1\n");
for(i=0;i<16;i++) fprintf(out, "%02X", C1[i]); fprintf(out, "\n");
}
void save_both(FILE *in, FILE* out, unsigned char* tweakey, unsigned char* PT, unsigned char* C0, unsigned char* C1) {
int i;
//forkEncrypt(C0, C1, PT, tweakey, (enum encrypt_selector) ENC_BOTH);
for(i=0;i<16;i++) fprintf(in, "%02X", PT[i]); fprintf(in, "\n");
for(i=0;i<16;i++) fprintf(in, "%02X", tweakey[i]); fprintf(in, "\n");
for(i=16;i<36;i++) fprintf(in, "%02X", tweakey[i]); fprintf(in, "\n");
fprintf(in, "0\n");
for(i=0;i<16;i++) fprintf(out, "%02X", C1[i]); fprintf(out, "\n");
for(i=0;i<16;i++) fprintf(out, "%02X", C0[i]); fprintf(out, "\n");
}
void random_testcase_gen(unsigned char* tweakey, unsigned char* PT, unsigned char* C0, unsigned char* C1) {
int i;
for(i = 0; i < 36; i++) tweakey[i] = rand() % 256;
for(i = 36; i < 48; i++) tweakey[i] = 0x00;
for(i = 0; i < 16; i++) PT[i] = rand() % 256;
forkEncrypt(C0, C1, PT, tweakey, (enum encrypt_selector) ENC_BOTH);
}
void random_aead_gen(unsigned char *c,
unsigned char *m, unsigned long long *mlen,
unsigned char *ad, unsigned long long *adlen,
unsigned char *npub,
unsigned char *k, unsigned char *incomplete_ad, unsigned char*incomplete_m ) {
// |nonce| = 104, |key| = 128, |block| = block_len*8, |
int i;
do {
*mlen = (unsigned long long) rand()%5;
*adlen = (unsigned long long) rand()%5;
} while (*adlen + *mlen == 0);
//*adlen = 1;
//*mlen = 1;
*incomplete_ad = rand()%2 == 0 ? 0x00 : 0x01;
*incomplete_m = rand()%2 == 0 ? 0x00 : 0x01;
//printf("mlen = %d\n", (int) *mlen);
//printf("adlen = %d\n", (int) *adlen);
for(i=0; i<13; i++) npub[i] = rand() % 256;
for(i=13; i<16; i++) npub[i] = 0x00;
for(i=0; i<16; i++) k[i] = rand() % 256;
for(i=0; i<16*(*mlen); i++) m[i] = rand() % 256;
for(i=0; i<16*(*adlen); i++) ad[i] = rand() % 256;
unsigned long long m_len = (*mlen) * 16;
unsigned long long ad_len = (*adlen) * 16;
// make ad half-complete
if (*incomplete_ad == 0x01 && *adlen >0) {
for(i=16*(*adlen - 1) + 8; i<16*(*adlen); i++) ad[i] = 0x00;
ad[16*(*adlen-1)+8]= 0x80;
ad_len -= 8;
}
if (*incomplete_m == 0x01 && *mlen >0) {
for(i=16*(*mlen - 1) + 8; i<16*(*mlen); i++) m[i] = 0x00;
m[16*(*mlen-1)+8] = 0x80;
m_len -= 8;
}
int res = paef_encrypt(c, m, m_len, ad, ad_len, npub, k);
//for(i=16*(*adlen + *mlen -1) + 8; i<16*(*adlen + *mlen); i++) c[i] = 0x00;
//for(i=0;i<128;i++) printf("%02X", c[i]); printf("\n");
if (res == -1) exit(1);
}
void save_aead(FILE *in, FILE* out, FILE* out2,
unsigned char *c, unsigned char *m, unsigned long long *mlen,
unsigned char *ad, unsigned long long *adlen,
unsigned char *npub,
unsigned char *k, unsigned char* incomplete_ad, unsigned char* incomplete_m) {
unsigned int i,j;
//forkEncrypt(C0, C1, PT, tweakey, (enum encrypt_selector) ENC_BOTH);
fprintf(in, "%d\n", (int) *adlen);
fprintf(in, "%d\n", (int) *mlen);
fprintf(in, "%d\n", (int) *incomplete_ad);
fprintf(in, "%d\n", (int) *incomplete_m);
for(i=0;i<16;i++) fprintf(in, "%02X", npub[i]); fprintf(in, "\n");
for(i=0;i<16;i++) fprintf(in, "%02X", k[i]); fprintf(in, "\n");
for(j=0;j<*adlen;j++) { for(i=16*j;i<16*(j+1);i++) fprintf(in, "%02X", ad[i]); fprintf(in, "\n"); }
for(j=0;j<*mlen;j++) { for(i=16*j;i<16*(j+1);i++) fprintf(in, "%02X", m[i]); fprintf(in, "\n"); }
for(j=0;j<(*mlen)+1;j++) { for(i=16*j;i<16*(j+1);i++) fprintf(out2, "%02X", c[i]); fprintf(out2, "\n"); }
if ((*mlen) == 0) {
for(i=0;i<16;i++) fprintf(out, "%02X", c[i]); fprintf(out, "\n");
return;
}
for(j=0;j<(*mlen)-1;j++) { for(i=16*j;i<16*(j+1);i++) fprintf(out, "%02X", c[i]); fprintf(out, "\n"); }
// change the order of tag and ct for testbench convenience
j = j+1;
for(i=16*j;i<16*(j+1);i++) fprintf(out, "%02X", c[i]); fprintf(out, "\n");
j = j-1;
for(i=16*j;i<16*(j+1);i++) fprintf(out, "%02X", c[i]); fprintf(out, "\n");
}
int main() {
FILE *in0 = fopen("test_vectors/in_paef", "w");
//FILE *in1 = fopen("test_vectors/in_both", "w");
FILE *out0 = fopen("test_vectors/out_paef_swapped", "w");
FILE *out1 = fopen("test_vectors/out_paef", "w");
unsigned char m[64]; // so we can accommodate 4 block
unsigned char c[160]; // 8 blocks at most
unsigned char k[16];
unsigned char ad[64];
unsigned char npub[16]; // 104 bits
unsigned long long mlen, adlen;
unsigned char tweakey[48];
unsigned char C0[16], C1[16];
unsigned char incomplete_ad, incomplete_m;
int i,j;
/*
for(j=0; j<3; j++) {
random_testcase_gen(tweakey, m, C0, C1);
save_enc(in1, out1, tweakey, m, C0, C1);
save_both(in1, out1, tweakey, m, C0, C1);
}
*/
for(j=0; j<33; j++) {
random_aead_gen(c, m, &mlen, ad, &adlen, npub, k, &incomplete_ad, &incomplete_m);
save_aead(in0, out0, out1, c, m, &mlen, ad, &adlen, npub, k, &incomplete_ad, &incomplete_m);
}
fclose(in0);
//fclose(in1);
fclose(out0);
//fclose(out1);
}
Event Timeline
Log In to Comment