X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=sidebyside;f=tfc_skein.c;h=fe86c20de71b1c595aa15e5e2d489223d1766d71;hb=a7a8ae5408eed270854e69adf40ccaf3a401f830;hp=b3b2019d5875d446d3704ea854f8511c72f0ce34;hpb=4ae16105a9849ffbd2a9bb0e02fa4dfe8b83ebd6;p=tfcrypt.git diff --git a/tfc_skein.c b/tfc_skein.c index b3b2019..fe86c20 100644 --- a/tfc_skein.c +++ b/tfc_skein.c @@ -49,7 +49,7 @@ void tf_key_tweak_compat(void *key) ukey[TF_TWEAK_WORD3] = ukey[TF_TWEAK_WORD1] ^ ukey[TF_TWEAK_WORD2]; } -tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize readto) +tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize offset, tfc_fsize readto) { static tfc_byte skblk[TFC_BLKSIZE]; @@ -62,9 +62,14 @@ tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize re if (ctr_mode == TFC_MODE_SKSUM) total_processed_src = total_processed_dst = delta_processed = 0; if (fd == -1) goto _fail; - if (fd > 2 && readto == NOFSIZE) { - readto = tfc_fdsize(fd); - if (readto == NOFSIZE) goto _fail; + if (fd > 2) { + if (readto == NOFSIZE) { + readto = tfc_fdsize(fd); + if (readto == NOFSIZE) goto _fail; + } + if (offset != 0 && offset != NOFSIZE) { + if (lseek(fd, (off_t)offset, SEEK_SET) == -1) goto _fail; + } } if (key) skein_init_key(&sk, key, bits); @@ -226,7 +231,7 @@ _dothat: } if (status_timer) setup_next_alarm(status_timer); - if (skeinfd(hash, bits, mackey_opt ? mackey : NULL, fd, maxlen) != YES) { + if (skeinfd(hash, bits, mackey_opt ? mackey : NULL, fd, iseek, maxlen) != YES) { xerror(YES, NO, YES, "%s", fname); exitcode = 1; continue; @@ -278,7 +283,7 @@ _dothat: } _dohash: if (status_timer) setup_next_alarm(status_timer); - if (skeinfd(hash, bits, mackey_opt ? mackey : NULL, fd, maxlen) != YES) { + if (skeinfd(hash, bits, mackey_opt ? mackey : NULL, fd, iseek, maxlen) != YES) { xerror(YES, NO, YES, "%s", fargv[x]); exitcode = 1; continue;