diff --git a/firmware/applications/final.c b/firmware/applications/final.c index 7cb1054..d9ee29a 100644 --- a/firmware/applications/final.c +++ b/firmware/applications/final.c @@ -18,9 +18,12 @@ void forLoadables(int i){ if(i){ lcdSetPixel(0,0); font=&Font_Invaders; - filetransfer_send(); + //filetransfer_send(); ECIES_encyptkeygen(); - filetransfer_receive(); + //filetransfer_receive(); + //rftransfer_receive(); + //rftransfer_send(); + systickGetTicks(); ECIES_decryptkeygen(); bitstr_parse_export(); nrf_rcv_pkt_time_encr(); diff --git a/firmware/loadable/avcard.c b/firmware/loadable/avcard.c deleted file mode 100644 index f879168..0000000 --- a/firmware/loadable/avcard.c +++ /dev/null @@ -1,299 +0,0 @@ -#include -#include -#include -#include -#include -#include "basic/basic.h" -#include "lcd/render.h" -#include "lcd/allfonts.h" -#include "basic/ecc.h" -#include "funk/nrf24l01p.h" -#include "filesystem/ff.h" -#include "filesystem/diskio.h" -#include "funk/filetransfer.h" -#include "lcd/print.h" - - - -uint8_t mac[5] = {1,2,3,2,1}; - -void sendPublicKey(void) -{ - uint8_t exp[2 + 4*NUMWORDS + 2]; - char buf[42]; - UINT readbytes; - FIL file; - - if( f_open(&file, "pubx.key", FA_OPEN_EXISTING|FA_READ) ){ - return; - } - if( f_read(&file, buf, 41, &readbytes) || readbytes != 41 ){ - return; - } - f_close(&file); - buf[41] = 0; - - exp[0] = 'P'; - bitstr_parse_export((char*)exp+2, buf); - exp[1] = 'X'; - nrf_snd_pkt_crc(32, exp); - delayms(10); - - if( f_open(&file, "puby.key", FA_OPEN_EXISTING|FA_READ) ){ - return; - } - if( f_read(&file, buf, 41, &readbytes) || readbytes != 41 ){ - return; - } - f_close(&file); - buf[41] = 0; - - exp[1] = 'Y'; - bitstr_parse_export((char*)exp+2, buf); - nrf_snd_pkt_crc(32, exp); - delayms(10); -} - -void sendR(uint8_t *rx, uint8_t *ry) -{ - uint8_t exp[2 + 4*NUMWORDS + 2]; - exp[0] = 'R'; - for(int i=0; i<4*NUMWORDS; i++) - exp[2+i] = rx[i]; - exp[1] = 'X'; - nrf_snd_pkt_crc(32, exp); - delayms(10); - exp[1] = 'Y'; - for(int i=0; i<4*NUMWORDS; i++) - exp[2+i] = ry[i]; - nrf_snd_pkt_crc(32, exp); - delayms(10); -} - -int receiveKey(uint8_t type, uint8_t *x, uint8_t *y) -{ - uint8_t buf[32]; - uint8_t n; - - n = nrf_rcv_pkt_time(1000, 32, buf); - if( n == 32 && buf[0] == type && buf[1] == 'X' ){ - for(int i=0; i +#include "funk/nrf24l01p.h" +#include "funk/filetransfer.h" +#include "funk/rftransfer.h" +#include "basic/basic.h" +#include "basic/xxtea.h" +#include "filesystem/ff.h" +#include "lcd/print.h" + + +int filetransfer_receive(uint8_t *mac, uint32_t const k[4]) +{ + uint8_t buf[MAXSIZE+1]; + uint16_t size; + uint8_t n; + + UINT written = 0; + FIL file; + FRESULT res; + //uint8_t macbuf[5]; + //nrf_get_rx_max(0,5,macbuf); + + uint8_t metadata[32]; + + //nrf_set_rx_mac(0, 32, 5, mac); + n = nrf_rcv_pkt_time_encr(3000, 32, metadata, k); + if( n != 32 ) + return 1; //timeout + //nrf_set_rx_mac(0, 32, 5, macbuf); + //lcdPrintln("got meta"); lcdRefresh(); + metadata[19] = 0; //enforce termination + size = (metadata[20] << 8) | metadata[21]; + + if( size > MAXSIZE ) {lcdPrintln("too big"); lcdRefresh(); while(1);} + if( size > MAXSIZE ) return 1; //file to big + //if(fileexists(metadata)) return 1; //file already exists + + //lcdPrint("open"); lcdPrintln((const char*)metadata); lcdRefresh(); + res = f_open(&file, (const char*)metadata, FA_OPEN_ALWAYS|FA_WRITE); + + //lcdPrintln("file opened"); lcdRefresh(); + if( res ) {lcdPrintln("res"); lcdPrint(f_get_rc_string(res)); lcdRefresh(); while(1);} + if( res ) + return res; + + uint16_t wordcount = (size+3)/4; + + //nrf_set_rx_mac(0, 32, 5, mac); + //lcdPrintln("get file"); lcdRefresh(); + int fres = rftransfer_receive(buf, wordcount*4, 1000); + if( fres == -1 ){ + lcdPrintln("checksum wrong"); + }else if( fres == -2 ){ + lcdPrintln("timeout"); + }else{ + //lcdPrintln("got file"); + } + lcdRefresh(); + if( fres < 0 ) + return 1; + //nrf_set_rx_mac(0, 32, 5, macbuf); + + xxtea_decode_words((uint32_t *)buf, wordcount, k); + + res = f_write(&file, buf, size, &written); + f_close(&file); + if( res ) + return res; + if( written != size ) + return 1; //error while writing + lcdClear(); + lcdPrintln("Received"); lcdPrintln((const char*)metadata); lcdRefresh(); + + return 0; +} + +#define MAXPACKET 32 +int16_t rftransfer_receive(uint8_t *buffer, uint16_t maxlen, uint16_t timeout) +{ + uint8_t buf[MAXPACKET]; + uint8_t state = 0; + uint16_t pos = 0, seq = 0, size = 0, rand = 0, crc = 0; + int n,i; + unsigned int currentTick = systickGetTicks(); + unsigned int startTick = currentTick; + + while(systickGetTicks() < (startTick+timeout) ){//this fails if either overflows + n = nrf_rcv_pkt_time(1000, MAXPACKET, buf); + switch(state){ + case 0: + if( n == 32 && buf[0] == 'L' ){ + size = (buf[1] << 8) | buf[2]; + rand = (buf[3] << 8) | buf[4]; + seq = 0; + pos = 0; + if( size <= maxlen ){ + //lcdClear(); + //lcdPrint("got l="); lcdPrintInt(size); + //lcdPrintln(""); lcdRefresh(); + state = 1; + } + } + break; + case 1: + if( n == 32 && buf[0] == 'D' && ((buf[3]<<8)|buf[4])==rand ){ + //lcdPrint("got d"); lcdRefresh(); + if( seq == ((buf[1]<<8)|buf[2]) ){ + //lcdPrintln(" in seq"); lcdRefresh(); + for(i=5; i +#include "funk/nrf24l01p.h" +#include "funk/filetransfer.h" +#include "funk/rftransfer.h" +#include "basic/basic.h" +#include "basic/xxtea.h" +#include "filesystem/ff.h" +#include "lcd/print.h" + + +//TODO: use a proper MAC to sign the message +int filetransfer_send(uint8_t *filename, uint16_t size, + uint8_t *mac, uint32_t const k[4]) +{ + uint8_t buf[MAXSIZE]; + FIL file; + FRESULT res; + UINT readbytes; + + + if( size > MAXSIZE ) + return 1; //File to big + + res=f_open(&file, (const char*)filename, FA_OPEN_EXISTING|FA_READ); + if( res ) + return res; + + //res = f_read(&file, (char *)buf, size, &readbytes); + for(uint16_t i=0; i> 8; + metadata[21] = size & 0xFF; + + //nrf_get_tx_max(5,macbuf); + + //nrf_set_tx_mac(5, mac); + nrf_snd_pkt_crc_encr(32, metadata, k); + delayms(20); + xxtea_encode_words((uint32_t *)buf, wordcount, k); + rftransfer_send(wordcount*4, buf); + //nrf_set_tx_mac(5, macbuf); + return 0; +} + +#include "funk/rftransfer.h" +#include "funk/nrf24l01p.h" +#include +#include +#include +#include + +#define MAXPACKET 32 +void rftransfer_send(uint16_t size, uint8_t *data) +{ + uint8_t buf[MAXPACKET]; + buf[0] = 'L'; + buf[1] = size >> 8; + buf[2] = size & 0xFF; + + uint16_t rand = getRandom() & 0xFFFF; + buf[3] = rand >> 8; + buf[4] = rand & 0xFF; + + nrf_snd_pkt_crc(32,buf); //setup packet + delayms(20); + uint16_t index = 0; + uint8_t i; + uint16_t crc = crc16(data,size); + + while(size){ + buf[0] = 'D'; + buf[1] = index >> 8; + buf[2] = index & 0xFF; + buf[3] = rand >> 8; + buf[4] = rand & 0xFF; + for(i=5; i0; i++,size--){ + buf[i] = *data++; + } + index++; + nrf_snd_pkt_crc(32,buf); //data packet + delayms(20); + } + + buf[0] = 'C'; + buf[1] = crc >> 8; + buf[2] = crc & 0xFF; + buf[3] = rand >> 8; + buf[4] = rand & 0xFF; + nrf_snd_pkt_crc(32,buf); //setup packet + delayms(20); +}