linphone-ios/linphone/oRTP/src/srtp.c
aymeric 2b8200409c Initial import
git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@1 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
2008-09-04 15:47:34 +00:00

203 lines
5 KiB
C

/*
The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.
Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#if defined(WIN32) || defined(_WIN32_WCE)
#include "ortp-config-win32.h"
#else
#include "ortp-config.h"
#endif
#include "ortp/ortp.h"
#ifdef HAVE_SRTP
#undef PACKAGE_NAME
#undef PACKAGE_STRING
#undef PACKAGE_TARNAME
#undef PACKAGE_VERSION
#include "ortp/srtp.h"
#define SRTP_PAD_BYTES 64 /*?? */
static int srtp_sendto(RtpTransport *t, mblk_t *m, int flags, const struct sockaddr *to, socklen_t tolen){
srtp_t srtp=(srtp_t)t->data;
int slen;
err_status_t err;
/* enlarge the buffer for srtp to write its data */
msgpullup(m,msgdsize(m)+SRTP_PAD_BYTES);
slen=m->b_wptr-m->b_rptr;
err=srtp_protect(srtp,m->b_rptr,&slen);
if (err==err_status_ok){
return sendto(t->session->rtp.socket,m->b_rptr,slen,flags,to,tolen);
}
ortp_error("srtp_protect() failed");
return -1;
}
static int srtp_recvfrom(RtpTransport *t, mblk_t *m, int flags, struct sockaddr *from, socklen_t *fromlen){
srtp_t srtp=(srtp_t)t->data;
int err;
int slen;
err=recvfrom(t->session->rtp.socket,m->b_wptr,m->b_datap->db_lim-m->b_datap->db_base,flags,from,fromlen);
if (err>0){
/* keep NON-RTP data unencrypted */
rtp_header_t *rtp;
if (err>=RTP_FIXED_HEADER_SIZE)
{
rtp = (rtp_header_t*)m->b_wptr;
if (rtp->version!=2)
{
return err;
}
}
slen=err;
if (srtp_unprotect(srtp,m->b_wptr,&slen)==err_status_ok)
return slen;
else {
ortp_error("srtp_unprotect() failed");
return -1;
}
}
return err;
}
static int srtcp_sendto(RtpTransport *t, mblk_t *m, int flags, const struct sockaddr *to, socklen_t tolen){
srtp_t srtp=(srtp_t)t->data;
int slen;
/* enlarge the buffer for srtp to write its data */
msgpullup(m,msgdsize(m)+SRTP_PAD_BYTES);
slen=m->b_wptr-m->b_rptr;
if (srtp_protect_rtcp(srtp,m->b_rptr,&slen)==err_status_ok){
return sendto(t->session->rtcp.socket,m->b_rptr,slen,flags,to,tolen);
}
ortp_error("srtp_protect_rtcp() failed");
return -1;
}
static int srtcp_recvfrom(RtpTransport *t, mblk_t *m, int flags, struct sockaddr *from, socklen_t *fromlen){
srtp_t srtp=(srtp_t)t->data;
int err;
int slen;
err=recvfrom(t->session->rtcp.socket,m->b_wptr,m->b_datap->db_lim-m->b_datap->db_base,flags,from,fromlen);
if (err>0){
slen=err;
if (srtp_unprotect_rtcp(srtp,m->b_wptr,&slen)==err_status_ok)
return slen;
else {
ortp_error("srtp_unprotect_rtcp() failed");
return -1;
}
}
return err;
}
ortp_socket_t
srtp_getsocket(RtpTransport *t)
{
return t->session->rtp.socket;
}
ortp_socket_t
srtcp_getsocket(RtpTransport *t)
{
return t->session->rtcp.socket;
}
/**
* Creates a pair of Secure-RTP/Secure-RTCP RtpTransport's.
* oRTP relies on libsrtp (see http://srtp.sf.net ) for secure RTP encryption.
* This function creates a RtpTransport object to be used to the RtpSession using
* rtp_session_set_transport().
* @srtp: the srtp_t session to be used
*
**/
int srtp_transport_new(srtp_t srtp, RtpTransport **rtpt, RtpTransport **rtcpt ){
if (rtpt) {
(*rtpt)=ortp_new(RtpTransport,1);
(*rtpt)->data=srtp;
(*rtpt)->t_getsocket=srtp_getsocket;
(*rtpt)->t_sendto=srtp_sendto;
(*rtpt)->t_recvfrom=srtp_recvfrom;
}
if (rtcpt) {
(*rtcpt)=ortp_new(RtpTransport,1);
(*rtcpt)->data=srtp;
(*rtcpt)->t_getsocket=srtcp_getsocket;
(*rtcpt)->t_sendto=srtcp_sendto;
(*rtcpt)->t_recvfrom=srtcp_recvfrom;
}
return 0;
}
err_status_t ortp_srtp_init(void)
{
return srtp_init();
}
err_status_t ortp_srtp_create(srtp_t *session, const srtp_policy_t *policy)
{
int i;
i = srtp_create(session, policy);
return i;
}
err_status_t ortp_srtp_dealloc(srtp_t session)
{
return srtp_dealloc(session);
}
err_status_t ortp_srtp_add_stream(srtp_t session, const srtp_policy_t *policy)
{
return srtp_add_stream(session, policy);
}
bool_t ortp_srtp_supported(void){
return TRUE;
}
#else
int srtp_transport_new(void *i, RtpTransport **rtpt, RtpTransport **rtcpt ){
ortp_error("srtp_transport_new: oRTP has not been compiled with SRTP support.");
return -1;
}
bool_t ortp_srtp_supported(void){
return FALSE;
}
int ortp_srtp_create(void *i, const void *policy)
{
return -1;
}
int ortp_srtp_dealloc(void *session)
{
return -1;
}
int ortp_srtp_add_stream(void *session, const void *policy)
{
return -1;
}
#endif