ccRTP
CryptoContext.h
Go to the documentation of this file.
00001 /*
00002   Copyright (C) 2004-2006 the Minisip Team
00003 
00004   This library is free software; you can redistribute it and/or
00005   modify it under the terms of the GNU Lesser General Public
00006   License as published by the Free Software Foundation; either
00007   version 2.1 of the License, or (at your option) any later version.
00008 
00009   This library is distributed in the hope that it will be useful,
00010   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012   Lesser General Public License for more details.
00013 
00014   You should have received a copy of the GNU Lesser General Public License
00015   along with GNU uCommon C++.  If not, see <http://www.gnu.org/licenses/>.
00016 */
00017 
00018 
00019 
00020 #ifndef CRYPTOCONTEXT_H
00021 #define CRYPTOCONTEXT_H
00022 
00023 #include <commoncpp/config.h>
00024 
00025 #include <ccrtp/rtppkt.h>
00026 
00027 
00028 #define REPLAY_WINDOW_SIZE 64
00029 
00030 const int SrtpAuthenticationNull     =  0;
00031 const int SrtpAuthenticationSha1Hmac =  1;
00032 const int SrtpAuthenticationSkeinHmac = 2;
00033 
00034 const int SrtpEncryptionNull  = 0;
00035 const int SrtpEncryptionAESCM = 1;
00036 const int SrtpEncryptionAESF8 = 2;
00037 const int SrtpEncryptionTWOCM = 3;
00038 const int SrtpEncryptionTWOF8 = 4;
00039 
00040 #ifndef CRYPTOCONTEXTCTRL_H
00041 
00042 #include <stdint.h>
00043 
00044 #ifdef SRTP_SUPPORT
00045 #include <ccrtp/crypto/SrtpSymCrypto.h>
00046 #endif
00047 
00048 class SrtpSymCrypto;
00049 
00050 NAMESPACE_COMMONCPP
00051 
00052     class RTPPacket;
00053 
00082     class __EXPORT CryptoContext {
00083     public:
00093         CryptoContext( uint32 ssrc );
00094 
00169         CryptoContext( uint32 ssrc, int32 roc,
00170                int64  keyDerivRate,
00171                const  int32 ealg,
00172                const  int32 aalg,
00173                uint8* masterKey,
00174                int32  masterKeyLength,
00175                uint8* masterSalt,
00176                int32  masterSaltLength,
00177                int32  ekeyl,
00178                int32  akeyl,
00179                int32  skeyl,
00180                int32  tagLength );
00186         ~CryptoContext();
00187 
00197         inline void
00198         setRoc(uint32 r)
00199         {roc = r;}
00200 
00209         inline uint32
00210         getRoc() const
00211         {return roc;}
00212 
00229         void srtpEncrypt( RTPPacket* rtp, uint64 index, uint32 ssrc );
00230 
00247         void srtpAuthenticate(RTPPacket* rtp, uint32 roc, uint8* tag );
00248 
00260         void deriveSrtpKeys(uint64 index);
00261 
00274         uint64 guessIndex(uint16 newSeqNumber);
00275 
00291         bool checkReplay(uint16 newSeqNumber);
00292 
00302         void update( uint16 newSeqNumber );
00303 
00309         inline int32
00310         getTagLength() const
00311         {return tagLength;}
00312 
00313 
00319         inline int32
00320         getMkiLength() const
00321         {return mkiLength;}
00322 
00328         inline uint32
00329         getSsrc() const
00330         {return ssrcCtx;}
00331 
00353      CryptoContext* newCryptoContextForSSRC(uint32 ssrc, int roc, int64 keyDerivRate);
00354 
00355     private:
00356 
00357         uint32 ssrcCtx;
00358         bool   using_mki;
00359         uint32 mkiLength;
00360         uint8* mki;
00361 
00362         uint32 roc;
00363         uint32 guessed_roc;
00364         uint16 s_l;
00365         int64  key_deriv_rate;
00366 
00367         /* bitmask for replay check */
00368         uint64 replay_window;
00369 
00370         uint8* master_key;
00371         uint32 master_key_length;
00372         uint32 master_key_srtp_use_nb;
00373         uint32 master_key_srtcp_use_nb;
00374         uint8* master_salt;
00375         uint32 master_salt_length;
00376 
00377         /* Session Encryption, Authentication keys, Salt */
00378         int32  n_e;
00379         uint8* k_e;
00380         int32  n_a;
00381         uint8* k_a;
00382         int32  n_s;
00383         uint8* k_s;
00384 
00385         int32 ealg;
00386         int32 aalg;
00387         int32 ekeyl;
00388         int32 akeyl;
00389         int32 skeyl;
00390         int32 tagLength;
00391         bool  seqNumSet;
00392 
00393         void*   macCtx;
00394 
00395 #ifdef SRTP_SUPPORT
00396         SrtpSymCrypto* cipher;
00397         SrtpSymCrypto* f8Cipher;
00398 #else
00399         void* cipher;
00400         void* f8Cipher;
00401 #endif
00402 
00403     };
00404 
00405 END_NAMESPACE
00406 
00407 #endif
00408 
00409 #endif
00410