aboutsummaryrefslogblamecommitdiffstatshomepage
path: root/include/aes/mode.h
blob: 7650ec0905b3d4400b23c35b3dc48049e979adad (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                       

                   




                  








              
 



                                                                                           
   
                              
 
                                                                           

 



                                                                                            
   
                              
 
                                                                            

 





                                                                                           
   
                              

                               

                                                                                  

 





                                                                                           
   
                              

                               

                                                                                       



                                     





                                                                                           
   
                              


                                                               
                                                                                      

 





                                                                                           
   
                              

                               

                                                                                       



                                     





                                                                                           
   
                              

                               
                                                                                                     



                                                           





                                                                                           
   


                               

                                                                      

 





                                                                                           
   
                              

                               

                                                                                      



                                                                    





                                                                                           
   


                               

                                                                      
 



                  
/**
 * \file
 * \author Egor Tensin <Egor.Tensin@gmail.com>
 * \date 2015
 * \copyright This file is licensed under the terms of the MIT License.
 *            See LICENSE.txt for details.
 */

#pragma once

#include <assert.h>

#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) \
{ \
    assert(encryption_keys); \
    assert(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) \
{ \
    assert(encryption_keys); \
    assert(next_init_vector); \
\
    return aesni_## prefix ##_encrypt_block_CTR( \
        ciphertext, encryption_keys, init_vector, next_init_vector); \
}

#ifdef __cplusplus
}
#endif