const char *err;
int i;
int en;
- size_t n;
+ size_t n, chsz;
dstr d = DSTR_INIT;
octet *tag, *ct;
buf b;
assert(GC_CLASS(c)->blksz <= sizeof(bb));
dstr_ensure(&d, sizeof(bb) + GM_CLASS(m)->hashsz);
seq = 0;
+ chsz = MASK16 - GM_CLASS(m)->hashsz;
for (;;) {
h = GM_INIT(m);
GH_HASHU32(h, seq);
GC_ENCRYPT(cx, 0, bb, GC_CLASS(c)->blksz);
GC_SETIV(c, bb);
}
- n = fread(bb, 1, sizeof(bb), fp);
+ n = fread(bb, 1, chsz, fp);
if (!n) break;
buf_init(&b, d.buf, d.sz);
tag = buf_get(&b, GM_CLASS(m)->hashsz);
if (ferror(rfp) || fclose(rfp))
die(EXIT_FAILURE, "error unbuffering output: %s", strerror(errno));
}
- if (ofp && (fflush(ofp) || ferror(ofp) || fclose(ofp)))
- die(EXIT_FAILURE, "error writing output: %s", strerror(errno));
e->ops->decdone(e);
if (verb && ofp != stdout)
printf("OK decrypted successfully\n");
+ if (ofp && (fflush(ofp) || ferror(ofp) || fclose(ofp)))
+ die(EXIT_FAILURE, "error writing output: %s", strerror(errno));
freeenc(e);
GC_DESTROY(c);
GC_DESTROY(cx);
GM_DESTROY(m);
freekem(km);
if (fp != stdin) fclose(fp);
- if (of) fclose(ofp);
key_close(&kf);
dstr_destroy(&d);
return (0);