]>
Commit | Line | Data |
---|---|---|
4c9e03e0 JB |
1 | /* |
2 | * AES-128 CTR | |
3 | * | |
4 | * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> | |
5 | * | |
0f3d578e JM |
6 | * This software may be distributed under the terms of the BSD license. |
7 | * See README for more details. | |
4c9e03e0 JB |
8 | */ |
9 | ||
10 | #include "includes.h" | |
11 | ||
12 | #include "common.h" | |
1ba787b9 | 13 | #include "aes.h" |
8e2c104f | 14 | #include "aes_wrap.h" |
4c9e03e0 JB |
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; | |
1ba787b9 | 31 | u8 counter[AES_BLOCK_SIZE], buf[AES_BLOCK_SIZE]; |
4c9e03e0 JB |
32 | |
33 | ctx = aes_encrypt_init(key, 16); | |
34 | if (ctx == NULL) | |
35 | return -1; | |
1ba787b9 | 36 | os_memcpy(counter, nonce, AES_BLOCK_SIZE); |
4c9e03e0 JB |
37 | |
38 | while (left > 0) { | |
39 | aes_encrypt(ctx, counter, buf); | |
40 | ||
1ba787b9 | 41 | len = (left < AES_BLOCK_SIZE) ? left : AES_BLOCK_SIZE; |
4c9e03e0 JB |
42 | for (j = 0; j < len; j++) |
43 | pos[j] ^= buf[j]; | |
44 | pos += len; | |
45 | left -= len; | |
46 | ||
1ba787b9 | 47 | for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { |
4c9e03e0 JB |
48 | counter[i]++; |
49 | if (counter[i]) | |
50 | break; | |
51 | } | |
52 | } | |
53 | aes_encrypt_deinit(ctx); | |
54 | return 0; | |
55 | } |