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