mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-26 23:52:30 +01:00
We need a weak RNG in a couple of places where the strong RNG is both needless and too slow. We had been using the weak RNG from our platform's libc implementation, but that was problematic (because many platforms have exceptionally horrible weak RNGs -- like, ones that only return values between 0 and SHORT_MAX) and because we were using it in a way that was wrong for LCG-based weak RNGs. (We were counting on the low bits of the LCG output to be as random as the high ones, which isn't true.) This patch adds a separate type for a weak RNG, adds an LCG implementation for it, and uses that exclusively where we had been using the platform weak RNG.
78 lines
3.2 KiB
C
78 lines
3.2 KiB
C
/* Copyright (c) 2001 Matej Pfajfar.
|
|
* Copyright (c) 2001-2004, Roger Dingledine.
|
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
|
* Copyright (c) 2007-2013, The Tor Project, Inc. */
|
|
/* See LICENSE for licensing information */
|
|
|
|
/**
|
|
* \file relay.h
|
|
* \brief Header file for relay.c.
|
|
**/
|
|
|
|
#ifndef TOR_RELAY_H
|
|
#define TOR_RELAY_H
|
|
|
|
extern uint64_t stats_n_relay_cells_relayed;
|
|
extern uint64_t stats_n_relay_cells_delivered;
|
|
|
|
int circuit_receive_relay_cell(cell_t *cell, circuit_t *circ,
|
|
cell_direction_t cell_direction);
|
|
|
|
void relay_header_pack(uint8_t *dest, const relay_header_t *src);
|
|
void relay_header_unpack(relay_header_t *dest, const uint8_t *src);
|
|
int relay_send_command_from_edge(streamid_t stream_id, circuit_t *circ,
|
|
uint8_t relay_command, const char *payload,
|
|
size_t payload_len, crypt_path_t *cpath_layer);
|
|
int connection_edge_send_command(edge_connection_t *fromconn,
|
|
uint8_t relay_command, const char *payload,
|
|
size_t payload_len);
|
|
int connection_edge_package_raw_inbuf(edge_connection_t *conn,
|
|
int package_partial,
|
|
int *max_cells);
|
|
void connection_edge_consider_sending_sendme(edge_connection_t *conn);
|
|
|
|
extern uint64_t stats_n_data_cells_packaged;
|
|
extern uint64_t stats_n_data_bytes_packaged;
|
|
extern uint64_t stats_n_data_cells_received;
|
|
extern uint64_t stats_n_data_bytes_received;
|
|
|
|
void init_cell_pool(void);
|
|
void free_cell_pool(void);
|
|
void clean_cell_pool(void);
|
|
void dump_cell_pool_usage(int severity);
|
|
|
|
/* For channeltls.c */
|
|
void packed_cell_free(packed_cell_t *cell);
|
|
|
|
void cell_queue_clear(cell_queue_t *queue);
|
|
void cell_queue_append(cell_queue_t *queue, packed_cell_t *cell);
|
|
void cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell);
|
|
|
|
void append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan,
|
|
cell_t *cell, cell_direction_t direction,
|
|
streamid_t fromstream);
|
|
void channel_unlink_all_circuits(channel_t *chan);
|
|
int channel_flush_from_first_active_circuit(channel_t *chan, int max);
|
|
void assert_circuit_mux_okay(channel_t *chan);
|
|
void update_circuit_on_cmux_(circuit_t *circ, cell_direction_t direction,
|
|
const char *file, int lineno);
|
|
#define update_circuit_on_cmux(circ, direction) \
|
|
update_circuit_on_cmux_((circ), (direction), SHORT_FILE__, __LINE__)
|
|
|
|
int append_address_to_payload(uint8_t *payload_out, const tor_addr_t *addr);
|
|
const uint8_t *decode_address_from_payload(tor_addr_t *addr_out,
|
|
const uint8_t *payload,
|
|
int payload_len);
|
|
void circuit_clear_cell_queue(circuit_t *circ, channel_t *chan);
|
|
|
|
void stream_choice_seed_weak_rng(void);
|
|
|
|
#ifdef RELAY_PRIVATE
|
|
int relay_crypt(circuit_t *circ, cell_t *cell, cell_direction_t cell_direction,
|
|
crypt_path_t **layer_hint, char *recognized);
|
|
int connected_cell_parse(const relay_header_t *rh, const cell_t *cell,
|
|
tor_addr_t *addr_out, int *ttl_out);
|
|
#endif
|
|
|
|
#endif
|
|
|