at86rf2xx_aes.h File Reference

Interface of the at86rf2xx security module (AES) More...

Detailed Description

Interface of the at86rf2xx security module (AES)

The extended feature set of at86rf2xx transceivers comprises a hardware implementation of AES. There are two supported block cipher modes, ECB and CBC.

Author
Fabian Hüßler fabia.nosp@m.n.hu.nosp@m.essle.nosp@m.r@ov.nosp@m.gu.de

Definition in file at86rf2xx_aes.h.

#include "at86rf2xx.h"
+ Include dependency graph for at86rf2xx_aes.h:

Go to the source code of this file.

Typedefs

typedef uint8_t aes_block_t[AT86RF2XX_AES_BLOCK_SIZE]
 An AES block. More...
 

Functions

void at86rf2xx_aes_key_read_encrypt (at86rf2xx_t *dev, uint8_t key[AT86RF2XX_AES_KEY_LENGTH])
 Read the AES key used for encryption. More...
 
void at86rf2xx_aes_key_write_encrypt (at86rf2xx_t *dev, const uint8_t key[AT86RF2XX_AES_KEY_LENGTH])
 Write the AES key used for encryption. More...
 
void at86rf2xx_aes_key_read_decrypt (at86rf2xx_t *dev, uint8_t key[AT86RF2XX_AES_KEY_LENGTH])
 Read the AES key used for decryption. More...
 
void at86rf2xx_aes_key_write_decrypt (at86rf2xx_t *dev, const uint8_t key[AT86RF2XX_AES_KEY_LENGTH])
 Write the AES key used for decryption. More...
 
void at86rf2xx_aes_ecb_encrypt (at86rf2xx_t *dev, aes_block_t *cipher, uint8_t key[AT86RF2XX_AES_BLOCK_SIZE], const aes_block_t *plain, uint8_t nblocks)
 Perform AES algorithm and encrypt data blocks in plain to cipher data blocks, using ECB mode. More...
 
void at86rf2xx_aes_ecb_decrypt (at86rf2xx_t *dev, aes_block_t *plain, uint8_t key[AT86RF2XX_AES_BLOCK_SIZE], const aes_block_t *cipher, uint8_t nblocks)
 Perform AES algorithm and decrypt data blocks in cipher to plain data blocks, using ECB mode. More...
 
void at86rf2xx_aes_cbc_encrypt (at86rf2xx_t *dev, aes_block_t *cipher, uint8_t key[AT86RF2XX_AES_BLOCK_SIZE], uint8_t iv[AT86RF2XX_AES_BLOCK_SIZE], const aes_block_t *plain, uint8_t nblocks)
 Perform AES algorithm and encrypt data blocks in plain to cipher data blocks, using CBC mode. More...
 
void at86rf2xx_aes_cbc_decrypt (at86rf2xx_t *dev, aes_block_t *plain, uint8_t key[AT86RF2XX_AES_BLOCK_SIZE], uint8_t iv[AT86RF2XX_AES_BLOCK_SIZE], const aes_block_t *cipher, uint8_t nblocks)
 Perform AES algorithm and decrypt data blocks in cipher to plain data blocks, using CBC mode. More...
 
#define AT86RF2XX_AES_KEY_BITS   (128U)
 AES key length in bits.
 
#define AT86RF2XX_AES_KEY_LENGTH   ((AT86RF2XX_AES_KEY_BITS) / 8)
 AES key length in bytes.
 
#define AT86RF2XX_AES_BLOCK_SIZE   ((AT86RF2XX_AES_KEY_BITS) / 8)
 AES block size in bytes.
 
#define AT86RF2XX_AES_DELAY_US   (24)
 Time to complete the AES algorithm in us.
 

AES rigister addresses

#define AT86RF2XX_REG__AES_STATUS   (0x82)
 
#define AT86RF2XX_REG__AES_CTRL   (0x83)
 
#define AT86RF2XX_REG__AES_KEY_START   (0x84)
 
#define AT86RF2XX_REG__AES_KEY_END   (0x93)
 
#define AT86RF2XX_REG__AES_DATA_START   (0x84)
 
#define AT86RF2XX_REG__AES_DATA_END   (0x93)
 
#define AT86RF2XX_REG__AES_CTRL_MIRROR   (0x94)
 

Layout of register AES_STATUS

#define AT86RF2XX_AES_STATUS_MASK__AES_ER   (0x80)
 
#define AT86RF2XX_AES_STATUS_MASK__AES_DONE   (0x01)
 
#define AT86RF2XX_AES_STATUS_AES_ER__NO_ERROR   (0x00)
 
#define AT86RF2XX_AES_STATUS_AES_ER__ERROR   (0x80)
 
#define AT86RF2XX_AES_STATUS_AES_DONE__NOT_DONE   (0x00)
 
#define AT86RF2XX_AES_STATUS_AES_DONE__DONE   (0x01)
 

Layout of register AES_CTRL

#define AT86RF2XX_AES_CTRL_MASK__AES_REQUEST   (0x80)
 
#define AT86RF2XX_AES_CTRL_MASK__AES_MODE   (0x70)
 
#define AT86RF2XX_AES_CTRL_MASK__AES_DIR   (0x08)
 
#define AT86RF2XX_AES_CTRL_AES_REQUEST__IDLE   (0x00)
 
#define AT86RF2XX_AES_CTRL_AES_REQUEST__START   (0x80)
 
#define AT86RF2XX_AES_CTRL_AES_MODE__ECB   (0x00)
 
#define AT86RF2XX_AES_CTRL_AES_MODE__KEY   (0x10)
 
#define AT86RF2XX_AES_CTRL_AES_MODE__CBC   (0x20)
 
#define AT86RF2XX_AES_CTRL_AES_DIR__ENC   (0x00)
 
#define AT86RF2XX_AES_CTRL_AES_DIR__DEC   (0x08)
 

Layout of register AES_CTRL_MIRROR

#define AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_REQUEST   (0x80)
 
#define AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_MODE   (0x70)
 
#define AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_DIR   (0x08)
 
#define AT86RF2XX_AES_CTRL_MIRROR_AES_REQUEST__IDLE   (0x00)
 
#define AT86RF2XX_AES_CTRL_MIRROR_AES_REQUEST__START   (0x80)
 
#define AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__ECB   (0x00)
 
#define AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__KEY   (0x10)
 
#define AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__CBC   (0x20)
 
#define AT86RF2XX_AES_CTRL_MIRROR_AES_DIR__ENC   (0x00)
 
#define AT86RF2XX_AES_CTRL_MIRROR_AES_DIR__DEC   (0x08)
 

Typedef Documentation

◆ aes_block_t

typedef uint8_t aes_block_t[AT86RF2XX_AES_BLOCK_SIZE]

An AES block.

AES works on blocks of 16 bytes

Definition at line 119 of file at86rf2xx_aes.h.

Function Documentation

◆ at86rf2xx_aes_cbc_decrypt()

void at86rf2xx_aes_cbc_decrypt ( at86rf2xx_t dev,
aes_block_t plain,
uint8_t  key[AT86RF2XX_AES_BLOCK_SIZE],
uint8_t  iv[AT86RF2XX_AES_BLOCK_SIZE],
const aes_block_t cipher,
uint8_t  nblocks 
)

Perform AES algorithm and decrypt data blocks in cipher to plain data blocks, using CBC mode.

Note
The decryption key must have been written before.
Parameters
[in]devDevice
[out]plainIf not NUll, plain data blocks
[out]keyIf not NULL, last round decryption key is stored
[in,out]ivin: initial vector, out: last plain block if plain is NULL
[in]cipherCipher data blocks
[in]nblocksNumber of blocks

◆ at86rf2xx_aes_cbc_encrypt()

void at86rf2xx_aes_cbc_encrypt ( at86rf2xx_t dev,
aes_block_t cipher,
uint8_t  key[AT86RF2XX_AES_BLOCK_SIZE],
uint8_t  iv[AT86RF2XX_AES_BLOCK_SIZE],
const aes_block_t plain,
uint8_t  nblocks 
)

Perform AES algorithm and encrypt data blocks in plain to cipher data blocks, using CBC mode.

Note
The encryption key must have been written before.
Parameters
[in]devDevice
[out]cipherIf not NULL, cipher blocks
[out]keyIf not NULL, last round encryption key is stored
[in,out]ivin: initial vector, out: last cipher block if cipher is NULL
[in]plainPlain data blocks
[in]nblocksNumber of blocks

◆ at86rf2xx_aes_ecb_decrypt()

void at86rf2xx_aes_ecb_decrypt ( at86rf2xx_t dev,
aes_block_t plain,
uint8_t  key[AT86RF2XX_AES_BLOCK_SIZE],
const aes_block_t cipher,
uint8_t  nblocks 
)

Perform AES algorithm and decrypt data blocks in cipher to plain data blocks, using ECB mode.

Note
The decryption key must have been written before.
Parameters
[in]devDevice
[out]plainIf not NULL, plain data blocks
[out]keyIf not NULL, last round decryption key is stored
[in]cipherCipher data blocks
[in]nblocksNumber of blocks

◆ at86rf2xx_aes_ecb_encrypt()

void at86rf2xx_aes_ecb_encrypt ( at86rf2xx_t dev,
aes_block_t cipher,
uint8_t  key[AT86RF2XX_AES_BLOCK_SIZE],
const aes_block_t plain,
uint8_t  nblocks 
)

Perform AES algorithm and encrypt data blocks in plain to cipher data blocks, using ECB mode.

Note
The encryption key must have been written before.
Parameters
[in]devDevice
[out]cipherIf not NULL, cipher data blocks
[out]keyIf not NULL, last round encryption key is stored
[in]plainPlain data blocks
[in]nblocksNumber of blocks

◆ at86rf2xx_aes_key_read_decrypt()

void at86rf2xx_aes_key_read_decrypt ( at86rf2xx_t dev,
uint8_t  key[AT86RF2XX_AES_KEY_LENGTH] 
)

Read the AES key used for decryption.

Parameters
[in]devDevice
[out]keyBuffer to store the key

◆ at86rf2xx_aes_key_read_encrypt()

void at86rf2xx_aes_key_read_encrypt ( at86rf2xx_t dev,
uint8_t  key[AT86RF2XX_AES_KEY_LENGTH] 
)

Read the AES key used for encryption.

Parameters
[in]devDevice
[out]keyBuffer to store the key

◆ at86rf2xx_aes_key_write_decrypt()

void at86rf2xx_aes_key_write_decrypt ( at86rf2xx_t dev,
const uint8_t  key[AT86RF2XX_AES_KEY_LENGTH] 
)

Write the AES key used for decryption.

It is important to write the decryption key, before decryption is done

Parameters
[in]devDevice
[in]keyBuffer which stores the key

◆ at86rf2xx_aes_key_write_encrypt()

void at86rf2xx_aes_key_write_encrypt ( at86rf2xx_t dev,
const uint8_t  key[AT86RF2XX_AES_KEY_LENGTH] 
)

Write the AES key used for encryption.

It is important to write the encryption key, before encryption is done

Parameters
[in]devDevice
[in]keyBuffer which stores the key