Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F7159433
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
71 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/deps/pjsip/third_party/zsrtp/include/ZsrtpCWrapper.h b/deps/pjsip/third_party/zsrtp/include/ZsrtpCWrapper.h
index c49a9d10..40613be0 100644
--- a/deps/pjsip/third_party/zsrtp/include/ZsrtpCWrapper.h
+++ b/deps/pjsip/third_party/zsrtp/include/ZsrtpCWrapper.h
@@ -1,448 +1,455 @@
/*
This file defines the ZRTP SRTP C-to-C++ wrapper.
Copyright (C) 2010 Werner Dittmann
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ZSRTPCWRAPPER_H
#define ZSRTPCWRAPPER_H
/**
* @file ZsrtpCWrapper.h
* @brief C-to-C++ wrapper for the C++ based SRTP and SRTCP implementation
* @defgroup Z_SRTP SRTP/SRTCP implementation for ZRTP including C-to-C++ wrapper
* @ingroup PJMEDIA_TRANSPORT_ZRTP
* @{
*/
#include <stdint.h>
/*
* Keep in synch with CryptoContext.h
*/
#define SrtpAuthenticationNull 0
#define SrtpAuthenticationSha1Hmac 1
#define SrtpAuthenticationSkeinHmac 2
#define SrtpEncryptionNull 0
#define SrtpEncryptionAESCM 1
#define SrtpEncryptionAESF8 2
#define SrtpEncryptionTWOCM 3
#define SrtpEncryptionTWOF8 4
#ifdef __cplusplus
extern "C"
{
#endif
+#ifdef __cplusplus
+ typedef class CryptoContext CryptoContext;
+#else
typedef struct CryptoContext CryptoContext;
+#endif
typedef struct zsrtpContext
{
CryptoContext* srtp;
void* userData;
} ZsrtpContext;
/**
* Create a ZSRTP wrapper fir a SRTP cryptographic context.
*
* This constructor creates an active SRTP cryptographic context were
* algorithms are enabled, keys are computed and so on. This SRTP
* cryptographic context can protect a RTP SSRC stream.
*
* @param ssrc
* The RTP SSRC that this SRTP cryptographic context protects.
*
* @param roc
* The initial Roll-Over-Counter according to RFC 3711. These are the
* upper 32 bit of the overall 48 bit SRTP packet index. Refer to
* chapter 3.2.1 of the RFC.
*
* @param keyDerivRate
* The key derivation rate defines when to recompute the SRTP session
* keys. Refer to chapter 4.3.1 in the RFC.
*
* @param ealg
* The encryption algorithm to use. Possible values are <code>
* SrtpEncryptionNull, SrtpEncryptionAESCM, SrtpEncryptionAESF8
* </code>. See chapter 4.1.1 for AESCM (Counter mode) and 4.1.2
* for AES F8 mode.
*
* @param aalg
* The authentication algorithm to use. Possible values are <code>
* SrtpEncryptionNull, SrtpAuthenticationSha1Hmac</code>. The only
* active algorithm here is SHA1 HMAC, a SHA1 based hashed message
* authentication code as defined in RFC 2104.
*
* @param masterKey
* Pointer to the master key for this SRTP cryptographic context.
* Must point to <code>masterKeyLength</code> bytes. Refer to chapter
* 3.2.1 of the RFC about the role of the master key.
*
* @param masterKeyLength
* The length in bytes of the master key in bytes. The length must
* match the selected encryption algorithm. Because SRTP uses AES
* based encryption only, then master key length may be 16 or 32
* bytes (128 or 256 bit master key)
*
* @param masterSalt
* SRTP uses the master salt to computer the initialization vector
* that in turn is input to compute the session key, session
* authentication key and the session salt.
*
* @param masterSaltLength
* The length in bytes of the master salt data in bytes. SRTP uses
* AES as encryption algorithm. AES encrypts 16 byte blocks
* (independent of the key length). According to RFC3711 the standard
* value for the master salt length should be 112 bit (14 bytes).
*
* @param ekeyl
* The length in bytes of the session encryption key that SRTP shall
* compute and use. Usually the same length as for the master key
* length. But you may use a different length as well. Be carefull
* that the key management mechanisms supports different key lengths.
*
* @param akeyl
* The length in bytes of the session authentication key. SRTP
* computes this key and uses it as input to the authentication
* algorithm.
* The standard value is 160 bits (20 bytes).
*
* @param skeyl
* The length in bytes of the session salt. SRTP computes this salt
* key and uses it as input during encryption. The length usually
* is the same as the master salt length.
*
* @param tagLength
* The length is bytes of the authentication tag that SRTP appends
* to the RTP packet. Refer to chapter 4.2. in the RFC 3711.
*
* @returns
* Pointer to a new ZSRTP wrapper context.
*/
ZsrtpContext* zsrtp_CreateWrapper(uint32_t ssrc, int32_t roc,
int64_t keyDerivRate,
const int32_t ealg,
const int32_t aalg,
uint8_t* masterKey,
int32_t masterKeyLength,
uint8_t* masterSalt,
int32_t masterSaltLength,
int32_t ekeyl,
int32_t akeyl,
int32_t skeyl,
int32_t tagLength);
/**
* Destroy a ZSRTP wrapper Context
*
* @param ctx
* A ZSRTP wrapper context.
*/
void zsrtp_DestroyWrapper (ZsrtpContext* ctx);
/**
* Encrypt the RTP payload and compute authentication code.
*
* The method requires a ready made RTP packet in the RTP packet data
* buffer.
*
* The method computes an authentication code and appends this code to the
* buffer and computes a new length. The RTP packet buffer must be large
* enough to hold this authentication code.
*
* @param ctx
* The ZsrtpContext
*
* @param buffer
* Pointer to the data that contains the RTP packet data. SRTP appends
* the authentication code to the encrypted RTP packet data.
*
* @param length
* Length of the RTP data buffer.
*
* @param newLength
* The new length of the RTP data buffer including authentication code
*
* @returns
* 0 if no active SRTP crypto context, 1 if data is encrypted.
*/
int32_t zsrtp_protect(ZsrtpContext* ctx, uint8_t* buffer, int32_t length,
int32_t* newLength);
/**
* Decrypt the RTP payload and check authentication code.
*
* The method requires a SRTP packet in the SRTP packet data
* buffer.
*
* SRTP checks SRTP packet replay, then it computes the authentication
* code and checks if the authentication code is correct. If the checks
* are ok then SRTP decrypts the payload data.
*
* @param ctx
* The ZsrtpContext
*
* @param buffer
* Pointer to the data that contains the SRTP packet data. SRTP removes
* the authentication code from the decrypted RTP packet data.
*
* @param length
* Length of the RTP data buffer.
*
* @param newLength
* The new length of the RTP data buffer excluding authentication code
*
* @returns
* 0 if no active SRTP crypto context, 1 if data is decrypted,
* -1 if data authentication failed, -2 if SRTP replay check failed
*/
int32_t zsrtp_unprotect(ZsrtpContext* ctx, uint8_t* buffer, int32_t length,
int32_t* newLength);
/**
* Derive a new Crypto Context for use with a new SSRC
*
* This method stores a new Crypto Context initialized with the data
* of this crypto context. Replacing the SSRC, Roll-over-Counter, and
* the key derivation rate the application cab use this Crypto Context
* to encrypt / decrypt a new stream (Synchronization source) inside
* one RTP session.
*
* Before the application can use this crypto context it must call
* the <code>deriveSrtpKeys</code> method.
*
* @param ctx
* The ZsrtpContext
* @param ssrc
* The SSRC for this context
* @param roc
* The Roll-Over-Counter for this context
* @param keyDerivRate
* The key derivation rate for this context
*/
void zsrtp_newCryptoContextForSSRC(ZsrtpContext* ctx, uint32_t ssrc,
int32_t roc, int64_t keyDerivRate);
/**
* Perform key derivation according to SRTP specification
*
* This method computes the session key, session authentication key and the
* session salt key. This method must be called at least once after the
* SRTP Cryptograhic context was set up.
*
* @param ctx
* The ZsrtpContext
* @param index
* The 48 bit SRTP packet index. See the <code>guessIndex</code>
* method.
*/
void zsrtp_deriveSrtpKeys(ZsrtpContext* ctx, uint64_t index);
-
+#ifdef __cplusplus
+ typedef class CryptoContextCtrl CryptoContextCtrl;
+#else
typedef struct CryptoContextCtrl CryptoContextCtrl;
+#endif
typedef struct zsrtcpContext
{
CryptoContextCtrl* srtcp;
void* userData;
uint32_t srtcpIndex;
} ZsrtpContextCtrl;
/**
* Constructor for an active SRTP cryptographic context.
*
* This constructor creates an active SRTP cryptographic context were
* algorithms are enabled, keys are computed and so on. This SRTP
* cryptographic context can protect a RTP SSRC stream.
*
* @param ssrc
* The RTP SSRC that this SRTP cryptographic context protects.
*
* @param ealg
* The encryption algorithm to use. Possible values are <code>
* SrtpEncryptionNull, SrtpEncryptionAESCM, SrtpEncryptionAESF8
* </code>. See chapter 4.1.1 for AESCM (Counter mode) and 4.1.2
* for AES F8 mode.
*
* @param aalg
* The authentication algorithm to use. Possible values are <code>
* SrtpEncryptionNull, SrtpAuthenticationSha1Hmac</code>. The only
* active algorithm here is SHA1 HMAC, a SHA1 based hashed message
* authentication code as defined in RFC 2104.
*
* @param masterKey
* Pointer to the master key for this SRTP cryptographic context.
* Must point to <code>masterKeyLength</code> bytes. Refer to chapter
* 3.2.1 of the RFC about the role of the master key.
*
* @param masterKeyLength
* The length in bytes of the master key in bytes. The length must
* match the selected encryption algorithm. Because SRTP uses AES
* based encryption only, then master key length may be 16 or 32
* bytes (128 or 256 bit master key)
*
* @param masterSalt
* SRTP uses the master salt to computer the initialization vector
* that in turn is input to compute the session key, session
* authentication key and the session salt.
*
* @param masterSaltLength
* The length in bytes of the master salt data in bytes. SRTP uses
* AES as encryption algorithm. AES encrypts 16 byte blocks
* (independent of the key length). According to RFC3711 the standard
* value for the master salt length should be 112 bit (14 bytes).
*
* @param ekeyl
* The length in bytes of the session encryption key that SRTP shall
* compute and use. Usually the same length as for the master key
* length. But you may use a different length as well. Be carefull
* that the key management mechanisms supports different key lengths.
*
* @param akeyl
* The length in bytes of the session authentication key. SRTP
* computes this key and uses it as input to the authentication
* algorithm.
* The standard value is 160 bits (20 bytes).
*
* @param skeyl
* The length in bytes of the session salt. SRTP computes this salt
* key and uses it as input during encryption. The length usually
* is the same as the master salt length.
*
* @param tagLength
* The length is bytes of the authentication tag that SRTP appends
* to the RTP packet. Refer to chapter 4.2. in the RFC 3711.
*/
ZsrtpContextCtrl* zsrtp_CreateWrapperCtrl( uint32_t ssrc,
const int32_t ealg,
const int32_t aalg,
uint8_t* masterKey,
int32_t masterKeyLength,
uint8_t* masterSalt,
int32_t masterSaltLength,
int32_t ekeyl,
int32_t akeyl,
int32_t skeyl,
int32_t tagLength );
/**
* Destroy a ZSRTCP wrapper Context
*
* @param ctx
* A ZSRTCP wrapper context.
*/
void zsrtp_DestroyWrapperCtrl (ZsrtpContextCtrl* ctx);
/**
* Encrypt the RTCP payload and compute authentication code.
*
* The method requires a ready made RTCP packet in the RTCP packet data
* buffer.
*
* The method computes an authentication code and appends this code to the
* buffer and computes a new length. The RTCP packet buffer must be large
* enough to hold this authentication code.
*
* @param ctx
* The ZsrtpContextCtrl
*
* @param buffer
* Pointer to the data that contains the RTP packet data. SRTP appends
* the authentication code to the encrypted RTP packet data.
*
* @param length
* Length of the RTCP data buffer.
*
* @param newLength
* The new length of the RTCP data buffer including authentication code
*
* @returns
* 0 if no active SRTCP crypto context, 1 if data is encrypted.
*/
int32_t zsrtp_protectCtrl(ZsrtpContextCtrl* ctx, uint8_t* buffer, int32_t length,
int32_t* newLength);
/**
* Decrypt the RTCP payload and check authentication code.
*
* The method requires a SRTCP packet in the SRTP packet data
* buffer.
*
* SRTP checks SRTP packet replay, then it computes the authentication
* code and checks if the authentication code is correct. If the checks
* are ok then SRTP decrypts the payload data.
*
* @param ctx
* The ZsrtpContextCtrl
*
* @param buffer
* Pointer to the data that contains the SRTCP packet data. SRTCP remove
* the authentication code from the decrypted RTCP packet data.
*
* @param length
* Length of the RTP data buffer.
*
* @param newLength
* The new length of the RTCP data buffer excluding authentication code
*
* @returns
* 0 if no active SRTCP crypto context, 1 if data is decrypted,
* -1 if data authentication failed, -2 if SRTCP replay check failed
*/
int32_t zsrtp_unprotectCtrl(ZsrtpContextCtrl* ctx, uint8_t* buffer, int32_t length,
int32_t* newLength);
/**
* Derive a new Crypto Context for use with a new SSRC
*
* This method stores a new Crypto Context initialized with the data
* of this crypto context. Replacing the SSRC, Roll-over-Counter, and
* the key derivation rate the application cab use this Crypto Context
* to encrypt / decrypt a new stream (Synchronization source) inside
* one RTP session.
*
* Before the application can use this crypto context it must call
* the <code>deriveSrtpKeys</code> method.
*
* @param ctx
* The ZsrtpContextCtrl
* @param ssrc
* The SSRC for this context
*/
void zsrtp_newCryptoContextForSSRCCtrl(ZsrtpContextCtrl* ctx, uint32_t ssrc);
/**
* Perform key derivation according to SRTP specification
*
* This method computes the session key, session authentication key and the
* session salt key. This method must be called at least once after the
* SRTP Cryptograhic context was set up.
*
* @param ctx
* The ZsrtpContextCtrl
*/
void zsrtp_deriveSrtpKeysCtrl(ZsrtpContextCtrl* ctx);
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/srtp/crypto/openssl/SrtpSymCrypto.cpp b/deps/pjsip/third_party/zsrtp/zrtp/srtp/crypto/openssl/SrtpSymCrypto.cpp
index 00d44768..5a64d327 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/srtp/crypto/openssl/SrtpSymCrypto.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/srtp/crypto/openssl/SrtpSymCrypto.cpp
@@ -1,315 +1,323 @@
/*
Copyright (C) 2012 Werner Dittmann
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/**
* @author Werner Dittmann <Werner.Dittmann@t-online.de>
*/
#define MAKE_F8_TEST
#include <stdlib.h>
#include <openssl/aes.h> // the include of openSSL
#include <crypto/SrtpSymCrypto.h>
#include <cryptcommon/twofish.h>
#include <string.h>
#include <stdio.h>
#include <common/osSpecifics.h>
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
SrtpSymCrypto::SrtpSymCrypto(int algo):key(NULL), algorithm(algo) {
}
SrtpSymCrypto::SrtpSymCrypto( uint8_t* k, int32_t keyLength, int algo ):
key(NULL), algorithm(algo) {
setNewKey(k, keyLength);
}
SrtpSymCrypto::~SrtpSymCrypto() {
if (key != NULL) {
if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8) {
memset(key, 0, sizeof(AES_KEY) );
}
else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8) {
memset(key, 0, sizeof(Twofish_key));
}
delete[] (uint8_t*)key;
key = NULL;
}
}
static int twoFishInit = 0;
bool SrtpSymCrypto::setNewKey(const uint8_t* k, int32_t keyLength) {
// release an existing key before setting a new one
if (key != NULL)
delete[] (uint8_t*)key;
if (!(keyLength == 16 || keyLength == 32)) {
return false;
}
if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8) {
key = new uint8_t[sizeof(AES_KEY)];
memset(key, 0, sizeof(AES_KEY) );
AES_set_encrypt_key(k, keyLength*8, (AES_KEY *)key);
}
else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8) {
if (!twoFishInit) {
Twofish_initialise();
twoFishInit = 1;
}
key = new uint8_t[sizeof(Twofish_key)];
memset(key, 0, sizeof(Twofish_key));
Twofish_prepare_key((Twofish_Byte*)k, keyLength, (Twofish_key*)key);
}
else
return false;
return true;
}
void SrtpSymCrypto::encrypt(const uint8_t* input, uint8_t* output ) {
if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8) {
AES_encrypt(input, output, (AES_KEY *)key);
}
else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8) {
Twofish_encrypt((Twofish_key*)key, (Twofish_Byte*)input,
(Twofish_Byte*)output);
}
}
void SrtpSymCrypto::get_ctr_cipher_stream(uint8_t* output, uint32_t length,
uint8_t* iv ) {
uint16_t ctr = 0;
unsigned char temp[SRTP_BLOCK_SIZE];
for(ctr = 0; ctr < length/SRTP_BLOCK_SIZE; ctr++) {
//compute the cipher stream
iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
iv[15] = (uint8_t)((ctr & 0x00FF));
encrypt(iv, &output[ctr*SRTP_BLOCK_SIZE]);
}
if ((length % SRTP_BLOCK_SIZE) > 0) {
// Treat the last bytes:
iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
iv[15] = (uint8_t)((ctr & 0x00FF));
encrypt(iv, temp);
memcpy(&output[ctr*SRTP_BLOCK_SIZE], temp, length % SRTP_BLOCK_SIZE );
}
}
void SrtpSymCrypto::ctr_encrypt(const uint8_t* input, uint32_t input_length,
uint8_t* output, uint8_t* iv ) {
if (key == NULL)
return;
uint16_t ctr = 0;
unsigned char temp[SRTP_BLOCK_SIZE];
int l = input_length/SRTP_BLOCK_SIZE;
for (ctr = 0; ctr < l; ctr++ ) {
iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
iv[15] = (uint8_t)((ctr & 0x00FF));
encrypt(iv, temp);
for (int i = 0; i < SRTP_BLOCK_SIZE; i++ ) {
*output++ = temp[i] ^ *input++;
}
}
l = input_length % SRTP_BLOCK_SIZE;
if (l > 0) {
// Treat the last bytes:
iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
iv[15] = (uint8_t)((ctr & 0x00FF));
encrypt(iv, temp);
for (int i = 0; i < l; i++ ) {
*output++ = temp[i] ^ *input++;
}
}
}
void SrtpSymCrypto::ctr_encrypt( uint8_t* data, uint32_t data_length, uint8_t* iv ) {
if (key == NULL)
return;
uint16_t ctr = 0;
unsigned char temp[SRTP_BLOCK_SIZE];
int l = data_length/SRTP_BLOCK_SIZE;
for (ctr = 0; ctr < l; ctr++ ) {
iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
iv[15] = (uint8_t)((ctr & 0x00FF));
encrypt(iv, temp);
for (int i = 0; i < SRTP_BLOCK_SIZE; i++ ) {
*data++ ^= temp[i];
}
}
l = data_length % SRTP_BLOCK_SIZE;
if (l > 0) {
// Treat the last bytes:
iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
iv[15] = (uint8_t)((ctr & 0x00FF));
encrypt(iv, temp);
for (int i = 0; i < l; i++ ) {
*data++ ^= temp[i];
}
}
}
void SrtpSymCrypto::f8_encrypt(const uint8_t* data, uint32_t data_length,
uint8_t* iv, SrtpSymCrypto* f8Cipher ) {
f8_encrypt(data, data_length, const_cast<uint8_t*>(data), iv, f8Cipher);
}
#define MAX_KEYLEN 32
void SrtpSymCrypto::f8_deriveForIV(SrtpSymCrypto* f8Cipher, uint8_t* key, int32_t keyLen,
uint8_t* salt, int32_t saltLen) {
unsigned char *cp_in, *cp_in1, *cp_out;
unsigned char maskedKey[MAX_KEYLEN];
unsigned char saltMask[MAX_KEYLEN];
if (keyLen > MAX_KEYLEN)
return;
if (saltLen > keyLen)
return;
/*
* First copy the salt into the mask field, then fill with 0x55 to
* get a full key.
*/
memcpy(saltMask, salt, saltLen);
memset(saltMask+saltLen, 0x55, keyLen-saltLen);
/*
* XOR the original key with the above created mask to
* get the special key.
*/
cp_out = maskedKey;
cp_in = key;
cp_in1 = saltMask;
for (int i = 0; i < keyLen; i++) {
*cp_out++ = *cp_in++ ^ *cp_in1++;
}
/*
* Prepare the a new AES cipher with the special key to compute IV'
*/
f8Cipher->setNewKey(maskedKey, keyLen);
}
void SrtpSymCrypto::f8_encrypt(const uint8_t* in, uint32_t in_length, uint8_t* out,
uint8_t* iv, SrtpSymCrypto* f8Cipher ) {
int offset = 0;
unsigned char ivAccent[SRTP_BLOCK_SIZE];
unsigned char S[SRTP_BLOCK_SIZE];
F8_CIPHER_CTX f8ctx;
if (key == NULL)
return;
/*
* Get memory for the derived IV (IV')
*/
f8ctx.ivAccent = ivAccent;
/*
* Use the derived IV encryption setup to encrypt the original IV to produce IV'.
*/
f8Cipher->encrypt(iv, f8ctx.ivAccent);
f8ctx.J = 0; // initialize the counter
f8ctx.S = S; // get the key stream buffer
memset(f8ctx.S, 0, SRTP_BLOCK_SIZE); // initial value for key stream
while (in_length >= SRTP_BLOCK_SIZE) {
processBlock(&f8ctx, in+offset, SRTP_BLOCK_SIZE, out+offset);
in_length -= SRTP_BLOCK_SIZE;
offset += SRTP_BLOCK_SIZE;
}
if (in_length > 0) {
processBlock(&f8ctx, in+offset, in_length, out+offset);
}
}
int SrtpSymCrypto::processBlock(F8_CIPHER_CTX *f8ctx, const uint8_t* in, int32_t length, uint8_t* out) {
int i;
const uint8_t *cp_in;
uint8_t* cp_in1, *cp_out;
uint32_t *ui32p;
/*
* XOR the previous key stream with IV'
* ( S(-1) xor IV' )
*/
cp_in = f8ctx->ivAccent;
cp_out = f8ctx->S;
for (i = 0; i < SRTP_BLOCK_SIZE; i++) {
*cp_out++ ^= *cp_in++;
}
/*
* Now XOR (S(n-1) xor IV') with the current counter, then increment the counter
*/
ui32p = (uint32_t *)f8ctx->S;
ui32p[3] ^= zrtpHtonl(f8ctx->J);
f8ctx->J++;
/*
* Now compute the new key stream using AES encrypt
*/
encrypt(f8ctx->S, f8ctx->S);
/*
* as the last step XOR the plain text with the key stream to produce
* the ciphertext.
*/
cp_out = out;
cp_in = in;
cp_in1 = f8ctx->S;
for (i = 0; i < length; i++) {
*cp_out++ = *cp_in++ ^ *cp_in1++;
}
return length;
}
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/srtp/crypto/openssl/hmac.cpp b/deps/pjsip/third_party/zsrtp/zrtp/srtp/crypto/openssl/hmac.cpp
index 93a6d0d7..6cdb6b14 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/srtp/crypto/openssl/hmac.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/srtp/crypto/openssl/hmac.cpp
@@ -1,113 +1,122 @@
/*
Copyright (C) 2010 Werner Dittmann
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/*
* Authors: Werner Dittmann
*/
#include <stdint.h>
#include <openssl/hmac.h>
#include <crypto/hmac.h>
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
void hmac_sha1(uint8_t * key, int32_t key_length,
const uint8_t* data, uint32_t data_length,
uint8_t* mac, int32_t* mac_length )
{
HMAC(EVP_sha1(), key, key_length,
data, data_length, mac,
reinterpret_cast<uint32_t*>(mac_length) );
}
void hmac_sha1( uint8_t* key, int32_t key_length,
const uint8_t* data_chunks[],
uint32_t data_chunck_length[],
uint8_t* mac, int32_t* mac_length ) {
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, key_length, EVP_sha1(), NULL);
while (*data_chunks) {
HMAC_Update(&ctx, *data_chunks, *data_chunck_length);
data_chunks ++;
data_chunck_length ++;
}
HMAC_Final(&ctx, mac, reinterpret_cast<uint32_t*>(mac_length));
HMAC_CTX_cleanup(&ctx);
}
void* createSha1HmacContext(uint8_t* key, int32_t key_length)
{
HMAC_CTX* ctx = (HMAC_CTX*)malloc(sizeof(HMAC_CTX));
HMAC_CTX_init(ctx);
HMAC_Init_ex(ctx, key, key_length, EVP_sha1(), NULL);
return ctx;
}
void* initializeSha1HmacContext(void* ctx, uint8_t* key, int32_t keyLength)
{
HMAC_CTX *pctx = (HMAC_CTX*)ctx;
HMAC_CTX_init(pctx);
HMAC_Init_ex(pctx, key, keyLength, EVP_sha1(), NULL);
return pctx;
}
void hmacSha1Ctx(void* ctx, const uint8_t* data, uint32_t data_length,
uint8_t* mac, int32_t* mac_length)
{
HMAC_CTX* pctx = (HMAC_CTX*)ctx;
HMAC_Init_ex(pctx, NULL, 0, NULL, NULL );
HMAC_Update(pctx, data, data_length );
HMAC_Final(pctx, mac, reinterpret_cast<uint32_t*>(mac_length) );
}
void hmacSha1Ctx(void* ctx, const uint8_t* data[], uint32_t data_length[],
uint8_t* mac, int32_t* mac_length )
{
HMAC_CTX* pctx = (HMAC_CTX*)ctx;
HMAC_Init_ex(pctx, NULL, 0, NULL, NULL );
while (*data) {
HMAC_Update(pctx, *data, *data_length);
data++;
data_length++;
}
HMAC_Final(pctx, mac, reinterpret_cast<uint32_t*>(mac_length) );
}
void freeSha1HmacContext(void* ctx)
{
if (ctx) {
HMAC_CTX_cleanup((HMAC_CTX*)ctx);
free(ctx);
}
-}
\ No newline at end of file
+}
+
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/InitializeOpenSSL.cpp b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/InitializeOpenSSL.cpp
index b23cabd6..aef6dc58 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/InitializeOpenSSL.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/InitializeOpenSSL.cpp
@@ -1,237 +1,246 @@
/*
Copyright (C) 2006-2013 Werner Dittmann
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Boston, MA 02111.
*/
#include <stdio.h>
#include <openssl/evp.h>
#include <config.h>
#ifdef _MSWINDOWS_
#include <windows.h>
#endif
#if defined SOLARIS && !defined HAVE_PTHREAD_H
#include <synch.h>
#include <thread.h>
#endif
#if !defined _MSWINDOWS_ && !defined SOLARIS
#include <pthread.h>
#endif
#ifdef const
#undef const
#endif
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
+
static void threadLockSetup(void);
static void threadLockCleanup(void);
static void myLockingCallback(int, int, const char *, int);
/**
* Implement the locking callback functions for openSSL.
*
* Unfortunatly we can't use the Commonc++ Mutex here because the
* Mutex may use (for some cases) the Commonc++ Thread class. OpenSSL
* does not use this Thread class.
*/
static int initialized = 0;
int initializeOpenSSL ()
{
if (initialized) {
return 1;
}
initialized = 1;
threadLockSetup();
return 1;
}
int finalizeOpenSSL ()
{
if(!initialized)
return 1;
initialized = 0;
threadLockCleanup();
return 1;
}
#ifdef _MSWINDOWS_
static HANDLE *lock_cs;
static void threadLockSetup(void) {
int i;
lock_cs=(HANDLE*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE));
for (i = 0; i < CRYPTO_num_locks(); i++) {
lock_cs[i] = CreateMutex(NULL,FALSE,NULL);
}
CRYPTO_set_locking_callback((void (*)(int,int,const char *,int))myLockingCallback);
/* id callback defined */
}
static void threadLockCleanup(void) {
int i;
CRYPTO_set_locking_callback(NULL);
for (i = 0; i < CRYPTO_num_locks(); i++) {
CloseHandle(lock_cs[i]);
}
OPENSSL_free(lock_cs);
}
static void myLockingCallback(int mode, int type, const char *file, int line) {
if (mode & CRYPTO_LOCK) {
WaitForSingleObject(lock_cs[type], INFINITE);
}
else {
ReleaseMutex(lock_cs[type]);
}
}
#endif /* OPENSSL_SYS_WIN32 */
#if defined SOLARIS && !defined HAVE_PTHREAD_H
static mutex_t *lock_cs;
static long *lock_count;
static void threadLockSetup(void) {
int i;
lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(mutex_t));
lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
for (i = 0; i < CRYPTO_num_locks(); i++) {
lock_count[i] = 0;
/* rwlock_init(&(lock_cs[i]),USYNC_THREAD,NULL); */
mutex_init(&(lock_cs[i]), USYNC_THREAD, NULL);
}
CRYPTO_set_locking_callback((void (*)(int, int ,const char *, int))myLockingCallback);
}
static void threadLockCleanup(void) {
int i;
CRYPTO_set_locking_callback(NULL);
fprintf(stderr,"cleanup\n");
for (i = 0; i < CRYPTO_num_locks(); i++) {
/* rwlock_destroy(&(lock_cs[i])); */
mutex_destroy(&(lock_cs[i]));
fprintf(stderr,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i));
}
OPENSSL_free(lock_cs);
OPENSSL_free(lock_count);
}
static void myLockingCallback(int mode, int type, const char *file, int line)
{
#ifdef undef
fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n",
CRYPTO_thread_id(),
(mode&CRYPTO_LOCK)?"l":"u",
(type&CRYPTO_READ)?"r":"w",file,line);
#endif
/*
if (CRYPTO_LOCK_SSL_CERT == type)
fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n",
CRYPTO_thread_id(),
mode,file,line);
*/
if (mode & CRYPTO_LOCK) {
mutex_lock(&(lock_cs[type]));
lock_count[type]++;
}
else {
mutex_unlock(&(lock_cs[type]));
}
}
static unsigned long solaris_thread_id(void) {
unsigned long ret;
ret=(unsigned long)thr_self();
return(ret);
}
#endif /* SOLARIS */
#if !defined _MSWINDOWS_ && !defined SOLARIS
static pthread_mutex_t* lock_cs;
static long* lock_count;
static void threadLockSetup(void) {
int i;
lock_cs = (pthread_mutex_t*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
lock_count = (long*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
for (i = 0; i < CRYPTO_num_locks(); i++) {
lock_count[i] = 0;
pthread_mutex_init(&(lock_cs[i]),NULL);
}
// CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id);
CRYPTO_set_locking_callback((void (*)(int,int,const char *, int))myLockingCallback);
}
static void threadLockCleanup(void)
{
int i;
CRYPTO_set_locking_callback(NULL);
fprintf(stderr,"cleanup\n");
for (i = 0; i < CRYPTO_num_locks(); i++) {
pthread_mutex_destroy(&(lock_cs[i]));
fprintf(stderr,"%8ld:%s\n",lock_count[i],
CRYPTO_get_lock_name(i));
}
OPENSSL_free(lock_cs);
OPENSSL_free(lock_count);
}
static void myLockingCallback(int mode, int type, const char *file,
int line) {
#ifdef undef
fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n",
CRYPTO_thread_id(),
(mode&CRYPTO_LOCK)?"l":"u",
(type&CRYPTO_READ)?"r":"w",file,line);
#endif
if (mode & CRYPTO_LOCK) {
pthread_mutex_lock(&(lock_cs[type]));
lock_count[type]++;
}
else {
pthread_mutex_unlock(&(lock_cs[type]));
}
}
#endif /* !defined _MSWINDOWS_ && !defined SOLARIS */
/*
static unsigned long pthreads_thread_id(void)
{
unsigned long ret;
ret = (unsigned long)pthread_self();
return(ret);
}
*/
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/aesCFB.cpp b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/aesCFB.cpp
index bac29f5c..114893b5 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/aesCFB.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/aesCFB.cpp
@@ -1,89 +1,97 @@
/*
Copyright (C) 2006, 2007 by Werner Dittmann
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/** Copyright (C) 2006, 2007
*
* @author Werner Dittmann <Werner.Dittmann@t-online.de>
*/
#include <openssl/crypto.h>
#include <openssl/aes.h>
#include <string.h>
#include <zrtp/crypto/aesCFB.h>
-// extern void initializeOpenSSL();
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+// extern void initializeOpenSSL();
void aesCfbEncrypt(uint8_t* key, int32_t keyLength, uint8_t* IV, uint8_t *data,
int32_t dataLength)
{
AES_KEY aesKey;
int usedBytes = 0;
// initializeOpenSSL();
memset(&aesKey, 0, sizeof( AES_KEY ) );
if (keyLength == 16) {
AES_set_encrypt_key(key, 128, &aesKey);
}
else if (keyLength == 32) {
AES_set_encrypt_key(key, 256, &aesKey);
}
else {
return;
}
AES_cfb128_encrypt(data, data, dataLength, &aesKey,
IV, &usedBytes, AES_ENCRYPT);
}
void aesCfbDecrypt(uint8_t* key, int32_t keyLength, uint8_t* IV, uint8_t *data,
int32_t dataLength)
{
AES_KEY aesKey;
int usedBytes = 0;
// initializeOpenSSL();
memset(&aesKey, 0, sizeof( AES_KEY ) );
if (keyLength == 16) {
AES_set_encrypt_key(key, 128, &aesKey);
}
else if (keyLength == 32) {
AES_set_encrypt_key(key, 256, &aesKey);
}
else {
return;
}
AES_cfb128_encrypt(data, data, dataLength, &aesKey,
IV, &usedBytes, AES_DECRYPT);
}
+
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/hmac256.cpp b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/hmac256.cpp
index 40e4e823..0953ad5c 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/hmac256.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/hmac256.cpp
@@ -1,67 +1,76 @@
/*
Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/*
* Authors: Erik Eliasson <eliasson@it.kth.se>
* Johan Bilien <jobi@via.ecp.fr>
*/
#include <openssl/hmac.h>
#include <crypto/hmac256.h>
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
void hmac_sha256(uint8_t* key, uint32_t key_length,
uint8_t* data, int32_t data_length,
uint8_t* mac, uint32_t* mac_length)
{
unsigned int tmp;
HMAC( EVP_sha256(), key, key_length, data, data_length, mac, &tmp );
*mac_length = tmp;
}
void hmac_sha256(uint8_t* key, uint32_t key_length,
uint8_t* data_chunks[],
uint32_t data_chunck_length[],
uint8_t* mac, uint32_t* mac_length )
{
unsigned int tmp;
HMAC_CTX ctx;
HMAC_CTX_init( &ctx );
HMAC_Init_ex( &ctx, key, key_length, EVP_sha256(), NULL );
while( *data_chunks ){
HMAC_Update( &ctx, *data_chunks, *data_chunck_length );
data_chunks ++;
data_chunck_length ++;
}
HMAC_Final( &ctx, mac, &tmp);
*mac_length = tmp;
HMAC_CTX_cleanup( &ctx );
}
+
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/hmac384.cpp b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/hmac384.cpp
index 8181cd66..f1dd5abc 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/hmac384.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/hmac384.cpp
@@ -1,65 +1,74 @@
/*
Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/*
* Authors: Erik Eliasson <eliasson@it.kth.se>
* Johan Bilien <jobi@via.ecp.fr>
*/
#include <openssl/hmac.h>
#include <zrtp/crypto/hmac256.h>
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
void hmac_sha384(uint8_t* key, uint32_t key_length, uint8_t* data, int32_t data_length, uint8_t* mac, uint32_t* mac_length)
{
unsigned int tmp;
HMAC( EVP_sha384(), key, key_length, data, data_length, mac, &tmp );
*mac_length = tmp;
}
void hmac_sha384(uint8_t* key, uint32_t key_length,
uint8_t* data_chunks[],
uint32_t data_chunck_length[],
uint8_t* mac, uint32_t* mac_length )
{
unsigned int tmp;
HMAC_CTX ctx;
HMAC_CTX_init( &ctx );
HMAC_Init_ex( &ctx, key, key_length, EVP_sha384(), NULL );
while( *data_chunks ){
HMAC_Update( &ctx, *data_chunks, *data_chunck_length );
data_chunks ++;
data_chunck_length ++;
}
HMAC_Final( &ctx, mac, &tmp);
*mac_length = tmp;
HMAC_CTX_cleanup( &ctx );
}
+
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/sha256.cpp b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/sha256.cpp
index c46d7f85..69ecc7a8 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/sha256.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/sha256.cpp
@@ -1,114 +1,123 @@
/*
Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/**
* @author Erik Eliasson <eliasson@it.kth.se>
* Johan Bilien <jobi@via.ecp.fr>
* Werner Dittmann <Werner.Dittmann@t-online.de>
*/
#include <openssl/crypto.h>
#include <openssl/sha.h>
#include <crypto/sha256.h>
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
void sha256(unsigned char *data, unsigned int data_length,
unsigned char *digest )
{
SHA256(data, data_length, digest);
}
void sha256(unsigned char * data_chunks[],
unsigned int data_chunck_length[],
unsigned char *digest)
{
SHA256_CTX ctx;
SHA256_Init( &ctx);
while(*data_chunks) {
SHA256_Update(&ctx, *data_chunks, *data_chunck_length);
data_chunks++;
data_chunck_length++;
}
SHA256_Final(digest, &ctx);
}
void* createSha256Context()
{
SHA256_CTX* ctx = (SHA256_CTX*)malloc(sizeof (SHA256_CTX));
if (ctx == NULL)
return NULL;
SHA256_Init(ctx);
return (void*)ctx;
}
void closeSha256Context(void* ctx, unsigned char* digest)
{
SHA256_CTX* hd = (SHA256_CTX*)ctx;
if (digest != NULL && hd != NULL) {
SHA256_Final(digest, hd);
}
free(hd);
}
void* initializeSha256Context(void* ctx)
{
SHA256_CTX* hd = (SHA256_CTX*)ctx;
SHA256_Init(hd);
return (void*)hd;
}
void finalizeSha256Context(void* ctx, unsigned char* digest)
{
SHA256_CTX* hd = (SHA256_CTX*)ctx;
if (digest != NULL && hd != NULL) {
SHA256_Final(digest, hd);
}
}
void sha256Ctx(void* ctx, unsigned char* data,
unsigned int dataLength)
{
SHA256_CTX* hd = (SHA256_CTX*)ctx;
SHA256_Update(hd, data, dataLength);
}
void sha256Ctx(void* ctx, unsigned char* dataChunks[],
unsigned int dataChunkLength[])
{
SHA256_CTX* hd = (SHA256_CTX*)ctx;
while (*dataChunks) {
SHA256_Update (hd, *dataChunks, *dataChunkLength);
dataChunks++;
dataChunkLength++;
}
}
+
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/sha384.cpp b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/sha384.cpp
index 88946956..9b59dfe9 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/sha384.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/sha384.cpp
@@ -1,115 +1,124 @@
/*
Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/**
* @author Erik Eliasson <eliasson@it.kth.se>
* Johan Bilien <jobi@via.ecp.fr>
* Werner Dittmann <Werner.Dittmann@t-online.de>
*/
#include <openssl/crypto.h>
#include <openssl/sha.h>
#include <crypto/sha384.h>
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
void sha384(unsigned char *data, unsigned int data_length,
unsigned char *digest )
{
SHA384(data, data_length, digest);
}
void sha384(unsigned char * data_chunks[],
unsigned int data_chunck_length[],
unsigned char *digest)
{
SHA512_CTX ctx;
SHA384_Init( &ctx);
while(*data_chunks) {
SHA384_Update(&ctx, *data_chunks, *data_chunck_length);
data_chunks++;
data_chunck_length++;
}
SHA384_Final(digest, &ctx);
}
void* createSha384Context()
{
SHA512_CTX* ctx = (SHA512_CTX*)malloc(sizeof (SHA512_CTX));
if (ctx == NULL)
return NULL;
SHA384_Init(ctx);
return (void*)ctx;
}
void closeSha384Context(void* ctx, unsigned char* digest)
{
SHA512_CTX* hd = (SHA512_CTX*)ctx;
if (digest != NULL) {
SHA384_Final(digest, hd);
}
free(hd);
}
void* initializeSha384Context(void* ctx)
{
SHA512_CTX* hd = (SHA512_CTX*)ctx;
SHA384_Init(hd);
return (void*)hd;
}
void finalizeSha384Context(void* ctx, unsigned char* digest)
{
SHA512_CTX* hd = (SHA512_CTX*)ctx;
if (digest != NULL) {
SHA384_Final(digest, hd);
}
}
void sha384Ctx(void* ctx, unsigned char* data,
unsigned int dataLength)
{
SHA512_CTX* hd = (SHA512_CTX*)ctx;
SHA384_Update(hd, data, dataLength);
}
void sha384Ctx(void* ctx, unsigned char* dataChunks[],
unsigned int dataChunkLength[])
{
SHA512_CTX* hd = (SHA512_CTX*)ctx;
while (*dataChunks) {
SHA384_Update (hd, *dataChunks, *dataChunkLength);
dataChunks++;
dataChunkLength++;
}
}
+
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
diff --git a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/zrtpDH.cpp b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/zrtpDH.cpp
index d5b8cc9b..2623d2a3 100644
--- a/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/zrtpDH.cpp
+++ b/deps/pjsip/third_party/zsrtp/zrtp/zrtp/crypto/openssl/zrtpDH.cpp
@@ -1,426 +1,435 @@
/*
Copyright (C) 2006, 2009 by Werner Dittmann
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/** Copyright (C) 2006, 2009
*
* @author Werner Dittmann <Werner.Dittmann@t-online.de>
*/
#include <string.h>
#include <openssl/crypto.h>
#include <openssl/bio.h>
#include <openssl/bn.h>
#include <openssl/rand.h>
#include <openssl/err.h>
#include <openssl/dh.h>
#include <openssl/evp.h>
#include <openssl/ec.h>
#include <openssl/ecdh.h>
#include <zrtp/crypto/zrtpDH.h>
#include <zrtp/libzrtpcpp/ZrtpTextData.h>
+#if defined(__APPLE__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
// extern void initializeOpenSSL();
static BIGNUM* bnP2048 = NULL;
static BIGNUM* bnP3072 = NULL;
// static BIGNUM* bnP4096 = NULL;
static BIGNUM* bnP2048MinusOne = NULL;
static BIGNUM* bnP3072MinusOne = NULL;
// static BIGNUM* bnP4096MinusOne = NULL;
static uint8_t dhinit = 0;
void randomZRTP(uint8_t *buf, int32_t length)
{
// initializeOpenSSL();
RAND_bytes(buf, length);
}
static const uint8_t P2048[] =
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,
0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,
0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,
0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,
0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,
0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,
0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,
0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2,
0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,
0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF
};
static const uint8_t P3072[] =
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,
0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,
0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,
0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,
0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,
0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,
0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,
0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2,
0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,
0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D,
0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57,
0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0,
0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73,
0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0,
0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20,
0xA9, 0x3A, 0xD2, 0xCA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
/* **************
static const uint8_t P4096[] =
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,
0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,
0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,
0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,
0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,
0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,
0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,
0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2,
0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,
0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D,
0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57,
0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0,
0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73,
0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0,
0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20,
0xA9, 0x21, 0x08, 0x01, 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, 0x99, 0xC3, 0x27, 0x18,
0x6A, 0xF4, 0xE2, 0x3C, 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, 0xDB, 0xBB, 0xC2, 0xDB,
0x04, 0xDE, 0x8E, 0xF9, 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, 0x99, 0xB2, 0x96, 0x4F,
0xA0, 0x90, 0xC3, 0xA2, 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, 0xB8, 0x1B, 0xDD, 0x76,
0x21, 0x70, 0x48, 0x1C, 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, 0x86, 0xFF, 0xB7, 0xDC,
0x90, 0xA6, 0xC0, 0x8F, 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
*************** */
ZrtpDH::ZrtpDH(const char* type) {
uint8_t random[64];
// Well - the algo type is only 4 char thus cast to int32 and compare
if (*(int32_t*)type == *(int32_t*)dh2k) {
pkType = DH2K;
}
else if (*(int32_t*)type == *(int32_t*)dh3k) {
pkType = DH3K;
}
else if (*(int32_t*)type == *(int32_t*)ec25) {
pkType = EC25;
}
else if (*(int32_t*)type == *(int32_t*)ec38) {
pkType = EC38;
}
else {
return;
}
// initializeOpenSSL();
if (!dhinit) {
bnP2048 = BN_bin2bn(P2048,sizeof(P2048),NULL);
bnP3072 = BN_bin2bn(P3072,sizeof(P3072),NULL);
// bnP4096 = BN_bin2bn(P4096,sizeof(P4096),NULL);
bnP2048MinusOne = BN_dup(bnP2048);
BN_sub_word(bnP2048MinusOne, 1);
bnP3072MinusOne = BN_dup(bnP3072);
BN_sub_word(bnP3072MinusOne, 1);
// bnP4096MinusOne = BN_dup(bnP4096);
// BN_sub_word(bnP4096MinusOne, 1);
dhinit = 1;
}
DH* tmpCtx = NULL;
switch (pkType) {
case DH2K:
case DH3K:
ctx = static_cast<void*>(DH_new());
tmpCtx = static_cast<DH*>(ctx);
tmpCtx->g = BN_new();
BN_set_word(tmpCtx->g, DH_GENERATOR_2);
if (pkType == DH2K) {
tmpCtx->p = BN_dup(bnP2048);
RAND_bytes(random, 32);
tmpCtx->priv_key = BN_bin2bn(random, 32, NULL);
}
else if (pkType == DH3K) {
tmpCtx->p = BN_dup(bnP3072);
RAND_bytes(random, 64);
tmpCtx->priv_key = BN_bin2bn(random, 32, NULL);
}
break;
case EC25:
ctx = static_cast<void*>(EC_KEY_new_by_curve_name(NID_X9_62_prime256v1));
break;
case EC38:
ctx = static_cast<void*>(EC_KEY_new_by_curve_name(NID_secp384r1));
break;
}
}
ZrtpDH::~ZrtpDH() {
if (ctx == NULL)
return;
switch (pkType) {
case DH2K:
case DH3K:
DH_free(static_cast<DH*>(ctx));
break;
case EC25:
case EC38:
EC_KEY_free(static_cast<EC_KEY*>(ctx));
break;
}
}
int32_t ZrtpDH::computeSecretKey(uint8_t *pubKeyBytes, uint8_t *secret) {
if (pkType == DH2K || pkType == DH3K) {
DH* tmpCtx = static_cast<DH*>(ctx);
if (tmpCtx->pub_key != NULL) {
BN_free(tmpCtx->pub_key);
}
tmpCtx->pub_key = BN_bin2bn(pubKeyBytes, getDhSize(), NULL);
return DH_compute_key(secret, tmpCtx->pub_key, tmpCtx);
}
if (pkType == EC25 || pkType == EC38) {
uint8_t buffer[100];
int32_t ret;
int32_t len = getPubKeySize();
buffer[0] = POINT_CONVERSION_UNCOMPRESSED;
memcpy(buffer+1, pubKeyBytes, len);
EC_POINT* point = EC_POINT_new(EC_KEY_get0_group(static_cast<EC_KEY*>(ctx)));
EC_POINT_oct2point(EC_KEY_get0_group(static_cast<EC_KEY*>(ctx)),
point, buffer, len+1, NULL);
ret = ECDH_compute_key(secret, getDhSize(), point, static_cast<EC_KEY*>(ctx), NULL);
EC_POINT_free(point);
return ret;
}
return -1;
}
int32_t ZrtpDH::generatePublicKey()
{
if (pkType == DH2K || pkType == DH3K)
return DH_generate_key(static_cast<DH*>(ctx));
if (pkType == EC25 || pkType == EC38)
return EC_KEY_generate_key(static_cast<EC_KEY*>(ctx));
return 0;
}
int32_t ZrtpDH::getDhSize() const
{
if (pkType == DH2K || pkType == DH3K)
return DH_size(static_cast<DH*>(ctx));
if (pkType == EC25)
return 32;
if (pkType == EC38)
return 48;
return 0;
}
int32_t ZrtpDH::getPubKeySize() const
{
if (pkType == DH2K || pkType == DH3K)
return BN_num_bytes(static_cast<DH*>(ctx)->pub_key);
if (pkType == EC25 || pkType == EC38)
return EC_POINT_point2oct(EC_KEY_get0_group(static_cast<EC_KEY*>(ctx)),
EC_KEY_get0_public_key(static_cast<EC_KEY*>(ctx)),
POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL) - 1;
return 0;
}
int32_t ZrtpDH::getPubKeyBytes(uint8_t *buf) const
{
if (pkType == DH2K || pkType == DH3K) {
// get len of pub_key, prepend with zeros to DH size
int32_t prepend = getDhSize() - getPubKeySize();
if (prepend > 0) {
memset(buf, 0, prepend);
}
return BN_bn2bin(static_cast<DH*>(ctx)->pub_key, buf + prepend);
}
if (pkType == EC25 || pkType == EC38) {
uint8_t buffer[100];
int len = EC_POINT_point2oct(EC_KEY_get0_group(static_cast<EC_KEY*>(ctx)),
EC_KEY_get0_public_key(static_cast<EC_KEY*>(ctx)),
POINT_CONVERSION_UNCOMPRESSED, buffer, 100, NULL);
memcpy(buf, buffer+1, len-1);
return len-1;
}
return 0;
}
int32_t ZrtpDH::checkPubKey(uint8_t *pubKeyBytes) const
{
if (pkType == EC25 || pkType == EC38) {
uint8_t buffer[100];
int32_t ret;
int32_t len = getPubKeySize();
buffer[0] = POINT_CONVERSION_UNCOMPRESSED;
memcpy(buffer+1, pubKeyBytes, len);
EC_POINT* point = EC_POINT_new(EC_KEY_get0_group(static_cast<EC_KEY*>(ctx)));
EC_POINT_oct2point(EC_KEY_get0_group(static_cast<EC_KEY*>(ctx)),
point, buffer, len+1, NULL);
EC_KEY* chkKey = EC_KEY_new();
EC_KEY_set_group(chkKey, EC_KEY_get0_group(static_cast<EC_KEY*>(ctx)));
EC_KEY_set_public_key(chkKey, point);
ret = EC_KEY_check_key(chkKey);
EC_POINT_free(point);
EC_KEY_free(chkKey);
return ret;
}
BIGNUM* pubKeyOther = BN_bin2bn(pubKeyBytes, getDhSize(), NULL);
if (pkType == DH2K) {
if (BN_cmp(bnP2048MinusOne, pubKeyOther) == 0)
return 0;
}
else if (pkType == DH3K) {
if (BN_cmp(bnP3072MinusOne, pubKeyOther) == 0)
return 0;
}
else {
// if (BN_cmp(bnP4096MinusOne, pubKeyOther) == 0)
return 0;
}
int one = BN_is_one(pubKeyOther);
if (one == 1)
return 0;
BN_free(pubKeyOther);
return 1;
}
const char* ZrtpDH::getDHtype()
{
switch (pkType) {
case DH2K:
return dh2k;
break;
case DH3K:
return dh3k;
break;
case EC25:
return ec25;
break;
case EC38:
return ec38;
break;
}
return NULL;
}
+#if defined(__APPLE__)
+# pragma GCC diagnostic pop
+#endif
+
/** EMACS **
* Local variables:
* mode: c++
* c-default-style: ellemtel
* c-basic-offset: 4
* End:
*/
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Nov 23, 5:49 AM (1 d, 8 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3408875
Default Alt Text
(71 KB)
Attached To
Mode
rPYNSIPSIMPLE python3-sipsimple
Attached
Detach File
Event Timeline
Log In to Comment