示例#1
0
void AbstractWorkGang::internal_worker_poll(WorkData* data) const {
  assert(monitor()->owned_by_self(), "worker_poll is an internal method");
  assert(data != NULL, "worker data is null");
  data->set_terminate(terminate());
  data->set_task(task());
  data->set_sequence_number(sequence_number());
}
示例#2
0
void get_item_observer::reply(msg const& m)
{
	public_key pk;
	signature sig;
	sequence_number seq{0};

	bdecode_node const r = m.message.dict_find_dict("r");
	if (!r)
	{
#ifndef TORRENT_DISABLE_LOGGING
		get_observer()->log(dht_logger::traversal, "[%p] missing response dict"
			, static_cast<void*>(algorithm()));
#endif
		timeout();
		return;
	}

	bdecode_node const k = r.dict_find_string("k");
	if (k && k.string_length() == public_key::len)
		std::memcpy(pk.bytes.data(), k.string_ptr(), public_key::len);

	bdecode_node const s = r.dict_find_string("sig");
	if (s && s.string_length() == signature::len)
		std::memcpy(sig.bytes.data(), s.string_ptr(), signature::len);

	bdecode_node const q = r.dict_find_int("seq");
	if (q)
	{
		seq = sequence_number(q.int_value());
	}
	else if (k && s)
	{
		timeout();
		return;
	}

	bdecode_node v = r.dict_find("v");
	if (v)
	{
		static_cast<get_item*>(algorithm())->got_data(v, pk, seq, sig);
	}

	find_data_observer::reply(m);
}
示例#3
0
size_t data_message::get_cleartext(void* buf, size_t buf_len, session_number_type session_number, const void* enc_key, size_t enc_key_len) const
{
    assert(enc_key);

    if (buf)
    {
        cryptoplus::cipher::cipher_algorithm cipher_algorithm(CIPHER_ALGORITHM);

        const std::vector<uint8_t> iv = compute_initialization_vector<uint8_t>(session_number, sequence_number(), enc_key, enc_key_len);

        cryptoplus::cipher::cipher_context cipher_context;
        cipher_context.initialize(cipher_algorithm, cryptoplus::cipher::cipher_context::decrypt, enc_key, enc_key_len, &iv[0], iv.size());
        cipher_context.set_padding(false);
        size_t cnt = cipher_context.update(buf, buf_len, ciphertext(), ciphertext_size());
        cnt += cipher_context.finalize(static_cast<uint8_t*>(buf) + cnt, buf_len - cnt);

        try
        {
            cnt = cipher_context.verify_iso_10126_padding(buf, cnt);
        }
        catch (std::logic_error&)
        {
            throw std::runtime_error("Incorrect padding in the RSA ciphertext");
        }

        return cnt;
    }
    else
    {
        return ciphertext_size();
    }
}
示例#4
0
void YieldingFlexibleWorkGang::internal_worker_poll(YieldingWorkData* data) const {
    assert(data != NULL, "worker data is null");
    data->set_task(task());
    data->set_sequence_number(sequence_number());
}