summaryrefslogtreecommitdiff
path: root/usb-i2c-sl018
diff options
context:
space:
mode:
authorOthmar Gsenger <otti@wirdorange.org>2013-02-06 20:56:51 +0000
committerOthmar Gsenger <otti@wirdorange.org>2013-02-06 20:56:51 +0000
commita783671c72aa4b9fde5bf7a2af3bf11a7c876191 (patch)
treeac655008112294336c5a3decc29b67e67decd071 /usb-i2c-sl018
parentmoved sl018 code to seperate file (diff)
moved keystore and usb/serial to seperate files
stdio_ptr might need some improvement git-svn-id: https://svn.spreadspace.org/avr/trunk@134 aa12f405-d877-488e-9caf-2d797e2a1cc7
Diffstat (limited to 'usb-i2c-sl018')
-rw-r--r--usb-i2c-sl018/Makefile2
-rw-r--r--usb-i2c-sl018/keystore.c109
-rw-r--r--usb-i2c-sl018/keystore.h31
-rw-r--r--usb-i2c-sl018/tuer-rfid.c217
-rw-r--r--usb-i2c-sl018/usb_serial.c126
-rw-r--r--usb-i2c-sl018/usb_serial.h32
6 files changed, 329 insertions, 188 deletions
diff --git a/usb-i2c-sl018/Makefile b/usb-i2c-sl018/Makefile
index 2bf0924..1900a9b 100644
--- a/usb-i2c-sl018/Makefile
+++ b/usb-i2c-sl018/Makefile
@@ -23,7 +23,7 @@
NAME := tuer-rfid
BOARD_TYPE := teensy2
-OBJ := $(NAME).o heartbeat.o stepper.o ledmatrix.o sl018.o
+OBJ := $(NAME).o heartbeat.o stepper.o ledmatrix.o sl018.o keystore.o usb_serial.o
LIBS := util led lufa-descriptor-usbserial
EXTERNAL_LIBS := lufa
diff --git a/usb-i2c-sl018/keystore.c b/usb-i2c-sl018/keystore.c
new file mode 100644
index 0000000..1d8a5db
--- /dev/null
+++ b/usb-i2c-sl018/keystore.c
@@ -0,0 +1,109 @@
+/*
+ * spreadspace avr utils
+ *
+ *
+ * Copyright (C) 2013 Christian Pointner <equinox@spreadspace.org>
+ * Othmar Gsenger <otti@wirdorange.org>
+ *
+ * This file is part of spreadspace avr utils.
+ *
+ * spreadspace avr utils is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
+ *
+ * spreadspace avr utils is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "keystore.h"
+#include <avr/eeprom.h>
+#include <stdio.h>
+#include "usb_serial.h"
+#include "led.h"
+
+#define EEPROM_SIZE 1024
+typedef uint8_t keyslot_t[8];
+keyslot_t EEMEM keystore[EEPROM_SIZE/sizeof(keyslot_t)];
+
+
+void flash_keystore_from_stdio(FILE * stdio)
+{
+ keyslot_t ks;
+ uint8_t byte_pos=0;
+ fprintf(stdio,"Flashing keys:\n\r");
+ fflush(stdio);
+ for(uint8_t ks_pos=0;ks_pos<EEPROM_SIZE/sizeof(ks);) {
+ usb_serial_task();
+
+ int16_t bytes_received = usb_serial_bytes_received();
+ while(bytes_received > 0) {
+ ks[byte_pos++]=fgetc(stdio);
+ bytes_received--;
+ if (byte_pos == sizeof(ks)) {
+ byte_pos=0;
+ eeprom_update_block(&ks,&keystore[ks_pos],sizeof(ks));
+ ks_pos++;
+ fputc('.', stdio);
+ fflush(stdio);
+ led_toggle();
+ }
+ }
+ }
+ fprintf(stdio,"\n");
+ fputc(0, stdio);
+ led_off();
+}
+
+void dump_keystore_to_stdio(FILE * stdio)
+{
+ keyslot_t ks;
+ for(uint8_t ks_pos=0;ks_pos<EEPROM_SIZE/sizeof(ks);ks_pos++) {
+ eeprom_read_block(&ks,&keystore[ks_pos],sizeof(ks));
+ for (uint8_t i=0; i< sizeof(ks); i++)
+ fprintf(stdio,"%02X",ks[i]);
+ fprintf(stdio,"\n\r");
+ }
+}
+
+/* this generates a Fletcher8 checksum */
+/* code from: http://stackoverflow.com/questions/13491700/8-bit-fletcher-checksum-of-16-byte-data */
+uint8_t generate_csum(uint8_t* data)
+{
+ uint16_t sum1 = 0xf, sum2 = 0xf, len = sizeof(keyslot_t) - 1;
+ do { sum2 += ( sum1 += *data++ ); } while (--len);
+ return sum2<<4 | sum1;
+}
+
+uint8_t compare_keyslots(const keyslot_t a, const keyslot_t b)
+{
+ uint8_t tmp=0;
+ // constant time compare
+ for(uint8_t i=0; i<sizeof(keyslot_t); ++i)
+ tmp |= a[i] ^ b[i];
+ return tmp;
+}
+
+uint8_t keystore_check_card(const uint8_t * uid, uint8_t uid_len)
+{
+ keyslot_t card, ks;
+ memset(card, 0, sizeof(card));
+ for (uint8_t pos=0; pos<uid_len; pos++)
+ card[pos]=uid[uid_len-pos-1];
+ card[sizeof(keyslot_t)-1]=generate_csum(card);
+ uint8_t valid=0;
+ for(uint8_t ks_pos=0;ks_pos<(EEPROM_SIZE/sizeof(ks));ks_pos++) {
+ eeprom_read_block(&ks,&keystore[ks_pos],sizeof(ks));
+ if(!compare_keyslots(card, ks)) {
+ valid=1;
+ // break; // this would break security (not constant time)
+ }
+ }
+ return valid;
+}
+
diff --git a/usb-i2c-sl018/keystore.h b/usb-i2c-sl018/keystore.h
new file mode 100644
index 0000000..a3b42ad
--- /dev/null
+++ b/usb-i2c-sl018/keystore.h
@@ -0,0 +1,31 @@
+/*
+ * spreadspace avr utils
+ *
+ *
+ * Copyright (C) 2013 Christian Pointner <equinox@spreadspace.org>
+ * Othmar Gsenger <otti@wirdorange.org>
+ *
+ * This file is part of spreadspace avr utils.
+ *
+ * spreadspace avr utils is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
+ *
+ * spreadspace avr utils is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef R3TUER_keystore_h_INCLUDED
+#define R3TUER_keystore_h_INCLUDED
+#include <stdio.h>
+void flash_keystore_from_stdio(FILE * stdio);
+void dump_keystore_to_stdio(FILE * stdio);
+uint8_t keystore_check_card(const uint8_t * uid, uint8_t uid_len);
+
+#endif
diff --git a/usb-i2c-sl018/tuer-rfid.c b/usb-i2c-sl018/tuer-rfid.c
index 7beccb0..6823c71 100644
--- a/usb-i2c-sl018/tuer-rfid.c
+++ b/usb-i2c-sl018/tuer-rfid.c
@@ -25,6 +25,8 @@
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <avr/power.h>
+#include <util/delay.h>
+#include "LUFA/Drivers/Peripheral/TWI.h"
#include <stdio.h>
#include <string.h>
@@ -36,127 +38,11 @@
#include "stepper.h"
#include "ledmatrix.h"
#include "sl018.h"
-
-#include "LUFA/Drivers/Peripheral/TWI.h"
-#include "LUFA/Drivers/Peripheral/Serial.h"
-#include "LUFA/Drivers/Misc/RingBuffer.h"
-
-#include <avr/eeprom.h>
-#define EEPROM_SIZE 1024
-typedef uint8_t keyslot_t[8];
-keyslot_t EEMEM keystore[EEPROM_SIZE/sizeof(keyslot_t)];
-
-FILE usb_stream;
-FILE serial_stream;
-FILE * stdio = &serial_stream;
-
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2012.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
+#include "keystore.h"
+#include "usb_serial.h"
+FILE * * stdio_ptr = NULL;
-#include <LUFA/Drivers/USB/USB.h>
-#include "lufa-descriptor-usbserial.h"
-
-USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
- {
- .Config =
- {
- .ControlInterfaceNumber = 0,
-
- .DataINEndpointNumber = CDC_TX_EPNUM,
- .DataINEndpointSize = CDC_TXRX_EPSIZE,
- .DataINEndpointDoubleBank = false,
-
- .DataOUTEndpointNumber = CDC_RX_EPNUM,
- .DataOUTEndpointSize = CDC_TXRX_EPSIZE,
- .DataOUTEndpointDoubleBank = false,
-
- .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,
- .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
- .NotificationEndpointDoubleBank = false,
- },
- };
-
-void EVENT_USB_Device_ConfigurationChanged(void)
-{
- CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
-}
-
-void EVENT_USB_Device_ControlRequest(void)
-{
- CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
-}
-
-void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
-{
- if(CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR)
- stdio = &usb_stream;
- else
- stdio = &serial_stream;
-}
-
-void EVENT_USB_Device_Disconnect(void)
-{
- stdio = &serial_stream;
-}
-/* end LUFA CDC-ACM specific definitions*/
-
-
-
-int16_t stdio_bytes_received(void)
-{
- if(stdio == &usb_stream)
- return CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface);
- else
- return (int16_t)Serial_IsCharReceived();
-}
-
-
-void flash_keystore_from_stdio(void)
-{
- keyslot_t ks;
- uint8_t byte_pos=0;
- fprintf(stdio,"Flashing keys:\n\r");
- fflush(stdio);
- for(uint8_t ks_pos=0;ks_pos<EEPROM_SIZE/sizeof(ks);) {
- CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
- USB_USBTask();
-
- int16_t bytes_received = stdio_bytes_received();
- while(bytes_received > 0) {
- ks[byte_pos++]=fgetc(stdio);
- bytes_received--;
- if (byte_pos == sizeof(ks)) {
- byte_pos=0;
- eeprom_update_block(&ks,&keystore[ks_pos],sizeof(ks));
- ks_pos++;
- fputc('.', stdio);
- fflush(stdio);
- led_toggle();
- }
- }
- }
- fprintf(stdio,"\n");
- fputc(0, stdio);
- led_off();
-}
-
-void dump_keystore_to_stdio(void)
-{
- keyslot_t ks;
- for(uint8_t ks_pos=0;ks_pos<EEPROM_SIZE/sizeof(ks);ks_pos++) {
- eeprom_read_block(&ks,&keystore[ks_pos],sizeof(ks));
- for (uint8_t i=0; i< sizeof(ks); i++)
- fprintf(stdio,"%02X",ks[i]);
- fprintf(stdio,"\n\r");
- }
-}
-
void handle_stdio(uint8_t cmd)
{
switch(cmd) {
@@ -164,33 +50,33 @@ void handle_stdio(uint8_t cmd)
reset2bootloader();
break;
case 'R':
- if(!sl018_reset(stdio))
- fprintf(stdio, "ok\n\r");
+ if(!sl018_reset(*stdio_ptr))
+ fprintf(*stdio_ptr, "ok\n\r");
break;
case 'f': //get cardreader firmware version
do {
- unsigned char * firmware_str = sl018_get_firmware_version(stdio);
+ unsigned char * firmware_str = sl018_get_firmware_version(*stdio_ptr);
if(firmware_str)
- fprintf(stdio, "%s\n\r",firmware_str);
+ fprintf(*stdio_ptr, "%s\n\r",firmware_str);
} while(0);
break;
case 'e': //flash eeprom
- flash_keystore_from_stdio();
+ flash_keystore_from_stdio(*stdio_ptr);
break;
case 'd': //dump eeprom - this breaks security!
- dump_keystore_to_stdio();
+ dump_keystore_to_stdio(*stdio_ptr);
break;
case 'o':
if(start_stepper(dir_open))
- fprintf(stdio, "ok\n\r");
+ fprintf(*stdio_ptr, "ok\n\r");
else
- fprintf(stdio, "error: already in progress\n\r");
+ fprintf(*stdio_ptr, "error: already in progress\n\r");
break;
case 'c':
if(start_stepper(dir_close))
- fprintf(stdio, "ok\n\r");
+ fprintf(*stdio_ptr, "ok\n\r");
else
- fprintf(stdio, "error: already in progress\n\r");
+ fprintf(*stdio_ptr, "error: already in progress\n\r");
break;
case '0': ledmatrix(off); break;
case '1': ledmatrix(red); break;
@@ -201,61 +87,23 @@ void handle_stdio(uint8_t cmd)
case '6': ledmatrix(green_blink); break;
case '7': ledmatrix(rg_moving); break;
case '8': ledmatrix(rg_blink); break;
- default: fprintf(stdio, "error, unknown command %02X '%c'\n\r",cmd, cmd); return;
- }
-}
-
-
-
-/* this generates a Fletcher8 checksum */
-/* code from: http://stackoverflow.com/questions/13491700/8-bit-fletcher-checksum-of-16-byte-data */
-uint8_t generate_csum(uint8_t* data)
-{
- uint16_t sum1 = 0xf, sum2 = 0xf, len = sizeof(keyslot_t) - 1;
- do { sum2 += ( sum1 += *data++ ); } while (--len);
- return sum2<<4 | sum1;
-}
-
-uint8_t compare_keyslots(const keyslot_t a, const keyslot_t b)
-{
- uint8_t tmp=0;
- // constant time compare
- for(uint8_t i=0; i<sizeof(keyslot_t); ++i)
- tmp |= a[i] ^ b[i];
- return tmp;
-}
-
-bool check_card(const uint8_t * uid, uint8_t uid_len)
-{
- keyslot_t card, ks;
- memset(card, 0, sizeof(card));
- for (uint8_t pos=0; pos<uid_len; pos++)
- card[pos]=uid[uid_len-pos-1];
- card[sizeof(keyslot_t)-1]=generate_csum(card);
- bool valid=0;
- for(uint8_t ks_pos=0;ks_pos<(EEPROM_SIZE/sizeof(ks));ks_pos++) {
- eeprom_read_block(&ks,&keystore[ks_pos],sizeof(ks));
- if(!compare_keyslots(card, ks)) {
- valid=1;
- // break; // this would break security (not constant time)
- }
+ default: fprintf(*stdio_ptr, "error, unknown command %02X '%c'\n\r",cmd, cmd); return;
}
- return valid;
}
void handle_card(void)
{
uid_t uid;
- sl018_read_card_uid(&uid,stdio);
+ sl018_read_card_uid(&uid,*stdio_ptr);
if (uid.length)
{
- if(check_card(uid.buffer,uid.length)) {
- sl018_set_led(1,stdio);
+ if(keystore_check_card(uid.buffer,uid.length)) {
+ sl018_set_led(1,*stdio_ptr);
_delay_ms(255);
- fprintf(stdio,"Card allowed - opening/closing door\n\r"); // TODO: open/close door!
- sl018_set_led(0,stdio);
+ fprintf(*stdio_ptr,"Card allowed - opening/closing door\n\r"); // TODO: open/close door!
+ sl018_set_led(0,*stdio_ptr);
} else {
- fprintf(stdio,"Card not found in Database\n\r");
+ fprintf(*stdio_ptr,"Card not found in Database\n\r");
}
}
}
@@ -267,29 +115,24 @@ int main(void)
cpu_init();
led_init();
- USB_Init();
+ usb_serial_init();
TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000));
- Serial_Init(115200,false);
- Serial_CreateStream(&serial_stream);
- CDC_Device_CreateStream(&VirtualSerial_CDC_Interface,&usb_stream);
-
- sei();
-
init_heartbeat();
init_stepper();
init_ledmatrix();
+ stdio_ptr = usb_serial_get_stdio_ptr();
+ sei();
- sl018_reset(stdio);
+ sl018_reset(*stdio_ptr);
for(;;) {
- CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
- USB_USBTask();
+ usb_serial_task();
- int16_t bytes_received = stdio_bytes_received();
+ int16_t bytes_received = usb_serial_bytes_received();
if(bytes_received > 0)
- handle_stdio(fgetc(stdio));
+ handle_stdio(fgetc(*stdio_ptr));
- if (sl018_check_for_new_card(stdio))
+ if (sl018_check_for_new_card(*stdio_ptr))
handle_card();
handle_heartbeat();
}
diff --git a/usb-i2c-sl018/usb_serial.c b/usb-i2c-sl018/usb_serial.c
new file mode 100644
index 0000000..3dd79e1
--- /dev/null
+++ b/usb-i2c-sl018/usb_serial.c
@@ -0,0 +1,126 @@
+/*
+ * spreadspace avr utils
+ *
+ *
+ * Copyright (C) 2013 Christian Pointner <equinox@spreadspace.org>
+ * Othmar Gsenger <otti@wirdorange.org>
+ *
+ * This file is part of spreadspace avr utils.
+ *
+ * spreadspace avr utils is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
+ *
+ * spreadspace avr utils is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "usb_serial.h"
+#include <LUFA/Drivers/USB/USB.h>
+#include "lufa-descriptor-usbserial.h"
+#include "LUFA/Drivers/Peripheral/Serial.h"
+
+FILE usb_stream;
+FILE serial_stream;
+FILE * stdio = &serial_stream;
+
+FILE * * usb_serial_get_stdio_ptr(void)
+{
+ return &stdio;
+}
+
+
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2012.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
+ {
+ .Config =
+ {
+ .ControlInterfaceNumber = 0,
+
+ .DataINEndpointNumber = CDC_TX_EPNUM,
+ .DataINEndpointSize = CDC_TXRX_EPSIZE,
+ .DataINEndpointDoubleBank = false,
+
+ .DataOUTEndpointNumber = CDC_RX_EPNUM,
+ .DataOUTEndpointSize = CDC_TXRX_EPSIZE,
+ .DataOUTEndpointDoubleBank = false,
+
+ .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,
+ .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
+ .NotificationEndpointDoubleBank = false,
+ },
+ };
+
+
+void usb_serial_init()
+{
+ USB_Init();
+ Serial_Init(115200,false);
+ Serial_CreateStream(&serial_stream);
+ CDC_Device_CreateStream(&VirtualSerial_CDC_Interface,&usb_stream);
+}
+
+void usb_serial_task(void)
+{
+ CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
+ USB_USBTask();
+}
+
+void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+ if(CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR)
+ stdio = &usb_stream;
+ else
+ stdio = &serial_stream;
+}
+
+void EVENT_USB_Device_Disconnect(void)
+{
+ stdio = &serial_stream;
+}
+/* end LUFA CDC-ACM specific definitions*/
+
+int16_t stdio_bytes_received(void)
+{
+ if(stdio == &usb_stream)
+ return CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface);
+ else
+ return (int16_t)Serial_IsCharReceived();
+}
+
+void EVENT_USB_Device_ConfigurationChanged(void)
+{
+ CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
+}
+
+void EVENT_USB_Device_ControlRequest(void)
+{
+ CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
+}
+
+
+/* end LUFA CDC-ACM specific definitions*/
+
+
+
+int16_t usb_serial_bytes_received(void)
+{
+ if(stdio == &usb_stream)
+ return CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface);
+ else
+ return (int16_t)Serial_IsCharReceived();
+}
+
diff --git a/usb-i2c-sl018/usb_serial.h b/usb-i2c-sl018/usb_serial.h
new file mode 100644
index 0000000..5f821f8
--- /dev/null
+++ b/usb-i2c-sl018/usb_serial.h
@@ -0,0 +1,32 @@
+/*
+ * spreadspace avr utils
+ *
+ *
+ * Copyright (C) 2013 Christian Pointner <equinox@spreadspace.org>
+ * Othmar Gsenger <otti@wirdorange.org>
+ *
+ * This file is part of spreadspace avr utils.
+ *
+ * spreadspace avr utils is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
+ *
+ * spreadspace avr utils is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef R3TUER_usb_serial_h_INCLUDED
+#define R3TUER_usb_serial_h_INCLUDED
+#include <stdio.h>
+
+FILE * * usb_serial_get_stdio_ptr(void);
+void usb_serial_init(void);
+void usb_serial_task(void);
+int16_t usb_serial_bytes_received(void);
+#endif