int recv_decrypt(struct encryption_ctx *ctx, int sock, unsigned char *buf, size_t *len, int flags) { char mybuf[4096]; int result = recv(sock, mybuf, *len, flags); memcpy(buf, mybuf, *len); decrypt_buf(ctx, buf, len); return result; }
static int decrypt_file(void) { struct enc_param ep; ssize_t src_len; unsigned char *buf = NULL; int err; int ret = -1; src_len = get_file_size(ifname); if (src_len < 0) { ERR("unable to get size of '%s'", ifname); goto out; } buf = malloc(src_len); if (buf == NULL) { ERR("no memory for the buffer"); goto out; } err = read_file_to_buf(ifname, buf, src_len); if (err) { ERR("unable to read from file '%s'", ifname); goto out; } memset(&ep, '\0', sizeof(ep)); ep.key = (unsigned char *) crypt_key; ep.longstate = longstate; err = decrypt_buf(&ep, buf, src_len); if (err) { ERR("unable to decrypt '%s'", ifname); goto out; } printf("Magic\t\t: '%s'\n", ep.magic); printf("Seed\t\t: 0x%02x\n", ep.seed); printf("Product\t\t: '%s'\n", ep.product); printf("Version\t\t: '%s'\n", ep.version); printf("Data len\t: %u\n", ep.datalen); printf("Checksum\t: 0x%08x\n", ep.csum); err = write_buf_to_file(ofname, buf, ep.datalen); if (err) { ERR("unable to write to file '%s'", ofname); goto out; } ret = 0; out: free(buf); return ret; }
static int cipher_buf(u8 *kbuf, u8 *dbuf, int size, CIPHER_KEY *ckey) { int i, retv; u8 tmp1[16], tmp2[16]; memcpy(kbuf + 0x14, ckey->key, 16); for (i = 0; i < 16; i++) { kbuf[0x14 + i] ^= amctrl_key3[i]; } if (ckey->type == 2) retv = kirk8(kbuf, 16); else retv = kirk7(kbuf, 16, 0x39); if (retv) return retv; for (i = 0; i < 16; i++) { kbuf[i] ^= amctrl_key2[i]; } memcpy(tmp2, kbuf, 0x10); if (ckey->seed == 1) { memset(tmp1, 0, 0x10); } else { memcpy(tmp1, tmp2, 0x10); *(u32*)(tmp1 + 0x0c) = ckey->seed - 1; } for (i = 0; i < size; i += 16) { memcpy(kbuf + 0x14 + i, tmp2, 12); *(u32*)(kbuf + 0x14 + i + 12) = ckey->seed; ckey->seed += 1; } retv = decrypt_buf(kbuf, size, tmp1, 0x63); if (retv) return retv; for (i = 0; i < size; i++) { dbuf[i] ^= kbuf[i]; } return 0; }