1214501Srpaulo/* 2346981Scy * AES-128/192/256 CTR 3214501Srpaulo * 4214501Srpaulo * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> 5214501Srpaulo * 6252726Srpaulo * This software may be distributed under the terms of the BSD license. 7252726Srpaulo * See README for more details. 8214501Srpaulo */ 9214501Srpaulo 10214501Srpaulo#include "includes.h" 11214501Srpaulo 12214501Srpaulo#include "common.h" 13214501Srpaulo#include "aes.h" 14214501Srpaulo#include "aes_wrap.h" 15214501Srpaulo 16214501Srpaulo/** 17346981Scy * aes_ctr_encrypt - AES-128/192/256 CTR mode encryption 18346981Scy * @key: Key for encryption (key_len bytes) 19346981Scy * @key_len: Length of the key (16, 24, or 32 bytes) 20214501Srpaulo * @nonce: Nonce for counter mode (16 bytes) 21214501Srpaulo * @data: Data to encrypt in-place 22214501Srpaulo * @data_len: Length of data in bytes 23214501Srpaulo * Returns: 0 on success, -1 on failure 24214501Srpaulo */ 25346981Scyint aes_ctr_encrypt(const u8 *key, size_t key_len, const u8 *nonce, 26346981Scy u8 *data, size_t data_len) 27214501Srpaulo{ 28214501Srpaulo void *ctx; 29214501Srpaulo size_t j, len, left = data_len; 30214501Srpaulo int i; 31214501Srpaulo u8 *pos = data; 32214501Srpaulo u8 counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; 33214501Srpaulo 34346981Scy ctx = aes_encrypt_init(key, key_len); 35214501Srpaulo if (ctx == NULL) 36214501Srpaulo return -1; 37214501Srpaulo os_memcpy(counter, nonce, AES_BLOCK_SIZE); 38214501Srpaulo 39214501Srpaulo while (left > 0) { 40214501Srpaulo aes_encrypt(ctx, counter, buf); 41214501Srpaulo 42214501Srpaulo len = (left < AES_BLOCK_SIZE) ? left : AES_BLOCK_SIZE; 43214501Srpaulo for (j = 0; j < len; j++) 44214501Srpaulo pos[j] ^= buf[j]; 45214501Srpaulo pos += len; 46214501Srpaulo left -= len; 47214501Srpaulo 48214501Srpaulo for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { 49214501Srpaulo counter[i]++; 50214501Srpaulo if (counter[i]) 51214501Srpaulo break; 52214501Srpaulo } 53214501Srpaulo } 54214501Srpaulo aes_encrypt_deinit(ctx); 55214501Srpaulo return 0; 56214501Srpaulo} 57346981Scy 58346981Scy 59346981Scy/** 60346981Scy * aes_128_ctr_encrypt - AES-128 CTR mode encryption 61346981Scy * @key: Key for encryption (key_len bytes) 62346981Scy * @nonce: Nonce for counter mode (16 bytes) 63346981Scy * @data: Data to encrypt in-place 64346981Scy * @data_len: Length of data in bytes 65346981Scy * Returns: 0 on success, -1 on failure 66346981Scy */ 67346981Scyint aes_128_ctr_encrypt(const u8 *key, const u8 *nonce, 68346981Scy u8 *data, size_t data_len) 69346981Scy{ 70346981Scy return aes_ctr_encrypt(key, 16, nonce, data, data_len); 71346981Scy} 72