# srtp.h

Go to the documentation of this file.

    00001 /*
    00002  * srtp.h
    00003  *
    00004  * SRTP protocol handler
    00005  *
    00006  * OPAL Library
    00007  *
    00008  * Copyright (C) 2006 Post Increment
    00009  *
    00010  * The contents of this file are subject to the Mozilla Public License
    00011  * Version 1.0 (the "License"); you may not use this file except in
    00012  * compliance with the License. You may obtain a copy of the License at
    00013  * http://www.mozilla.org/MPL/
    00014  *
    00015  * Software distributed under the License is distributed on an "AS IS"
    00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
    00017  * the License for the specific language governing rights and limitations
    00018  * under the License.
    00019  *
    00020  * The Original Code is OPAL Library.
    00021  *
    00022  * The Initial Developer of the Original Code is Post Increment
    00023  *     Portions of this code were written with the assistance of funding from
    00024  *     US Joint Forces Command Joint Concept Development & Experimentation (J9)
    00025  *     http://www.jfcom.mil/about/abt_j9.htm
    00026  *
    00027  * Contributor(s): ______________________________________.
    00028  *
    00029  * $Revision: 22444 $
    00030  * $Author: rjongbloed $
    00031  * $Date: 2009-04-20 18:49:06 -0500 (Mon, 20 Apr 2009) $
    00032  */
    00033
    00034 #ifndef OPAL_RTP_SRTP_H
    00035 #define OPAL_RTP_SRTP_H
    00036
    00037 #ifdef P_USE_PRAGMA
    00038 #pragma interface
    00039 #endif
    00040
    00041 #ifndef _PTLIB_H
    00042 #include <ptlib.h>
    00043 #endif
    00044
    00045 #include <opal/buildopts.h>
    00046
    00047 #include <rtp/rtp.h>
    00048 #include <opal/rtpconn.h>
    00049
    00050 #if OPAL_SRTP
    00051
    00052
    00054 //
    00055 //  this class holds the parameters required for an SRTP session
    00056 //
    00057 //  Crypto modes are identified by key strings that are contained in PFactory<OpalSRTPParms>
    00058 //  The following strings should be implemented:
    00059 //
    00060 //     AES_CM_128_HMAC_SHA1_80,
    00061 //     AES_CM_128_HMAC_SHA1_32,
    00062 //     AES_CM_128_NULL_AUTH,
    00063 //     NULL_CIPHER_HMAC_SHA1_80
    00064 //     STRONGHOLD
    00065 //
    00066
    00067 class OpalSRTPSecurityMode : public OpalSecurityMode
    00068 {
    00069   PCLASSINFO(OpalSRTPSecurityMode, OpalSecurityMode);
    00070   public:
    00071     struct KeySalt {
    00072       KeySalt()                                                       { }
    00073       KeySalt(const PBYTEArray & data)           : key(data)          { }
    00074       KeySalt(const BYTE * data, PINDEX dataLen) : key(data, dataLen) { }
    00075       PBYTEArray key;
    00076       PBYTEArray salt;
    00077     };
    00078     virtual PBoolean SetOutgoingKey(const KeySalt & key) = 0;
    00079     virtual PBoolean GetOutgoingKey(KeySalt & key) const = 0;
    00080     virtual PBoolean SetOutgoingSSRC(DWORD ssrc) = 0;
    00081     virtual PBoolean GetOutgoingSSRC(DWORD & ssrc) const = 0;
    00082
    00083     virtual PBoolean SetIncomingKey(const KeySalt & key) = 0;
    00084     virtual PBoolean GetIncomingKey(KeySalt & key) const = 0;
    00085     virtual PBoolean SetIncomingSSRC(DWORD ssrc) = 0;
    00086     virtual PBoolean GetIncomingSSRC(DWORD & ssrc) const = 0;
    00087 };
    00088
    00090 //
    00091 //  this class implements SRTP over UDP
    00092 //
    00093
    00094 class OpalSRTP_UDP : public SecureRTP_UDP
    00095 {
    00096   PCLASSINFO(OpalSRTP_UDP, SecureRTP_UDP);
    00097   public:
    00098     OpalSRTP_UDP(
    00099       const Params & options
    00100     );
    00101
    00102     virtual SendReceiveStatus OnSendData   (RTP_DataFrame & frame) = 0;
    00103     virtual SendReceiveStatus OnReceiveData(RTP_DataFrame & frame) = 0;
    00104     virtual SendReceiveStatus OnSendControl(RTP_ControlFrame & frame, PINDEX & len) = 0;
    00105     virtual SendReceiveStatus OnReceiveControl(RTP_ControlFrame & frame) = 0;
    00106 };
    00107
    00108
    00110 //
    00111 //  this class implements SRTP using libSRTP
    00112 //
    00113
    00114 class LibSRTP_UDP : public OpalSRTP_UDP
    00115 {
    00116   PCLASSINFO(LibSRTP_UDP, OpalSRTP_UDP);
    00117   public:
    00118     LibSRTP_UDP(
    00119       const Params & options
    00120     );
    00121
    00122     ~LibSRTP_UDP();
    00123
    00124     PBoolean Open(
    00125       PIPSocket::Address localAddress,
    00126       WORD portBase,
    00127       WORD portMax,
    00128       BYTE ipTypeOfService,
    00129       PNatMethod * natMethod = NULL,
    00130       RTP_QOS * rtpqos = NULL
    00131     );
    00132
    00133     virtual SendReceiveStatus OnSendData   (RTP_DataFrame & frame);
    00134     virtual SendReceiveStatus OnReceiveData(RTP_DataFrame & frame);
    00135     virtual SendReceiveStatus OnSendControl(RTP_ControlFrame & frame, PINDEX & len);
    00136     virtual SendReceiveStatus OnReceiveControl(RTP_ControlFrame & frame);
    00137 };
    00138
    00139 PFACTORY_LOAD(LibSRTPSecurityMode_STRONGHOLD);
    00140
    00141
    00142 #endif // OPAL_SRTP
    00143
    00144 #endif // OPAL_RTP_SRTP_H