Skip to content
Snippets Groups Projects
Commit acdb04e5 authored by Alexandre Savard's avatar Alexandre Savard
Browse files

[#1722] Fix base64 decoding

parent 096978e6
No related branches found
No related tags found
No related merge requests found
...@@ -21,8 +21,11 @@ ...@@ -21,8 +21,11 @@
#include "sip/sipcall.h" #include "sip/sipcall.h"
#include <openssl/bio.h> #include <openssl/sha.h>
#include <openssl/hmac.h>
#include <openssl/evp.h> #include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <cstdio> #include <cstdio>
...@@ -78,6 +81,7 @@ std::string AudioSrtpSession::getCryptoSdpInfo() { ...@@ -78,6 +81,7 @@ std::string AudioSrtpSession::getCryptoSdpInfo() {
void AudioSrtpSession::initializeMasterKey(void) void AudioSrtpSession::initializeMasterKey(void)
{ {
_masterKeyLength = 16;
for(int i = 0; i < 16; i++) for(int i = 0; i < 16; i++)
_masterKey[i] = mk[i]; _masterKey[i] = mk[i];
...@@ -88,13 +92,33 @@ void AudioSrtpSession::initializeMasterKey(void) ...@@ -88,13 +92,33 @@ void AudioSrtpSession::initializeMasterKey(void)
void AudioSrtpSession::initializeMasterSalt(void) void AudioSrtpSession::initializeMasterSalt(void)
{ {
for(int i = 0; i < 16; i++) _masterSaltLength = 14;
for(int i = 0; i < 14; i++)
_masterSalt[i] = ms[i]; _masterSalt[i] = ms[i];
return; return;
} }
std::string AudioSrtpSession::getBase64ConcatenatedKeys()
{
uint8 concatenated[30];
memcpy((void*)concatenated, (void*)_masterKey, 16);
memcpy((void*)(concatenated+16), (void*)_masterSalt, 14);
char *output = encodeBase64((unsigned char*)concatenated, 30);
std::string keys(output);
free(output);
return keys;
}
void AudioSrtpSession::initializeInputCryptoContext(void) void AudioSrtpSession::initializeInputCryptoContext(void)
{ {
...@@ -143,15 +167,26 @@ void AudioSrtpSession::initializeOutputCryptoContext(void) ...@@ -143,15 +167,26 @@ void AudioSrtpSession::initializeOutputCryptoContext(void)
char* AudioSrtpSession::encodeBase64(unsigned char *input, int length) char* AudioSrtpSession::encodeBase64(unsigned char *input, int length)
{ {
BIO *b64, *bmem; BIO *b64, *bmem;
BUF_MEM *bptr ;
char *buffer = (char *)malloc(length); char *buffer = (char *)malloc(2*length);
memset(buffer, 0, length); memset(buffer, 0, 2*length);
// init decoder and buffer
b64 = BIO_new(BIO_f_base64()); b64 = BIO_new(BIO_f_base64());
bmem = BIO_new_mem_buf(input, length); bmem = BIO_new(BIO_s_mem());
bmem = BIO_push(bmem, b64);
BIO_read(bmem, buffer, length); // 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);
// copy result in output buffer
strncpy(buffer, (char*)(bptr->data), bptr->length);
BIO_free_all(bmem); BIO_free_all(bmem);
...@@ -165,15 +200,19 @@ char* AudioSrtpSession::decodeBase64(unsigned char *input, int length) ...@@ -165,15 +200,19 @@ char* AudioSrtpSession::decodeBase64(unsigned char *input, int length)
char *buffer = (char *)malloc(length); char *buffer = (char *)malloc(length);
memset(buffer, 0, length); memset(buffer, 0, length);
// init decoder and read-only BIO buffer
b64 = BIO_new(BIO_f_base64()); b64 = BIO_new(BIO_f_base64());
bmem = BIO_new_mem_buf(input, length); bmem = BIO_new_mem_buf(input, length);
bmem = BIO_push(b64, bmem);
// create encoder chain
bmem = BIO_push(bmem, b64);
BIO_read(bmem, buffer, length); BIO_read(bmem, buffer, length);
BIO_free_all(bmem); BIO_free_all(bmem);
return buffer; return buffer;
} }
} }
...@@ -54,14 +54,20 @@ namespace sfl { ...@@ -54,14 +54,20 @@ namespace sfl {
void initializeOutputCryptoContext(void); void initializeOutputCryptoContext(void);
std::string getBase64ConcatenatedKeys();
char* encodeBase64(unsigned char *input, int length); char* encodeBase64(unsigned char *input, int length);
char* decodeBase64(unsigned char *input, int length); char* decodeBase64(unsigned char *input, int length);
uint8 _masterKey[16]; uint8 _masterKey[16];
int _masterKeyLength;
uint8 _masterSalt[14]; uint8 _masterSalt[14];
int _masterSaltLength;
ost::CryptoContext* inputCryptoCtx; ost::CryptoContext* inputCryptoCtx;
ost::CryptoContext* outputCryptoCtx; ost::CryptoContext* outputCryptoCtx;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment