/** * \file * \author Egor Tensin * \date 2015 * \copyright This file is licensed under the terms of the MIT License. * See LICENSE.txt for details. */ #pragma once #include #ifdef __cplusplus extern "C" { #endif typedef enum { AESNI_ECB, AESNI_CBC, AESNI_CFB, AESNI_OFB, AESNI_CTR, } AesNI_Mode; #define AESNI_ENCRYPT_BLOCK_ECB(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_encrypt_block_ECB( \ AesNI_## prefix ##_Block plaintext, \ const AesNI_## prefix ##_RoundKeys* encryption_keys) \ { \ assert(encryption_keys); \ \ return aesni_## prefix ##_encrypt_block_(plaintext, encryption_keys); \ } #define AESNI_DECRYPT_BLOCK_ECB(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_decrypt_block_ECB( \ AesNI_## prefix ##_Block ciphertext, \ const AesNI_## prefix ##_RoundKeys* decryption_keys) \ { \ assert(decryption_keys); \ \ return aesni_## prefix ##_decrypt_block_(ciphertext, decryption_keys); \ } #define AESNI_ENCRYPT_BLOCK_CBC(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_encrypt_block_CBC( \ AesNI_## prefix ##_Block plaintext, \ const AesNI_## prefix ##_RoundKeys* encryption_keys, \ AesNI_## prefix ##_Block init_vector, \ AesNI_## prefix ##_Block* next_init_vector) \ { \ assert(encryption_keys); \ assert(next_init_vector); \ \ return *next_init_vector = aesni_## prefix ##_encrypt_block_( \ aesni_## prefix ##_xor_blocks(plaintext, init_vector), encryption_keys); \ } #define AESNI_DECRYPT_BLOCK_CBC(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_decrypt_block_CBC( \ AesNI_## prefix ##_Block ciphertext, \ const AesNI_## prefix ##_RoundKeys* decryption_keys, \ AesNI_## prefix ##_Block init_vector, \ AesNI_## prefix ##_Block* next_init_vector) \ { \ assert(decryption_keys); \ assert(next_init_vector); \ \ AesNI_## prefix ##_Block plaintext = aesni_## prefix ##_xor_blocks( \ aesni_## prefix ##_decrypt_block_(ciphertext, decryption_keys), init_vector); \ *next_init_vector = ciphertext; \ return plaintext; \ } #define AESNI_ENCRYPT_BLOCK_CFB(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_encrypt_block_CFB( \ AesNI_## prefix ##_Block plaintext, \ const AesNI_## prefix ##_RoundKeys* encryption_keys, \ AesNI_## prefix ##_Block init_vector, \ AesNI_## prefix ##_Block* next_init_vector) \ { \ assert(encryption_keys); \ assert(next_init_vector); \ \ return *next_init_vector = aesni_## prefix ##_xor_blocks( \ aesni_## prefix ##_encrypt_block_(init_vector, encryption_keys), plaintext); \ } #define AESNI_DECRYPT_BLOCK_CFB(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_decrypt_block_CFB( \ AesNI_## prefix ##_Block ciphertext, \ const AesNI_## prefix ##_RoundKeys* encryption_keys, \ AesNI_## prefix ##_Block init_vector, \ AesNI_## prefix ##_Block* next_init_vector) \ { \ assert(encryption_keys); \ assert(next_init_vector); \ \ AesNI_## prefix ##_Block plaintext = aesni_## prefix ##_xor_blocks( \ aesni_## prefix ##_encrypt_block_(init_vector, encryption_keys), ciphertext); \ *next_init_vector = ciphertext; \ return plaintext; \ } #define AESNI_ENCRYPT_BLOCK_OFB(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_encrypt_block_OFB( \ AesNI_## prefix ##_Block plaintext, \ const AesNI_## prefix ##_RoundKeys* encryption_keys, \ AesNI_## prefix ##_Block init_vector, \ AesNI_## prefix ##_Block* next_init_vector) \ { \ assert(encryption_keys); \ assert(next_init_vector); \ \ AesNI_## prefix ##_Block tmp = aesni_## prefix ##_encrypt_block_(init_vector, encryption_keys); \ *next_init_vector = tmp; \ return aesni_## prefix ##_xor_blocks(tmp, plaintext); \ } #define AESNI_DECRYPT_BLOCK_OFB(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_decrypt_block_OFB( \ AesNI_## prefix ##_Block ciphertext, \ const AesNI_## prefix ##_RoundKeys* encryption_keys, \ AesNI_## prefix ##_Block init_vector, \ AesNI_## prefix ##_Block* next_init_vector) \ { \ return aesni_## prefix ##_encrypt_block_OFB( \ ciphertext, encryption_keys, init_vector, next_init_vector); \ } #define AESNI_ENCRYPT_BLOCK_CTR(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_encrypt_block_CTR( \ AesNI_## prefix ##_Block plaintext, \ const AesNI_## prefix ##_RoundKeys* encryption_keys, \ AesNI_## prefix ##_Block init_vector, \ AesNI_## prefix ##_Block* next_init_vector) \ { \ assert(encryption_keys); \ assert(next_init_vector); \ \ AesNI_## prefix ##_Block ciphertext = aesni_## prefix ##_xor_blocks( \ plaintext, aesni_## prefix ##_encrypt_block_(init_vector, encryption_keys)); \ *next_init_vector = aesni_## prefix ##_inc_block(init_vector); \ return ciphertext; \ } #define AESNI_DECRYPT_BLOCK_CTR(prefix) \ static __inline AesNI_## prefix ##_Block __fastcall aesni_## prefix ##_decrypt_block_CTR( \ AesNI_## prefix ##_Block ciphertext, \ const AesNI_## prefix ##_RoundKeys* encryption_keys, \ AesNI_## prefix ##_Block init_vector, \ AesNI_## prefix ##_Block* next_init_vector) \ { \ return aesni_## prefix ##_encrypt_block_CTR( \ ciphertext, encryption_keys, init_vector, next_init_vector); \ } #ifdef __cplusplus } #endif