1 /* 2 mediastreamer2 library - modular sound and video processing and streaming 3 Copyright (C) 2012-2016 Belledonne Communications 4 5 This program is free software; you can redistribute it and/or 6 modify it under the terms of the GNU General Public License 7 as published by the Free Software Foundation; either version 2 8 of the License, or (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 */ 19 20 #ifndef MS_STUN_H 21 #define MS_STUN_H 22 23 24 #include <ortp/rtpsession.h> 25 #include <mediastreamer2/mscommon.h> 26 27 28 #define MS_STUN_MAX_MESSAGE_SIZE 2048 29 #define MS_STUN_MAGIC_COOKIE 0x2112A442 30 31 #define MS_STUN_ADDR_FAMILY_IPV4 0x01 32 #define MS_STUN_ADDR_FAMILY_IPV6 0x02 33 34 #define MS_STUN_TYPE_REQUEST 0x0000 35 #define MS_STUN_TYPE_INDICATION 0x0010 36 #define MS_STUN_TYPE_SUCCESS_RESPONSE 0x0100 37 #define MS_STUN_TYPE_ERROR_RESPONSE 0x0110 38 39 #define MS_STUN_METHOD_BINDING 0x001 40 #define MS_STUN_METHOD_SHARED_SECRET 0x002 /* Deprecated, now reserved */ 41 42 #define MS_TURN_METHOD_ALLOCATE 0x003 43 #define MS_TURN_METHOD_REFRESH 0x004 44 #define MS_TURN_METHOD_SEND 0x006 45 #define MS_TURN_METHOD_DATA 0x007 46 #define MS_TURN_METHOD_CREATE_PERMISSION 0x008 47 #define MS_TURN_METHOD_CHANNEL_BIND 0x009 48 49 50 #define MS_STUN_ATTR_MAPPED_ADDRESS 0x0001 51 #define MS_STUN_ATTR_RESPONSE_ADDRESS 0x0002 /* Deprecated, now reserved */ 52 #define MS_STUN_ATTR_CHANGE_REQUEST 0x0003 /* Deprecated, now reserved */ 53 #define MS_STUN_ATTR_SOURCE_ADDRESS 0x0004 /* Deprecated, now reserved */ 54 #define MS_STUN_ATTR_CHANGED_ADDRESS 0x0005 /* Deprecated, now reserved */ 55 #define MS_STUN_ATTR_USERNAME 0x0006 56 #define MS_STUN_ATTR_PASSWORD 0x0007 /* Deprecated, now reserved */ 57 #define MS_STUN_ATTR_MESSAGE_INTEGRITY 0x0008 58 #define MS_STUN_ATTR_ERROR_CODE 0x0009 59 #define MS_STUN_ATTR_UNKNOWN_ATTRIBUTES 0x000A 60 #define MS_STUN_ATTR_REFLECTED_FROM 0x000B 61 #define MS_STUN_ATTR_REALM 0x0014 62 #define MS_STUN_ATTR_NONCE 0x0015 63 #define MS_STUN_ATTR_XOR_MAPPED_ADDRESS 0x0020 64 65 #define MS_STUN_ATTR_SOFTWARE 0x8022 66 #define MS_STUN_ATTR_ALTERNATE_SERVER 0x8023 67 #define MS_STUN_ATTR_FINGERPRINT 0x8028 68 69 #define MS_TURN_ATTR_CHANNEL_NUMBER 0x000C 70 #define MS_TURN_ATTR_LIFETIME 0x000D 71 #define MS_TURN_ATTR_BANDWIDTH 0x0010 /* Deprecated, now reserved */ 72 #define MS_TURN_ATTR_XOR_PEER_ADDRESS 0x0012 73 #define MS_TURN_ATTR_DATA 0x0013 74 #define MS_TURN_ATTR_XOR_RELAYED_ADDRESS 0x0016 75 #define MS_TURN_ATTR_REQUESTED_ADDRESS_FAMILY 0x0017 76 #define MS_TURN_ATTR_EVEN_PORT 0x0018 77 #define MS_TURN_ATTR_REQUESTED_TRANSPORT 0x0019 78 #define MS_TURN_ATTR_DONT_FRAGMENT 0x001A 79 #define MS_TURN_ATTR_TIMER_VAL 0x0021 /* Deprecated, now reserved */ 80 #define MS_TURN_ATTR_RESERVATION_TOKEN 0x0022 81 82 #define MS_ICE_ATTR_PRIORITY 0x0024 83 #define MS_ICE_ATTR_USE_CANDIDATE 0x0025 84 #define MS_ICE_ATTR_ICE_CONTROLLED 0x8029 85 #define MS_ICE_ATTR_ICE_CONTROLLING 0x802A 86 87 88 #define MS_STUN_ERROR_CODE_TRY_ALTERNATE 300 89 #define MS_STUN_ERROR_CODE_BAD_REQUEST 400 90 #define MS_STUN_ERROR_CODE_UNAUTHORIZED 401 91 #define MS_STUN_ERROR_CODE_UNKNOWN_ATTRIBUTE 420 92 #define MS_STUN_ERROR_CODE_STALE_NONCE 438 93 #define MS_STUN_ERROR_CODE_SERVER_ERROR 500 94 95 #define MS_TURN_ERROR_CODE_FORBIDDEN 403 96 #define MS_TURN_ERROR_CODE_ALLOCATION_MISMATCH 437 97 #define MS_TURN_ERROR_CODE_WRONG_CREDENTIALS 441 98 #define MS_TURN_ERROR_CODE_UNSUPPORTED_TRANSPORT_PROTOCOL 442 99 #define MS_TURN_ERROR_CODE_ALLOCATION_QUOTA_REACHED 486 100 #define MS_TURN_ERROR_CODE_INSUFFICIENT_CAPACITY 508 101 102 #define MS_ICE_ERROR_CODE_ROLE_CONFLICT 487 103 104 105 typedef struct { 106 uint16_t port; 107 uint32_t addr; 108 } MSStunAddress4; 109 110 typedef struct { 111 uint16_t port; 112 UInt128 addr; 113 } MSStunAddress6; 114 115 typedef struct { 116 union { 117 MSStunAddress4 v4; 118 MSStunAddress6 v6; 119 } ip; 120 uint8_t family; 121 } MSStunAddress; 122 123 typedef struct { 124 char *reason; 125 uint16_t number; 126 } MSStunErrorCode; 127 128 typedef struct { 129 uint16_t type; 130 uint16_t method; 131 uint16_t length; 132 UInt96 tr_id; 133 uint8_t *data; 134 char *username; 135 char *password; 136 char *ha1; 137 char *realm; 138 char *message_integrity; 139 char *software; 140 char *nonce; 141 MSStunErrorCode error_code; 142 MSStunAddress mapped_address; 143 MSStunAddress xor_mapped_address; 144 MSStunAddress xor_peer_address; 145 MSStunAddress xor_relayed_address; 146 uint32_t change_request; 147 uint32_t fingerprint; 148 uint32_t priority; 149 uint64_t ice_controlling; 150 uint64_t ice_controlled; 151 uint32_t lifetime; 152 uint16_t channel_number; 153 uint16_t data_length; 154 uint8_t requested_transport; 155 uint8_t requested_address_family; 156 bool_t include_username_attribute; 157 bool_t has_error_code; 158 bool_t has_message_integrity; 159 bool_t has_dummy_message_integrity; 160 bool_t has_fingerprint; 161 bool_t has_mapped_address; 162 bool_t has_xor_mapped_address; 163 bool_t has_xor_peer_address; 164 bool_t has_xor_relayed_address; 165 bool_t has_priority; 166 bool_t has_use_candidate; 167 bool_t has_ice_controlling; 168 bool_t has_ice_controlled; 169 bool_t has_lifetime; 170 bool_t has_channel_number; 171 bool_t has_requested_transport; 172 bool_t has_requested_address_family; 173 } MSStunMessage; 174 175 typedef enum { 176 MS_TURN_CONTEXT_STATE_IDLE, 177 MS_TURN_CONTEXT_STATE_CREATING_ALLOCATION, 178 MS_TURN_CONTEXT_STATE_ALLOCATION_CREATED, 179 MS_TURN_CONTEXT_STATE_CREATING_PERMISSIONS, 180 MS_TURN_CONTEXT_STATE_PERMISSIONS_CREATED, 181 MS_TURN_CONTEXT_STATE_BINDING_CHANNEL, 182 MS_TURN_CONTEXT_STATE_CHANNEL_BOUND 183 } MSTurnContextState; 184 185 typedef enum { 186 MS_TURN_CONTEXT_TYPE_RTP, 187 MS_TURN_CONTEXT_TYPE_RTCP 188 } MSTurnContextType; 189 190 typedef struct { 191 uint32_t nb_send_indication; 192 uint32_t nb_data_indication; 193 uint32_t nb_received_channel_msg; 194 uint32_t nb_sent_channel_msg; 195 uint16_t nb_successful_allocate; 196 uint16_t nb_successful_refresh; 197 uint16_t nb_successful_create_permission; 198 uint16_t nb_successful_channel_bind; 199 } MSTurnContextStatistics; 200 201 typedef struct { 202 RtpSession *rtp_session; 203 RtpTransport *endpoint; 204 MSList *allowed_peer_addresses; 205 char *realm; 206 char *nonce; 207 char *username; 208 char *password; 209 char *ha1; 210 uint32_t lifetime; 211 uint16_t channel_number; 212 MSTurnContextState state; 213 MSTurnContextType type; 214 MSStunAddress relay_addr; 215 struct sockaddr *turn_server_addr; 216 socklen_t turn_server_addrlen; 217 bool_t force_rtp_sending_via_relay; 218 MSTurnContextStatistics stats; 219 } MSTurnContext; 220 221 222 #ifdef __cplusplus 223 extern "C" 224 { 225 #endif 226 227 typedef void (*MSStunAuthRequestedCb)(void *userdata, const char *realm, const char *nonce, const char **username, const char **password, const char **ha1); 228 229 230 MS2_PUBLIC bool_t ms_compare_stun_addresses(const MSStunAddress *a1, const MSStunAddress *a2); 231 MS2_PUBLIC int ms_stun_family_to_af(int stun_family); 232 MS2_PUBLIC void ms_stun_address_to_sockaddr(const MSStunAddress *stun_addr, struct sockaddr *addr, socklen_t *addrlen); 233 MS2_PUBLIC void ms_sockaddr_to_stun_address(const struct sockaddr *addr, MSStunAddress *stun_addr); 234 MS2_PUBLIC MSStunAddress ms_ip_address_to_stun_address(int ai_family, int socktype, const char *hostname, int port); 235 MS2_PUBLIC void ms_stun_address_to_ip_address(const MSStunAddress *stun_address, char *ip, size_t ip_size, int *port); 236 MS2_PUBLIC void ms_stun_address_to_printable_ip_address(const MSStunAddress *stun_address, char *printable_ip, size_t printable_ip_size); 237 MS2_PUBLIC char * ms_stun_calculate_integrity_short_term(const char *buf, size_t bufsize, const char *key); 238 MS2_PUBLIC char * ms_stun_calculate_integrity_long_term(const char *buf, size_t bufsize, const char *realm, const char *username, const char *password); 239 MS2_PUBLIC char * ms_stun_calculate_integrity_long_term_from_ha1(const char *buf, size_t bufsize, const char *ha1_text); 240 MS2_PUBLIC uint32_t ms_stun_calculate_fingerprint(const char *buf, size_t bufsize); 241 242 MS2_PUBLIC MSStunMessage * ms_stun_message_create(uint16_t type, uint16_t method); 243 MS2_PUBLIC MSStunMessage * ms_stun_message_create_from_buffer_parsing(const uint8_t *buf, ssize_t bufsize); 244 MS2_PUBLIC MSStunMessage * ms_stun_binding_request_create(void); 245 MS2_PUBLIC MSStunMessage * ms_stun_binding_success_response_create(void); 246 MS2_PUBLIC MSStunMessage * ms_stun_binding_error_response_create(void); 247 MS2_PUBLIC MSStunMessage * ms_stun_binding_indication_create(void); 248 MS2_PUBLIC bool_t ms_stun_message_is_request(const MSStunMessage *msg); 249 MS2_PUBLIC bool_t ms_stun_message_is_success_response(const MSStunMessage *msg); 250 MS2_PUBLIC bool_t ms_stun_message_is_error_response(const MSStunMessage *msg); 251 MS2_PUBLIC bool_t ms_stun_message_is_indication(const MSStunMessage *msg); 252 MS2_PUBLIC void ms_stun_message_destroy(MSStunMessage *msg); 253 MS2_PUBLIC size_t ms_stun_message_encode(const MSStunMessage *msg, char **buf); 254 MS2_PUBLIC uint16_t ms_stun_message_get_method(const MSStunMessage *msg); 255 MS2_PUBLIC uint16_t ms_stun_message_get_length(const MSStunMessage *msg); 256 MS2_PUBLIC UInt96 ms_stun_message_get_tr_id(const MSStunMessage *msg); 257 MS2_PUBLIC void ms_stun_message_set_tr_id(MSStunMessage *msg, UInt96 tr_id); 258 MS2_PUBLIC void ms_stun_message_set_random_tr_id(MSStunMessage *msg); 259 MS2_PUBLIC const char * ms_stun_message_get_username(const MSStunMessage *msg); 260 MS2_PUBLIC void ms_stun_message_set_username(MSStunMessage *msg, const char *username); 261 MS2_PUBLIC void ms_stun_message_include_username_attribute(MSStunMessage *msg, bool_t include); 262 MS2_PUBLIC const char * ms_stun_message_get_password(const MSStunMessage *msg); 263 MS2_PUBLIC void ms_stun_message_set_password(MSStunMessage *msg, const char *password); 264 MS2_PUBLIC void ms_stun_message_set_ha1(MSStunMessage *msg, const char *ha1_text); 265 MS2_PUBLIC const char * ms_stun_message_get_realm(const MSStunMessage *msg); 266 MS2_PUBLIC void ms_stun_message_set_realm(MSStunMessage *msg, const char *realm); 267 MS2_PUBLIC const char * ms_stun_message_get_software(const MSStunMessage *msg); 268 MS2_PUBLIC void ms_stun_message_set_software(MSStunMessage *msg, const char *software); 269 MS2_PUBLIC const char * ms_stun_message_get_nonce(const MSStunMessage *msg); 270 MS2_PUBLIC void ms_stun_message_set_nonce(MSStunMessage *msg, const char *nonce); 271 MS2_PUBLIC bool_t ms_stun_message_has_error_code(const MSStunMessage *msg); 272 MS2_PUBLIC uint16_t ms_stun_message_get_error_code(const MSStunMessage *msg, char **reason); 273 MS2_PUBLIC void ms_stun_message_set_error_code(MSStunMessage *msg, uint16_t number, const char *reason); 274 MS2_PUBLIC bool_t ms_stun_message_message_integrity_enabled(const MSStunMessage *msg); 275 MS2_PUBLIC void ms_stun_message_enable_message_integrity(MSStunMessage *msg, bool_t enable); 276 MS2_PUBLIC const char * ms_stun_message_get_message_integrity(const MSStunMessage *msg); 277 MS2_PUBLIC bool_t ms_stun_message_fingerprint_enabled(const MSStunMessage *msg); 278 MS2_PUBLIC void ms_stun_message_enable_fingerprint(MSStunMessage *msg, bool_t enable); 279 MS2_PUBLIC const MSStunAddress * ms_stun_message_get_mapped_address(const MSStunMessage *msg); 280 MS2_PUBLIC void ms_stun_message_set_mapped_address(MSStunMessage *msg, MSStunAddress mapped_address); 281 MS2_PUBLIC const MSStunAddress * ms_stun_message_get_xor_mapped_address(const MSStunMessage *msg); 282 MS2_PUBLIC void ms_stun_message_set_xor_mapped_address(MSStunMessage *msg, MSStunAddress xor_mapped_address); 283 MS2_PUBLIC const MSStunAddress * ms_stun_message_get_xor_peer_address(const MSStunMessage *msg); 284 MS2_PUBLIC void ms_stun_message_set_xor_peer_address(MSStunMessage *msg, MSStunAddress xor_peer_address); 285 MS2_PUBLIC const MSStunAddress * ms_stun_message_get_xor_relayed_address(const MSStunMessage *msg); 286 MS2_PUBLIC void ms_stun_message_set_xor_relayed_address(MSStunMessage *msg, MSStunAddress xor_relayed_address); 287 MS2_PUBLIC void ms_stun_message_enable_change_ip(MSStunMessage *msg, bool_t enable); 288 MS2_PUBLIC void ms_stun_message_enable_change_port(MSStunMessage *msg, bool_t enable); 289 290 MS2_PUBLIC bool_t ms_stun_message_has_priority(const MSStunMessage *msg); 291 MS2_PUBLIC uint32_t ms_stun_message_get_priority(const MSStunMessage *msg); 292 MS2_PUBLIC void ms_stun_message_set_priority(MSStunMessage *msg, uint32_t priority); 293 MS2_PUBLIC bool_t ms_stun_message_use_candidate_enabled(const MSStunMessage *msg); 294 MS2_PUBLIC void ms_stun_message_enable_use_candidate(MSStunMessage *msg, bool_t enable); 295 MS2_PUBLIC bool_t ms_stun_message_has_ice_controlling(const MSStunMessage *msg); 296 MS2_PUBLIC uint64_t ms_stun_message_get_ice_controlling(const MSStunMessage *msg); 297 MS2_PUBLIC void ms_stun_message_set_ice_controlling(MSStunMessage *msg, uint64_t value); 298 MS2_PUBLIC bool_t ms_stun_message_has_ice_controlled(const MSStunMessage *msg); 299 MS2_PUBLIC uint64_t ms_stun_message_get_ice_controlled(const MSStunMessage *msg); 300 MS2_PUBLIC void ms_stun_message_set_ice_controlled(MSStunMessage *msg, uint64_t value); 301 302 MS2_PUBLIC bool_t ms_stun_message_dummy_message_integrity_enabled(const MSStunMessage *msg); 303 MS2_PUBLIC void ms_stun_message_enable_dummy_message_integrity(MSStunMessage *msg, bool_t enable); 304 305 MS2_PUBLIC MSStunMessage * ms_turn_allocate_request_create(void); 306 MS2_PUBLIC MSStunMessage * ms_turn_refresh_request_create(uint32_t lifetime); 307 MS2_PUBLIC MSStunMessage * ms_turn_create_permission_request_create(MSStunAddress peer_address); 308 MS2_PUBLIC MSStunMessage * ms_turn_send_indication_create(MSStunAddress peer_address); 309 MS2_PUBLIC MSStunMessage * ms_turn_channel_bind_request_create(MSStunAddress peer_address, uint16_t channel_number); 310 MS2_PUBLIC bool_t ms_stun_message_has_requested_transport(const MSStunMessage *msg); 311 MS2_PUBLIC uint8_t ms_stun_message_get_requested_transport(const MSStunMessage *msg); 312 MS2_PUBLIC bool_t ms_stun_message_has_requested_address_family(const MSStunMessage *msg); 313 MS2_PUBLIC uint8_t ms_stun_message_get_requested_address_family(const MSStunMessage *msg); 314 MS2_PUBLIC void ms_stun_message_set_requested_address_family(MSStunMessage *msg, uint8_t family); 315 MS2_PUBLIC bool_t ms_stun_message_has_lifetime(const MSStunMessage *msg); 316 MS2_PUBLIC uint32_t ms_stun_message_get_lifetime(const MSStunMessage *msg); 317 MS2_PUBLIC void ms_stun_message_set_lifetime(MSStunMessage *msg, uint32_t lifetime); 318 MS2_PUBLIC bool_t ms_stun_message_has_channel_number(const MSStunMessage *msg); 319 MS2_PUBLIC uint16_t ms_stun_message_get_channel_number(const MSStunMessage *msg); 320 MS2_PUBLIC void ms_stun_message_set_channel_number(MSStunMessage *msg, uint16_t channel_number); 321 MS2_PUBLIC uint8_t * ms_stun_message_get_data(const MSStunMessage *msg); 322 MS2_PUBLIC uint16_t ms_stun_message_get_data_length(const MSStunMessage *msg); 323 MS2_PUBLIC void ms_stun_message_set_data(MSStunMessage *msg, uint8_t *data, uint16_t length); 324 325 MS2_PUBLIC MSTurnContext * ms_turn_context_new(MSTurnContextType type, RtpSession *rtp_session); 326 MS2_PUBLIC void ms_turn_context_destroy(MSTurnContext *context); 327 MS2_PUBLIC void ms_turn_context_set_server_addr(MSTurnContext *context, struct sockaddr *addr, socklen_t addrlen); 328 MS2_PUBLIC MSTurnContextState ms_turn_context_get_state(const MSTurnContext *context); 329 MS2_PUBLIC void ms_turn_context_set_state(MSTurnContext *context, MSTurnContextState state); 330 MS2_PUBLIC const char * ms_turn_context_get_realm(const MSTurnContext *context); 331 MS2_PUBLIC void ms_turn_context_set_realm(MSTurnContext *context, const char *realm); 332 MS2_PUBLIC const char * ms_turn_context_get_nonce(const MSTurnContext *context); 333 MS2_PUBLIC void ms_turn_context_set_nonce(MSTurnContext *context, const char *nonce); 334 MS2_PUBLIC const char * ms_turn_context_get_username(const MSTurnContext *context); 335 MS2_PUBLIC void ms_turn_context_set_username(MSTurnContext *context, const char *username); 336 MS2_PUBLIC const char * ms_turn_context_get_password(const MSTurnContext *context); 337 MS2_PUBLIC void ms_turn_context_set_password(MSTurnContext *context, const char *password); 338 MS2_PUBLIC const char * ms_turn_context_get_ha1(const MSTurnContext *context); 339 MS2_PUBLIC void ms_turn_context_set_ha1(MSTurnContext *context, const char *ha1); 340 MS2_PUBLIC uint32_t ms_turn_context_get_lifetime(const MSTurnContext *context); 341 MS2_PUBLIC void ms_turn_context_set_lifetime(MSTurnContext *context, uint32_t lifetime); 342 MS2_PUBLIC uint16_t ms_turn_context_get_channel_number(const MSTurnContext *context); 343 MS2_PUBLIC void ms_turn_context_set_channel_number(MSTurnContext *context, uint16_t channel_number); 344 MS2_PUBLIC void ms_turn_context_set_allocated_relay_addr(MSTurnContext *context, MSStunAddress relay_addr); 345 MS2_PUBLIC void ms_turn_context_set_force_rtp_sending_via_relay(MSTurnContext *context, bool_t force); 346 MS2_PUBLIC bool_t ms_turn_context_peer_address_allowed(const MSTurnContext *context, const MSStunAddress *peer_address); 347 MS2_PUBLIC void ms_turn_context_allow_peer_address(MSTurnContext *context, const MSStunAddress *peer_address); 348 MS2_PUBLIC RtpTransport * ms_turn_context_create_endpoint(MSTurnContext *context); 349 350 #ifdef __cplusplus 351 } 352 #endif 353 354 #endif /* MS_STUN_H */ 355