#include #include #include typedef unsigned char poly8; typedef unsigned long long poly8x64[8]; void poly8_bitslice(poly8x64 r, const poly8 x[64]) { /* TODO implement */ } /* reduction polynomial x^8 + x^4 + x^3 + x + 1 */ void poly8x64_mulmod(poly8x64 r, const poly8x64 a, const poly8x64 b) { /* TODO implement */ } void poly8x64_unbitslice(poly8 r[64], const poly8x64 x) { /* TODO implement */ } static void poly8mod_print(const poly8 x) { int i; int d=0; printf("Mod("); for(i=0;i<8;i++) if(1&(x>>i)) { if(d) printf(" + "); printf("Mod(1,2)*X^%d",i); d = 1; } if(d==0) printf("Mod(0,2)"); printf(",Mod(1,2)*X^8+Mod(1,2)*X^4+Mod(1,2)*X^3+Mod(1,2)*X+Mod(1,2))"); } /* Pipe output through gp */ int main() { poly8 a[64], b[64], r[64]; poly8x64 va, vb, vt; int i; FILE *urandom = fopen("/dev/urandom","r"); for(i=0;i<64;i++) { a[i] = fgetc(urandom); b[i] = fgetc(urandom); } poly8_bitslice(va, a); poly8_bitslice(vb, b); poly8x64_mulmod(vt,va,vb); poly8x64_unbitslice(r,vt); for(i=0;i<64;i++) { printf("centerlift(centerlift("); poly8mod_print(a[i]); printf(" * "); poly8mod_print(b[i]); printf(" - "); poly8mod_print(r[i]); printf("))\n"); } fclose(urandom); return 0; }