1214501Srpaulo/* 2214501Srpaulo * AES-128 CTR 3214501Srpaulo * 4214501Srpaulo * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> 5214501Srpaulo * 6214501Srpaulo * This program is free software; you can redistribute it and/or modify 7214501Srpaulo * it under the terms of the GNU General Public License version 2 as 8214501Srpaulo * published by the Free Software Foundation. 9214501Srpaulo * 10214501Srpaulo * Alternatively, this software may be distributed under the terms of BSD 11214501Srpaulo * license. 12214501Srpaulo * 13214501Srpaulo * See README and COPYING for more details. 14214501Srpaulo */ 15214501Srpaulo 16214501Srpaulo#include "includes.h" 17214501Srpaulo 18214501Srpaulo#include "common.h" 19214501Srpaulo#include "aes.h" 20214501Srpaulo#include "aes_wrap.h" 21214501Srpaulo 22214501Srpaulo/** 23214501Srpaulo * aes_128_ctr_encrypt - AES-128 CTR mode encryption 24214501Srpaulo * @key: Key for encryption (16 bytes) 25214501Srpaulo * @nonce: Nonce for counter mode (16 bytes) 26214501Srpaulo * @data: Data to encrypt in-place 27214501Srpaulo * @data_len: Length of data in bytes 28214501Srpaulo * Returns: 0 on success, -1 on failure 29214501Srpaulo */ 30214501Srpauloint aes_128_ctr_encrypt(const u8 *key, const u8 *nonce, 31214501Srpaulo u8 *data, size_t data_len) 32214501Srpaulo{ 33214501Srpaulo void *ctx; 34214501Srpaulo size_t j, len, left = data_len; 35214501Srpaulo int i; 36214501Srpaulo u8 *pos = data; 37214501Srpaulo u8 counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; 38214501Srpaulo 39214501Srpaulo ctx = aes_encrypt_init(key, 16); 40214501Srpaulo if (ctx == NULL) 41214501Srpaulo return -1; 42214501Srpaulo os_memcpy(counter, nonce, AES_BLOCK_SIZE); 43214501Srpaulo 44214501Srpaulo while (left > 0) { 45214501Srpaulo aes_encrypt(ctx, counter, buf); 46214501Srpaulo 47214501Srpaulo len = (left < AES_BLOCK_SIZE) ? left : AES_BLOCK_SIZE; 48214501Srpaulo for (j = 0; j < len; j++) 49214501Srpaulo pos[j] ^= buf[j]; 50214501Srpaulo pos += len; 51214501Srpaulo left -= len; 52214501Srpaulo 53214501Srpaulo for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { 54214501Srpaulo counter[i]++; 55214501Srpaulo if (counter[i]) 56214501Srpaulo break; 57214501Srpaulo } 58214501Srpaulo } 59214501Srpaulo aes_encrypt_deinit(ctx); 60214501Srpaulo return 0; 61214501Srpaulo} 62