diff --git a/webrtc/pc/externalhmac.cc b/webrtc/pc/externalhmac.cc index f85e753e71..a094ff8432 100644 --- a/webrtc/pc/externalhmac.cc +++ b/webrtc/pc/externalhmac.cc @@ -26,6 +26,18 @@ extern "C" { #include "webrtc/base/logging.h" +#ifdef COMPILING_AGAINST_LIBSRTP1 +#define srtp_auth_type_t auth_type_t + +#define srtp_auth_init_func auth_init_func +#define srtp_auth_compute_func auth_compute_func +#define srtp_auth_update_func auth_update_func +#define srtp_auth_start_func auth_start_func +#define srtp_auth_test_case_t auth_test_case_t + +#define srtp_replace_auth_type crypto_kernel_replace_auth_type +#endif // COMPILING_AGAINST_LIBSRTP1 + #if defined(HAVE_SRTP) && defined(ENABLE_EXTERNAL_AUTH) // Begin test case 0 */ @@ -43,7 +55,7 @@ static const uint8_t kExternalHmacFakeTag[10] = { 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd }; -static const auth_test_case_t kExternalHmacTestCase0 = { +static const srtp_auth_test_case_t kExternalHmacTestCase0 = { 20, // Octets in key const_cast(kExternalHmacTestCase0Key), // Key 8, // Octets in data @@ -57,106 +69,121 @@ static const auth_test_case_t kExternalHmacTestCase0 = { static const char kExternalHmacDescription[] = "external hmac sha-1 authentication"; -// auth_type_t external_hmac is the hmac metaobject +// srtp_auth_type_t external_hmac is the hmac metaobject -static const auth_type_t external_hmac = { +#ifdef COMPILING_AGAINST_LIBSRTP1 +static const srtp_auth_type_t external_hmac = { external_hmac_alloc, external_hmac_dealloc, - (auth_init_func) external_hmac_init, - (auth_compute_func) external_hmac_compute, - (auth_update_func) external_hmac_update, - (auth_start_func) external_hmac_start, + (srtp_auth_init_func) external_hmac_init, + (srtp_auth_compute_func) external_hmac_compute, + (srtp_auth_update_func) external_hmac_update, + (srtp_auth_start_func) external_hmac_start, const_cast(kExternalHmacDescription), 0, // Instance count. - const_cast(&kExternalHmacTestCase0), + const_cast(&kExternalHmacTestCase0), NULL, // No debugging module. EXTERNAL_HMAC_SHA1 }; +#else +static const srtp_auth_type_t external_hmac = { + external_hmac_alloc, + external_hmac_dealloc, + (srtp_auth_init_func) external_hmac_init, + (srtp_auth_compute_func) external_hmac_compute, + (srtp_auth_update_func) external_hmac_update, + (srtp_auth_start_func) external_hmac_start, + const_cast(kExternalHmacDescription), + const_cast(&kExternalHmacTestCase0), + EXTERNAL_HMAC_SHA1 +}; +#endif // COMPILING_AGAINST_LIBSRTP1 - -err_status_t external_hmac_alloc(auth_t** a, int key_len, int out_len) { +srtp_err_status_t external_hmac_alloc(srtp_auth_t** a, + int key_len, + int out_len) { uint8_t* pointer; // Check key length - note that we don't support keys larger // than 20 bytes yet if (key_len > 20) - return err_status_bad_param; + return srtp_err_status_bad_param; // Check output length - should be less than 20 bytes/ if (out_len > 20) - return err_status_bad_param; + return srtp_err_status_bad_param; // Allocate memory for auth and hmac_ctx_t structures. - pointer = new uint8_t[(sizeof(ExternalHmacContext) + sizeof(auth_t))]; + pointer = new uint8_t[(sizeof(ExternalHmacContext) + sizeof(srtp_auth_t))]; if (pointer == NULL) - return err_status_alloc_fail; + return srtp_err_status_alloc_fail; // Set pointers - *a = (auth_t *)pointer; + *a = (srtp_auth_t *)pointer; // |external_hmac| is const and libsrtp expects |type| to be non-const. // const conversion is required. |external_hmac| is constant because we don't // want to increase global count in Chrome. - (*a)->type = const_cast(&external_hmac); - (*a)->state = pointer + sizeof(auth_t); + (*a)->type = const_cast(&external_hmac); + (*a)->state = pointer + sizeof(srtp_auth_t); (*a)->out_len = out_len; (*a)->key_len = key_len; (*a)->prefix_len = 0; - return err_status_ok; + return srtp_err_status_ok; } -err_status_t external_hmac_dealloc(auth_t* a) { +srtp_err_status_t external_hmac_dealloc(srtp_auth_t* a) { // Zeroize entire state - memset((uint8_t *)a, 0, sizeof(ExternalHmacContext) + sizeof(auth_t)); + memset((uint8_t *)a, 0, sizeof(ExternalHmacContext) + sizeof(srtp_auth_t)); // Free memory delete[] a; - return err_status_ok; + return srtp_err_status_ok; } -err_status_t external_hmac_init(ExternalHmacContext* state, - const uint8_t* key, - int key_len) { +srtp_err_status_t external_hmac_init(ExternalHmacContext* state, + const uint8_t* key, + int key_len) { if (key_len > HMAC_KEY_LENGTH) - return err_status_bad_param; + return srtp_err_status_bad_param; memset(state->key, 0, key_len); memcpy(state->key, key, key_len); state->key_length = key_len; - return err_status_ok; + return srtp_err_status_ok; } -err_status_t external_hmac_start(ExternalHmacContext* state) { - return err_status_ok; +srtp_err_status_t external_hmac_start(ExternalHmacContext* state) { + return srtp_err_status_ok; } -err_status_t external_hmac_update(ExternalHmacContext* state, - const uint8_t* message, - int msg_octets) { - return err_status_ok; +srtp_err_status_t external_hmac_update(ExternalHmacContext* state, + const uint8_t* message, + int msg_octets) { + return srtp_err_status_ok; } -err_status_t external_hmac_compute(ExternalHmacContext* state, - const void* message, - int msg_octets, - int tag_len, - uint8_t* result) { +srtp_err_status_t external_hmac_compute(ExternalHmacContext* state, + const void* message, + int msg_octets, + int tag_len, + uint8_t* result) { memcpy(result, kExternalHmacFakeTag, tag_len); - return err_status_ok; + return srtp_err_status_ok; } -err_status_t external_crypto_init() { +srtp_err_status_t external_crypto_init() { // |external_hmac| is const. const_cast is required as libsrtp expects // non-const. - err_status_t status = crypto_kernel_replace_auth_type( - const_cast(&external_hmac), EXTERNAL_HMAC_SHA1); + srtp_err_status_t status = srtp_replace_auth_type( + const_cast(&external_hmac), EXTERNAL_HMAC_SHA1); if (status) { LOG(LS_ERROR) << "Error in replacing default auth module, error: " << status; - return err_status_fail; + return srtp_err_status_fail; } - return err_status_ok; + return srtp_err_status_ok; } #endif // defined(HAVE_SRTP) && defined(ENABLE_EXTERNAL_AUTH) diff --git a/webrtc/pc/externalhmac.h b/webrtc/pc/externalhmac.h index 18d4681145..091412e6a9 100644 --- a/webrtc/pc/externalhmac.h +++ b/webrtc/pc/externalhmac.h @@ -20,8 +20,8 @@ // How will libsrtp select this module? // Libsrtp defines authentication function types identified by an unsigned -// integer, e.g. HMAC_SHA1 is 3. Using authentication ids, the application -// can plug any desired authentication modules into libsrtp. +// integer, e.g. SRTP_HMAC_SHA1 is 3. Using authentication ids, the +// application can plug any desired authentication modules into libsrtp. // libsrtp also provides a mechanism to select different auth functions for // individual streams. This can be done by setting the right value in // the auth_type of srtp_policy_t. The application must first register auth @@ -39,9 +39,20 @@ extern "C" { } #endif // HAVE_SRTP +#if defined(HAVE_SRTP) && !defined(SRTP_HMAC_SHA1) +// Include compatibility shims to compile against libsrtp 1.x. +// TODO(mattdr): Remove once Chromium uses libsrtp 2. + +// Remember that the definition of SRTP_HMAC_SHA1 is synthetic. +#define COMPILING_AGAINST_LIBSRTP1 1 + +#define SRTP_HMAC_SHA1 HMAC_SHA1 +#define srtp_auth_t auth_t +#endif + #if defined(HAVE_SRTP) && defined(ENABLE_EXTERNAL_AUTH) -#define EXTERNAL_HMAC_SHA1 HMAC_SHA1 + 1 +#define EXTERNAL_HMAC_SHA1 SRTP_HMAC_SHA1 + 1 #define HMAC_KEY_LENGTH 20 // The HMAC context structure used to store authentication keys. @@ -52,27 +63,29 @@ typedef struct { int key_length; } ExternalHmacContext; -err_status_t external_hmac_alloc(auth_t** a, int key_len, int out_len); +srtp_err_status_t external_hmac_alloc(srtp_auth_t** a, + int key_len, + int out_len); -err_status_t external_hmac_dealloc(auth_t* a); +srtp_err_status_t external_hmac_dealloc(srtp_auth_t* a); -err_status_t external_hmac_init(ExternalHmacContext* state, - const uint8_t* key, - int key_len); +srtp_err_status_t external_hmac_init(ExternalHmacContext* state, + const uint8_t* key, + int key_len); -err_status_t external_hmac_start(ExternalHmacContext* state); +srtp_err_status_t external_hmac_start(ExternalHmacContext* state); -err_status_t external_hmac_update(ExternalHmacContext* state, - const uint8_t* message, - int msg_octets); +srtp_err_status_t external_hmac_update(ExternalHmacContext* state, + const uint8_t* message, + int msg_octets); -err_status_t external_hmac_compute(ExternalHmacContext* state, - const void* message, - int msg_octets, - int tag_len, - uint8_t* result); +srtp_err_status_t external_hmac_compute(ExternalHmacContext* state, + const void* message, + int msg_octets, + int tag_len, + uint8_t* result); -err_status_t external_crypto_init(); +srtp_err_status_t external_crypto_init(); #endif // defined(HAVE_SRTP) && defined(ENABLE_EXTERNAL_AUTH) #endif // WEBRTC_PC_EXTERNALHMAC_H_