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