Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}