1ba787b954
The BLOCK_SIZE define can be made more specific by using AES_ prefix and by moving it to aes.h. After this, most aes-*.c do not really need to include anything from the internal aes_i.h header file. In other words, aes_i.h can now be used only for the code that uses the internal AES block operation implementation and none of the code that can use AES implementation from an external library do not need to include this header file.
60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
/*
|
|
* AES-128 CTR
|
|
*
|
|
* Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* Alternatively, this software may be distributed under the terms of BSD
|
|
* license.
|
|
*
|
|
* See README and COPYING for more details.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
|
|
#include "common.h"
|
|
#include "aes.h"
|
|
|
|
/**
|
|
* aes_128_ctr_encrypt - AES-128 CTR mode encryption
|
|
* @key: Key for encryption (16 bytes)
|
|
* @nonce: Nonce for counter mode (16 bytes)
|
|
* @data: Data to encrypt in-place
|
|
* @data_len: Length of data in bytes
|
|
* Returns: 0 on success, -1 on failure
|
|
*/
|
|
int aes_128_ctr_encrypt(const u8 *key, const u8 *nonce,
|
|
u8 *data, size_t data_len)
|
|
{
|
|
void *ctx;
|
|
size_t j, len, left = data_len;
|
|
int i;
|
|
u8 *pos = data;
|
|
u8 counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE];
|
|
|
|
ctx = aes_encrypt_init(key, 16);
|
|
if (ctx == NULL)
|
|
return -1;
|
|
os_memcpy(counter, nonce, AES_BLOCK_SIZE);
|
|
|
|
while (left > 0) {
|
|
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;
|
|
}
|
|
}
|
|
aes_encrypt_deinit(ctx);
|
|
return 0;
|
|
}
|