#include "encio.h" #include #include #include void test_read() { ENCFILE *ef; ef = enc_fopen("test.txt.nc", "rb", "gaga"); enc_add_index(ef, "test.txt.ix", "gaga", INDEX_LOAD | INDEX_CREATE | INDEX_SAVE); FILE *f = fopen("res.txt", "rb"); // enc_forced_salt = memdup(ef->salt, ef->salt_size); // enc_forced_iv = memdup(ef->IV, ef->IV_size); int at = -11; int dir = SEEK_END; enc_fseek(ef, at, dir); fseek(f, at, dir); char buf[21]; int nread = enc_fread(buf, 1, 20, ef); buf[nread] = 0; fprintf(stderr, "buf = [%s], %d\n", buf, nread); nread = fread(buf, 1, 20, f); buf[nread] = 0; fprintf(stderr, "buf = [%s], %d\n", buf, nread); enc_fclose(ef); fclose(f); } void encrypt(const char *in, const char *out, const char *passphrase) { ENCFILE *ef; ef = enc_fopen(out, "wb", passphrase); FILE *f = fopen(in, "rb"); char buf[10000]; while(!feof(f)) { int nread = fread(buf, 1, 10000, f); int nwrote = enc_fwrite(buf, 1, nread, ef); } fclose(f); enc_fclose(ef); } void genfile(const char *fn, int size) { FILE *fp = fopen(fn, "wb"); int k; srand(time(NULL)); while(size) { k = rand(); fwrite(&k, 1, 1, fp); size--; } fclose(fp); } #define MAX_READ 10000 void test_seek(int size, int dir) { genfile("tmpfile.in", size); encrypt("tmpfile.in", "tmpfile.in.nc", "gaga"); ENCFILE *ef = enc_fopen("tmpfile.in.nc", "rb", "gaga"); FILE *fp = fopen("tmpfile.in", "rb"); enc_add_index(ef, NULL, "gaga", INDEX_CREATE); int i, at, chunk, nread, enread, seekres, eseekres, atdomain, t, et; atdomain = dir == SEEK_CUR ? 2*size : size; char *buf = malloc(MAX_READ); char *ebuf = malloc(MAX_READ); for(i = 0; i != 100; i++) { at = atdomain * ((float)rand())/RAND_MAX; chunk = MAX_READ * ((float)rand())/RAND_MAX; if(dir == SEEK_END) { at = -at; } if(dir == SEEK_CUR) { at -= size; } // fprintf(stderr, "%d: at = %d, chunk = %d\n", i, at, chunk); t = ftell(fp); et = enc_ftell(ef); seekres = fseek(fp, at, dir); if(ftell(fp) > size) { fseek(fp, t, SEEK_SET); --i; continue; } // stdio succeeds if fseek()ed beyond EOF, while encio does not eseekres = enc_fseek(ef, at, dir); nread = enread = 0; if(seekres != eseekres) { goto err; } nread = fread(buf, 1, chunk, fp); enread = enc_fread(ebuf, 1, chunk, ef); if(nread != enread) { goto err; } if(memcmp(buf, ebuf, nread) != 0) { goto err; } if(i % 50 == 0) { fprintf(stderr, "."); } } free(buf); free(ebuf); fclose(fp); enc_fclose(ef); fprintf(stderr, " OK\n"); unlink("tmpfile.in"); unlink("tmpfile.in.nc"); return; err: fprintf(stderr, "%d: at = %d, chunk = %d : ", i, at, chunk); fprintf(stderr, "nread = %d, enread = %d : ", nread, enread); fprintf(stderr, "seekres = %d, eseekres = %d : ", seekres, eseekres); fprintf(stderr, "t = %d, et = %d : ", t, et); fprintf(stderr, "t2 = %d, et2 = %d : ", ftell(fp), enc_ftell(ef)); fprintf(stderr, "FAILED\n"); perror(NULL); exit(-1); } int main(int argc, char *argv[]) { enc_init(); //test_read(); //test_write(); fprintf(stderr, "enc_fseek()\n"); fprintf(stderr, " SEEK_SET "); test_seek(100000, SEEK_SET); fprintf(stderr, " SEEK_END "); test_seek(100000, SEEK_END); fprintf(stderr, " SEEK_CUR "); test_seek(100000, SEEK_CUR); enc_deinit(); return 0; }