From e5a4cdf427e8a143452999382f753625208eb209 Mon Sep 17 00:00:00 2001 From: schneider Date: Wed, 3 Aug 2011 10:27:56 +0200 Subject: [PATCH] added send/receive card loadables --- firmware/loadable/recvcard.c | 183 +++++++++++++++++++++++++++++++++++ firmware/loadable/sendcard.c | 176 +++++++++++++++++++++++++++++++++ 2 files changed, 359 insertions(+) create mode 100644 firmware/loadable/recvcard.c create mode 100644 firmware/loadable/sendcard.c diff --git a/firmware/loadable/recvcard.c b/firmware/loadable/recvcard.c new file mode 100644 index 0000000..a5ed46f --- /dev/null +++ b/firmware/loadable/recvcard.c @@ -0,0 +1,183 @@ +#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 ram(void) +{ + if( sendKeys() ) + return; + + char priv[42]; + UINT readbytes; + FIL file; + + if( f_open(&file, "priv.key", FA_OPEN_EXISTING|FA_READ) ){ + return; + } + if( f_read(&file, priv, 41, &readbytes) || readbytes != 41 ){ + return; + } + f_close(&file); + priv[41] = 0; + + uint8_t done = 0; + uint8_t key; + uint8_t k1[16], k2[16], rx[4*NUMWORDS], ry[4*NUMWORDS]; + + while( !done ){ + lcdClear(); + lcdPrintln("Receiving file"); + lcdPrintln("Down=Abort"); + lcdRefresh(); + key = getInput(); + delayms(20); + if( key == BTN_DOWN ){ + return -1; + } + if( receiveR(rx,ry) ) + continue; + lcdPrintln("Creating key"); + lcdRefresh(); + ECIES_decryptkeygen(rx, ry, k1, k2, priv); + if( filetransfer_receive(mac,(uint32_t*)k1) < 0 ) + continue; + lcdPrintln("Right=OK"); + lcdPrintln("Left=Retry"); + lcdPrintln("Down=Abort"); + lcdRefresh(); + + while(1){ + key = getInput(); + delayms(20); + if( key == BTN_LEFT ){ + break; + }else if( key == BTN_RIGHT ){ + done = 1; + break; + }else if( key == BTN_DOWN ){ + return -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); +} + + +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 +#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 ram(void) +{ + char file[13]; + selectFile(file,"TXT"); + sendFile(file); +} + +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