aboutsummaryrefslogtreecommitdiffstats
path: root/src/cnki_kdh.c
diff options
context:
space:
mode:
authoryzrh <yzrh@tuta.io>2020-08-14 22:04:26 +0000
committeryzrh <yzrh@tuta.io>2020-08-14 22:04:26 +0000
commit12ecdd71592eccf7bdb6214edbc7318246469c1c (patch)
treefda27e41c37a2345702ad3e90480154d975e426f /src/cnki_kdh.c
downloadmelon-12ecdd71592eccf7bdb6214edbc7318246469c1c.tar.gz
melon-12ecdd71592eccf7bdb6214edbc7318246469c1c.tar.zst
Initial commit.
Diffstat (limited to 'src/cnki_kdh.c')
-rw-r--r--src/cnki_kdh.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/cnki_kdh.c b/src/cnki_kdh.c
new file mode 100644
index 0000000..8441319
--- /dev/null
+++ b/src/cnki_kdh.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2020, yzrh <yzrh@tuta.io>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "cnki.h"
+
+int
+cnki_kdh(cnki_t **param)
+{
+ if (*param == NULL)
+ return 1;
+
+ if ((*param)->stat > 0)
+ printf("Begin 'KDH' decryption\n");
+
+ fseek((*param)->fp_i, 0, SEEK_END);
+
+ long size = ftell((*param)->fp_i);
+
+ fseek((*param)->fp_i, ADDRESS_KDH_BODY, SEEK_SET);
+
+ const char key[] = KEY_KDH;
+ const int key_len = KEY_KDH_LENGTH;
+ long key_cur = 0;
+
+ char buf[(*param)->size_buf];
+
+ for (;;) {
+ fread(buf, (*param)->size_buf, 1, (*param)->fp_i);
+
+ for (int i = 0; i < (*param)->size_buf; i++) {
+ buf[i] ^= key[key_cur % key_len];
+ key_cur++;
+ }
+
+ fwrite(buf, (*param)->size_buf, 1, (*param)->fp_o);
+
+ if (ftell((*param)->fp_i) == size)
+ break;
+ }
+
+ if ((*param)->stat > 0)
+ printf("Decryption ended total %ld byte(s) written\n",
+ ftell((*param)->fp_o));
+
+ return 0;
+}