blob: a376a2eb16e02ff2c2dea320dce3941d80aa25fd [file] [log] [blame]
/*
* Copyright (c) 2017 The Linux Foundation. All rights reserved.
*/
/*
* AES-128/192/256 CTR
*
* Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
#ifdef WLAN_SUPPORT_FILS
#include <qdf_crypto.h>
#include "wlan_crypto_aes_i.h"
int32_t wlan_crypto_aes_ctr_encrypt(const uint8_t *key, size_t key_len,
const uint8_t *nonce, uint8_t *data,
size_t data_len)
{
void *ctx;
size_t j, len, left = data_len;
int32_t i;
uint8_t *pos = data;
uint8_t counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE];
int32_t status = -1;
ctx = wlan_crypto_aes_encrypt_init(key, key_len);
if (!ctx)
return status;
qdf_mem_copy(counter, nonce, AES_BLOCK_SIZE);
while (left > 0) {
wlan_crypto_aes_encrypt(ctx, counter, buf);
len = (left < AES_BLOCK_SIZE) ? left : AES_BLOCK_SIZE;
for (j = 0; j < len; j++)
pos[j] ^= buf[j];
pos += len;
left -= len;
for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) {
counter[i]++;
if (counter[i])
break;
}
}
wlan_crypto_aes_encrypt_deinit(ctx);
return 0;
}
int32_t wlan_crypto_aes_128_ctr_encrypt(const uint8_t *key,
const uint8_t *nonce, uint8_t *data,
size_t data_len)
{
return wlan_crypto_aes_ctr_encrypt(key, 16, nonce, data, data_len);
}
#endif /* WLAN_SUPPORT_FILS */