| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Asterisk -- An open source telephony toolkit. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2006 - 2007, Mikael Magnusson | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Mikael Magnusson <mikma@users.sourceforge.net> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * See http://www.asterisk.org for more information about
 | 
					
						
							|  |  |  |  * the Asterisk project. Please do not directly contact | 
					
						
							|  |  |  |  * any of the maintainers of this project for assistance; | 
					
						
							|  |  |  |  * the project provides a web site, mailing lists and IRC | 
					
						
							|  |  |  |  * channels for your use. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software, distributed under the terms of | 
					
						
							|  |  |  |  * the GNU General Public License Version 2. See the LICENSE file | 
					
						
							|  |  |  |  * at the top of the source tree. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-17 07:15:15 -05:00
										 |  |  | /*! \file
 | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  |  * \brief SRTP and SDP Security descriptions | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2016-07-13 12:24:46 +02:00
										 |  |  |  * Specified in RFC 3711, 6188, 7714, and 4568 | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * \author Mikael Magnusson <mikma@users.sourceforge.net> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-15 16:20:16 +00:00
										 |  |  | /*** MODULEINFO
 | 
					
						
							|  |  |  | 	<support_level>core</support_level> | 
					
						
							|  |  |  |  ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | #include "asterisk.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 12:24:46 +02:00
										 |  |  | #include "asterisk/linkedlists.h"       /* for AST_LIST_NEXT, etc */
 | 
					
						
							|  |  |  | #include "asterisk/logger.h"            /* for ast_log, LOG_ERROR, etc */
 | 
					
						
							|  |  |  | #include "asterisk/sdp_srtp.h"          /* for ast_sdp_srtp, etc */
 | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | /*! Registered SDP crypto API */ | 
					
						
							|  |  |  | static struct ast_sdp_crypto_api *sdp_crypto_api; | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | struct ast_sdp_srtp *ast_sdp_srtp_alloc(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (!ast_rtp_engine_srtp_is_registered()) { | 
					
						
							|  |  |  | 	       ast_debug(1, "No SRTP module loaded, can't setup SRTP session.\n"); | 
					
						
							|  |  |  | 	       return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ast_calloc(1, sizeof(struct ast_sdp_srtp)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ast_sdp_srtp_destroy(struct ast_sdp_srtp *srtp) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-07-13 12:24:46 +02:00
										 |  |  | 	struct ast_sdp_srtp *next; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (next = AST_LIST_NEXT(srtp, sdp_srtp_list); | 
					
						
							|  |  |  | 	     srtp; | 
					
						
							|  |  |  | 	     srtp = next, next = srtp ? AST_LIST_NEXT(srtp, sdp_srtp_list) : NULL) { | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 		ast_sdp_crypto_destroy(srtp->crypto); | 
					
						
							| 
									
										
										
										
											2016-07-13 12:24:46 +02:00
										 |  |  | 		srtp->crypto = NULL; | 
					
						
							|  |  |  | 		ast_free(srtp); | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ast_sdp_crypto_destroy(struct ast_sdp_crypto *crypto) | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	if (sdp_crypto_api) { | 
					
						
							|  |  |  | 		sdp_crypto_api->dtor(crypto); | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 12:24:46 +02:00
										 |  |  | struct ast_sdp_crypto *ast_sdp_crypto_alloc(void) | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	if (!sdp_crypto_api) { | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	return sdp_crypto_api->alloc(); | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | int ast_sdp_crypto_process(struct ast_rtp_instance *rtp, struct ast_sdp_srtp *srtp, const char *attr) | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	if (!sdp_crypto_api) { | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	return sdp_crypto_api->parse_offer(rtp, srtp, attr); | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | int ast_sdp_crypto_build_offer(struct ast_sdp_crypto *p, int taglen) | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	if (!sdp_crypto_api) { | 
					
						
							|  |  |  | 		return -1; | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	return sdp_crypto_api->build_offer(p, taglen); | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | const char *ast_sdp_srtp_get_attrib(struct ast_sdp_srtp *srtp, int dtls_enabled, int default_taglen_32) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	if (!sdp_crypto_api) { | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | 	return sdp_crypto_api->get_attr(srtp, dtls_enabled, default_taglen_32); | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-30 19:51:28 +00:00
										 |  |  | char *ast_sdp_get_rtp_profile(unsigned int sdes_active, struct ast_rtp_instance *instance, unsigned int using_avpf, | 
					
						
							|  |  |  | 	unsigned int force_avp) | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | 	struct ast_rtp_engine_dtls *dtls; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if ((dtls = ast_rtp_instance_get_dtls(instance)) && dtls->active(instance)) { | 
					
						
							| 
									
										
										
										
											2014-06-30 19:51:28 +00:00
										 |  |  | 		if (force_avp) { | 
					
						
							|  |  |  | 			return using_avpf ? "RTP/SAVPF" : "RTP/SAVP"; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return using_avpf ? "UDP/TLS/RTP/SAVPF" : "UDP/TLS/RTP/SAVP"; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		if (using_avpf) { | 
					
						
							|  |  |  | 			return sdes_active ? "RTP/SAVPF" : "RTP/AVPF"; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return sdes_active ? "RTP/SAVP" : "RTP/AVP"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-06-08 05:29:08 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-06-22 14:03:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-08 14:50:53 -05:00
										 |  |  | int ast_sdp_crypto_register(struct ast_sdp_crypto_api *api) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (sdp_crypto_api) { | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	sdp_crypto_api = api; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ast_sdp_crypto_unregister(struct ast_sdp_crypto_api *api) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (sdp_crypto_api == api) { | 
					
						
							|  |  |  | 		sdp_crypto_api = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |