/*
* File:        RijndaelCBCMAC.h
*
* Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
* See included license file for license details.
*/
#if !defined(_RijndaelCBCMAC_h_)
#define _RijndaelCBCMAC_h_

#include "AESKey.h"
#include <string.h>

/*!
* \brief Class to compute CBC-MAC using the AES/Rijndael cipher.
*
* Currently only supports 128-bit keys and block sizes.
*/
class RijndaelCBCMAC
{
public:
       enum
       {
               BLOCK_SIZE = 16 //!< Number of bytes in one cipher block.
       };

       //! The cipher block data type.
       typedef uint8_t block_t[BLOCK_SIZE];

public:
       //! \brief Default constructor.
       //!
       //! The key and IV are both set to zero.
       RijndaelCBCMAC() {}

       //! \brief Constructor.
       RijndaelCBCMAC(const AESKey<128> & key, const uint8_t * iv=0);

       //! \brief Process data.
       void update(const uint8_t * data, unsigned length);

       //! \brief Signal that all data has been processed.
       void finalize();

       //! \brief Returns a reference to the current MAC value.
       const block_t & getMAC() const { return m_mac; }

       //! \brief Assignment operator.
       RijndaelCBCMAC & operator = (const RijndaelCBCMAC & other)
       {
               m_key = other.m_key;
               memcpy(m_mac, other.m_mac, sizeof(m_mac));
               return *this;
       }

protected:
       AESKey<128> m_key;      //!< 128-bit key to use for the CBC-MAC.
       block_t m_mac;  //!< Current message authentication code value.

       void updateOneBlock(const uint8_t * data);
};

#endif // _RijndaelCBCMAC_h_