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()); }
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); }
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(); } }
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()); }