Contiki 2.6
|
00001 /* 00002 * Copyright (c) 2008, Swedish Institute of Computer Science. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the Institute nor the names of its contributors 00014 * may be used to endorse or promote products derived from this software 00015 * without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 00018 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 00021 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00022 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00023 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00024 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00025 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00026 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00027 * SUCH DAMAGE. 00028 * 00029 * This file is part of the Contiki operating system. 00030 * 00031 * $Id: cc2420-aes.c,v 1.5 2010/06/24 11:25:55 nifi Exp $ 00032 */ 00033 00034 /** 00035 * \file 00036 * AES encryption functions. 00037 * \author 00038 * Adam Dunkels <adam@sics.se> 00039 */ 00040 00041 #include "contiki.h" 00042 #include "dev/cc2420.h" 00043 #include "dev/cc2420-aes.h" 00044 #include "dev/spi.h" 00045 00046 #define KEYLEN 16 00047 #define MAX_DATALEN 16 00048 00049 #define CC2420_WRITE_RAM_REV(buffer,adr,count) \ 00050 do { \ 00051 uint8_t i; \ 00052 CC2420_SPI_ENABLE(); \ 00053 SPI_WRITE_FAST(0x80 | (adr & 0x7f)); \ 00054 SPI_WRITE_FAST((adr >> 1) & 0xc0); \ 00055 for(i = (count); i > 0; i--) { \ 00056 SPI_WRITE_FAST(((uint8_t*)(buffer))[i - 1]); \ 00057 } \ 00058 SPI_WAITFORTx_ENDED(); \ 00059 CC2420_SPI_DISABLE(); \ 00060 } while(0) 00061 00062 #define MIN(a,b) ((a) < (b)? (a): (b)) 00063 00064 /*---------------------------------------------------------------------------*/ 00065 void 00066 cc2420_aes_set_key(const uint8_t *key, int index) 00067 { 00068 switch(index) { 00069 case 0: 00070 CC2420_WRITE_RAM_REV(key, CC2420RAM_KEY0, KEYLEN); 00071 break; 00072 case 1: 00073 CC2420_WRITE_RAM_REV(key, CC2420RAM_KEY1, KEYLEN); 00074 break; 00075 } 00076 } 00077 /*---------------------------------------------------------------------------*/ 00078 /* Encrypt at most 16 bytes of data. */ 00079 static void 00080 cipher16(uint8_t *data, int len) 00081 { 00082 uint8_t status; 00083 00084 len = MIN(len, MAX_DATALEN); 00085 00086 CC2420_WRITE_RAM(data, CC2420RAM_SABUF, len); 00087 CC2420_STROBE(CC2420_SAES); 00088 /* Wait for the encryption to finish */ 00089 do { 00090 CC2420_GET_STATUS(status); 00091 } while(status & BV(CC2420_ENC_BUSY)); 00092 CC2420_READ_RAM(data, CC2420RAM_SABUF, len); 00093 } 00094 /*---------------------------------------------------------------------------*/ 00095 void 00096 cc2420_aes_cipher(uint8_t *data, int len, int key_index) 00097 { 00098 int i; 00099 uint16_t secctrl0; 00100 00101 CC2420_READ_REG(CC2420_SECCTRL0, secctrl0); 00102 00103 secctrl0 &= ~(CC2420_SECCTRL0_SAKEYSEL0 | CC2420_SECCTRL0_SAKEYSEL1); 00104 00105 switch(key_index) { 00106 case 0: 00107 secctrl0 |= CC2420_SECCTRL0_SAKEYSEL0; 00108 break; 00109 case 1: 00110 secctrl0 |= CC2420_SECCTRL0_SAKEYSEL1; 00111 break; 00112 } 00113 CC2420_WRITE_REG(CC2420_SECCTRL0, secctrl0); 00114 00115 for(i = 0; i < len; i = i + MAX_DATALEN) { 00116 cipher16(data + i, MIN(len - i, MAX_DATALEN)); 00117 } 00118 } 00119 /*---------------------------------------------------------------------------*/