Loading...
Searching...
No Matches
at86rf2xx_aes.h File Reference

The extended feature set of at86rf2xx transceivers comprises a hardware implementation of AES. More...

Detailed Description

The extended feature set of at86rf2xx transceivers comprises a hardware implementation of AES.

There are two supported block cipher modes, ECB and CBC.

Interface of the at86rf2xx security module (AES)

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.
 

Functions

void at86rf2xx_aes_key_read_encrypt (at86rf2xx_t *dev, uint8_t key[AT86RF2XX_AES_KEY_LENGTH])
 Read the AES key used for encryption.
 
void at86rf2xx_aes_key_write_encrypt (at86rf2xx_t *dev, const uint8_t key[AT86RF2XX_AES_KEY_LENGTH])
 Write the AES key used for encryption.
 
void at86rf2xx_aes_key_read_decrypt (at86rf2xx_t *dev, uint8_t key[AT86RF2XX_AES_KEY_LENGTH])
 Read the AES key used for decryption.
 
void at86rf2xx_aes_key_write_decrypt (at86rf2xx_t *dev, const uint8_t key[AT86RF2XX_AES_KEY_LENGTH])
 Write the AES key used for decryption.
 
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.
 
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.
 
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.
 
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.
 
#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)
 

Macro Definition Documentation

◆ AT86RF2XX_AES_BLOCK_SIZE

#define AT86RF2XX_AES_BLOCK_SIZE   ((AT86RF2XX_AES_KEY_BITS) / 8)

AES block size in bytes.

Definition at line 43 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_AES_DIR__DEC

#define AT86RF2XX_AES_CTRL_AES_DIR__DEC   (0x08)

Definition at line 92 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_AES_DIR__ENC

#define AT86RF2XX_AES_CTRL_AES_DIR__ENC   (0x00)

Definition at line 91 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_AES_MODE__CBC

#define AT86RF2XX_AES_CTRL_AES_MODE__CBC   (0x20)

Definition at line 89 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_AES_MODE__ECB

#define AT86RF2XX_AES_CTRL_AES_MODE__ECB   (0x00)

Definition at line 87 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_AES_MODE__KEY

#define AT86RF2XX_AES_CTRL_AES_MODE__KEY   (0x10)

Definition at line 88 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_AES_REQUEST__IDLE

#define AT86RF2XX_AES_CTRL_AES_REQUEST__IDLE   (0x00)

Definition at line 84 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_AES_REQUEST__START

#define AT86RF2XX_AES_CTRL_AES_REQUEST__START   (0x80)

Definition at line 85 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MASK__AES_DIR

#define AT86RF2XX_AES_CTRL_MASK__AES_DIR   (0x08)

Definition at line 82 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MASK__AES_MODE

#define AT86RF2XX_AES_CTRL_MASK__AES_MODE   (0x70)

Definition at line 81 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MASK__AES_REQUEST

#define AT86RF2XX_AES_CTRL_MASK__AES_REQUEST   (0x80)

Definition at line 80 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_AES_DIR__DEC

#define AT86RF2XX_AES_CTRL_MIRROR_AES_DIR__DEC   (0x08)

Definition at line 111 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_AES_DIR__ENC

#define AT86RF2XX_AES_CTRL_MIRROR_AES_DIR__ENC   (0x00)

Definition at line 110 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__CBC

#define AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__CBC   (0x20)

Definition at line 108 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__ECB

#define AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__ECB   (0x00)

Definition at line 106 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__KEY

#define AT86RF2XX_AES_CTRL_MIRROR_AES_MODE__KEY   (0x10)

Definition at line 107 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_AES_REQUEST__IDLE

#define AT86RF2XX_AES_CTRL_MIRROR_AES_REQUEST__IDLE   (0x00)

Definition at line 103 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_AES_REQUEST__START

#define AT86RF2XX_AES_CTRL_MIRROR_AES_REQUEST__START   (0x80)

Definition at line 104 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_DIR

#define AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_DIR   (0x08)

Definition at line 101 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_MODE

#define AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_MODE   (0x70)

Definition at line 100 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_REQUEST

#define AT86RF2XX_AES_CTRL_MIRROR_MASK__AES_REQUEST   (0x80)

Definition at line 99 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_DELAY_US

#define AT86RF2XX_AES_DELAY_US   (24)

Time to complete the AES algorithm in us.

Definition at line 47 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_KEY_BITS

#define AT86RF2XX_AES_KEY_BITS   (128U)

AES key length in bits.

Definition at line 35 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_KEY_LENGTH

#define AT86RF2XX_AES_KEY_LENGTH   ((AT86RF2XX_AES_KEY_BITS) / 8)

AES key length in bytes.

Definition at line 39 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_STATUS_AES_DONE__DONE

#define AT86RF2XX_AES_STATUS_AES_DONE__DONE   (0x01)

Definition at line 73 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_STATUS_AES_DONE__NOT_DONE

#define AT86RF2XX_AES_STATUS_AES_DONE__NOT_DONE   (0x00)

Definition at line 72 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_STATUS_AES_ER__ERROR

#define AT86RF2XX_AES_STATUS_AES_ER__ERROR   (0x80)

Definition at line 70 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_STATUS_AES_ER__NO_ERROR

#define AT86RF2XX_AES_STATUS_AES_ER__NO_ERROR   (0x00)

Definition at line 69 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_STATUS_MASK__AES_DONE

#define AT86RF2XX_AES_STATUS_MASK__AES_DONE   (0x01)

Definition at line 67 of file at86rf2xx_aes.h.

◆ AT86RF2XX_AES_STATUS_MASK__AES_ER

#define AT86RF2XX_AES_STATUS_MASK__AES_ER   (0x80)

Definition at line 66 of file at86rf2xx_aes.h.

◆ AT86RF2XX_REG__AES_CTRL

#define AT86RF2XX_REG__AES_CTRL   (0x83)

Definition at line 54 of file at86rf2xx_aes.h.

◆ AT86RF2XX_REG__AES_CTRL_MIRROR

#define AT86RF2XX_REG__AES_CTRL_MIRROR   (0x94)

Definition at line 59 of file at86rf2xx_aes.h.

◆ AT86RF2XX_REG__AES_DATA_END

#define AT86RF2XX_REG__AES_DATA_END   (0x93)

Definition at line 58 of file at86rf2xx_aes.h.

◆ AT86RF2XX_REG__AES_DATA_START

#define AT86RF2XX_REG__AES_DATA_START   (0x84)

Definition at line 57 of file at86rf2xx_aes.h.

◆ AT86RF2XX_REG__AES_KEY_END

#define AT86RF2XX_REG__AES_KEY_END   (0x93)

Definition at line 56 of file at86rf2xx_aes.h.

◆ AT86RF2XX_REG__AES_KEY_START

#define AT86RF2XX_REG__AES_KEY_START   (0x84)

Definition at line 55 of file at86rf2xx_aes.h.

◆ AT86RF2XX_REG__AES_STATUS

#define AT86RF2XX_REG__AES_STATUS   (0x82)

Definition at line 53 of file at86rf2xx_aes.h.

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