123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- /**
-
- @mainpage Introduction to libSRTP
-
- This document describes libSRTP, the Open Source Secure RTP library
- from Cisco Systems, Inc. RTP is the Real-time Transport Protocol, an
- IETF standard for the transport of real-time data such as telephony,
- audio, and video, defined by RFC 3550. Secure RTP (SRTP) is an RTP
- profile for providing confidentiality to RTP data and authentication
- to the RTP header and payload. SRTP is an IETF Proposed Standard,
- defined in RFC 3711, and was developed in the IETF Audio/Video
- Transport (AVT) Working Group. This library supports all of the
- mandatory features of SRTP, but not all of the optional features. See
- the @ref Features section for more detailed information.
-
- This document is organized as follows. The first chapter provides
- background material on SRTP and overview of libSRTP. The following
- chapters provide a detailed reference to the libSRTP API and related
- functions. The reference material is created automatically (using the
- doxygen utility) from comments embedded in some of the C header
- files. The documentation is organized into modules in order to improve
- its clarity. These modules do not directly correspond to files. An
- underlying cryptographic kernel provides much of the basic
- functionality of libSRTP, but is mostly undocumented because it does
- its work behind the scenes.
- @section LICENSE License and Disclaimer
- libSRTP is distributed under the following license, which is included
- in the source code distribution. It is reproduced in the manual in
- case you got the library from another source.
-
- @latexonly
- \begin{quote}
- Copyright (c) 2001-2005 Cisco Systems, Inc. All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- \begin{itemize}
- \item Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- \item Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- \item Neither the name of the Cisco Systems, Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- \end{itemize}
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- OF THE POSSIBILITY OF SUCH DAMAGE.
- \end{quote}
- @endlatexonly
- @section Features Supported Features
- This library supports all of the mandatory-to-implement features of
- SRTP (as defined by the most recent Internet Draft). Some of these
- features can be selected (or de-selected) at run time by setting an
- appropriate policy; this is done using the structure srtp_policy_t.
- Some other behaviors of the protocol can be adapted by defining an
- approriate event handler for the exceptional events; see the @ref
- SRTPevents section.
- Some options that are not included in the specification are supported.
- Most notably, the TMMH authentication function is included, though it
- was removed from the SRTP Internet Draft during the summer of 2002.
- @latexonly
- Some options that are described in the SRTP specification are not
- supported. This includes
- \begin{itemize}
- \item the Master Key Index (MKI),
- \item key derivation rates other than zero,
- \item the cipher F8,
- \item anti-replay lists with sizes other than 128,
- \item the use of the packet index to select between master keys.
- \end{itemize}
- @endlatexonly
-
- The user should be aware that it is possible to misuse this libary,
- and that the result may be that the security level it provides is
- inadequate. If you are implementing a feature using this library, you
- will want to read the Security Considerations section of the Internet
- Draft. In addition, it is important that you read and understand the
- terms outlined in the @ref LICENSE section.
- @section Installing Installing and Building libSRTP
- @latexonly
- To install libSRTP, download the latest release of the distribution
- from \texttt{srtp.sourceforge.net}. The format of the names of the
- distributions are \texttt{srtp-A.B.C.tgz}, where \texttt{A} is the
- version number, \texttt{B} is the major release number, \texttt{C} is
- the minor release number, and \texttt{tgz} is the file
- extension\footnote{The extension \texttt{.tgz} is identical to
- \texttt{tar.gz}, and indicates a compressed tar file.} You probably
- want to get the most recent release. Unpack the distribution and
- extract the source files; the directory into which the source files
- will go is named \texttt{srtp}.
- libSRTP uses the GNU \texttt{autoconf} and \texttt{make}
- utilities\footnote{BSD make will not work; if both versions of make
- are on your platform, you can invoke GNU make as \texttt{gmake}.}. In
- the \texttt{srtp} directory, run the configure script and then make:
- \begin{verbatim}
- ./configure [ options ]
- make
- \end{verbatim}
- The configure script accepts the following options:
- \begin{quote}
- \begin{description}
- \item[--help] provides a usage summary.
- \item[--disable-debug] compiles libSRTP without the runtime
- dynamic debugging system.
- \item[--enable-generic-aesicm] compile in changes for ismacryp
- \item[--enable-syslog] use syslog for error reporting.
- \item[--disable-stdout] diables stdout for error reporting.
- \item[--enable-console] use \texttt{/dev/console} for error reporting
- \item[--gdoi] use GDOI key management (disabled at present).
- \end{description}
- \end{quote}
- By default, dynamic debugging is enabled and stdout is used for
- debugging. You can use the configure options to have the debugging
- output sent to syslog or the system console. Alternatively, you can
- define ERR\_REPORTING\_FILE in \texttt{include/conf.h} to be any other
- file that can be opened by libSRTP, and debug messages will be sent to
- it.
- This package has been tested on the following platforms: Mac OS X
- (powerpc-apple-darwin1.4), Cygwin (i686-pc-cygwin), Solaris
- (sparc-sun-solaris2.6), RedHat Linux 7.1 and 9 (i686-pc-linux), and
- OpenBSD (sparc-unknown-openbsd2.7).
- @endlatexonly
- @section Applications Applications
- @latexonly
- Several test drivers and a simple and portable srtp application are
- included in the \texttt{test/} subdirectory.
- \begin{center}
- \begin{tabular}{ll}
- \hline
- Test driver & Function tested \\
- \hline
- kernel\_driver & crypto kernel (ciphers, auth funcs, rng) \\
- srtp\_driver & srtp in-memory tests (does not use the network) \\
- rdbx\_driver & rdbx (extended replay database) \\
- roc\_driver & extended sequence number functions \\
- replay\_driver & replay database \\
- cipher\_driver & ciphers \\
- auth\_driver & hash functions \\
- \hline
- \end{tabular}
- \end{center}
- The app rtpw is a simple rtp application which reads words from
- /usr/dict/words and then sends them out one at a time using [s]rtp.
- Manual srtp keying uses the -k option; automated key management
- using gdoi will be added later.
- The usage for rtpw is
- \texttt{rtpw [[-d $<$debug$>$]* [-k $<$key$>$ [-a][-e]] [-s | -r] dest\_ip
- dest\_port] | [-l]}
- Either the -s (sender) or -r (receiver) option must be chosen. The
- values dest\_ip, dest\_port are the IP address and UDP port to which
- the dictionary will be sent, respectively. The options are:
- \begin{center}
- \begin{tabular}{ll}
- -s & (S)RTP sender - causes app to send words \\
- -r & (S)RTP receive - causes app to receive words \\
- -k $<$key$>$ & use SRTP master key $<$key$>$, where the
- key is a hexadecimal value (without the
- leading "0x") \\
- -e & encrypt/decrypt (for data confidentiality)
- (requires use of -k option as well)\\
- -a & message authentication
- (requires use of -k option as well) \\
- -l & list the available debug modules \\
- -d $<$debug$>$ & turn on debugging for module $<$debug$>$ \\
- \end{tabular}
- \end{center}
- In order to get a random 30-byte value for use as a key/salt pair, you
- can use the \texttt{rand\_gen} utility in the \texttt{test/}
- subdirectory.
- An example of an SRTP session using two rtpw programs follows:
- \begin{verbatim}
- [sh1] set k=`test/rand_gen -n 30`
- [sh1] echo $k
- c1eec3717da76195bb878578790af71c4ee9f859e197a414a78d5abc7451
- [sh1]$ test/rtpw -s -k $k -ea 0.0.0.0 9999
- Security services: confidentiality message authentication
- set master key/salt to C1EEC3717DA76195BB878578790AF71C/4EE9F859E197A414A78D5ABC7451
- setting SSRC to 2078917053
- sending word: A
- sending word: a
- sending word: aa
- sending word: aal
- sending word: aalii
- sending word: aam
- sending word: Aani
- sending word: aardvark
- ...
- [sh2] set k=c1eec3717da76195bb878578790af71c4ee9f859e197a414a78d5abc7451
- [sh2]$ test/rtpw -r -k $k -ea 0.0.0.0 9999
- security services: confidentiality message authentication
- set master key/salt to C1EEC3717DA76195BB878578790AF71C/4EE9F859E197A414A78D5ABC7451
- 19 octets received from SSRC 2078917053 word: A
- 19 octets received from SSRC 2078917053 word: a
- 20 octets received from SSRC 2078917053 word: aa
- 21 octets received from SSRC 2078917053 word: aal
- ...
- \end{verbatim}
- @endlatexonly
- @section Review Secure RTP Background
- In this section we review SRTP and introduce some terms that are used
- in libSRTP. An RTP session is defined by a pair of destination
- transport addresses, that is, a network address plus a pair of UDP
- ports for RTP and RTCP. RTCP, the RTP control protocol, is used to
- coordinate between the participants in an RTP session, e.g. to provide
- feedback from receivers to senders. An @e SRTP @e session is
- similarly defined; it is just an RTP session for which the SRTP
- profile is being used. An SRTP session consists of the traffic sent
- to the SRTP or SRTCP destination transport addresses. Each
- participant in a session is identified by a synchronization source
- (SSRC) identifier. Some participants may not send any SRTP traffic;
- they are called receivers, even though they send out SRTCP traffic,
- such as receiver reports.
- RTP allows multiple sources to send RTP and RTCP traffic during the
- same session. The synchronization source identifier (SSRC) is used to
- distinguish these sources. In libSRTP, we call the SRTP and SRTCP
- traffic from a particular source a @e stream. Each stream has its own
- SSRC, sequence number, rollover counter, and other data. A particular
- choice of options, cryptographic mechanisms, and keys is called a @e
- policy. Each stream within a session can have a distinct policy
- applied to it. A session policy is a collection of stream policies.
- A single policy can be used for all of the streams in a given session,
- though the case in which a single @e key is shared across multiple
- streams requires care. When key sharing is used, the SSRC values that
- identify the streams @b must be distinct. This requirement can be
- enforced by using the convention that each SRTP and SRTCP key is used
- for encryption by only a single sender. In other words, the key is
- shared only across streams that originate from a particular device (of
- course, other SRTP participants will need to use the key for
- decryption). libSRTP supports this enforcement by detecting the case
- in which a key is used for both inbound and outbound data.
- @section Overview libSRTP Overview
- libSRTP provides functions for protecting RTP and RTCP. RTP packets
- can be encrypted and authenticated (using the srtp_protect()
- function), turning them into SRTP packets. Similarly, SRTP packets
- can be decrypted and have their authentication verified (using the
- srtp_unprotect() function), turning them into RTP packets. Similar
- functions apply security to RTCP packets.
- The typedef srtp_stream_t points to a structure holding all of the
- state associated with an SRTP stream, including the keys and
- parameters for cipher and message authentication functions and the
- anti-replay data. A particular srtp_stream_t holds the information
- needed to protect a particular RTP and RTCP stream. This datatype
- is intentionally opaque in order to better seperate the libSRTP
- API from its implementation.
- Within an SRTP session, there can be multiple streams, each
- originating from a particular sender. Each source uses a distinct
- stream context to protect the RTP and RTCP stream that it is
- originating. The typedef srtp_t points to a structure holding all of
- the state associated with an SRTP session. There can be multiple
- stream contexts associated with a single srtp_t. A stream context
- cannot exist indepent from an srtp_t, though of course an srtp_t can
- be created that contains only a single stream context. A device
- participating in an SRTP session must have a stream context for each
- source in that session, so that it can process the data that it
- receives from each sender.
- In libSRTP, a session is created using the function srtp_create().
- The policy to be implemented in the session is passed into this
- function as an srtp_policy_t structure. A single one of these
- structures describes the policy of a single stream. These structures
- can also be linked together to form an entire session policy. A linked
- list of srtp_policy_t structures is equivalent to a session policy.
- In such a policy, we refer to a single srtp_policy_t as an @e element.
- An srtp_policy_t strucutre contains two crypto_policy_t structures
- that describe the cryptograhic policies for RTP and RTCP, as well as
- the SRTP master key and the SSRC value. The SSRC describes what to
- protect (e.g. which stream), and the crypto_policy_t structures
- describe how to protect it. The key is contained in a policy element
- because it simplifies the interface to the library. In many cases, it
- is desirable to use the same cryptographic policies across all of the
- streams in a session, but to use a distinct key for each stream. A
- crypto_policy_t structure can be initialized by using either the
- crypto_policy_set_rtp_default() or crypto_policy_set_rtcp_default()
- functions, which set a crypto policy structure to the default policies
- for RTP and RTCP protection, respectively.
-
- @section Example Example Code
- This section provides a simple example of how to use libSRTP. The
- example code lacks error checking, but is functional. Here we assume
- that the value ssrc is already set to describe the SSRC of the stream
- that we are sending, and that the functions get_rtp_packet() and
- send_srtp_packet() are available to us. The former puts an RTP packet
- into the buffer and returns the number of octets written to that
- buffer. The latter sends the RTP packet in the buffer, given the
- length as its second argument.
- @verbatim
- srtp_t session;
- srtp_policy_t policy;
- uint8_t key[30];
- // initialize libSRTP
- srtp_init();
- // set policy to describe a policy for an SRTP stream
- crypto_policy_set_rtp_default(&policy.rtp);
- crypto_policy_set_rtcp_default(&policy.rtcp);
- policy.ssrc = ssrc;
- policy.key = key;
- policy.next = NULL;
- // set key to random value
- crypto_get_random(key, 30);
- // allocate and initialize the SRTP session
- srtp_create(&session, &policy);
-
- // main loop: get rtp packets, send srtp packets
- while (1) {
- char rtp_buffer[2048];
- unsigned len;
- len = get_rtp_packet(rtp_buffer);
- srtp_protect(session, rtp_buffer, &len);
- send_srtp_packet(rtp_buffer, len);
- }
- @endverbatim
- @section ISMAcryp ISMA Encryption Support
- The Internet Streaming Media Alliance (ISMA) specifies a way
- to pre-encrypt a media file prior to streaming. This method
- is an alternative to SRTP encryption, which is potentially
- useful when a particular media file will be streamed
- multiple times. The specification is available online
- at http://www.isma.tv/specreq.nsf/SpecRequest.
- libSRTP provides the encryption and decryption functions needed for ISMAcryp
- in the library @t libaesicm.a, which is included in the default
- Makefile target. This library is used by the MPEG4IP project; see
- http://mpeg4ip.sourceforge.net/.
- Note that ISMAcryp does not provide authentication for
- RTP nor RTCP, nor confidentiality for RTCP.
- ISMAcryp RECOMMENDS the use of SRTP message authentication for ISMAcryp
- streams while using ISMAcryp encryption to protect the media itself.
- */
|