/* * 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 /*! * \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_