1 /* 2 * AES-128 CBC 3 * 4 * Copyright (c) 2003-2007, Jouni Malinen <j (at) 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_cbc_encrypt - AES-128 CBC encryption 18 * @key: Encryption key 19 * @iv: Encryption IV for CBC mode (16 bytes) 20 * @data: Data to encrypt in-place 21 * @data_len: Length of data in bytes (must be divisible by 16) 22 * Returns: 0 on success, -1 on failure 23 */ 24 int aes_128_cbc_encrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len) 25 { 26 void *ctx; 27 u8 cbc[AES_BLOCK_SIZE]; 28 u8 *pos = data; 29 int i, j, blocks; 30 31 if (TEST_FAIL()) 32 return -1; 33 34 ctx = aes_encrypt_init(key, 16); 35 if (ctx == NULL) 36 return -1; 37 os_memcpy(cbc, iv, AES_BLOCK_SIZE); 38 39 blocks = data_len / AES_BLOCK_SIZE; 40 for (i = 0; i < blocks; i++) { 41 for (j = 0; j < AES_BLOCK_SIZE; j++) 42 cbc[j] ^= pos[j]; 43 aes_encrypt(ctx, cbc, cbc); 44 os_memcpy(pos, cbc, AES_BLOCK_SIZE); 45 pos += AES_BLOCK_SIZE; 46 } 47 aes_encrypt_deinit(ctx); 48 return 0; 49 } 50 51 52 /** 53 * aes_128_cbc_decrypt - AES-128 CBC decryption 54 * @key: Decryption key 55 * @iv: Decryption IV for CBC mode (16 bytes) 56 * @data: Data to decrypt in-place 57 * @data_len: Length of data in bytes (must be divisible by 16) 58 * Returns: 0 on success, -1 on failure 59 */ 60 int aes_128_cbc_decrypt(const u8 *key, const u8 *iv, u8 *data, size_t data_len) 61 { 62 void *ctx; 63 u8 cbc[AES_BLOCK_SIZE], tmp[AES_BLOCK_SIZE]; 64 u8 *pos = data; 65 int i, j, blocks; 66 67 if (TEST_FAIL()) 68 return -1; 69 70 ctx = aes_decrypt_init(key, 16); 71 if (ctx == NULL) 72 return -1; 73 os_memcpy(cbc, iv, AES_BLOCK_SIZE); 74 75 blocks = data_len / AES_BLOCK_SIZE; 76 for (i = 0; i < blocks; i++) { 77 os_memcpy(tmp, pos, AES_BLOCK_SIZE); 78 aes_decrypt(ctx, pos, pos); 79 for (j = 0; j < AES_BLOCK_SIZE; j++) 80 pos[j] ^= cbc[j]; 81 os_memcpy(cbc, tmp, AES_BLOCK_SIZE); 82 pos += AES_BLOCK_SIZE; 83 } 84 aes_decrypt_deinit(ctx); 85 return 0; 86 } 87