18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * AES-128 CTR 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 7c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "aes.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "aes_wrap.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * aes_128_ctr_encrypt - AES-128 CTR mode encryption 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @key: Key for encryption (16 bytes) 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @nonce: Nonce for counter mode (16 bytes) 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @data: Data to encrypt in-place 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @data_len: Length of data in bytes 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint aes_128_ctr_encrypt(const u8 *key, const u8 *nonce, 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *data, size_t data_len) 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *ctx; 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t j, len, left = data_len; 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos = data; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx = aes_encrypt_init(key, 16); 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctx == NULL) 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(counter, nonce, AES_BLOCK_SIZE); 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (left > 0) { 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt aes_encrypt(ctx, counter, buf); 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = (left < AES_BLOCK_SIZE) ? left : AES_BLOCK_SIZE; 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (j = 0; j < len; j++) 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos[j] ^= buf[j]; 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += len; 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt left -= len; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt counter[i]++; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (counter[i]) 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt aes_encrypt_deinit(ctx); 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 56