safe_connection.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /* Copyright (c) 2013-2019, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #ifndef OR_SAFE_CONN_H
  4. #define OR_SAFE_CONN_H
  5. #include "core/or/relay.h"
  6. #include "lib/evloop/compat_libevent.h"
  7. #include "lib/evloop/events.h"
  8. #include "lib/evloop/token_bucket.h"
  9. #include "lib/lock/compat_mutex.h"
  10. #include "lib/tls/x509.h"
  11. extern event_label_t safe_or_conn_tcp_connecting_ev;
  12. extern event_label_t safe_or_conn_tls_handshaking_ev;
  13. extern event_label_t safe_or_conn_link_handshaking_ev;
  14. extern event_label_t safe_or_conn_open_ev;
  15. extern event_label_t safe_or_conn_closed_ev;
  16. extern event_label_t safe_or_conn_fixed_cell_ev;
  17. extern event_label_t safe_or_conn_var_cell_ev;
  18. typedef struct link_handshaking_ev_data_t {
  19. tor_x509_cert_t *tls_own_cert; // the ownership is passed in this event
  20. tor_x509_cert_t *tls_peer_cert; // the ownership is passed in this event
  21. } link_handshaking_ev_data;
  22. void link_handshaking_ev_free(void *ptr);
  23. /*
  24. typedef struct generic_cell_t {
  25. TOR_SIMPLEQ_ENTRY(safe_cell_t) next;
  26. enum {
  27. CELL_TYPE_FIXED,
  28. CELL_TYPE_VAR,
  29. } type;
  30. union {
  31. cell_t *fixed_cell;
  32. var_cell_t *var_cell;
  33. } data;
  34. } generic_cell_t;
  35. typedef struct safe_cell_queue_t {
  36. tor_mutex_t lock;
  37. TOR_SIMPLEQ_HEAD(safe_cell_queue_head_t, generic_cell_t) head;
  38. } safe_cell_queue_t;
  39. */
  40. //#define SAFE_BASE_CONN_MAGIC 0x64DB4EE2u
  41. #define SAFE_OR_CONN_MAGIC 0x1221ABBAu
  42. typedef enum tor_error_t {
  43. E_SUCCESS = 0,
  44. E_ERROR = 1,
  45. } tor_error_t;
  46. typedef enum or_conn_state_t {
  47. SAFE_OR_CONN_STATE_UNINITIALIZED,
  48. SAFE_OR_CONN_STATE_NO_SOCKET,
  49. SAFE_OR_CONN_STATE_TCP_CONNECTING,
  50. SAFE_OR_CONN_STATE_PROXY_HANDSHAKING,
  51. SAFE_OR_CONN_STATE_TLS_HANDSHAKING,
  52. SAFE_OR_CONN_STATE_LINK_HANDSHAKING,
  53. SAFE_OR_CONN_STATE_OPEN,
  54. SAFE_OR_CONN_STATE_CLOSED,
  55. } or_conn_state_t;
  56. typedef struct socket_rw_state_t {
  57. bool state;
  58. } socket_rw_state_t;
  59. typedef struct safe_connection_t {
  60. uint32_t magic;
  61. tor_mutex_t lock;
  62. bool linked;
  63. tor_socket_t socket;
  64. struct event *read_event;
  65. struct event *write_event;
  66. socket_rw_state_t read_allowed;
  67. socket_rw_state_t write_allowed;
  68. bool (*is_read_wanted)(struct safe_connection_t *);
  69. bool (*is_write_wanted)(struct safe_connection_t *);
  70. void (*read_cb)(struct safe_connection_t *);
  71. void (*write_cb)(struct safe_connection_t *);
  72. void (*socket_added_cb)(struct safe_connection_t *);
  73. void (*inbuf_modified_cb)(struct safe_connection_t *);
  74. void (*outbuf_modified_cb)(struct safe_connection_t *);
  75. struct buf_t *inbuf;
  76. struct buf_t *outbuf;
  77. event_source_t *event_source;
  78. event_listener_t *event_listener;
  79. bool care_about_modified;
  80. } safe_connection_t;
  81. typedef struct safe_or_connection_t {
  82. safe_connection_t base_;
  83. token_bucket_rw_t bucket;
  84. struct tor_tls_t *tls;
  85. or_conn_state_t state;
  86. bool is_outgoing;
  87. char *remote_address_str;
  88. uint16_t link_protocol;
  89. bool wide_circ_ids;
  90. bool waiting_for_link_protocol;
  91. //safe_cell_queue_t incoming_cell_queue;
  92. socket_rw_state_t tor_read_wanted;
  93. socket_rw_state_t tor_write_wanted;
  94. socket_rw_state_t tls_read_wanted;
  95. socket_rw_state_t tls_write_wanted;
  96. socket_rw_state_t bucket_read_allowed;
  97. socket_rw_state_t bucket_write_allowed;
  98. //bool tls_read_waiting_on_socket_writable;
  99. //bool tls_write_waiting_on_socket_readable;
  100. } safe_or_connection_t;
  101. safe_or_connection_t *TO_SAFE_OR_CONN(safe_connection_t *safe_conn);
  102. #define TO_SAFE_CONN(c) (&(((c)->base_)))
  103. void safe_or_conn_register_events(event_registry_t *registry);
  104. void safe_or_conn_buf_data_event_update(event_label_t label,
  105. event_data_t *old_data,
  106. event_data_t *new_data);
  107. /********************************************************/
  108. void
  109. safe_connection_init(safe_connection_t *safe_conn, uint32_t type_magic,
  110. event_source_t *conn_event_source,
  111. bool (*is_read_wanted)(safe_connection_t *),
  112. bool (*is_write_wanted)(safe_connection_t *),
  113. void (*read_cb)(safe_connection_t *),
  114. void (*write_cb)(safe_connection_t *),
  115. void (*socket_added_cb)(safe_connection_t *),
  116. void (*inbuf_modified_cb)(safe_connection_t *),
  117. void (*outbuf_modified_cb)(safe_connection_t *),
  118. bool requires_buffers, bool linked);
  119. void
  120. safe_connection_set_socket(safe_connection_t *safe_conn, tor_socket_t socket);
  121. void
  122. safe_connection_subscribe(safe_connection_t *safe_conn,
  123. event_listener_t *listener, event_label_t label);
  124. void
  125. safe_connection_unsubscribe_all(safe_connection_t *safe_conn,
  126. event_listener_t *listener);
  127. void
  128. safe_connection_unregister_events(safe_connection_t *safe_conn);
  129. tor_error_t
  130. safe_connection_register_events(safe_connection_t *safe_conn,
  131. struct event_base *event_base);
  132. void
  133. safe_connection_set_read_permission(safe_connection_t *safe_conn,
  134. bool read_allowed);
  135. void
  136. safe_connection_set_write_permission(safe_connection_t *safe_conn,
  137. bool write_allowed);
  138. void
  139. safe_connection_start_caring_about_modified(safe_connection_t *safe_conn);
  140. void
  141. safe_connection_stop_caring_about_modified(safe_connection_t *safe_conn);
  142. void
  143. safe_connection_inbuf_modified(safe_connection_t *safe_conn);
  144. void
  145. safe_connection_outbuf_modified(safe_connection_t *safe_conn);
  146. /********************************************************/
  147. safe_or_connection_t *
  148. safe_or_connection_new(bool requires_buffers, bool is_outgoing,
  149. const char *remote_address_str,
  150. event_source_t *conn_event_source);
  151. void
  152. safe_or_connection_get_tls_desc(safe_or_connection_t *safe_or_conn,
  153. char *buf, size_t buf_size);
  154. int
  155. safe_or_connection_tls_secrets(safe_or_connection_t *safe_or_conn,
  156. uint8_t *secrets_out);
  157. int
  158. safe_or_connection_key_material(safe_or_connection_t *safe_or_conn,
  159. uint8_t *secrets_out,
  160. const uint8_t *context,
  161. size_t context_len, const char *label);
  162. void
  163. safe_or_connection_refill_buckets(safe_or_connection_t *safe_or_conn,
  164. uint32_t now_ts);
  165. void
  166. safe_or_connection_adjust_buckets(safe_or_connection_t *safe_or_conn,
  167. uint32_t rate, uint32_t burst,
  168. bool reset, uint32_t now_ts);
  169. #endif