From 46db3203d71fe6d6faba2beef67bdc2ba3b4bdc0 Mon Sep 17 00:00:00 2001 From: schneider Date: Sun, 17 Jul 2011 11:26:52 +0200 Subject: [PATCH 1/3] added file chooser for vcard --- firmware/applications/vcard.c | 66 ++++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/firmware/applications/vcard.c b/firmware/applications/vcard.c index fe04108..e12dcf2 100644 --- a/firmware/applications/vcard.c +++ b/firmware/applications/vcard.c @@ -206,13 +206,24 @@ void receiveFile(void) lcdPrintln("Got R"); lcdRefresh(); ECIES_decryptkeygen(rx, ry, k1, k2, Priv); - //if( filetransfer_receive(mac,k1) ) - // continue; + #if 0 + lcdClear(); + for(int i=0; i<16; i++){ + lcdPrintCharHex(k1[i]); + if((i+1)%4==0) + lcdPrintln(""); + } + lcdRefresh(); + #else + uint32_t k[4] = {0xffff,0xffff,0xffff,0xffff}; + if( filetransfer_receive(mac,(uint32_t*)k) ) + continue; lcdPrintln("Done"); lcdPrintln("Right=OK"); lcdPrintln("Left=Retry"); lcdPrintln("Down=Abort"); lcdRefresh(); + #endif while(1){ key = getInput(); delayms(20); @@ -249,11 +260,21 @@ void sendFile(char *filename) sendR(rx,ry); lcdPrintln("Sent R"); lcdRefresh(); + #if 0 + lcdClear(); + for(int i=0; i<16; i++){ + lcdPrintCharHex(k1[i]); + if((i+1)%4==0) + lcdPrintln(""); + } + #else delayms(3000); - //filetransfer_send((uint8_t*)filename, 0, mac, (uint32_t*)k1); + uint32_t k[4] = {0xffff,0xffff,0xffff,0xffff}; + filetransfer_send((uint8_t*)filename, 0, mac, (uint32_t*)k); lcdPrintln("Done"); lcdPrintln("Right=OK"); lcdPrintln("Left=Retry"); + #endif lcdRefresh(); while(1){ @@ -273,7 +294,15 @@ void main_vcard(void) { char key; nrf_init(); f_mount(0, &FatFs[0]); - nrf_set_rx_mac(0, 32, 5, mac); + + struct NRF_CFG config = { + .channel= 81, + .txmac= "\x1\x2\x3\x2\x1", + .nrmacs=1, + .mac0= "\x1\x2\x3\x2\x1", + .maclen ="\x20", + }; + nrf_config_set(&config); while (1) { key= getInput(); @@ -285,10 +314,12 @@ void main_vcard(void) { lcdDisplay(0); ISPandReset(5); }else if(key==BTN_UP){ - lcdClear(); - lcdPrintln("Generating..."); - lcdRefresh(); - sendFile("foobar.txt"); + //lcdClear(); + //lcdPrintln("Generating..."); + //lcdRefresh(); + char file[13]; + selectFile(file,"TXT"); + sendFile(file); //uint8_t k1[16], k2[16], Rx[4*NUMWORDS], Ry[4*NUMWORDS]; //ECIES_encyptkeygen("1c56d302cf642a8e1ba4b48cc4fbe2845ee32dce7", // "45f46eb303edf2e62f74bd68368d979e265ee3c03", @@ -308,6 +339,25 @@ void main_vcard(void) { //nrf_snd_pkt_crc(30, k1); lcdPrintln("Done"); lcdRefresh(); + }else if(key==BTN_RIGHT){ + //uint8_t *data1 = "123456789012345678901234567890"; + uint8_t data2[30] = "123456789012345678901234567890"; + uint32_t key[4] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF}; + + lcdClear(); + lcdPrintln("encode"); lcdRefresh(); + xxtea_encode(data2, 30, key); + //xxtea_encode_words(data2, 7 , key); + lcdPrintln("decode"); lcdRefresh(); + xxtea_decode(data2, 30, key); + //xxtea_decode_words(data2, 7 , key); + lcdClear(); + for(int i=0; i<30; i++){ + lcdPrintCharHex(data2[i]); + if((i+1)%5==0) + lcdPrintln(""); + } + lcdRefresh(); } //encryption_decryption_demo("This is encrypted", From 13637cafb9083055e0eec11f7a5c1fbb7da5c2f3 Mon Sep 17 00:00:00 2001 From: schneider Date: Sun, 17 Jul 2011 12:46:33 +0200 Subject: [PATCH 2/3] vcard: moved to new rf interface --- firmware/applications/vcard.c | 50 +++++++++++------------------------ firmware/funk/filetransfer.c | 46 +++++++++++++++++++++++++------- firmware/funk/nrf24l01p.c | 24 ----------------- firmware/funk/nrf24l01p.h | 4 --- firmware/funk/rftransfer.c | 41 +++++++++++++++++----------- 5 files changed, 78 insertions(+), 87 deletions(-) diff --git a/firmware/applications/vcard.c b/firmware/applications/vcard.c index e12dcf2..b9298f4 100644 --- a/firmware/applications/vcard.c +++ b/firmware/applications/vcard.c @@ -24,46 +24,46 @@ char *Priv ="0e10e787036941e6c78daf8a0e8e1dbfac68e26d2"; void sendPublicKey(char *px, char *py) { - uint8_t exp[2 + 4*NUMWORDS]; + uint8_t exp[2 + 4*NUMWORDS + 2]; exp[0] = 'P'; bitstr_parse_export((char*)exp+2, px); exp[1] = 'X'; - nrf_snd_pkt_crc(30, exp); + nrf_snd_pkt_crc(32, exp); delayms(10); exp[1] = 'Y'; bitstr_parse_export((char*)exp+2, py); - nrf_snd_pkt_crc(30, exp); + nrf_snd_pkt_crc(32, exp); delayms(10); } void sendR(uint8_t *rx, uint8_t *ry) { - uint8_t exp[2 + 4*NUMWORDS]; + 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(30, exp); + 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(30, exp); + nrf_snd_pkt_crc(32, exp); delayms(10); } int receiveKey(uint8_t type, uint8_t *x, uint8_t *y) { - uint8_t buf[30]; + uint8_t buf[32]; uint8_t n; - n = nrf_rcv_pkt_time(1000, 30, buf); + n = nrf_rcv_pkt_time(1000, 32, buf); lcdPrint("pkt:"); lcdPrintInt(n);lcdPrintln(""); lcdRefresh(); - if( n == 30 && buf[0] == type && buf[1] == 'X' ){ + if( n == 32 && buf[0] == type && buf[1] == 'X' ){ for(int i=0; i 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(metadata); lcdRefresh(); res = f_open(&file, (const char*)metadata, FA_OPEN_ALWAYS|FA_WRITE); + + //lcdPrintln("file opened"); lcdRefresh(); + if( res ) {lcdPrintln("res"); put_rc(res); lcdRefresh(); while(1);} if( res ) return res; uint16_t wordcount = (size+3)/4; - nrf_set_rx_mac(0, 32, 5, mac); + //nrf_set_rx_mac(0, 32, 5, mac); + lcdPrintln("get file"); lcdRefresh(); rftransfer_receive(buf, wordcount*4, 1000); + lcdPrintln("got file"); lcdRefresh(); //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 ) diff --git a/firmware/funk/nrf24l01p.c b/firmware/funk/nrf24l01p.c index a6240de..ab5510d 100644 --- a/firmware/funk/nrf24l01p.c +++ b/firmware/funk/nrf24l01p.c @@ -92,24 +92,6 @@ void nrf_write_long(const uint8_t cmd, int len, uint8_t* data){ nrf_write_long(C_W_REGISTER|(reg), len, data) // High-Level: -int nrf_rcv_pkt_time_xxtea(int maxtime, int maxsize, - uint8_t * pkt, uint32_t const k[4]) -{ - int n = nrf_rcv_pkt_time(maxtime, maxsize, pkt); - if( n ){ - if( n < 2 ) - return -4; - xxtea_decode(pkt, n, k); - uint16_t crc=crc16(pkt,n-2); - if( pkt[n-2] == ((crc>>8)&0xFF) && pkt[n-1] == (crc&0xFF) ){ - return n; - }else{ - return -5; - } - } - return n; -} - int nrf_rcv_pkt_time_encr(int maxtime, int maxsize, uint8_t * pkt, uint32_t const key[4]){ uint8_t len; uint8_t status=0; @@ -203,12 +185,6 @@ char nrf_snd_pkt_crc_encr(int size, uint8_t * pkt, uint32_t const key[4]){ return nrf_cmd_status(C_NOP); }; -char nrf_snd_pkt_xxtea(int size, uint8_t * pkt, uint32_t const k[4]) -{ - xxtea_encode(pkt, size, k); - return nrf_snd_pkt_crc(size, pkt); -} - void nrf_set_rx_mac(int pipe, int rxlen, int maclen, uint8_t * mac){ #ifdef SAFE assert(maclen>=1 || maclen<=5); diff --git a/firmware/funk/nrf24l01p.h b/firmware/funk/nrf24l01p.h index d20e82f..061c846 100644 --- a/firmware/funk/nrf24l01p.h +++ b/firmware/funk/nrf24l01p.h @@ -137,10 +137,6 @@ int nrf_rcv_pkt_time_encr(int maxtime, int maxsize, uint8_t * pkt, uint32_t cons nrf_snd_pkt_crc_encr(size, pkt, NULL) char nrf_snd_pkt_crc_encr(int size, uint8_t * pkt, uint32_t const k[4]); -// Schneider-stuff? -int nrf_rcv_pkt_time_xxtea(int maxtime, int maxsize, - uint8_t * pkt, uint32_t const k[4]); -char nrf_snd_pkt_xxtea(int size, uint8_t * pkt, uint32_t const k[4]); void nrf_init() ; void nrf_cmd(uint8_t cmd); diff --git a/firmware/funk/rftransfer.c b/firmware/funk/rftransfer.c index 725bc15..5b79315 100644 --- a/firmware/funk/rftransfer.c +++ b/firmware/funk/rftransfer.c @@ -3,7 +3,7 @@ #include #include -#define MAXPACKET 30 +#define MAXPACKET 32 void rftransfer_send(uint16_t size, uint8_t *data) { uint8_t buf[MAXPACKET]; @@ -16,8 +16,8 @@ void rftransfer_send(uint16_t size, uint8_t *data) buf[4] = rand & 0xFF; //nrf_snd_pkt_crc(5,buf); //setup packet - nrf_snd_pkt_crc(30,buf); //setup packet - delayms(10); + nrf_snd_pkt_crc(32,buf); //setup packet + delayms(20); uint16_t index = 0; uint8_t i; uint16_t crc = crc16(data,size); @@ -32,9 +32,8 @@ void rftransfer_send(uint16_t size, uint8_t *data) buf[i] = *data++; } index++; - //nrf_snd_pkt_crc(i,buf); //data packet - nrf_snd_pkt_crc(30,buf); //setup packet - delayms(10); + nrf_snd_pkt_crc(32,buf); //data packet + delayms(20); } buf[0] = 'C'; @@ -43,8 +42,8 @@ void rftransfer_send(uint16_t size, uint8_t *data) buf[3] = rand >> 8; buf[4] = rand & 0xFF; //nrf_snd_pkt_crc(5,buf); //crc packet - nrf_snd_pkt_crc(30,buf); //setup packet - delayms(10); + nrf_snd_pkt_crc(32,buf); //setup packet + delayms(20); } uint16_t rftransfer_receive(uint8_t *buffer, uint16_t maxlen, uint16_t timeout) @@ -57,36 +56,46 @@ uint16_t rftransfer_receive(uint8_t *buffer, uint16_t maxlen, uint16_t timeout) unsigned int startTick = currentTick; while(currentTick < (startTick+timeout) ){//this fails if either overflows - n = nrf_rcv_pkt_time(10, MAXPACKET, buf); + n = nrf_rcv_pkt_time(1000, MAXPACKET, buf); switch(state){ case 0: - if( n == 5 && buf[0] == 'L' ){ + 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 ) + if( size <= maxlen ){ + lcdClear(); + lcdPrintln("got l"); lcdRefresh(); state = 1; + } } break; case 1: - if( n > 5 && buf[0] == 'D' && ((buf[3]<<8)|buf[4])==rand ){ + if( n == 32 && buf[0] == 'D' && ((buf[3]<<8)|buf[4])==rand ){ + lcdPrint("got d"); lcdRefresh(); if( seq == ((buf[1]<<8)|buf[2]) ){ - if( (pos + n - 5) Date: Sun, 17 Jul 2011 14:25:15 +0200 Subject: [PATCH 3/3] added openbeacon helper files --- firmware/funk/Makefile | 1 + firmware/funk/openbeacon.c | 46 ++++++++++++++++++++++++++++++++++++++ firmware/funk/openbeacon.h | 10 +++++++++ 3 files changed, 57 insertions(+) create mode 100644 firmware/funk/openbeacon.c create mode 100644 firmware/funk/openbeacon.h diff --git a/firmware/funk/Makefile b/firmware/funk/Makefile index dd2a593..bc05c8e 100644 --- a/firmware/funk/Makefile +++ b/firmware/funk/Makefile @@ -7,6 +7,7 @@ OBJS = OBJS += nrf24l01p.o OBJS += rftransfer.o OBJS += filetransfer.o +OBJS += openbeacon.h LIBNAME=funk diff --git a/firmware/funk/openbeacon.c b/firmware/funk/openbeacon.c new file mode 100644 index 0000000..b980a90 --- /dev/null +++ b/firmware/funk/openbeacon.c @@ -0,0 +1,46 @@ +#include "openbeacon.h" +#include "nrf24l01p.h" +#include "basic/byteorder.h" + +const uint32_t key = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; +const uint8_t enctoggle = 0; +uint32_t mid = 0; +uint32_t mctr = 0; +uint8_t strength = 0; + +void openbeaconSetup(uint32_t id, uint32_t ctr) +{ + mid = id; + mctr = ctr; + strength = 0; +} + +void openbeaconSendPacket(uint32_t id, uint32_t ctr, uint8_t flags, uint8_t strength) +{ + uint8_t buf[32]; + int status; + + buf[0]=0x10; // Length: 16 bytes + buf[1]=0x17; // Proto - fixed at 0x17? + buf[2]=flags; + buf[3]=strength*85; // Send intensity + + uint322uint8p(ctr, buf+4); + uint322uint8p(id, buf+8); + + buf[12]=0xff; // salt (0xffff always?) + buf[13]=0xff; + + status=nrf_snd_pkt_crc_encr(16,buf,enctoggle?testkey:NULL); +} + +void openbeaconSend(void) +{ + //uint8_t tmp = nrfgetstrength(); + //nrfsetstrength(strength); + openbeaconSendPacket(mid, ctr++, 0xFF, strength++); + if( strength == 4 ) + strength = 0; + //maybe this produces timing problems? + //nrfsetstrength(tmp); +} diff --git a/firmware/funk/openbeacon.h b/firmware/funk/openbeacon.h new file mode 100644 index 0000000..3d9d82d --- /dev/null +++ b/firmware/funk/openbeacon.h @@ -0,0 +1,10 @@ +#ifndef _OPENBEACON_H_ +#define _OPENBEACON_H_ +#include + +void openbeaconSetup(uint32_t id, uint32_t ctr); +void openbeaconSendPacket(uint32_t id, uint32_t ctr, + uint8_t flags, uint8_t strength); +void openbeaconSend(void); + +#endif