static bool	process_hunk(char const *program,
			     struct notify_info *notify,
			     struct memory_block_data const *payload,
			     struct memory_block_signature const *signature)
{
	struct signature_algorithm	*sigalg = NULL;
	struct decompression_algorithm	*decompalg = NULL;


	sigalg = create_sigalg(signature);
	if (!sigalg)
		goto err;

	decompalg = create_decompress(payload);
	if (!decompalg && payload->compression != STREAM_COMPRESS_NONE)
		goto err;

	if (!send_stream(program, notify, payload, sigalg, decompalg))
		goto err;

	if (!signature_update(sigalg, payload->mem.stream->extra_salt,
			      payload->mem.stream->extra_salt_len) ||
	    !signature_update(sigalg, signature->shdr->salt,
			      sizeof signature->shdr->salt) ||
	    !signature_update(sigalg, signature->hhdr,
			      sizeof *signature->hhdr))
		goto err;

	if (signature->mem.len && !verify_signature(signature, sigalg))
		goto err;

	if (!finish_stream(program, payload, sigalg))
		goto err;

	signature_free(sigalg);

	return true;

err:
	decompression_free(decompalg);
	signature_free(sigalg);

	return false;
}
Ejemplo n.º 2
0
json_t *json_bencode_loadf(FILE *input, size_t flags, json_error_t *error)
{
    stream_t stream;
    const char *source;
    json_t *result;

    if(input == stdin)
        source = "<stdin>";
    else
        source = "<stream>";

    jsonp_error_init(error, source);

    if (input == NULL) {
        error_set(error, NULL, "wrong arguments");
        return NULL;
    }

    init_stream(&stream, NULL, 0, file_fill, input);
    result = parse_bencode(&stream, flags, error);
    finish_stream(&stream);
    return result;
}