aes-ctr.c revision 8d520ff1dc2da35cdca849e982051b86468016d8
1ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* 2ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * AES-128 CTR 3ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 4ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> 5ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 6ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * This program is free software; you can redistribute it and/or modify 7ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * it under the terms of the GNU General Public License version 2 as 8ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * published by the Free Software Foundation. 9ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 10ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Alternatively, this software may be distributed under the terms of BSD 11ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * license. 12ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 13ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * See README and COPYING for more details. 14ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta */ 15ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 16ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "includes.h" 17ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 18ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "common.h" 19ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "aes.h" 20ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "aes_wrap.h" 21ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 225cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen/** 23ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * aes_128_ctr_encrypt - AES-128 CTR mode encryption 24ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * @key: Key for encryption (16 bytes) 25ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * @nonce: Nonce for counter mode (16 bytes) 26ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * @data: Data to encrypt in-place 27ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * @data_len: Length of data in bytes 28ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Returns: 0 on success, -1 on failure 29ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta */ 30ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battaint aes_128_ctr_encrypt(const u8 *key, const u8 *nonce, 31ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta u8 *data, size_t data_len) 32ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 33ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta void *ctx; 34ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta size_t j, len, left = data_len; 35ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int i; 36ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta u8 *pos = data; 37ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta u8 counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; 38ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 39ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ctx = aes_encrypt_init(key, 16); 40ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (ctx == NULL) 41ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return -1; 42ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta os_memcpy(counter, nonce, AES_BLOCK_SIZE); 43ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 44ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while (left > 0) { 45ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta aes_encrypt(ctx, counter, buf); 46ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 47ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta len = (left < AES_BLOCK_SIZE) ? left : AES_BLOCK_SIZE; 48ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (j = 0; j < len; j++) 49ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta pos[j] ^= buf[j]; 50ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta pos += len; 51ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta left -= len; 52ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { 54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta counter[i]++; 55ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (counter[i]) 56ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 57ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 58ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 59ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta aes_encrypt_deinit(ctx); 607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return 0; 617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 62ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta