#! /bin/bash # This is bash which supports ANSI-C Quoting nl=$'\n' # # This file is *NOT* generated by GNU Autoconf, but written by NIIBE Yutaka # # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 # 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 # (at your option) any later version. # # Gnuk 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 . # # Submodule check # if ! test -f ../chopstx/rules.mk; then echo "Submodule 'chopstx' not found" >&2 echo "You might need: git submodule update --init" >&2 exit 1 fi # Default settings help=no vidpid=none target=FST_01 with_dfu=default debug=no sys1_compat=yes pinpad=no certdo=no hid_card_change=no factory_reset=no flash_override="" # For emulation prefix=/usr/local exec_prefix='${prefix}' libexecdir='${exec_prefix}/libexec' # Revision number if test -e ../.git; then if type git >/dev/null 2>&1; then REVISION=$(git describe --dirty="-modified") else # echo 'No git available, please install git' GIT_REVISION=$(sed -e 's/^\(.......\).*$/g\1/' "../.git/$(sed -e 's/^ref: //' ../.git/HEAD)") REVISION=$(cat ../VERSION)-$GIT_REVISION fi else REVISION=$(cat ../VERSION) fi # Process each option for option; do case $option in *=*) optarg=$(expr "X$option" : '[^=]*=\(.*\)') ;; *) optarg=yes ;; esac case $option in -h | --help) help=yes ;; --vidpid=*) vidpid=$optarg ;; --target=*) target=$optarg ;; --enable-debug) debug=yes ;; --disable-debug) debug=no ;; --enable-pinpad=*) pinpad=$optarg ;; --disable-pinpad) pinpad=no ;; --enable-certdo) certdo=yes ;; --disable-certdo) certdo=no ;; --enable-hid-card-change) hid_card_change=yes ;; --disable-hid-card-change) hid_card_change=no ;; --enable-sys1-compat) sys1_compat=yes ;; --disable-sys1-compat) sys1_compat=no ;; --enable-factory-reset) factory_reset=yes ;; --disable-factory-reset) factory_reset=no ;; --with-dfu) with_dfu=yes ;; --without-dfu) with_dfu=no ;; # # For emulation # --prefix=*) prefix=optarg ;; --exec-prefix=*) exec_prefix=optarg ;; --libexecdir=*) libexecdir=optarg ;; *) echo "Unrecognized option \`$option'" >&2 echo "Try \`$0 --help' for more information." >&2 exit 1 ;; esac done if test "$help" = "yes"; then cat <] --target=TARGET specify target [FST_01] supported targets are: FST_01 FST_01G OLIMEX_STM32_H103 MAPLE_MINI ST_DONGLE ST_NUCLEO_F103 NITROKEY_START BLUE_PILL STM8S_DISCOVERY CQ_STARM STM32_PRIMER2 STBEE STBEE_MINI FST_01_00 (unreleased version with 8MHz XTAL) --enable-factory-reset support life cycle management [no] --enable-debug debug with virtual COM port [no] --enable-pinpad=cir PIN entry support [no] --enable-certdo support CERT.3 data object [no] --enable-sys1-compat enable SYS 1.0 compatibility [yes] executable is target dependent --disable-sys1-compat disable SYS 1.0 compatibility [no] executable is target independent but requires SYS 2.0 or newer --with-dfu build image for DFU [] EOF exit 0 fi BOARD_HEADER_FILE=board-$(echo $target | tr '_[:upper:]' '-[:lower:]').h echo "Header file is: $BOARD_HEADER_FILE" ln -sf "../chopstx/board/$BOARD_HEADER_FILE" board.h # Flash page size in byte FLASH_PAGE_SIZE=1024 # Flash memory size in KiB FLASH_SIZE=128 # Memory size in KiB MEMORY_SIZE=20 # Settings for TARGET case $target in BLUE_PILL|STM8S_DISCOVERY) # It's 64KB version of STM32F103, but actually has 128KB flash_override="-DSTM32F103_OVERRIDE_FLASH_SIZE_KB=128" ;; CQ_STARM|STBEE_MINI) if test "$with_dfu" = "default"; then with_dfu=yes; fi ;; STM32_PRIMER2) FLASH_PAGE_SIZE=2048 FLASH_SIZE=512 MEMORY_SIZE=64 ;; STBEE) FLASH_PAGE_SIZE=2048 FLASH_SIZE=512 MEMORY_SIZE=64 if test "$with_dfu" = "default"; then with_dfu=yes; fi ;; *) ;; esac if test "$target" = "GNU_LINUX"; then ldscript="" chip="gnu-linux" emulation="yes" cross="" mcu="none" def_emulation="-DGNU_LINUX_EMULATION" enable_hexoutput="" libs="-lpthread" else ldscript="gnuk.ld" chip="stm32f103" emulation="" cross="arm-none-eabi-" mcu="cortex-m3" def_emulation="" enable_hexoutput=yes libs="" fi if test "$emulation" = "yes"; then if test "$vidpid" = "none"; then vidpid=0000:0000 else echo "Please don't specify VID:PID for emulation at compile time;" echo "It is a user who should specify VID:PID at run time." exit 1 fi else if test "$vidpid" = "none"; then echo "Please specify Vendor ID and Product ID by --vidpid option." >&2 exit 1 fi fi # --enable-debug option if test "$debug" = "yes"; then DEBUG_MAKE_OPTION="ENABLE_DEBUG=1" DEBUG_DEFINE="#define DEBUG 1" echo "Debug option enabled" else DEBUG_MAKE_OPTION="# ENABLE_DEBUG=1" DEBUG_DEFINE="#undef DEBUG" echo "Debug option disabled" fi # --with-dfu option if test "$with_dfu" = "yes"; then if test "$target" = "FST_01" -o "$target" = "FST_01G" \ -o "$target" = "FST_01_00"; then echo "FST-01 doesn't have DFU loader, you should not use --with-dfu." >&2 exit 1 fi echo "Configured for DFU" ORIGIN=0x08003000 FLASH_SIZE=$((FLASH_SIZE - 12)) DFU_DEFINE="#define DFU_SUPPORT 1" else with_dfu=no echo "Configured for bare system (no-DFU)" ORIGIN=0x08000000 DFU_DEFINE="#undef DFU_SUPPORT" fi # --enable-pinpad option if test "$pinpad" = "no"; then PINPAD_MAKE_OPTION="# ENABLE_PINPAD=" PINPAD_DEFINE="#undef PINPAD_SUPPORT" PINPAD_MORE_DEFINE="" echo "PIN pad option disabled" else PINPAD_MAKE_OPTION="ENABLE_PINPAD=$pinpad" PINPAD_DEFINE="#define PINPAD_SUPPORT 1" PINPAD_MORE_DEFINE="#define PINPAD_${pinpad^^[a-z]}_SUPPORT 1" echo "PIN pad option enabled ($pinpad)" fi # --enable-certdo option if test "$certdo" = "yes"; then CERTDO_DEFINE="#define CERTDO_SUPPORT 1" echo "CERT.3 Data Object is supported" else CERTDO_DEFINE="#undef CERTDO_SUPPORT" echo "CERT.3 Data Object is NOT supported" fi # --enable-hid-card-change option if test "$hid_card_change" = "yes"; then HID_CARD_CHANGE_DEFINE="#define HID_CARD_CHANGE_SUPPORT 1" echo "Card insert/removal by HID device is supported" else HID_CARD_CHANGE_DEFINE="#undef HID_CARD_CHANGE_SUPPORT" echo "Card insert/removal by HID device is NOT supported" fi # --enable-factory-reset option if test "$factory_reset" = "yes"; then LIFE_CYCLE_MANAGEMENT_DEFINE="#define LIFE_CYCLE_MANAGEMENT_SUPPORT 1" echo "Life cycle management is supported" else LIFE_CYCLE_MANAGEMENT_DEFINE="#undef LIFE_CYCLE_MANAGEMENT_SUPPORT" echo "Life cycle management is NOT supported" fi ### !!! Replace following string of "FSIJ" to yours !!! #### SERIALNO="FSIJ-$(sed -e 's%^[^/]*/%%' <../VERSION)-" 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: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 exit 1 fi # Override settings for common binary. Safer side. FLASH_PAGE_SIZE=2048 FLASH_SIZE=128 MEMORY_SIZE=20 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" } output_vendor_product_serial_strings () { name=$1 echo "static const uint8_t ${name}string_vendor[] = {" 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 ${name}string_product[] = {" 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 '};' if test -n "$name"; then echo echo "const uint8_t ${name}string_serial[] = {" 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" if test "$emulation" = "yes"; then echo " 'E', 0, 'M', 0, 'U', 0, 'L', 0," echo " 'A', 0, 'T', 0, 'E', 0, 'D', 0," else echo " 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff," echo " 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff," fi echo '};' echo echo '#ifdef USB_STRINGS_FOR_GNUK' echo "static const uint8_t ${name}revision_detail[] = {" 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 ${name}config_options[] = {" 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 '};' echo '#endif' fi } 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 output_vendor_product_serial_strings gnuk_ >usb-strings.c.inc exit 0 fi done; exit 1) < ../GNUK_USB_DEVICE_ID then echo "Please specify valid Vendor ID and Product ID." >&2 echo "Check ../GNUK_USB_DEVICE_ID." >&2 exit 1 fi if test "$sys1_compat" = "no"; then # Disable when you are sure that it's sys version 3.0 or later. # Note that Gnuk 1.0 and NeuG (until 0.06) uses sys version 1.0. # Disabling the compatibility, executable will be target independent, # assuming the clock initialization will be done by clock_init in # SYS. use_sys3="-DUSE_SYS3" else use_sys3="" fi (echo "CHIP=$chip"; 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" if test "$emulation" = "yes"; then echo "prefix=$prefix" echo "exec_prefix=$exec_prefix" echo "libexecdir=$libexecdir" fi ) > config.mk if test "$certdo" = "yes"; then sed -e "/^@CERTDO_SUPPORT_START@$/ d" -e "/^@CERTDO_SUPPORT_END@$/ d" \ -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \ -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \ -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \ < gnuk.ld.in > gnuk.ld else sed -e "/^@CERTDO_SUPPORT_START@$/,/^@CERTDO_SUPPORT_END@$/ d" \ -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \ -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \ -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \ < gnuk.ld.in > gnuk.ld fi sed -e "s/@DEBUG_DEFINE@/$DEBUG_DEFINE/" \ -e "s/@DFU_DEFINE@/$DFU_DEFINE/" \ -e "s/@PINPAD_DEFINE@/$PINPAD_DEFINE/" \ -e "s/@PINPAD_MORE_DEFINE@/$PINPAD_MORE_DEFINE/" \ -e "s/@CERTDO_DEFINE@/$CERTDO_DEFINE/" \ -e "s/@HID_CARD_CHANGE_DEFINE@/$HID_CARD_CHANGE_DEFINE/" \ -e "s/@LIFE_CYCLE_MANAGEMENT_DEFINE@/$LIFE_CYCLE_MANAGEMENT_DEFINE/" \ -e "s/@SERIALNO_STR_LEN_DEFINE@/$SERIALNO_STR_LEN_DEFINE/" \ < config.h.in > config.h exit 0