From 7e2e965eb7c700b2f74f2611ac61829fd2e86a60 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Tue, 6 Jun 2017 13:32:14 -0500 Subject: [PATCH] crypto: Optimize arc4_skip --- src/crypto.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index 53d5cb4d..46ed39b2 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -169,12 +169,15 @@ bool arc4_skip(const uint8_t *key, size_t key_len, size_t skip, { char skip_buf[1024]; struct l_cipher *cipher; + struct iovec in_vec[2]; + struct iovec out_vec[2]; + bool r; cipher = l_cipher_new(L_CIPHER_ARC4, key, key_len); if (!cipher) return false; - while (skip > 0) { + while (skip > sizeof(skip_buf)) { size_t to_skip = skip > sizeof(skip_buf) ? sizeof(skip_buf) : skip; @@ -182,10 +185,20 @@ bool arc4_skip(const uint8_t *key, size_t key_len, size_t skip, skip -= to_skip; } - l_cipher_decrypt(cipher, in, out, len); + in_vec[0].iov_base = skip_buf; + in_vec[0].iov_len = skip; + in_vec[1].iov_base = (void *) in; + in_vec[1].iov_len = len; + + out_vec[0].iov_base = skip_buf; + out_vec[0].iov_len = skip; + out_vec[1].iov_base = out; + out_vec[1].iov_len = len; + + r = l_cipher_decryptv(cipher, in_vec, 2, out_vec, 2); l_cipher_free(cipher); - return true; + return r; } /* 802.11, Section 11.6.2, Table 11-4 */