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 <commoncpp/config.h>
00025
00026 #include <ccrtp/rtppkt.h>
00027
00028
00029 #define REPLAY_WINDOW_SIZE 64
00030
00031 const int SrtpAuthenticationNull = 0;
00032 const int SrtpAuthenticationSha1Hmac = 1;
00033 const int SrtpAuthenticationSkeinHmac = 2;
00034
00035 const int SrtpEncryptionNull = 0;
00036 const int SrtpEncryptionAESCM = 1;
00037 const int SrtpEncryptionAESF8 = 2;
00038 const int SrtpEncryptionTWOCM = 3;
00039 const int SrtpEncryptionTWOF8 = 4;
00040
00041 #ifndef CRYPTOCONTEXTCTRL_H
00042
00043 #include <stdint.h>
00044
00045 #ifdef SRTP_SUPPORT
00046 #include <ccrtp/crypto/SrtpSymCrypto.h>
00047 #endif
00048
00049 class SrtpSymCrypto;
00050
00051 NAMESPACE_COMMONCPP
00052
00053 class RTPPacket;
00054
00083 class __EXPORT CryptoContext {
00084 public:
00094 CryptoContext( uint32 ssrc );
00095
00170 CryptoContext( uint32 ssrc, int32 roc,
00171 int64 keyDerivRate,
00172 const int32 ealg,
00173 const int32 aalg,
00174 uint8* masterKey,
00175 int32 masterKeyLength,
00176 uint8* masterSalt,
00177 int32 masterSaltLength,
00178 int32 ekeyl,
00179 int32 akeyl,
00180 int32 skeyl,
00181 int32 tagLength );
00187 ~CryptoContext();
00188
00198 inline void
00199 setRoc(uint32 r)
00200 {roc = r;}
00201
00210 inline uint32
00211 getRoc() const
00212 {return roc;}
00213
00230 void srtpEncrypt( RTPPacket* rtp, uint64 index, uint32 ssrc );
00231
00248 void srtpAuthenticate(RTPPacket* rtp, uint32 roc, uint8* tag );
00249
00261 void deriveSrtpKeys(uint64 index);
00262
00275 uint64 guessIndex(uint16 newSeqNumber);
00276
00292 bool checkReplay(uint16 newSeqNumber);
00293
00303 void update( uint16 newSeqNumber );
00304
00310 inline int32
00311 getTagLength() const
00312 {return tagLength;}
00313
00314
00320 inline int32
00321 getMkiLength() const
00322 {return mkiLength;}
00323
00329 inline uint32
00330 getSsrc() const
00331 {return ssrcCtx;}
00332
00354 CryptoContext* newCryptoContextForSSRC(uint32 ssrc, int roc, int64 keyDerivRate);
00355
00356 private:
00357
00358 uint32 ssrcCtx;
00359 bool using_mki;
00360 uint32 mkiLength;
00361 uint8* mki;
00362
00363 uint32 roc;
00364 uint32 guessed_roc;
00365 uint16 s_l;
00366 int64 key_deriv_rate;
00367
00368
00369 uint64 replay_window;
00370
00371 uint8* master_key;
00372 uint32 master_key_length;
00373 uint32 master_key_srtp_use_nb;
00374 uint32 master_key_srtcp_use_nb;
00375 uint8* master_salt;
00376 uint32 master_salt_length;
00377
00378
00379 int32 n_e;
00380 uint8* k_e;
00381 int32 n_a;
00382 uint8* k_a;
00383 int32 n_s;
00384 uint8* k_s;
00385
00386 int32 ealg;
00387 int32 aalg;
00388 int32 ekeyl;
00389 int32 akeyl;
00390 int32 skeyl;
00391 int32 tagLength;
00392 bool seqNumSet;
00393
00394 void* macCtx;
00395
00396 #ifdef SRTP_SUPPORT
00397 SrtpSymCrypto* cipher;
00398 SrtpSymCrypto* f8Cipher;
00399 #else
00400 void* cipher;
00401 void* f8Cipher;
00402 #endif
00403
00404 };
00405
00406 END_NAMESPACE
00407
00408 #endif
00409
00410 #endif
00411