From c08809e29009d5f51bdc2276530e9ec40f211eaf Mon Sep 17 00:00:00 2001 From: Spencer Thomason Date: Fri, 22 Jul 2016 07:37:21 -0700 Subject: [PATCH] FS-8783: [libsrtp] Fix alignment issue Backport upstream alignment fix to correct bus error on platforms that require strict memory alignment such as SPARC FS-8783 #resolve From upstream: commit 4d8430a504137509f23b5a19f8a06b6df0f651cc Author: Jaap Keuter Date: Fri Nov 7 00:13:10 2014 +0100 While setting the IV for AES ICM the nonce is simply typecast from a void * to a v128_t *. This breaches alignment requirements for v128_t objects on platforms that require it. Instead make a copy of the nonce to assure proper alignment. --- libs/srtp/crypto/cipher/aes_icm.c | 9 ++++++--- libs/srtp/crypto/cipher/aes_icm_ossl.c | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/libs/srtp/crypto/cipher/aes_icm.c b/libs/srtp/crypto/cipher/aes_icm.c index ef7545f283..cda56a8ddc 100644 --- a/libs/srtp/crypto/cipher/aes_icm.c +++ b/libs/srtp/crypto/cipher/aes_icm.c @@ -284,12 +284,15 @@ aes_icm_set_octet(aes_icm_ctx_t *c, err_status_t aes_icm_set_iv(aes_icm_ctx_t *c, void *iv, int direction) { - v128_t *nonce = (v128_t *) iv; + v128_t nonce; + + /* set nonce (for alignment) */ + v128_copy_octet_string(&nonce, iv); debug_print(mod_aes_icm, - "setting iv: %s", v128_hex_string(nonce)); + "setting iv: %s", v128_hex_string(&nonce)); - v128_xor(&c->counter, &c->offset, nonce); + v128_xor(&c->counter, &c->offset, &nonce); debug_print(mod_aes_icm, "set_counter: %s", v128_hex_string(&c->counter)); diff --git a/libs/srtp/crypto/cipher/aes_icm_ossl.c b/libs/srtp/crypto/cipher/aes_icm_ossl.c index 12054a2cc9..1e1860d093 100644 --- a/libs/srtp/crypto/cipher/aes_icm_ossl.c +++ b/libs/srtp/crypto/cipher/aes_icm_ossl.c @@ -263,11 +263,14 @@ err_status_t aes_icm_openssl_context_init (aes_icm_ctx_t *c, const uint8_t *key) err_status_t aes_icm_openssl_set_iv (aes_icm_ctx_t *c, void *iv, int dir) { const EVP_CIPHER *evp; - v128_t *nonce = (v128_t*)iv; + v128_t nonce; - debug_print(mod_aes_icm, "setting iv: %s", v128_hex_string(nonce)); + /* set nonce (for alignment) */ + v128_copy_octet_string(&nonce, iv); - v128_xor(&c->counter, &c->offset, nonce); + debug_print(mod_aes_icm, "setting iv: %s", v128_hex_string(&nonce)); + + v128_xor(&c->counter, &c->offset, &nonce); debug_print(mod_aes_icm, "set_counter: %s", v128_hex_string(&c->counter));