/** * * \file * * \brief SAM Advanced Encryption Standard driver. * * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. * * \asf_license_start * * \page License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 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 name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * 4. This software may only be redistributed and used in connection with an * Atmel microcontroller product. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * \asf_license_stop * */ /* * Support and FAQ: visit Atmel Support */ #ifndef AES_H_INCLUDED #define AES_H_INCLUDED #ifdef __cplusplus extern "C" { #endif /** * \defgroup asfdoc_sam0_drivers_aes_group SAM Advanced Encryption Standard (AES) Driver * * This driver for Atmel® | SMART ARM®-based microcontrollers provides an interface for the configuration * and management of the device's Advanced Encryption Standard functionality. The following * driver API modes are covered by this manual: * * - Polled APIs * - Callback APIs * * The Advanced Encryption Standard module supports all five confidentiality * modes of operation for symmetrical key block cipher algorithms (as specified * in the NIST Special Publication 800-38A Recommendation): * - Electronic Code Book (ECB) * - Cipher Block Chaining (CBC) * - Output Feedback (OFB) * - Cipher Feedback (CFB) * - Counter (CTR) * * The following peripheral is used by this module: * - AES (Advanced Encryption Standard) * * The following devices can use this module: * - Atmel | SMART SAM L21 * - Atmel | SMART SAM L22 * * The outline of this documentation is as follows: * - \ref asfdoc_sam0_drivers_aes_prerequisites * - \ref asfdoc_sam0_drivers_aes_module_overview * - \ref asfdoc_sam0_drivers_aes_special_considerations * - \ref asfdoc_sam0_drivers_aes_extra_info * - \ref asfdoc_sam0_drivers_aes_examples * - \ref asfdoc_sam0_drivers_aes_api_overview * * * \section asfdoc_sam0_drivers_aes_prerequisites Prerequisites * * There are no prerequisites for this module. * * * \section asfdoc_sam0_drivers_aes_module_overview Module Overview * * The Advanced Encryption Standard (AES) is a specification for the encryption of * electronic data established by the U.S. National Institute of Standards and * Technology (NIST) in 2001. It is compliant with the American FIPS * (Federal Information Processing Standard) Publication 197 specification. * * The AES supports all five confidentiality modes of operation for symmetrical * key block cipher algorithms (as specified in the NIST Special Publication * 800-38A Recommendation): * - Electronic Code Book (ECB) * - Cipher Block Chaining (CBC) * - Output Feedback (OFB) * - Cipher Feedback (CFB) * - Counter (CTR) * * Data transfers both to and from the AES module can occur using the peripheral * DMA controller channels, thus minimizing processor intervention for * large data buffer transfers. * * As soon as the initialization vector, the input data and the key are * configured, the encryption/decryption process may be started. Once the * process has completed the encrypted/decrypted data can be read out via * registers or through DMA channels. * * \subsection asfdoc_sam0_drivers_aes_module_overview_en_de Encryption and Decryption * The AES is capable of using cryptographic keys of 128/192/256 bits to * encrypt and decrypt data in blocks of 128 bits. In Cipher Feedback Mode (CFB), * five data sizes are possible (8, 16, 32, 64, or 128 bits). * * The input to the encryption processes of the CBC, CFB, and OFB modes includes, * in addition to the plaintext, a 128-bit data block called the Initialization * Vector (IV). The Initialization Vector is used in the initial step in the * encryption of a message and in the corresponding decryption of the message. * * There are three encryption/decryption start modes: * - Manual Mode: Start encryption/decryption manually * - Auto Start Mode: Once the correct number of input data registers is written, * processing is automatically started, DMA operation uses this mode * - Last Output Data Mode (LOD): This mode is used to generate message * authentication code (MAC) on data in CCM mode of operation * * \subsection asfdoc_sam0_drivers_aes_module_overview_hardware_countermeasures Hardware Countermeasures * The AES module features four types of hardware countermeasures that are * useful for protecting data against differential power analysis attacks: * - Type 1: Randomly add one cycle to data processing * - Type 2: Randomly add one cycle to data processing (other version) * - Type 3: Add a random number of clock cycles to data processing, subject to * a maximum of 11/13/15 clock cycles for key sizes of 128/192/256 bits * - Type 4: Add random spurious power consumption during data processing * * \subsection asfdoc_sam0_drivers_aes_module_overview_gcm Galois Counter Mode (GCM) * GCM is comprised of the AES engine in CTR mode along with a universal hash * function (GHASH engine) that is defined over a binary Galois field to produce * a message authentication tag. The GHASH engine processes data packets after the * AES operation. GCM provides assurance of the confidentiality of data through the * AES Counter mode of operation for DRAFT 920 encryption. Authenticity of the * confidential data is assured through the GHASH engine. Refer to the NIST Special * Publication 800-38D Recommendation for more complete information. * * \section asfdoc_sam0_drivers_aes_special_considerations Special Considerations * * There are no special considerations for this module. * * \section asfdoc_sam0_drivers_aes_extra_info Extra Information * * For extra information, see \ref asfdoc_sam0_drivers_aes_extra. This includes: * - \ref asfdoc_sam0_drivers_aes_extra_acronyms * - \ref asfdoc_sam0_drivers_aes_extra_dependencies * - \ref asfdoc_sam0_drivers_aes_extra_errata * - \ref asfdoc_sam0_drivers_aes_extra_history * * \section asfdoc_sam0_drivers_aes_examples Examples * * For a list of examples related to this driver, see * \ref asfdoc_sam0_drivers_aes_exqsg. * * * \section asfdoc_sam0_drivers_aes_api_overview API Overview * @{ */ #include #include #ifdef __cplusplus extern "C" { #endif /** AES processing mode. */ enum aes_encrypt_mode { AES_DECRYPTION = 0, /**< Decryption of data will be performed */ AES_ENCRYPTION, /**< Encryption of data will be performed */ }; /** AES cryptographic key size. */ enum aes_key_size { AES_KEY_SIZE_128 = 0, /**< AES key size is 128-bit */ AES_KEY_SIZE_192, /**< AES key size is 192-bit */ AES_KEY_SIZE_256, /**< AES key size is 256-bit */ }; /** AES start mode. */ enum aes_start_mode { AES_MANUAL_START = 0, /**< Manual start mode */ AES_AUTO_START, /**< Auto start mode */ }; /** AES operation mode. */ enum aes_operation_mode { AES_ECB_MODE = 0, /**< Electronic Codebook (ECB) */ AES_CBC_MODE, /**< Cipher Block Chaining (CBC) */ AES_OFB_MODE, /**< Output Feedback (OFB) */ AES_CFB_MODE, /**< Cipher Feedback (CFB) */ AES_CTR_MODE, /**< Counter (CTR) */ AES_CCM_MODE, /**< Counter (CCM) */ AES_GCM_MODE, /**< Galois Counter Mode (GCM) */ }; /** AES Cipher FeedBack (CFB) size. */ enum aes_cfb_size { AES_CFB_SIZE_128 = 0, /**< Cipher feedback data size is 128-bit */ AES_CFB_SIZE_64, /**< Cipher feedback data size is 64-bit */ AES_CFB_SIZE_32, /**< Cipher feedback data size is 32-bit */ AES_CFB_SIZE_16, /**< Cipher feedback data size is 16-bit */ AES_CFB_SIZE_8, /**< Cipher feedback data size is 8-bit */ }; /** AES countermeasure type */ enum aes_countermeature_type { AES_COUNTERMEASURE_TYPE_disabled = 0x0, /**< Countermeasure type all disabled */ AES_COUNTERMEASURE_TYPE_1 = 0x01, /**< Countermeasure1 enabled */ AES_COUNTERMEASURE_TYPE_2 = 0x02, /**< Countermeasure2 enabled */ AES_COUNTERMEASURE_TYPE_3 = 0x04, /**< Countermeasure3 enabled */ AES_COUNTERMEASURE_TYPE_4 = 0x08, /**< Countermeasure4 enabled */ AES_COUNTERMEASURE_TYPE_ALL = 0x0F, /**< Countermeasure type all enabled */ }; /** * \name Module Status Flags * * AES status flags, returned by \ref aes_get_status() and cleared by * \ref aes_clear_status(). * * @{ */ /** AES encryption complete. */ #define AES_ENCRYPTION_COMPLETE (1UL << 0) /** AES GF multiplication complete. */ #define AES_GF_MULTI_COMPLETE (1UL << 1) /** @} */ /** AES Configuration structure. */ struct aes_config { /** AES data mode (decryption or encryption) */ enum aes_encrypt_mode encrypt_mode; /** AES key size */ enum aes_key_size key_size; /** Start mode */ enum aes_start_mode start_mode; /** AES cipher operation mode*/ enum aes_operation_mode opmode; /** Cipher feedback data size */ enum aes_cfb_size cfb_size; /** Countermeasure type */ enum aes_countermeature_type ctype; /** Enable XOR key */ bool enable_xor_key; /** Enable key generation */ bool enable_key_gen; /** Last output data mode enable/disable */ bool lod; }; #if !defined(__DOXYGEN__) /** * \brief Device structure. */ struct aes_module { /** AES hardware module. */ Aes *hw; /** AES cipher operation mode.*/ enum aes_operation_mode opmode; /** AES key size. */ enum aes_key_size key_size; /** Cipher feedback data size. */ enum aes_cfb_size cfb_size; }; #endif /** * \name Configuration and Initialization * @{ */ void aes_get_config_defaults(struct aes_config *const config); void aes_set_config(struct aes_module *const module, Aes *const hw, struct aes_config *const config); void aes_init(struct aes_module *const module, Aes *const hw, struct aes_config *const config); /** @} */ /** * \name Start, Enable, and Write * @{ */ /** * \brief Start a manual encryption/decryption process. * * \param[in] module Pointer to the AES software instance struct */ static inline void aes_start(struct aes_module *const module) { Assert(module); Assert(module->hw); module->hw->CTRLB.reg |= AES_CTRLB_START; } /** * \brief Notifies the module that the next input data block * is the beginning of a new message. * * \param[in] module Pointer to the AES software instance struct * */ static inline void aes_set_new_message(struct aes_module *const module) { Assert(module); Assert(module->hw); module->hw->CTRLB.reg |= AES_CTRLB_NEWMSG; } /** * \brief Clear the indication of the beginning for a new message * * \param[in] module Pointer to the AES software instance struct * */ static inline void aes_clear_new_message(struct aes_module *const module) { Assert(module); Assert(module->hw); module->hw->CTRLB.reg &= ~AES_CTRLB_NEWMSG; } void aes_enable(struct aes_module *const module); void aes_disable(struct aes_module *const module); void aes_write_key(struct aes_module *const module, const uint32_t *key); void aes_write_init_vector(struct aes_module *const module, const uint32_t *vector); void aes_write_input_data(struct aes_module *const module, const uint32_t *p_input_data_buffer); void aes_read_output_data(struct aes_module *const module, uint32_t *p_output_data_buffer); /** * \brief Write AES random seed. * * \param[in] module Pointer to the AES software instance struct * \param[in] seed Seed for the random number generator */ static inline void aes_write_random_seed(struct aes_module *const module, uint32_t seed) { Assert(module); Assert(module->hw); module->hw->RANDSEED.reg = seed; } /** @} */ /** * \name Status Management * @{ */ /** * \brief Retrieves the current module status. * * Retrieves the status of the module, giving overall state information. * * \param[in] module Pointer to the AES software instance struct * * \retval AES_ENCRYPTION_COMPLETE AES encryption complete * \retval AES_GF_MULTI_COMPLETE AES GF multiplication complete */ static inline uint32_t aes_get_status(struct aes_module *const module) { /* Sanity check arguments */ Assert(module); Assert(module->hw); uint32_t int_flags = module->hw->INTFLAG.reg; uint32_t status_flags = 0; if (int_flags & AES_INTFLAG_ENCCMP) { status_flags |= AES_ENCRYPTION_COMPLETE; } if (int_flags & AES_INTFLAG_GFMCMP) { status_flags |= AES_GF_MULTI_COMPLETE; } return status_flags; } /** * \brief Clears a module status flag. * * Clears the given status flag of the module. * * \param[in] module Pointer to the AES software instance struct * \param[in] status_flags Bitmask flags to clear */ static inline void aes_clear_status( struct aes_module *const module, const uint32_t status_flags) { /* Sanity check arguments */ Assert(module); Assert(module->hw); uint32_t int_flags = 0; if (status_flags & AES_ENCRYPTION_COMPLETE) { int_flags |= AES_INTENCLR_ENCCMP; } if (status_flags & AES_GF_MULTI_COMPLETE) { int_flags |= AES_INTENCLR_GFMCMP; } /* Clear interrupt flag */ module->hw->INTFLAG.reg = int_flags; } /** @} */ /** * \name Galois Counter Mode * @{ */ /** * \brief Get the AES GCM Hash Value. * * \param[in] module Pointer to the AES software instance struct * \param[in] id Index into the GHASH array (range 0 to 3) * * \return The content of the GHASHRx[x = 0...3] value. */ static inline uint32_t aes_gcm_read_ghash(struct aes_module *const module, uint32_t id) { Assert(module); Assert(module->hw); return module->hw->GHASH[id].reg; } /** * \brief Set the AES GCM Hash Value. * * \param[in] module Pointer to the AES software instance struct * \param[in] id Index into the GHASHx array (range 0 to 3) * \param[in] ghash GCM hash value */ static inline void aes_gcm_write_ghash(struct aes_module *const module, uint32_t id,uint32_t ghash) { Assert(module); Assert(module->hw); module->hw->GHASH[id].reg = ghash; } /** * \brief Get AES GCM Hash key. * * \param[in] module Pointer to the AES software instance struct * \param[in] id Index into the Hash key array (range 0 to 3) * * \return The contents of the HASHKEYx[x = 0...3] specified. */ static inline uint32_t aes_gcm_read_hash_key(struct aes_module *const module, uint32_t id) { Assert(module); Assert(module->hw); return module->hw->HASHKEY[id].reg; } /** * \brief Set the AES GCM Hash key. * * \param[in] module Pointer to the AES software instance struct * \param[in] id Index into the Hash key array (range 0 to 3) * \param[in] key GCM Hash key */ static inline void aes_gcm_write_hash_key(struct aes_module *const module, uint32_t id, uint32_t key) { Assert(module); Assert(module->hw); module->hw->HASHKEY[id].reg = key; } /** * \brief Get the AES GCM cipher length. * * \param[in] module Pointer to the AES software instance struct * * \return The contents of the HASHKEYx[x = 0...3] specified. */ static inline uint32_t aes_gcm_read_cipher_len(struct aes_module *const module) { Assert(module); Assert(module->hw); return (module->hw->CIPLEN.reg); } /** * \brief Set the AES GCM cipher length. * * \param[in] module Pointer to the AES software instance struct * \param[in] len Cipher length */ static inline void aes_gcm_write_cipher_len(struct aes_module *const module, uint32_t len) { Assert(module); Assert(module->hw); module->hw->CIPLEN.reg = len; } /** * \brief Set GCM end of input message status. * * \param[in] module Pointer to the AES software instance struct */ static inline void aes_gcm_set_end_message_status(struct aes_module *const module) { Assert(module); Assert(module->hw); module->hw->CTRLB.reg |= AES_CTRLB_EOM; } /** * \brief Clear GCM end of input message status. * * \param[in] module Pointer to the AES software instance struct */ static inline void aes_gcm_clear_end_message_status(struct aes_module *const module) { Assert(module); Assert(module->hw); module->hw->CTRLB.reg &= ~AES_CTRLB_EOM; } /** * \brief Set GF multiplication of GCM mode. * * \param[in] module Pointer to the AES software instance struct */ static inline void aes_gcm_set_gf_multiplication(struct aes_module *const module) { Assert(module); Assert(module->hw); module->hw->CTRLB.reg |= AES_CTRLB_GFMUL; } /** @} */ #ifdef __cplusplus } #endif /** @} */ /** * \page asfdoc_sam0_drivers_aes_extra Extra Information for Advanced Encryption Standard * * \section asfdoc_sam0_drivers_aes_extra_acronyms Acronyms * Below is a table listing the acronyms used in this module, along with their * intended meanings. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
AcronymDefinition
AADAdditional Authenticated Data
CBCCipher Block Chaining
CFBCipher Feedback
CTR Counter
DMADirect Memory Access
DMACDMA Controller
ECBElectronic Codebook
GCMGalois Counter Mode
OFBOutput Feedback
QSGQuick Start Guide
* * * \section asfdoc_sam0_drivers_aes_extra_dependencies Dependencies * This driver has the following dependencies: * * - None * * * \section asfdoc_sam0_drivers_aes_extra_errata Errata * There are no errata related to this driver. * * * \section asfdoc_sam0_drivers_aes_extra_history Module History * An overview of the module history is presented in the table below, with * details on the enhancements and fixes made to the module since its first * release. The current version of this corresponds to the newest version in * the table. * * * * * * * * *
Changelog
Initial release
*/ /** * \page asfdoc_sam0_drivers_aes_exqsg Examples for Advanced Encryption Standard * * This is a list of the available Quick Start Guides (QSGs) and example * applications for \ref asfdoc_sam0_drivers_aes_group. QSGs are simple examples with * step-by-step instructions to configure and use this driver in a selection of * use cases. Note that a QSG can be compiled as a standalone application or be * added to the user application. * * - \subpage asfdoc_sam0_aes_basic_use_case * - \subpage asfdoc_sam0_aes_callback_use_case * - \subpage asfdoc_sam0_aes_dma_use_case * * \page asfdoc_sam0_drivers_aes_document_revision_history Document Revision History * * * * * * * * * * * * * * *
Doc. Rev. * Date * Comments *
42445B12/2015Added support for SAM L22
42445A06/2015Initial release
* */ #ifdef __cplusplus } #endif #endif /* AES_H_INCLUDED */