Fix KDH decryption.

Signed-off-by: yzrh <yzrh@noema.org>
This commit is contained in:
yzrh 2023-01-03 12:12:42 +00:00
parent 4a02b8bfc7
commit e0fe937e1a

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020-2021, yzrh <yzrh@noema.org> * Copyright (c) 2020-2023, yzrh <yzrh@noema.org>
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -15,16 +15,18 @@ cnki_kdh(cnki_t **param)
if ((*param)->stat > 0) if ((*param)->stat > 0)
printf("Begin 'KDH' decryption\n"); printf("Begin 'KDH' decryption\n");
long cur = ADDRESS_KDH_BODY;
long end;
fseek((*param)->fp_i, 0, SEEK_END); fseek((*param)->fp_i, 0, SEEK_END);
end = ftell((*param)->fp_i);
long size = ftell((*param)->fp_i); fseek((*param)->fp_i, cur, SEEK_SET);
fseek((*param)->fp_i, ADDRESS_KDH_BODY, SEEK_SET);
const char key[] = KEY_KDH; const char key[] = KEY_KDH;
const int key_len = KEY_KDH_LENGTH; const int key_len = KEY_KDH_LENGTH;
long key_cur = 0; long key_cur = 0;
int buf_size;
char buf[(*param)->size_buf]; char buf[(*param)->size_buf];
FILE *tmp = tmpfile(); FILE *tmp = tmpfile();
@ -33,32 +35,32 @@ cnki_kdh(cnki_t **param)
return 1; return 1;
for (;;) { for (;;) {
fread(buf, (*param)->size_buf, 1, (*param)->fp_i); if (cur + (*param)->size_buf < end)
buf_size = (*param)->size_buf;
else
buf_size = end - cur;
for (int i = 0; i < (*param)->size_buf; i++) { fread(buf, buf_size, 1, (*param)->fp_i);
buf[i] ^= key[key_cur % key_len];
key_cur++;
}
fwrite(buf, (*param)->size_buf, 1, tmp); for (int i = 0; i < buf_size; i++)
buf[i] ^= key[key_cur++ % key_len];
if (ftell((*param)->fp_i) == size) fwrite(buf, buf_size, 1, tmp);
if ((cur = ftell((*param)->fp_i)) >= end)
break; break;
} }
if ((*param)->stat > 0) if ((*param)->stat > 0)
printf("Decrypted %ld byte(s)\n", ftell(tmp)); printf("Decrypted %ld byte(s)\n", ftell(tmp));
fseek(tmp, 0, SEEK_SET); fclose((*param)->fp_i);
FILE *orig = (*param)->fp_i; fseek(tmp, 0, SEEK_SET);
(*param)->fp_i = tmp; (*param)->fp_i = tmp;
cnki_pdf(param); cnki_pdf(param);
(*param)->fp_i = orig;
fclose(tmp);
if ((*param)->stat > 0) if ((*param)->stat > 0)
printf("Conversion ended\n"); printf("Conversion ended\n");