Emulation tool added.
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 5 Oct 2017 04:53:48 +0000 (13:53 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 5 Oct 2017 04:53:48 +0000 (13:53 +0900)
ChangeLog
src/Makefile
src/configure
src/main.c
tool/gnuk-emulation-setup [new file with mode: 0755]

index cc8b9a7..8e9ce09 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2017-10-05  NIIBE Yutaka  <gniibe@fsij.org>
 
+       * src/Makefile (install): New target.
+
+       * src/configure (prefix. exec_prefix, libexecdir): Add.
+
+       * src/main.c [GNU_LINUX_EMULATION] (main): Option handling.
+
+       * tool/gnuk-emulation-setup: New.
+
        * polarssl/library/bignum.c (M_LIMBS, limbs_M, MAX_A_LIMBS)
        (limbs_MAX_A, mpi_gen_prime): Fix for 64-bit machine.
 
index 1e21543..1a755a3 100644 (file)
@@ -77,12 +77,14 @@ distclean: clean
               usb-strings.c.inc usb-vid-pid-ver.c.inc
 
 ifneq ($(EMULATION),)
-build/flash.data: Makefile
-       @echo 'Generating 8192-byte flash.data'
-       @/bin/echo -n -e '\xff\xff\xff\xff\xff\xff\xff\xff' >$@
-       @for i in $(shell seq 511); \
-          do /bin/echo -n -e '\xff\xff\xff\xff\xff\xff\xff\xff' >>$@; done
-       @/bin/echo -n -e '\x00\x00\xff\xff\xff\xff\xff\xff' >>$@
-       @for i in $(shell seq 511); \
-          do /bin/echo -n -e '\xff\xff\xff\xff\xff\xff\xff\xff' >>$@; done
+# By specifying DESTDIR on invocation of "make", you can install
+# program to different ROOT.
+
+# The variables prefix, exec_prefix, libexecdir are defined in
+# config.mk.
+
+install: build/gnuk
+       test -d "$(DESTDIR)$(libexecdir)" || mkdir -p "$(DESTDIR)$(libexecdir)"
+       install -c build/gnuk "$(DESTDIR)$(libexecdir)"
+
 endif
index 90682b1..d51ff7d 100755 (executable)
@@ -45,6 +45,10 @@ 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
@@ -101,6 +105,15 @@ for option; do
     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
@@ -309,25 +322,25 @@ output_vid_pid_version () {
 }
 
 output_vendor_product_serial_strings () {
-  prefix=$1
+  name=$1
 
-  echo "static const uint8_t ${prefix}string_vendor[] = {"
+  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 ${prefix}string_product[] = {"
+  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 "$prefix"; then
+  if test -n "$name"; then
   echo
-  echo "const uint8_t ${prefix}string_serial[] = {"
+  echo "const uint8_t ${name}string_serial[] = {"
   echo "  ${#SERIALNO}*2+2+16,                  /* bLength */"
   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
   echo "  /* Serial number: \"$SERIALNO\" */"
@@ -342,14 +355,14 @@ output_vendor_product_serial_strings () {
   echo '};'
   echo
   echo '#ifdef USB_STRINGS_FOR_GNUK'
-  echo "static const uint8_t ${prefix}revision_detail[] = {"
+  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 ${prefix}config_options[] = {"
+  echo "static const uint8_t ${name}config_options[] = {"
   echo "  ${#CONFIG}*2+2,                       /* bLength */"
   echo "  STRING_DESCRIPTOR,            /* bDescriptorType */"
   echo "  /* configure options: \"$CONFIG\" */"
@@ -397,6 +410,11 @@ fi
  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
index 0740ee5..aa54935 100644 (file)
@@ -36,6 +36,7 @@
 #include "usb-cdc.h"
 #include "random.h"
 #ifdef GNU_LINUX_EMULATION
+#include <stdio.h>
 #include <stdlib.h>
 #define main emulated_main
 #else
@@ -215,28 +216,63 @@ extern uint32_t bDeviceState;
  * Entry point.
  */
 int
-main (int argc, char *argv[])
+main (int argc, const char *argv[])
 {
 #ifdef GNU_LINUX_EMULATION
   uintptr_t flash_addr;
+  const char *flash_image_path;
+  char *path_string = NULL;
 #endif
 #ifdef FLASH_UPGRADE_SUPPORT
   uintptr_t entry;
 #endif
   chopstx_t ccid_thd;
 
-  (void)argc;
-  (void)argv;
-
   gnuk_malloc_init ();
 
 #ifdef GNU_LINUX_EMULATION
-  flash_addr = flash_init ("flash.data");
+#define FLASH_IMAGE_NAME ".gnuk-flash-image"
+
+  if (argc >= 3 || (argc == 2 && !strcmp (argv[1], "--help")))
+    {
+      fprintf (stdout, "Usage: %s [flash-image-file]", argv[0]);
+      exit (0);
+    }
+
+  if (argc == 1)
+    {
+      char *p = getenv ("HOME");
+
+      if (p == NULL)
+       {
+         fprintf (stderr, "Can't find $HOME\n");
+         exit (1);
+       }
+
+      path_string = malloc (strlen (p) + strlen (FLASH_IMAGE_NAME) + 2);
+
+      p = stpcpy (path_string, p);
+      *p++ = '/';
+      strcpy (p, FLASH_IMAGE_NAME);
+      flash_image_path = path_string;
+    }
+  else
+    flash_image_path = argv[1];
+
+  flash_addr = flash_init (flash_image_path);
   flash_addr_key_storage_start = (uint8_t *)flash_addr;
   flash_addr_data_storage_start = (uint8_t *)flash_addr + 4096;
+#else
+  (void)argc;
+  (void)argv;
 #endif
+
   flash_unlock ();
-#if !defined (GNU_LINUX_EMULATION)
+
+#ifdef GNU_LINUX_EMULATION
+    if (path_string)
+      free (path_string);
+#else
   device_initialize_once ();
 #endif
 
diff --git a/tool/gnuk-emulation-setup b/tool/gnuk-emulation-setup
new file mode 100755 (executable)
index 0000000..19f0bc8
--- /dev/null
@@ -0,0 +1,48 @@
+#! /bin/sh
+#
+# gnuk-emulation-setup - Generate flash image for Gnuk
+#
+# Copyright (C) 2017  Free Software Initiative of Japan
+# Author: NIIBE Yutaka <gniibe@fsij.org>
+#
+# 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 <http://www.gnu.org/licenses/>.
+
+if test "$1" = "--help"; then
+    echo "Usage:"
+    echo "     $0 [output-file]"
+    echo "             Generate Gnuk flash image"
+    echo "     $0 --help"
+    echo "             Show this message"
+    exit 0
+fi
+
+OUTPUT_FILE=${1:-$HOME/.gnuk-flash-image}
+
+# Generate 8192-byte flash data into OUTPUT_FILE
+
+exec > $OUTPUT_FILE
+
+for i in $(seq 512); do
+    /bin/echo -n -e '\xff\xff\xff\xff\xff\xff\xff\xff'
+done
+
+/bin/echo -n -e '\x00\x00\xff\xff\xff\xff\xff\xff'
+
+for i in $(seq 511); do
+    /bin/echo -n -e '\xff\xff\xff\xff\xff\xff\xff\xff'
+done
+
+chmod og-rw $OUTPUT_FILE