Secure RTP (SRTP) Reference Implementation
David A. McGrew
Cisco Systems, Inc.
mcgrew@cisco.com


This package provides an implementation of the Secure Real-time
Transport Protocol (SRTP), the Universal Security Transform (UST), and
a supporting cryptographic kernel.  These mechanisms are documented in
the Internet Drafts in the doc/ subdirectory.  The SRTP API is
documented in include/srtp.h, and the library is in libsrtp.a (after
compilation).  An overview and reference manual is available in
doc/libsrtp.pdf.  The PDF documentation is more up to date than this
file.


Installation:

./configure [ options ]       # GNU autoconf script 
make                          # or gmake if needed; use GNU make

The configure script accepts the following options:

   --help              provides a usage summary
   --disable-debug     compile without the runtime debugging system
   --enable-syslog     use syslog for error reporting
   --disable-stdout    use stdout for error reporting
   --enable-console    use /dev/console for error reporting
   --gdoi              use GDOI key management (disabled at present)

By default, debbuging is enabled and stdout is used for debugging.
You can use the above configure options to have the debugging output
sent to syslog or the system console.  Alternatively, you can define
ERR_REPORTING_FILE in 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 Mac OS X (powerpc-apple-darwin1.4),
Cygwin (i686-pc-cygwin), and Sparc (sparc-sun-solaris2.6).  Previous
versions have been tested on Linux and OpenBSD on both x86 and sparc
platforms.

A quick tour of this package:

Makefile		targets: all, clean, ...
README			this file
CHANGES                 change log 
VERSION			version number of this package
LICENSE                 legal details (it's a BSD-like license)
crypto/ciphers/		ciphers (null, aes_icm, ...)
crypto/math/		crypto math routines
crypto/hash/            crypto hashing (hmac, tmmhv2, ...)
crypto/replay/		replay protection
doc/			documentation: rfcs, apis, and suchlike
include/		include files for all code in distribution
srtp/			secure real-time transport protocol implementation
tables/                 apps for generating tables (useful in porting)
test/			test drivers 


Applications

  Several test drivers and a simple and portable srtp application
  are included in the test/ subdirectory.

  test driver	function tested	
  -------------------------------------------------------------
  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 (n.b. not used in libsrtp)
  cipher_driver	ciphers 
  auth_driver	hash functions 

  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.

usage: rtpw [-d <debug>]* [-k <key> [-a][-e]] [-s | -r] dest_ip dest_port
or     rtpw -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.  

  options:

  -s		(s)rtp sender - causes app to send words

  -r		(s)rtp receive - causes app to receve 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 debug modules

  -d <debug>    turn on debugging for module <debug>


In order to get random 30-byte values for use as key/salt pairs , you
can use the following bash function to format the output of
/dev/random (where that device is available).

function randhex() {
   cat /dev/random | od --read-bytes=32 --width=32 -x | awk '{ print $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 }'
}


An example of an SRTP session using two rtpw programs follows:

set 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
...

[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
...

Implementation Notes

  * The srtp_protect() function assumes that the buffer holding the
    rtp packet has enough storage allocated that the authentication 
    tag can be written to the end of that packet.  If this assumption
    is not valid, memory corruption will ensue.  

  * Automated tests for the crypto functions are provided through
    the cipher_type_self_test() and auth_type_self_test() functions.
    These functions should be used to test each port of this code 
    to a new platform.

  * Replay protection is contained in the crypto engine, and
    tests for it are provided.

  * This implementation provides calls to initialize, protect, and
    unprotect RTP packets, and makes as few as possible assumptions
    about how these functions will be called.  For example, the
    caller is not expected to provide packets in order (though if
    they're called more than 65k out of sequence, synchronization
    will be lost).
    
  * The sequence number in the rtp packet is used as the low 16 bits
    of the sender's local packet index. Note that RTP will start its
    sequence number in a random place, and the SRTP layer just jumps
    forward to that number at its first invocation.  An earlier
    version of this library used initial sequence numbers that are
    less than 32,768; this trick is no longer required as the
    rdbx_estimate_index(...) function has been made smarter.

  * The replay window is 128 bits in length, and is hard-coded to this
    value for now.  


