From 6486c51692fd31c480089af9a9993b47b8194f19 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Fri, 24 May 2013 05:24:14 -0700 Subject: [PATCH] CC2420: Hardware-accelerated aes_128_driver --- dev/cc2420/cc2420.c | 40 +++++++++++++++++++++++++++++++++++----- dev/cc2420/cc2420.h | 4 ++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/dev/cc2420/cc2420.c b/dev/cc2420/cc2420.c index bdc1c3140..a3a372ffd 100644 --- a/dev/cc2420/cc2420.c +++ b/dev/cc2420/cc2420.c @@ -352,6 +352,39 @@ wait_for_transmission(void) && RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + (RTIMER_SECOND / 10))); } /*---------------------------------------------------------------------------*/ +static void +init_security(void) +{ + /* only use key 0 */ + setreg(CC2420_SECCTRL0, 0); + setreg(CC2420_SECCTRL1, 0); +} +/*---------------------------------------------------------------------------*/ +static void +set_key(uint8_t *key) +{ + write_ram(key, CC2420RAM_KEY0, 16, CC2420_WRITE_RAM_REVERSE); +} +/*---------------------------------------------------------------------------*/ +static void +encrypt(uint8_t *plaintext_and_result) +{ + write_ram(plaintext_and_result, + CC2420RAM_SABUF, + 16, + CC2420_WRITE_RAM_IN_ORDER); + + strobe(CC2420_SAES); + while(get_status() & BV(CC2420_ENC_BUSY)); + + read_ram(plaintext_and_result, CC2420RAM_SABUF, 16); +} +/*---------------------------------------------------------------------------*/ +const struct aes_128_driver cc2420_aes_128_driver = { + set_key, + encrypt +}; +/*---------------------------------------------------------------------------*/ static uint8_t locked, lock_on, lock_off; static void @@ -473,10 +506,7 @@ cc2420_init(void) /* Set the FIFOP threshold to maximum. */ setreg(CC2420_IOCFG0, FIFOP_THR(127)); - /* Turn off "Security enable" (page 32). */ - reg = getreg(CC2420_SECCTRL0); - reg &= ~RXFIFO_PROTECTION; - setreg(CC2420_SECCTRL0, reg); + init_security(); cc2420_set_pan_addr(0xffff, 0x0000, NULL); cc2420_set_channel(CC2420_CONF_CHANNEL); @@ -590,7 +620,7 @@ static int cc2420_prepare(const void *payload, unsigned short payload_len) { uint8_t total_len; - + GET_LOCK(); PRINTF("cc2420: sending %d bytes\n", payload_len); diff --git a/dev/cc2420/cc2420.h b/dev/cc2420/cc2420.h index 133db83c4..d840c7b9b 100644 --- a/dev/cc2420/cc2420.h +++ b/dev/cc2420/cc2420.h @@ -36,6 +36,7 @@ * \author * Adam Dunkels * Joakim Eriksson + * Konrad Krentz */ #ifndef CC2420_H_ @@ -45,6 +46,7 @@ #include "dev/spi.h" #include "dev/radio.h" #include "cc2420_const.h" +#include "lib/aes-128.h" int cc2420_init(void); @@ -88,6 +90,8 @@ int cc2420_off(void); void cc2420_set_cca_threshold(int value); +extern const struct aes_128_driver cc2420_aes_128_driver; + /************************************************************************/ /* Additional SPI Macros for the CC2420 */ /************************************************************************/