1 /* 2 * AES-128 CTR 3 * 4 * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> 5 * 6 * This software may be distributed under the terms of the BSD license. 7 * See README for more details. 8 */ 9 10 #include "includes.h" 11 12 #include "common.h" 13 #include "aes.h" 14 #include "aes_wrap.h" 15 16 /** 17 * aes_128_ctr_encrypt - AES-128 CTR mode encryption 18 * @key: Key for encryption (16 bytes) 19 * @nonce: Nonce for counter mode (16 bytes) 20 * @data: Data to encrypt in-place 21 * @data_len: Length of data in bytes 22 * Returns: 0 on success, -1 on failure 23 */ 24 int aes_128_ctr_encrypt(const u8 *key, const u8 *nonce, 25 u8 *data, size_t data_len) 26 { 27 void *ctx; 28 size_t j, len, left = data_len; 29 int i; 30 u8 *pos = data; 31 u8 counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; 32 33 ctx = aes_encrypt_init(key, 16); 34 if (ctx == NULL) 35 return -1; 36 os_memcpy(counter, nonce, AES_BLOCK_SIZE); 37 38 while (left > 0) { 39 aes_encrypt(ctx, counter, buf); 40 41 len = (left < AES_BLOCK_SIZE) ? left : AES_BLOCK_SIZE; 42 for (j = 0; j < len; j++) 43 pos[j] ^= buf[j]; 44 pos += len; 45 left -= len; 46 47 for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { 48 counter[i]++; 49 if (counter[i]) 50 break; 51 } 52 } 53 aes_encrypt_deinit(ctx); 54 return 0; 55 } 56