diff --git a/daemon/src/audio/audiortp/audio_srtp_session.cpp b/daemon/src/audio/audiortp/audio_srtp_session.cpp index 500d03ba7dc3ac89986a72a5a0915482350418df..9e33d8d508b86102e695e3ccb2ec48eca6a832c8 100644 --- a/daemon/src/audio/audiortp/audio_srtp_session.cpp +++ b/daemon/src/audio/audiortp/audio_srtp_session.cpp @@ -42,6 +42,78 @@ namespace sfl { +namespace { + std::string + encodeBase64(unsigned char *input, int length) + { + // init decoder + BIO *b64 = BIO_new(BIO_f_base64()); + BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); + + // init internal buffer + BIO *bmem = BIO_new(BIO_s_mem()); + + // create decoder chain + b64 = BIO_push(b64, bmem); + + BIO_write(b64, input, length); + // BIO_flush (b64); + + // get pointer to data + BUF_MEM *bptr = 0; + BIO_get_mem_ptr(b64, &bptr); + + std::string output(bptr->data, bptr->length); + + BIO_free_all(bmem); + + return output; + } + + std::vector<char> decodeBase64(unsigned char *input, int length) + { + BIO *b64, *bmem; + + // init decoder and read-only BIO buffer + b64 = BIO_new(BIO_f_base64()); + BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); + + // init internal buffer + bmem = BIO_new_mem_buf(input, length); + + // create encoder chain + bmem = BIO_push(b64, bmem); + + std::vector<char> buffer(length, 0); + BIO_read(bmem, &(*buffer.begin()), length); + + BIO_free_all(bmem); + + return buffer; + } + + // Fills the array dest with length random bytes + void buffer_fill(unsigned char dest [], size_t length) + { + DEBUG("AudioSrtp: Init local master key"); + + // @TODO key may have different length depending on cipher suite + // Allocate memory for key + std::vector<unsigned char> random_key(length); + + // Generate ryptographically strong pseudo-random bytes + int err; + + if ((err = RAND_bytes(&(*random_key.begin()), length)) != 1) + DEBUG("Error occured while generating cryptographically strong pseudo-random key"); + + assert((sizeof dest / sizeof dest[0]) <= length); + memcpy(dest, &(*random_key.begin()), length); + } +} + + + AudioSrtpSession::AudioSrtpSession(SIPCall &call) : AudioSymmetricRtpSession(call), remoteCryptoCtx_(NULL), @@ -133,41 +205,18 @@ void AudioSrtpSession::setRemoteCryptoInfo(sfl::SdesNegotiator& nego) void AudioSrtpSession::initializeLocalMasterKey() { DEBUG("AudioSrtp: Init local master key"); - // @TODO key may have different length depending on cipher suite localMasterKeyLength_ = sfl::CryptoSuites[localCryptoSuite_].masterKeyLength / 8; - DEBUG("AudioSrtp: Local master key length %d", localMasterKeyLength_); - - // Allocate memory for key - unsigned char *random_key = new unsigned char[localMasterKeyLength_]; - - // Generate ryptographically strong pseudo-random bytes - int err; - - if ((err = RAND_bytes(random_key, localMasterKeyLength_)) != 1) - DEBUG("Error occured while generating cryptographically strong pseudo-random key"); - - memcpy(localMasterKey_, random_key, localMasterKeyLength_); + buffer_fill(localMasterKey_, localMasterKeyLength_); } void AudioSrtpSession::initializeLocalMasterSalt() { // @TODO key may have different length depending on cipher suite localMasterSaltLength_ = sfl::CryptoSuites[localCryptoSuite_].masterSaltLength / 8; - - // Allocate memory for key - unsigned char *random_key = new unsigned char[localMasterSaltLength_]; - DEBUG("AudioSrtp: Local master salt length %d", localMasterSaltLength_); - - // Generate ryptographically strong pseudo-random bytes - int err; - - if ((err = RAND_bytes(random_key, localMasterSaltLength_)) != 1) - DEBUG("Error occured while generating cryptographically strong pseudo-random key"); - - memcpy(localMasterSalt_, random_key, localMasterSaltLength_); + buffer_fill(localMasterSalt_, localMasterSaltLength_); } std::string AudioSrtpSession::getBase64ConcatenatedKeys() @@ -198,13 +247,11 @@ void AudioSrtpSession::unBase64ConcatenatedKeys(std::string base64keys) char *dataptr = (char*) base64keys.data(); // decode concatenated binary keys - char *output = decodeBase64((unsigned char*) dataptr, strlen(dataptr)); + std::vector<char> output(decodeBase64((unsigned char*) dataptr, strlen(dataptr))); // copy master and slt respectively - memcpy((void*) remoteMasterKey_, (void*) output, remoteMasterKeyLength_); - memcpy((void*) remoteMasterSalt_, (void*)(output + remoteMasterKeyLength_), remoteMasterSaltLength_); - - delete[] output; + memcpy((void*) remoteMasterKey_, &(*output.begin()), remoteMasterKeyLength_); + memcpy((void*) remoteMasterSalt_, &(*output.begin()) + remoteMasterKeyLength_, remoteMasterSaltLength_); } void AudioSrtpSession::initializeRemoteCryptoContext() @@ -240,10 +287,8 @@ void AudioSrtpSession::initializeLocalCryptoContext() CryptoSuiteDefinition crypto = sfl::CryptoSuites[localCryptoSuite_]; - if (localCryptoCtx_) { + if (localCryptoCtx_) delete localCryptoCtx_; - localCryptoCtx_ = NULL; - } localCryptoCtx_ = new ost::CryptoContext(OutgoingDataQueue::getLocalSSRC(), 0, // roc, @@ -266,56 +311,4 @@ void AudioSrtpSession::restoreCryptoContext(ost::CryptoContext *localContext, os setOutQueueCryptoContext(localContext); } -std::string AudioSrtpSession::encodeBase64(unsigned char *input, int length) -{ - BIO *b64, *bmem; - BUF_MEM *bptr ; - - // init decoder - b64 = BIO_new(BIO_f_base64()); - BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); - - // init internal buffer - bmem = BIO_new(BIO_s_mem()); - - // create decoder chain - b64 = BIO_push(b64, bmem); - - BIO_write(b64, input, length); - // BIO_flush (b64); - - // get pointer to data - BIO_get_mem_ptr(b64, &bptr); - - std::string output(bptr->data, bptr->length); - - BIO_free_all(bmem); - - return output; -} - -char* AudioSrtpSession::decodeBase64(unsigned char *input, int length) -{ - BIO *b64, *bmem; - - // init decoder and read-only BIO buffer - b64 = BIO_new(BIO_f_base64()); - BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); - - // init internal buffer - bmem = BIO_new_mem_buf(input, length); - - // create encoder chain - bmem = BIO_push(b64, bmem); - - char *buffer = new char[length]; - memset(buffer, 0, length); - - BIO_read(bmem, buffer, length); - - BIO_free_all(bmem); - - return buffer; -} - } diff --git a/daemon/src/audio/audiortp/audio_srtp_session.h b/daemon/src/audio/audiortp/audio_srtp_session.h index 5cce01a60a21f6ad249115ebe7d04e2bc21626e8..ee7cf8262eb7885de4e47d6a047e91875bf763d9 100644 --- a/daemon/src/audio/audiortp/audio_srtp_session.h +++ b/daemon/src/audio/audiortp/audio_srtp_session.h @@ -143,16 +143,6 @@ class AudioSrtpSession : public AudioSymmetricRtpSession { */ void unBase64ConcatenatedKeys(std::string base64keys); - /** - * Encode input data as base64 - */ - std::string encodeBase64(unsigned char *input, int length); - - /** - * Decode base64 data - */ - char* decodeBase64(unsigned char *input, int length); - /** Default local crypto suite is AES_CM_128_HMAC_SHA1_80*/ int localCryptoSuite_;