
/*
 -------------------------------------------------------------------------
 Copyright (c) 2001, Dr Brian Gladman <brg@gladman.uk.net>, Worcester, UK.
 All rights reserved.

 TERMS

 Redistribution and use in source and binary forms, with or without 
 modification, are permitted subject to the following conditions:

  1. Redistributions of source code must retain the above copyright 
     notice, this list of conditions and the following disclaimer. 

  2. Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in the 
     documentation and/or other materials provided with the distribution. 

  3. The copyright holder's name must not be used to endorse or promote 
     any products derived from this software without his specific prior 
     written permission. 

 This software is provided 'as is' with no express or implied warranties 
 of correctness or fitness for purpose.
 -------------------------------------------------------------------------
 Issue Date: 21/01/2002

 This file contains the definitions required to use AES (Rijndael) in C++.
*/

#ifndef _AESCPP_H
#define _AESCPP_H

#include "aes.h"

class AESencrypt
{   aes_encrypt_ctx cx[1];
public:
    AESencrypt(void)    
            { };
#ifdef  AES_128
    AESencrypt(const unsigned char in_key[])
            { aes_encrypt_key128(in_key, cx); }
    void key128(const unsigned char in_key[])
            { aes_encrypt_key128(in_key, cx); }
#endif
#ifdef  AES_192
    void key192(const unsigned char in_key[])
            { aes_encrypt_key192(in_key, cx); }
#endif
#ifdef  AES_256
    void key256(const unsigned char in_key[])
            { aes_encrypt_key256(in_key, cx); }
#endif
#ifdef	AES_VAR
    void key(const unsigned char in_key[], int key_len)
            { aes_encrypt_key(in_key, key_len, cx); }
#endif
    void encrypt(const unsigned char in_blk[], unsigned char out_blk[]) const
            { aes_encrypt(in_blk, out_blk, cx);  }
};

class AESdecrypt
{   aes_decrypt_ctx cx[1];
public:
    AESdecrypt(void)    
            { };
#ifdef  AES_128
    AESdecrypt(const unsigned char in_key[])
            { aes_decrypt_key128(in_key, cx); }
    void key128(const unsigned char in_key[])
            { aes_decrypt_key128(in_key, cx); }
#endif
#ifdef  AES_192
    void key192(const unsigned char in_key[])
            { aes_decrypt_key192(in_key, cx); }
#endif
#ifdef  AES_256
    void key256(const unsigned char in_key[])
            { aes_decrypt_key256(in_key, cx); }
#endif
#ifdef	AES_VAR
    void key(const unsigned char in_key[], int key_len)
            { aes_decrypt_key(in_key, key_len, cx); }
#endif
    void decrypt(const unsigned char in_blk[], unsigned char out_blk[]) const
            { aes_decrypt(in_blk, out_blk, cx);  }
};

#endif
