diff --git a/daemon/crypto.c b/daemon/crypto.c index ef9a7dade..cddb66f53 100644 --- a/daemon/crypto.c +++ b/daemon/crypto.c @@ -366,6 +366,7 @@ static void aes_ctr(unsigned char *out, str *in, EVP_CIPHER_CTX *ecc, const unsi unsigned char *p, *q; unsigned int left; int outlen, i; + gboolean aligned = TRUE; u_int64_t *pi, *qi, *ki; if (!ecc) @@ -377,11 +378,16 @@ static void aes_ctr(unsigned char *out, str *in, EVP_CIPHER_CTX *ecc, const unsi ki = (void *) key_block; left = in->len; + if ((GPOINTER_TO_UINT(pi) % sizeof(*pi)) != 0) + aligned = FALSE; + if ((GPOINTER_TO_UINT(qi) % sizeof(*qi)) != 0) + aligned = FALSE; + while (left) { EVP_EncryptUpdate(ecc, key_block, &outlen, ivx, 16); assert(outlen == 16); - if (G_UNLIKELY(left < 16)) { + if (left < 16 || !aligned) { p = (void *) pi; q = (void *) qi; for (i = 0; i < 16; i++) { @@ -390,12 +396,14 @@ static void aes_ctr(unsigned char *out, str *in, EVP_CIPHER_CTX *ecc, const unsi if (!left) goto done; } - abort(); } - - *qi++ = *pi++ ^ ki[0]; - *qi++ = *pi++ ^ ki[1]; - left -= 16; + else { + qi[0] = pi[0] ^ ki[0]; + qi[1] = pi[1] ^ ki[1]; + left -= 16; + } + qi += 2; + pi += 2; for (i = 15; i >= 0; i--) { ivx[i]++;