|
|
|
@ -260,15 +260,26 @@ done: |
|
|
|
} |
|
|
|
|
|
|
|
static void aes_ctr_128_no_ctx(unsigned char *out, str *in, const unsigned char *key, const unsigned char *iv) { |
|
|
|
EVP_CIPHER_CTX ctx; |
|
|
|
EVP_CIPHER_CTX *ctx; |
|
|
|
unsigned char block[16]; |
|
|
|
int len; |
|
|
|
|
|
|
|
EVP_CIPHER_CTX_init(&ctx); |
|
|
|
EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, key, NULL); |
|
|
|
aes_ctr_128(out, in, &ctx, iv); |
|
|
|
EVP_EncryptFinal_ex(&ctx, block, &len); |
|
|
|
EVP_CIPHER_CTX_cleanup(&ctx); |
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L |
|
|
|
ctx = EVP_CIPHER_CTX_new(); |
|
|
|
#else |
|
|
|
EVP_CIPHER_CTX ctx_s; |
|
|
|
ctx = &ctx_s; |
|
|
|
EVP_CIPHER_CTX_init(ctx); |
|
|
|
#endif |
|
|
|
EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, NULL); |
|
|
|
aes_ctr_128(out, in, ctx, iv); |
|
|
|
EVP_EncryptFinal_ex(ctx, block, &len); |
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L |
|
|
|
EVP_CIPHER_CTX_free(ctx); |
|
|
|
#else |
|
|
|
EVP_CIPHER_CTX_cleanup(ctx); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
/* rfc 3711 section 4.3.1 and 4.3.3 |
|
|
|
@ -463,15 +474,27 @@ static int aes_f8_encrypt_rtcp(struct crypto_context *c, struct rtcp_packet *r, |
|
|
|
/* rfc 3711, sections 4.2 and 4.2.1 */ |
|
|
|
static int hmac_sha1_rtp(struct crypto_context *c, char *out, str *in, u_int64_t index) { |
|
|
|
unsigned char hmac[20]; |
|
|
|
HMAC_CTX hc; |
|
|
|
u_int32_t roc; |
|
|
|
HMAC_CTX *hc; |
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L |
|
|
|
hc = HMAC_CTX_new(); |
|
|
|
#else |
|
|
|
HMAC_CTX hc_s; |
|
|
|
HMAC_CTX_init(&hc_s); |
|
|
|
hc = &hc_s; |
|
|
|
#endif |
|
|
|
|
|
|
|
HMAC_Init(&hc, c->session_auth_key, c->params.crypto_suite->srtp_auth_key_len, EVP_sha1()); |
|
|
|
HMAC_Update(&hc, (unsigned char *) in->s, in->len); |
|
|
|
HMAC_Init_ex(hc, c->session_auth_key, c->params.crypto_suite->srtp_auth_key_len, EVP_sha1(), NULL); |
|
|
|
HMAC_Update(hc, (unsigned char *) in->s, in->len); |
|
|
|
roc = htonl((index & 0xffffffff0000ULL) >> 16); |
|
|
|
HMAC_Update(&hc, (unsigned char *) &roc, sizeof(roc)); |
|
|
|
HMAC_Final(&hc, hmac, NULL); |
|
|
|
HMAC_CTX_cleanup(&hc); |
|
|
|
HMAC_Update(hc, (unsigned char *) &roc, sizeof(roc)); |
|
|
|
HMAC_Final(hc, hmac, NULL); |
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L |
|
|
|
HMAC_CTX_free(hc); |
|
|
|
#else |
|
|
|
HMAC_CTX_cleanup(hc); |
|
|
|
#endif |
|
|
|
|
|
|
|
assert(sizeof(hmac) >= c->params.crypto_suite->srtp_auth_tag); |
|
|
|
memcpy(out, hmac, c->params.crypto_suite->srtp_auth_tag); |
|
|
|
@ -495,8 +518,12 @@ static int hmac_sha1_rtcp(struct crypto_context *c, char *out, str *in) { |
|
|
|
static int aes_cm_session_key_init(struct crypto_context *c) { |
|
|
|
evp_session_key_cleanup(c); |
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L |
|
|
|
c->session_key_ctx[0] = EVP_CIPHER_CTX_new(); |
|
|
|
#else |
|
|
|
c->session_key_ctx[0] = g_slice_alloc(sizeof(EVP_CIPHER_CTX)); |
|
|
|
EVP_CIPHER_CTX_init(c->session_key_ctx[0]); |
|
|
|
#endif |
|
|
|
EVP_EncryptInit_ex(c->session_key_ctx[0], EVP_aes_128_ecb(), NULL, |
|
|
|
(unsigned char *) c->session_key, NULL); |
|
|
|
return 0; |
|
|
|
@ -522,8 +549,12 @@ static int aes_f8_session_key_init(struct crypto_context *c) { |
|
|
|
for (i = 0; i < k_e_len; i++) |
|
|
|
m[i] ^= key[i]; |
|
|
|
|
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L |
|
|
|
c->session_key_ctx[1] = EVP_CIPHER_CTX_new(); |
|
|
|
#else |
|
|
|
c->session_key_ctx[1] = g_slice_alloc(sizeof(EVP_CIPHER_CTX)); |
|
|
|
EVP_CIPHER_CTX_init(c->session_key_ctx[1]); |
|
|
|
#endif |
|
|
|
EVP_EncryptInit_ex(c->session_key_ctx[1], EVP_aes_128_ecb(), NULL, m, NULL); |
|
|
|
|
|
|
|
return 0; |
|
|
|
@ -538,8 +569,12 @@ static int evp_session_key_cleanup(struct crypto_context *c) { |
|
|
|
continue; |
|
|
|
|
|
|
|
EVP_EncryptFinal_ex(c->session_key_ctx[i], block, &len); |
|
|
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L |
|
|
|
EVP_CIPHER_CTX_free(c->session_key_ctx[i]); |
|
|
|
#else |
|
|
|
EVP_CIPHER_CTX_cleanup(c->session_key_ctx[i]); |
|
|
|
g_slice_free1(sizeof(EVP_CIPHER_CTX), c->session_key_ctx[i]); |
|
|
|
#endif |
|
|
|
c->session_key_ctx[i] = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
|