#include #include #include #include #include #include "fns.h" void (*cipher[])(uchar *, uchar *, AESstate *); void usage(void) { fprint(2, "usage: %s [-d] key [ivec]\n", argv0); exits(nil); } void main(int argc, char **argv) { int dflag; uchar key[AESmaxkey]; int keylen; AESstate s; Biobuf bin, bout; long n; uchar ivec[AESbsize], in[AESbsize], out[AESbsize]; dflag = 0; ARGBEGIN { case 'd': dflag = 1; break; default: usage(); } ARGEND if(argc < 1 || argc > 2) usage(); keylen = readfile(argv[0], key, sizeof key); if(argc == 2) { if(readfile(argv[1], ivec, sizeof ivec) != sizeof ivec) sysfatal("short ivec"); } else { memset(ivec, 0, sizeof ivec); } Binit(&bin, 0, OREAD); Binit(&bout, 1, OWRITE); setupAESstate(&s, key, keylen, ivec); while((n = Bread(&bin, in, sizeof in)) == sizeof in) { cipher[dflag](out, in, &s); if(Bwrite(&bout, out, sizeof out) < sizeof out) sysfatal("write: %r"); } if(n < 0) sysfatal("read: %r"); if(n > 0 && n < sizeof in) sysfatal("unusual block size: %ld", n); exits(nil); }