Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CRYPTOCONTEXT_H
00022 #define CRYPTOCONTEXT_H
00023
00024 #include <cc++/config.h>
00025
00026 #include <ccrtp/rtppkt.h>
00027
00028 #ifdef SRTP_SUPPORT
00029 #include <ccrtp/crypto/AesSrtp.h>
00030 #endif
00031
00032 #define REPLAY_WINDOW_SIZE 64
00033
00034
00035 const int SrtpAuthenticationNull = 0;
00036 const int SrtpAuthenticationSha1Hmac = 1;
00037 const int SrtpAuthenticationSkeinHmac = 2;
00038
00039 const int SrtpEncryptionNull = 0;
00040 const int SrtpEncryptionAESCM = 1;
00041 const int SrtpEncryptionAESF8 = 2;
00042 const int SrtpEncryptionTWOCM = 3;
00043 const int SrtpEncryptionTWOF8 = 4;
00044
00045 #ifdef CCXX_NAMESPACES
00046 namespace ost {
00047 #endif
00048
00049 class RTPPacket;
00050
00079 class __EXPORT CryptoContext {
00080 public:
00090 CryptoContext( uint32 ssrc );
00091
00166 CryptoContext( uint32 ssrc, int32 roc,
00167 int64 keyDerivRate,
00168 const int32 ealg,
00169 const int32 aalg,
00170 uint8* masterKey,
00171 int32 masterKeyLength,
00172 uint8* masterSalt,
00173 int32 masterSaltLength,
00174 int32 ekeyl,
00175 int32 akeyl,
00176 int32 skeyl,
00177 int32 tagLength );
00183 ~CryptoContext();
00184
00194 inline void
00195 setRoc(uint32 r)
00196 {roc = r;}
00197
00206 inline uint32
00207 getRoc() const
00208 {return roc;}
00209
00226 void srtpEncrypt( RTPPacket* rtp, uint64 index, uint32 ssrc );
00227
00244 void srtpAuthenticate(RTPPacket* rtp, uint32 roc, uint8* tag );
00245
00257 void deriveSrtpKeys(uint64 index);
00258
00271 uint64 guessIndex(uint16 newSeqNumber);
00272
00288 bool checkReplay(uint16 newSeqNumber);
00289
00299 void update( uint16 newSeqNumber );
00300
00306 inline int32
00307 getTagLength() const
00308 {return tagLength;}
00309
00310
00316 inline int32
00317 getMkiLength() const
00318 {return mkiLength;}
00319
00325 inline uint32
00326 getSsrc() const
00327 {return ssrc;}
00328
00351 CryptoContext* newCryptoContextForSSRC(uint32 ssrc, int roc, int64 keyDerivRate);
00352
00353 private:
00354
00355 uint32 ssrc;
00356 bool using_mki;
00357 uint32 mkiLength;
00358 uint8* mki;
00359
00360 uint32 roc;
00361 uint32 guessed_roc;
00362 uint16 s_l;
00363 int64 key_deriv_rate;
00364
00365
00366 uint64 replay_window;
00367
00368 uint8* master_key;
00369 uint32 master_key_length;
00370 uint32 master_key_srtp_use_nb;
00371 uint32 master_key_srtcp_use_nb;
00372 uint8* master_salt;
00373 uint32 master_salt_length;
00374
00375
00376 int32 n_e;
00377 uint8* k_e;
00378 int32 n_a;
00379 uint8* k_a;
00380 int32 n_s;
00381 uint8* k_s;
00382
00383 int32 ealg;
00384 int32 aalg;
00385 int32 ekeyl;
00386 int32 akeyl;
00387 int32 skeyl;
00388 int32 tagLength;
00389 bool seqNumSet;
00390
00391 void* macCtx;
00392
00393 #ifdef SRTP_SUPPORT
00394 AesSrtp* aesCipher;
00395 AesSrtp* f8AesCipher;
00396 #else
00397 void* aesCipher;
00398 void* f8AesCipher;
00399 #endif
00400
00401 };
00402 #ifdef CCXX_NAMESPACES
00403 }
00404 #endif
00405
00406 #endif
00407