diff --git a/ChangeLog b/ChangeLog index 496eddf..8403f46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-09-28 NIIBE Yutaka + + * src/Makefile: Support GNU/Linux emulation. + * src/configure: Support GNU/Linux emulation. + * emulation: Remove. + 2017-08-11 NIIBE Yutaka * VERSION: 1.2.5. diff --git a/chopstx b/chopstx index d8df82b..5b7c5a9 160000 --- a/chopstx +++ b/chopstx @@ -1 +1 @@ -Subproject commit d8df82badf671fef49d5eae2e5a2f1b5ae46bf99 +Subproject commit 5b7c5a9996333d882376cd45ebf4d590812ccecd diff --git a/emulation/Makefile b/emulation/Makefile deleted file mode 100644 index 7739329..0000000 --- a/emulation/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -SRCS = usbip-server.c usb-emu.c glue.c -OBJS = $(SRCS:.c=.o) -TARGET=gnuk_emulation -GNUKDIR=../src - -GNUK_SRCS = main.c call-rsa.c \ - usb-ccid.c openpgp.c ac.c openpgp-do.c flash.c \ - bn.c mod.c \ - modp256r1.c jpc_p256r1.c ec_p256r1.c call-ec_p256r1.c \ - modp256k1.c jpc_p256k1.c ec_p256k1.c call-ec_p256k1.c \ - mod25638.c ecc-edwards.c ecc-mont.c sha512.c \ - random.c neug.c sha256.c -USB_SRCS=usb_desc.c usb_ctrl.c - -GNUK_CSRC = $(addprefix $(GNUKDIR)/, $(GNUK_SRCS)) -GNUK_OBJS = $(notdir $(GNUK_CSRC:.c=.o)) - -USB_CSRC = $(addprefix $(GNUKDIR)/, $(USB_SRCS)) -USB_OBJS = $(notdir $(USB_CSRC:.c=.o)) - -# all: -# echo $(GNUK_OBJS) - -$(TARGET): $(OBJS) $(USB_OBJS) Makefile - $(CC) -o $(TARGET) $(OBJS) $(USB_OBJS) - -$(GNUK_OBJS): %.o : $(GNUKDIR)/%.c Makefile - $(CC) -c $(CFLAGS) -I. -I$(GNUKDIR) -I../chopstx $< -o $@ - -$(USB_OBJS): %.o : $(GNUKDIR)/%.c Makefile - $(CC) -c $(CFLAGS) -I. -I$(GNUKDIR) -I../chopstx $< -o $@ diff --git a/emulation/glue.c b/emulation/glue.c deleted file mode 100644 index 91c513b..0000000 --- a/emulation/glue.c +++ /dev/null @@ -1,54 +0,0 @@ -#include - -uint8_t _regnual_start; -uint8_t __heap_end__; - -int -check_crc32 (const uint32_t *start_p, const uint32_t *end_p) -{ - return 0; -} - -uint8_t * -sram_address (uint32_t offset) -{ - return ((uint8_t *)0x20000000) + offset; -} - -const uint8_t sys_version[8] = { - 3*2+2, /* bLength */ - 0x03, /* bDescriptorType = USB_STRING_DESCRIPTOR_TYPE */ - /* sys version: "3.0" */ - '3', 0, '.', 0, '0', 0, -}; - -void -led_blink (int spec) -{ -} - -void -ccid_usb_reset (int full) -{ -} - -void -ccid_card_change_signal (int how) -{ -} - -enum ccid_state { - CCID_STATE_NOCARD, /* No card available */ - CCID_STATE_START, /* Initial */ - CCID_STATE_WAIT, /* Waiting APDU */ - /* Busy1, Busy2, Busy3, Busy5 */ - CCID_STATE_EXECUTE, /* Busy4 */ - CCID_STATE_RECEIVE, /* APDU Received Partially */ - CCID_STATE_SEND, /* APDU Sent Partially */ - - CCID_STATE_EXITED, /* ICC Thread Terminated */ - CCID_STATE_EXEC_REQUESTED, /* Exec requested */ -}; - -static enum ccid_state ccid_state; -enum ccid_state *const ccid_state_p = &ccid_state; diff --git a/emulation/usb-emu.c b/emulation/usb-emu.c deleted file mode 100644 index c6d9a39..0000000 --- a/emulation/usb-emu.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - * usb-emu.c - USB driver for USBIP emulation - * - * Copyright (C) 2017 Flying Stone Technology - * Author: NIIBE Yutaka - * - * This file is a part of Chopstx, a thread library for embedded. - * - * Chopstx 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 - * (at your option) any later version. - * - * Chopstx 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 this program. If not, see . - * - */ - -#include -#include - -#include "../chopstx/usb_lld.h" - -int -usb_lld_ctrl_ack (struct usb_dev *dev) -{ - return 0; -} - -int -usb_lld_ctrl_recv (struct usb_dev *dev, void *p, size_t len) -{ - return 0; -} - -int -usb_lld_ctrl_send (struct usb_dev *dev, const void *buf, size_t buflen) -{ - return 0; -} - -uint8_t -usb_lld_current_configuration (struct usb_dev *dev) -{ - return 0; -} - -void -usb_lld_prepare_shutdown (void) -{ -} - -void -usb_lld_ctrl_error (struct usb_dev *dev) -{ -} - -void -usb_lld_reset (struct usb_dev *dev, uint8_t feature) -{ -} - -void -usb_lld_set_configuration (struct usb_dev *dev, uint8_t config) -{ -} - - - -void -usb_lld_shutdown (void) -{ -} - -void -usb_lld_setup_endpoint (int ep_num, int ep_type, int ep_kind, - int ep_rx_addr, int ep_tx_addr, - int ep_rx_memory_size) -{ -} - -void -usb_lld_stall (int ep_num) -{ -} - - -void -usb_lld_stall_tx (int ep_num) -{ - usb_lld_stall (ep_num); -} - -void -usb_lld_stall_rx (int ep_num) -{ - usb_lld_stall (ep_num); -} diff --git a/emulation/usbip-server.c b/emulation/usbip-server.c deleted file mode 100644 index e69e93d..0000000 --- a/emulation/usbip-server.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - * usbip-server.c - USB Device Emulation by USBIP Protocol - * - * Copyright (C) 2017 Flying Stone Technology - * Author: NIIBE Yutaka - * - * This file is a part of Chopstx, a thread library for embedded. - * - * Chopstx 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 - * (at your option) any later version. - * - * Chopstx 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 this program. If not, see . - * - */ - -#include - -#include -#include -#include -#include - -#include -#include -#include - -#define USBIP_PORT 3240 - -#define CMD_REQ_LIST 0x01118005 -#define CMD_REQ_ATTACH 0x01118003 -#define CMD_URB 0x00000001 -#define CMD_DETACH 0x00000002 - -struct usbip_msg_head { - uint32_t cmd; - uint32_t seq; -}; - -#define USBIP_REPLY_HEADER_SIZE 12 -#define DEVICE_INFO_SIZE (256+32+12+6+6) -#define INTERFACE_INFO_SIZE 4 -#define DEVICE_LIST_SIZE (USBIP_REPLY_HEADER_SIZE+DEVICE_INFO_SIZE*1+INTERFACE_INFO_SIZE*1) - -#define USBIP_REPLY_DEVICE_LIST "\x01\x11\x00\x05" -#define NETWORK_UINT32_ZERO "\x00\x00\x00\x00" -#define NETWORK_UINT32_ONE "\x00\x00\x00\x01" -#define NETWORK_UINT32_TWO "\x00\x00\x00\x02" -#define NETWORK_UINT16_FSIJ "\x23\x4b" -#define NETWORK_UINT16_ZERO "\x00\x00" -#define NETWORK_UINT16_ONE_ONE "\x01\x01" - -static char * -list_devices (size_t *len_p) -{ - char *p0, *p; - - *len_p = 0; - p0 = malloc (DEVICE_LIST_SIZE); - if (p0 == NULL) - return NULL; - - *len_p = DEVICE_LIST_SIZE; - - p = p0; - memcpy (p, USBIP_REPLY_DEVICE_LIST, 4); - p += 4; - memcpy (p, NETWORK_UINT32_ZERO, 4); - p += 4; - memcpy (p, NETWORK_UINT32_ONE, 4); - p += 4; - memset (p, 0, 256); - strcpy (p, "/sys/devices/pci0000:00/0000:00:01.1/usb1/1-1"); - p += 256; - memset (p, 0, 32); - strcpy (p, "1-1"); - p += 32; - memcpy (p, NETWORK_UINT32_ONE, 4); /* Bus */ - p += 4; - memcpy (p, NETWORK_UINT32_TWO, 4); /* Dev */ - p += 4; - memcpy (p, NETWORK_UINT32_ONE, 4); /* Speed */ - p += 4; - memcpy (p, NETWORK_UINT16_FSIJ, 2); - p += 2; - memcpy (p, NETWORK_UINT16_ZERO, 2); /* Gnuk */ - p += 2; - memcpy (p, NETWORK_UINT16_ONE_ONE, 2); /* USB 1.1 */ - p += 2; - - *p++ = 0; /* bDeviceClass */ - *p++ = 0; /* bDeviceSubClass */ - *p++ = 0; /* bDeviceProtocol */ - *p++ = 0; /* bConfigurationValue */ - *p++ = 1; /* bConfigurationValue */ - *p++ = 1; /* bNumInterfaces */ - - *p++ = 11; /* bInterfaceClass */ - *p++ = 0; /* bInterfaceSubClass */ - *p++ = 0; /* bInterfaceProtocol */ - *p++ = 0; /* ----pad----------- */ - - return p0; -} - -static char * -attach_device (char busid[32], size_t *len_p) -{ - *len_p = 0; - return NULL; -} - -static int -handle_urb (int fd) -{ - return 0; -} - - -static void -run_server (void) -{ - int sock; - struct sockaddr_in v4addr; - const int one = 1; - - if ((sock = socket (PF_INET, SOCK_STREAM, 0)) < 0) - { - perror ("socket"); - exit (1); - } - - if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, - (const char*)&one, sizeof (int)) < 0) - perror ("WARN: setsockopt"); - - memset (&v4addr, 0, sizeof (v4addr)); - v4addr.sin_family = AF_INET; - v4addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - v4addr.sin_port = htons (USBIP_PORT); - - if (bind (sock, (const struct sockaddr *)&v4addr, sizeof (v4addr)) < 0) - { - perror ("bind"); - exit (1); - } - - /* We only accept a connection from a single client. */ - if (listen (sock, 1) < 0) - { - perror ("listen"); - exit (1); - } - - for (;;) - { - int fd; - int attached = 0; - - /* We don't care who is connecting. */ - if ((fd = accept (sock, NULL, NULL)) < 0) - { - perror ("accept"); - exit (1); - } - - for (;;) - { - struct usbip_msg_head msg; - - if (recv (fd, (char *)&msg, sizeof (msg), 0) != sizeof (msg)) - { - perror ("msg recv"); - break; - } - - msg.cmd = ntohl (msg.cmd); - msg.seq = ntohl (msg.seq); - - if (msg.cmd == CMD_REQ_LIST) - { - char *device_list; - size_t device_list_size; - - if (attached) - { - fprintf (stderr, "REQ list while attached\n"); - break; - } - - device_list = list_devices (&device_list_size); - - if (send (fd, device_list, device_list_size, 0) != device_list_size) - { - perror ("list send"); - break; - } - - free (device_list); - } - else if (msg.cmd == CMD_REQ_ATTACH) - { - char busid[32]; - char *attach; - size_t attach_size; - - if (attached) - { - fprintf (stderr, "REQ attach while attached\n"); - break; - } - - if (recv (fd, busid, 32, 0) != 32) - { - perror ("attach recv"); - break; - } - - attach = attach_device (busid, &attach_size); - if (send (fd, attach, attach_size, 0) != attach_size) - { - perror ("list send"); - break; - } - - free (attach); - attached = 1; - } - else if (msg.cmd == CMD_URB) - { - if (!attached) - { - fprintf (stderr, "URB while attached\n"); - break; - } - - if (handle_urb (fd) < 0) - { - fprintf (stderr, "URB handling failed\n"); - break; - } - } - else if(msg.cmd == CMD_DETACH) - { - if (!attached) - { - fprintf (stderr, "DETACH while attached\n"); - break; - } - - /* send reply??? */ - break; - } - else - { - fprintf (stderr, "Unknown command %08x, disconnecting.\n", msg.cmd); - break; - } - } - - close (fd); - } -} - - -int -main (int argc, const char *argv[]) -{ - run_server (); - return 0; -} diff --git a/src/Makefile b/src/Makefile index aefba17..5161c19 100644 --- a/src/Makefile +++ b/src/Makefile @@ -5,9 +5,6 @@ PROJECT = gnuk CHOPSTX = ../chopstx -# Define linker script file here -LDSCRIPT= gnuk.ld - CSRC = main.c call-rsa.c mcu-stm32f103.c \ usb_desc.c usb_ctrl.c \ usb-ccid.c openpgp.c ac.c openpgp-do.c flash.c \ @@ -29,6 +26,9 @@ INCDIR += $(CRYPTINCDIR) include config.mk +USE_SYS = yes +USE_USB = yes +USE_ADC = yes USE_EVENTFLAG = yes ifneq ($(ENABLE_DEBUG),) @@ -43,21 +43,13 @@ ifeq ($(ENABLE_PINPAD),dnd) CSRC += usb-msc.c endif -CHIP=stm32f103 -USE_SYS = yes -USE_USB = yes -USE_ADC = yes - ################################### -CROSS = arm-none-eabi- CC = $(CROSS)gcc LD = $(CROSS)gcc OBJCOPY = $(CROSS)objcopy -MCU = cortex-m3 CWARN = -Wall -Wextra -Wstrict-prototypes OPT = -O3 -Os -g -LIBS = ####################### include $(CHOPSTX)/rules.mk diff --git a/src/configure b/src/configure index 18f1bd3..5af252d 100755 --- a/src/configure +++ b/src/configure @@ -10,6 +10,7 @@ nl=$'\n' # Free Software Initiative of Japan # # This file is a part of Gnuk, a GnuPG USB Token implementation. +# # Gnuk 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 @@ -191,6 +192,28 @@ STM8S_DISCOVERY) ;; esac +if test "$target" = "GNU_LINUX"; then + ldscript="" + chip="gnu-linux" + use_sys="yes" + emulation="yes" + cross="" + mcu="none" + def_emulation="-DGNU_LINUX_EMULATION" + enable_hexoutput="" + libs="-lpthread" +else + ldscript="gnuk.ld" + chip="stm32f103" + use_sys="yes" + emulation="" + cross="arm-none-eabi-" + mcu="cortex-m3" + def_emulation="" + enable_hexoutput=yes + libs="" +fi + # --enable-debug option if test "$debug" = "yes"; then DEBUG_MAKE_OPTION="ENABLE_DEBUG=1" @@ -213,13 +236,11 @@ if test "$with_dfu" = "yes"; then ORIGIN=0x08003000 FLASH_SIZE=$((FLASH_SIZE - 12)) DFU_DEFINE="#define DFU_SUPPORT 1" - HEXOUTPUT_MAKE_OPTION="ENABLE_OUTPUT_HEX=yes" else with_dfu=no echo "Configured for bare system (no-DFU)" ORIGIN=0x08000000 DFU_DEFINE="#undef DFU_SUPPORT" - HEXOUTPUT_MAKE_OPTION="" fi # --enable-pinpad option @@ -278,7 +299,7 @@ SERIALNO_STR_LEN_DEFINE="#define SERIALNO_STR_LEN ${#SERIALNO}" if test "$sys1_compat" = "yes"; then - CONFIG="$target:dfu=$with_dfu:debug=$debug:pinpad=$pinpad:certdo=$certdo" + CONFIG="$target:dfu=$with_dfu:debug=$debug:pinpad=$pinpad:certdo=$certdo:factory_reset=$factory_reset" else if test "$with_dfu" = "yes"; then echo "Common binary can't support DFU loader, don't use --with-dfu." >&2 @@ -288,27 +309,27 @@ else FLASH_PAGE_SIZE=2048 FLASH_SIZE=128 MEMORY_SIZE=20 - CONFIG="common:debug=$debug:pinpad=$pinpad:certdo=$certdo" + CONFIG="common:debug=$debug:pinpad=$pinpad:certdo=$certdo:factory_reset=$factory_reset" fi output_vid_pid_version () { echo "$VIDPID" | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\):\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$% 0x\2, 0x\1, /* idVendor */\\${nl} 0x\4, 0x\3, /* idProduct */%p" - echo "$VERSION" | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$% 0x\2, 0x\1, /* bcdDevice */%p" + echo "$VERSION" | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$% 0x\2, 0x\1, /* bcdDevice */%p" } output_vendor_product_serial_strings () { prefix=$1 echo "static const uint8_t ${prefix}string_vendor[] = {" - echo " ${#VENDOR}*2+2, /* bLength */" - echo " STRING_DESCRIPTOR, /* bDescriptorType */" + echo " ${#VENDOR}*2+2, /* bLength */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* Manufacturer: \"$VENDOR\" */" echo "$VENDOR" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo '};' echo echo "static const uint8_t ${prefix}string_product[] = {" - echo " ${#PRODUCT}*2+2, /* bLength */" - echo " STRING_DESCRIPTOR, /* bDescriptorType */" + echo " ${#PRODUCT}*2+2, /* bLength */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* Product name: \"$PRODUCT\" */" echo "$PRODUCT" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo '};' @@ -316,8 +337,8 @@ output_vendor_product_serial_strings () { if test -n "$prefix"; then echo echo "const uint8_t ${prefix}string_serial[] = {" - echo " ${#SERIALNO}*2+2+16, /* bLength */" - echo " STRING_DESCRIPTOR, /* bDescriptorType */" + echo " ${#SERIALNO}*2+2+16, /* bLength */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* Serial number: \"$SERIALNO\" */" echo "$SERIALNO" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo " 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff," @@ -326,15 +347,15 @@ output_vendor_product_serial_strings () { echo echo '#ifdef USB_STRINGS_FOR_GNUK' echo "static const uint8_t ${prefix}revision_detail[] = {" - echo " ${#REVISION}*2+2, /* bLength */" - echo " STRING_DESCRIPTOR, /* bDescriptorType */" + echo " ${#REVISION}*2+2, /* bLength */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* revision detail: \"$REVISION\" */" echo "$REVISION" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo '};' echo echo "static const uint8_t ${prefix}config_options[] = {" - echo " ${#CONFIG}*2+2, /* bLength */" - echo " STRING_DESCRIPTOR, /* bDescriptorType */" + echo " ${#CONFIG}*2+2, /* bLength */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* configure options: \"$CONFIG\" */" echo $CONFIG | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo '};' @@ -342,7 +363,7 @@ output_vendor_product_serial_strings () { fi } -if ! (IFS=" " +if !(IFS=" " while read -r VIDPID VERSION PRODUCT VENDOR; do if test "$vidpid" = "$VIDPID"; then output_vid_pid_version > usb-vid-pid-ver.c.inc @@ -351,7 +372,7 @@ if ! (IFS=" " fi done; exit 1) < ../GNUK_USB_DEVICE_ID then - echo "Please specify valid Vendor ID and Product ID." >&2 + echo "Please specify valid Vendor ID and Product ID." >&2 echo "Check ../GNUK_USB_DEVICE_ID." >&2 exit 1 fi @@ -368,11 +389,19 @@ else fi -echo -e "DEFS=$use_sys3 $flash_override" '\n' \ - "$DEBUG_MAKE_OPTION" '\n' \ - "$PINPAD_MAKE_OPTION" '\n' \ - "$HEXOUTPUT_MAKE_OPTION" \ - > config.mk +(echo "CHIP=$chip"; + echo "USE_SYS=$use_sys"; + echo "EMULATION=$emulation"; + echo "CROSS=$cross"; + echo "MCU=$mcu"; + echo "DEFS=$use_sys3 $flash_override $def_emulation"; + echo "LDSCRIPT=$ldscript"; + echo "LIBS=$libs"; + echo "$DEBUG_MAKE_OPTION"; + echo "$PINPAD_MAKE_OPTION"; + echo "ENABLE_FRAUCHEKY=$enable_fraucheky"; + echo "ENABLE_OUTPUT_HEX=$enable_hexoutput" +) > config.mk if test "$certdo" = "yes"; then sed -e "/^@CERTDO_SUPPORT_START@$/ d" -e "/^@CERTDO_SUPPORT_END@$/ d" \