Compare commits
24 Commits
release/0.
...
release/1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b49390de7a | ||
|
|
71eaffc0ee | ||
|
|
5e9a35c881 | ||
|
|
df5b7f31a3 | ||
|
|
add6fa8b67 | ||
|
|
c488bed215 | ||
|
|
63979416f6 | ||
|
|
92be182e8a | ||
|
|
9ffa68355d | ||
|
|
814f6b6329 | ||
|
|
1927f8a1ec | ||
|
|
d3fb62b437 | ||
|
|
5d3e6c2b29 | ||
|
|
8be278be17 | ||
|
|
6de9c11329 | ||
|
|
63df97a2e0 | ||
|
|
144dd88a07 | ||
|
|
e80c8f1e8e | ||
|
|
99d7e8d396 | ||
|
|
f38f33dade | ||
|
|
cbed6b49c7 | ||
|
|
51435e7dba | ||
|
|
29b68186bf | ||
|
|
a5fddc691d |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -14,3 +14,4 @@ src/*.inc
|
|||||||
regnual/regnual.bin
|
regnual/regnual.bin
|
||||||
regnual/regnual.hex
|
regnual/regnual.hex
|
||||||
regnual/regnual.elf
|
regnual/regnual.elf
|
||||||
|
doc/_build
|
||||||
|
|||||||
42
ChangeLog
42
ChangeLog
@@ -1,3 +1,45 @@
|
|||||||
|
2012-07-21 Niibe Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
|
* Version 1.0.
|
||||||
|
* src/usb_desc.c (gnukStringSerial): Updated.
|
||||||
|
|
||||||
|
Documentation by Sphinx.
|
||||||
|
* doc/Makefile: New.
|
||||||
|
* doc/note: Old notes are moved here.
|
||||||
|
|
||||||
|
2012-07-20 Niibe Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
|
* test/features/002_get_data_static.feature: Support CERTDO enabled
|
||||||
|
Gnuk for the test of extended capabilities.
|
||||||
|
* test/features/802_get_data_static.feature: Ditto.
|
||||||
|
* test/features/402_get_data_static.feature: Ditto.
|
||||||
|
|
||||||
|
2012-07-10 Niibe Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
|
* test/features/*: Add test cases for PW1/PW3 of factory settings.
|
||||||
|
|
||||||
|
* test/features/202_keygen.feature: Add PSO signature test after
|
||||||
|
keygen.
|
||||||
|
* test/features/602_keygen.feature: Ditto.
|
||||||
|
|
||||||
|
Bug fix.
|
||||||
|
* src/openpgp-do.c (gpg_do_write_prvkey): Don't call ac_reset_*
|
||||||
|
here.
|
||||||
|
(proc_key_import): But call ac_reset_* here.
|
||||||
|
(gpg_do_keygen): Load private key for signing.
|
||||||
|
|
||||||
|
* tool/stlinkv2.py (stlinkv2.usb_disconnect): New.
|
||||||
|
|
||||||
|
2012-07-09 Niibe Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
|
* src/openpgp.c (cmd_pso): For decryption, return error sooner for
|
||||||
|
invalid data.
|
||||||
|
|
||||||
|
* tool/stlinkv2.py (stlinkv2.setup_gpio): Fix GPIOB_CRL.
|
||||||
|
|
||||||
|
* test/rsa_keys.py (integer_to_bytes_256): Rename from
|
||||||
|
integer_to_bytes and it should be exactly 256-byte long.
|
||||||
|
|
||||||
2012-07-06 Niibe Yutaka <gniibe@fsij.org>
|
2012-07-06 Niibe Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
* Version 0.21.
|
* Version 0.21.
|
||||||
|
|||||||
7
NEWS
7
NEWS
@@ -1,5 +1,12 @@
|
|||||||
Gnuk NEWS - User visible changes
|
Gnuk NEWS - User visible changes
|
||||||
|
|
||||||
|
* Major changes in Gnuk 1.0
|
||||||
|
|
||||||
|
Released 2012-07-21, by NIIBE Yutaka
|
||||||
|
|
||||||
|
This is bug fixes only release.
|
||||||
|
|
||||||
|
|
||||||
* Major changes in Gnuk 0.21
|
* Major changes in Gnuk 0.21
|
||||||
|
|
||||||
Released 2012-07-06, by NIIBE Yutaka
|
Released 2012-07-06, by NIIBE Yutaka
|
||||||
|
|||||||
78
README
78
README
@@ -1,7 +1,7 @@
|
|||||||
Gnuk - An Implementation of USB Cryptographic Token for GnuPG
|
Gnuk - An Implementation of USB Cryptographic Token for GnuPG
|
||||||
|
|
||||||
Version 0.21
|
Version 1.0
|
||||||
2012-07-06
|
2012-07-21
|
||||||
Niibe Yutaka
|
Niibe Yutaka
|
||||||
Free Software Initiative of Japan
|
Free Software Initiative of Japan
|
||||||
|
|
||||||
@@ -30,11 +30,7 @@ Q0: How Gnuk USB Token is superior than other solutions (OpenPGP
|
|||||||
card 2.0, GPF Crypto Stick, etc.) ?
|
card 2.0, GPF Crypto Stick, etc.) ?
|
||||||
http://www.g10code.de/p-card.html
|
http://www.g10code.de/p-card.html
|
||||||
http://www.privacyfoundation.de/crypto_stick/
|
http://www.privacyfoundation.de/crypto_stick/
|
||||||
A0: IMRHO, not quite, since there is no ready-to-use out-of-box Gnuk
|
A0: Good points of Gnuk are:
|
||||||
product yet. (It is welcome for me that some vendor will
|
|
||||||
manufacture Gnuk USB Token. Even I can help design of hardware,
|
|
||||||
if needed.)
|
|
||||||
Good points for Gnuk are:
|
|
||||||
* If you have skill of electronics and like DIY, you can build
|
* If you have skill of electronics and like DIY, you can build
|
||||||
Gnuk Token cheaper (see Q8-A8).
|
Gnuk Token cheaper (see Q8-A8).
|
||||||
* You can study Gnuk to modify and to enhance. For example, you
|
* You can study Gnuk to modify and to enhance. For example, you
|
||||||
@@ -60,7 +56,7 @@ A3: Orthodox choice is Olimex STM32-H103.
|
|||||||
|
|
||||||
Q4: What's version of GnuPG are you using?
|
Q4: What's version of GnuPG are you using?
|
||||||
A4: In Debian GNU/Linux system, I use gnupg 1.4.11-3 and gnupg-agent
|
A4: In Debian GNU/Linux system, I use gnupg 1.4.11-3 and gnupg-agent
|
||||||
2.0.14-2 (in sid). With older versions, you can only sign with SHA1.
|
2.0.18-2. With older versions, you can only sign with SHA1.
|
||||||
See: http://www.fsij.org/gnuk/gnupg2-fixes-needed
|
See: http://www.fsij.org/gnuk/gnupg2-fixes-needed
|
||||||
|
|
||||||
Q5: What's version of pcscd and libccid are you using?
|
Q5: What's version of pcscd and libccid are you using?
|
||||||
@@ -83,13 +79,18 @@ A8: STM8S Discovery Kit costs 750 JPY (< $10 USD) only. You can build
|
|||||||
http://www.fsij.org/gnuk/jtag_dongle_ftdi2232
|
http://www.fsij.org/gnuk/jtag_dongle_ftdi2232
|
||||||
|
|
||||||
Q9: I got an error like "gpg: selecting openpgp failed: ec=6.108", what's up?
|
Q9: I got an error like "gpg: selecting openpgp failed: ec=6.108", what's up?
|
||||||
|
|
||||||
A9: GnuPG's SCDaemon has problems for handling insertion/removal of
|
A9: GnuPG's SCDaemon has problems for handling insertion/removal of
|
||||||
card/reader (problems are fixed in trunk). When your newly
|
card/reader (problems are fixed in trunk, and backported to 2.0
|
||||||
inserted token is not found by GnuPG, try killing scdaemon and let
|
branch, it will be 2.0.20). When your newly inserted token is not
|
||||||
it to be invoked again. I do:
|
found by GnuPG, try killing scdaemon and let it to be invoked
|
||||||
$ gpg-connect-agent "SCD KILLSCD" "SCD BYE" /bye
|
again. I do:
|
||||||
|
|
||||||
|
$ gpg-connect-agent "SCD KILLSCD" "SCD BYE" /bye
|
||||||
|
|
||||||
and confirm scdaemon doesn't exist, then,
|
and confirm scdaemon doesn't exist, then,
|
||||||
$ gpg-connect-agent learn /bye
|
|
||||||
|
$ gpg-connect-agent learn /bye
|
||||||
|
|
||||||
Qa: With GNOME 2, I can't use Gnuk Token for SSH. How can we use it for SSH?
|
Qa: With GNOME 2, I can't use Gnuk Token for SSH. How can we use it for SSH?
|
||||||
Aa: You need to deactivate seahorse-agent and gnome-keyring, but use
|
Aa: You need to deactivate seahorse-agent and gnome-keyring, but use
|
||||||
@@ -107,16 +108,16 @@ Ab: That's because gnome-keyring-daemon interferes GnuPG. Type:
|
|||||||
|
|
||||||
Qc: Do you know a good SWD debugger to connect FST-01 or something?
|
Qc: Do you know a good SWD debugger to connect FST-01 or something?
|
||||||
Ac: STLink v2 is cheap one. We have a tool/stlinkv2.py as flash ROM
|
Ac: STLink v2 is cheap one. We have a tool/stlinkv2.py as flash ROM
|
||||||
writer.
|
writer program.
|
||||||
|
|
||||||
|
|
||||||
Release notes
|
Release notes
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is another "version 1.0 release candidate" of Gnuk. In this
|
This is version 1.0 release of Gnuk, after a year and eleven months
|
||||||
release, a test suite is added. While it is daily use, some features
|
development. While it is daily use for a year or so, some newly
|
||||||
(including key generation and firmware upgrade) are still considered
|
introduced features (including key generation and firmware upgrade)
|
||||||
experimental.
|
should be considered experimental.
|
||||||
|
|
||||||
Tested features are:
|
Tested features are:
|
||||||
|
|
||||||
@@ -133,13 +134,16 @@ Tested features are:
|
|||||||
* Changing value of password status bytes (0x00C4): forcesig
|
* Changing value of password status bytes (0x00C4): forcesig
|
||||||
* Verify with pin pad
|
* Verify with pin pad
|
||||||
* Modify with pin pad
|
* Modify with pin pad
|
||||||
* Card holder certificate
|
* Card holder certificate (read)
|
||||||
* Removal of keys (Overriding key import is not supported,
|
* Removal of keys
|
||||||
|
(Overriding key import is not supported,
|
||||||
but you can remove all keys to import again).
|
but you can remove all keys to import again).
|
||||||
* Key generation on device side
|
* Key generation on device side
|
||||||
|
|
||||||
Original feature of Gnuk, tested lightly:
|
Original features of Gnuk, tested lightly:
|
||||||
|
|
||||||
|
* OpenPGP card serial number setup
|
||||||
|
* Card holder certificate (write by UPDATE BINARY)
|
||||||
* Upgrading with "EXTERNAL AUTHENTICATE" by reGNUal
|
* Upgrading with "EXTERNAL AUTHENTICATE" by reGNUal
|
||||||
|
|
||||||
It is known not-working well:
|
It is known not-working well:
|
||||||
@@ -148,11 +152,11 @@ It is known not-working well:
|
|||||||
work well. Please make sure to disable DEBUG option if it
|
work well. Please make sure to disable DEBUG option if it
|
||||||
doesn't work well.
|
doesn't work well.
|
||||||
|
|
||||||
It is known that the combination libccid 1.4.1 (or newer) with libusb
|
It is known that the combination of libccid 1.4.1 (or newer) with
|
||||||
1.0.8 (or older) has a problem. It is possible for USB communication
|
libusb 1.0.8 (or older) has a minor problem. It is rare but it is
|
||||||
to be failed, because of a bug in libusb implementation. Use libusbx
|
possible for USB communication to be failed, because of a bug in
|
||||||
1.0.9 or newer, or don't use PC/SC, but use internal CCID driver of
|
libusb implementation. Use libusbx 1.0.9 or newer, or don't use
|
||||||
GnuPG.
|
PC/SC, but use internal CCID driver of GnuPG.
|
||||||
|
|
||||||
|
|
||||||
Targets
|
Targets
|
||||||
@@ -288,15 +292,16 @@ respect users' freedom for computing. Please ask FSIJ for the
|
|||||||
license.
|
license.
|
||||||
|
|
||||||
Otherwise, companies which want to distribute Gnuk devices, please use
|
Otherwise, companies which want to distribute Gnuk devices, please use
|
||||||
your own USB vendor ID and product ID. Note that please replace
|
your own USB vendor ID and product ID. Please replace "FSIJ" in the
|
||||||
"FSIJ" in the string gnukStringSerial (usb_desc.c) to yours, when you
|
string gnukStringSerial (usb_desc.c) to yours, when you modify Gnuk.
|
||||||
modify Gnuk.
|
|
||||||
|
|
||||||
|
|
||||||
Host Requirements
|
Host Requirements
|
||||||
=================
|
=================
|
||||||
|
|
||||||
For GNU/Linux, libccid version >= 1.3.11 is recommended.
|
For GNU/Linux, PC/SC service is an option, you can use GnuPG's
|
||||||
|
internal CCID driver instead. If you chose using PC/SC service,
|
||||||
|
libccid version >= 1.3.11 is recommended for GNU/Linux.
|
||||||
|
|
||||||
I think that it should not be requirment but the kernel version of my use is:
|
I think that it should not be requirment but the kernel version of my use is:
|
||||||
Linux version 2.6.32-5-686 (Debian 2.6.32-18) (ben@decadent.org.uk) (gcc version 4.3.5 (Debian 4.3.5-2) ) #1 SMP Sat Jul 24 02:27:10 UTC 2010
|
Linux version 2.6.32-5-686 (Debian 2.6.32-18) (ben@decadent.org.uk) (gcc version 4.3.5 (Debian 4.3.5-2) ) #1 SMP Sat Jul 24 02:27:10 UTC 2010
|
||||||
@@ -312,7 +317,7 @@ You need GNU toolchain and newlib for 'arm-none-eabi' target.
|
|||||||
|
|
||||||
See http://github.com/esden/summon-arm-toolchain/ (which includes fix
|
See http://github.com/esden/summon-arm-toolchain/ (which includes fix
|
||||||
of binutils-2.21.1) for preparation of GNU Toolchain for
|
of binutils-2.21.1) for preparation of GNU Toolchain for
|
||||||
'arm-none-eabi' target.
|
'arm-none-eabi' target. This is for GCC 4.5.
|
||||||
|
|
||||||
# Note that we need to link correct C library (for string functions).
|
# Note that we need to link correct C library (for string functions).
|
||||||
# For this purpose, Makefile.in contains following line:
|
# For this purpose, Makefile.in contains following line:
|
||||||
@@ -328,6 +333,13 @@ of binutils-2.21.1) for preparation of GNU Toolchain for
|
|||||||
# -mno-thumb-interwork option. This means that you should not
|
# -mno-thumb-interwork option. This means that you should not
|
||||||
# link C library which contains ARM (not Thumb) code.
|
# link C library which contains ARM (not Thumb) code.
|
||||||
|
|
||||||
|
Recently, there is "gcc-arm-embedded" project. See:
|
||||||
|
|
||||||
|
https://launchpad.net/gcc-arm-embedded/
|
||||||
|
|
||||||
|
It is based on GCC 4.6. For version 4.6-2012-q2-update, you'd
|
||||||
|
need "-O3 -Os" instead of "-O2" and it will be slightly better.
|
||||||
|
|
||||||
|
|
||||||
Change directory to `src':
|
Change directory to `src':
|
||||||
|
|
||||||
@@ -582,7 +594,7 @@ RSA), you can import them.
|
|||||||
Gnuk supports key generation, but this feature is young and should be
|
Gnuk supports key generation, but this feature is young and should be
|
||||||
considered experimental.
|
considered experimental.
|
||||||
|
|
||||||
For detail, please see doc/DEMO and doc/DEMO-2.
|
For detail, please see doc/note/DEMO and doc/note/DEMO-2.
|
||||||
|
|
||||||
Note that it make sense to preserve your keys on your computer so that
|
Note that it make sense to preserve your keys on your computer so that
|
||||||
you can import the keys (again) to (possibly another) Gnuk Token. In
|
you can import the keys (again) to (possibly another) Gnuk Token. In
|
||||||
@@ -644,7 +656,7 @@ linux/Documentation/usb/usbmon.txt
|
|||||||
Firmware update
|
Firmware update
|
||||||
===============
|
===============
|
||||||
|
|
||||||
See doc/firmware-update.
|
See doc/note/firmware-update.
|
||||||
|
|
||||||
|
|
||||||
Read-only Git Repository
|
Read-only Git Repository
|
||||||
|
|||||||
@@ -101,10 +101,9 @@
|
|||||||
* PA5 - Alternate Push pull output (SPI1_SCK)
|
* PA5 - Alternate Push pull output (SPI1_SCK)
|
||||||
* PA6 - Alternate Push pull output (SPI1_MISO)
|
* PA6 - Alternate Push pull output (SPI1_MISO)
|
||||||
* PA7 - Alternate Push pull output (SPI1_MOSI)
|
* PA7 - Alternate Push pull output (SPI1_MOSI)
|
||||||
|
* PA10 - Push pull output (USB 1:ON 0:OFF)
|
||||||
* PA11 - input with pull-up (USBDM)
|
* PA11 - input with pull-up (USBDM)
|
||||||
* PA12 - input with pull-up (USBDP)
|
* PA12 - input with pull-up (USBDP)
|
||||||
* Everything input with pull-up except:
|
|
||||||
* PA10 - Push pull output (USB 1:ON 0:OFF)
|
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOACRL 0xBBB38888 /* PA7...PA0 */
|
#define VAL_GPIOACRL 0xBBB38888 /* PA7...PA0 */
|
||||||
#define VAL_GPIOACRH 0x88888388 /* PA15...PA8 */
|
#define VAL_GPIOACRH 0x88888388 /* PA15...PA8 */
|
||||||
|
|||||||
153
doc/Makefile
Normal file
153
doc/Makefile
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
# Makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
# You can set these variables from the command line.
|
||||||
|
SPHINXOPTS =
|
||||||
|
SPHINXBUILD = sphinx-build
|
||||||
|
PAPER = a4
|
||||||
|
BUILDDIR = _build
|
||||||
|
|
||||||
|
# Internal variables.
|
||||||
|
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||||
|
PAPEROPT_letter = -D latex_paper_size=letter
|
||||||
|
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||||
|
# the i18n builder cannot share the environment and doctrees with the others
|
||||||
|
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||||
|
|
||||||
|
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Please use \`make <target>' where <target> is one of"
|
||||||
|
@echo " html to make standalone HTML files"
|
||||||
|
@echo " dirhtml to make HTML files named index.html in directories"
|
||||||
|
@echo " singlehtml to make a single large HTML file"
|
||||||
|
@echo " pickle to make pickle files"
|
||||||
|
@echo " json to make JSON files"
|
||||||
|
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||||
|
@echo " qthelp to make HTML files and a qthelp project"
|
||||||
|
@echo " devhelp to make HTML files and a Devhelp project"
|
||||||
|
@echo " epub to make an epub"
|
||||||
|
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||||
|
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||||
|
@echo " text to make text files"
|
||||||
|
@echo " man to make manual pages"
|
||||||
|
@echo " texinfo to make Texinfo files"
|
||||||
|
@echo " info to make Texinfo files and run them through makeinfo"
|
||||||
|
@echo " gettext to make PO message catalogs"
|
||||||
|
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||||
|
@echo " linkcheck to check all external links for integrity"
|
||||||
|
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm -rf $(BUILDDIR)/*
|
||||||
|
|
||||||
|
html:
|
||||||
|
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||||
|
|
||||||
|
dirhtml:
|
||||||
|
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||||
|
|
||||||
|
singlehtml:
|
||||||
|
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||||
|
|
||||||
|
pickle:
|
||||||
|
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the pickle files."
|
||||||
|
|
||||||
|
json:
|
||||||
|
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the JSON files."
|
||||||
|
|
||||||
|
htmlhelp:
|
||||||
|
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||||
|
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||||
|
|
||||||
|
qthelp:
|
||||||
|
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||||
|
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||||
|
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/GnukDocumentation.qhcp"
|
||||||
|
@echo "To view the help file:"
|
||||||
|
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/GnukDocumentation.qhc"
|
||||||
|
|
||||||
|
devhelp:
|
||||||
|
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished."
|
||||||
|
@echo "To view the help file:"
|
||||||
|
@echo "# mkdir -p $$HOME/.local/share/devhelp/GnukDocumentation"
|
||||||
|
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/GnukDocumentation"
|
||||||
|
@echo "# devhelp"
|
||||||
|
|
||||||
|
epub:
|
||||||
|
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||||
|
|
||||||
|
latex:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||||
|
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||||
|
"(use \`make latexpdf' here to do that automatically)."
|
||||||
|
|
||||||
|
latexpdf:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo "Running LaTeX files through pdflatex..."
|
||||||
|
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||||
|
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||||
|
|
||||||
|
text:
|
||||||
|
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||||
|
|
||||||
|
man:
|
||||||
|
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||||
|
|
||||||
|
texinfo:
|
||||||
|
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||||
|
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||||
|
"(use \`make info' here to do that automatically)."
|
||||||
|
|
||||||
|
info:
|
||||||
|
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||||
|
@echo "Running Texinfo files through makeinfo..."
|
||||||
|
make -C $(BUILDDIR)/texinfo info
|
||||||
|
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||||
|
|
||||||
|
gettext:
|
||||||
|
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||||
|
|
||||||
|
changes:
|
||||||
|
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||||
|
@echo
|
||||||
|
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||||
|
|
||||||
|
linkcheck:
|
||||||
|
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||||
|
@echo
|
||||||
|
@echo "Link check complete; look for any errors in the above output " \
|
||||||
|
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||||
|
|
||||||
|
doctest:
|
||||||
|
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||||
|
@echo "Testing of doctests in the sources finished, look at the " \
|
||||||
|
"results in $(BUILDDIR)/doctest/output.txt."
|
||||||
246
doc/conf.py
Normal file
246
doc/conf.py
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Gnuk Documentation documentation build configuration file, created by
|
||||||
|
# sphinx-quickstart on Wed Jul 4 15:29:05 2012.
|
||||||
|
#
|
||||||
|
# This file is execfile()d with the current directory set to its containing dir.
|
||||||
|
#
|
||||||
|
# Note that not all possible configuration values are present in this
|
||||||
|
# autogenerated file.
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
|
# -- General configuration -----------------------------------------------------
|
||||||
|
|
||||||
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
|
#needs_sphinx = '1.0'
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||||
|
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
|
extensions = ['sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.pngmath', 'sphinx.ext.mathjax', 'sphinx.ext.viewcode']
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = '.rst'
|
||||||
|
|
||||||
|
# The encoding of source files.
|
||||||
|
#source_encoding = 'utf-8-sig'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = u'Gnuk Documentation'
|
||||||
|
copyright = u'2012, Niibe Yutaka'
|
||||||
|
|
||||||
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
# built documents.
|
||||||
|
#
|
||||||
|
# The short X.Y version.
|
||||||
|
version = '1.0'
|
||||||
|
# The full version, including alpha/beta/rc tags.
|
||||||
|
release = '1.0'
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#language = None
|
||||||
|
|
||||||
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
|
# non-false value, then it is used:
|
||||||
|
#today = ''
|
||||||
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
|
#today_fmt = '%B %d, %Y'
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
exclude_patterns = ['_build']
|
||||||
|
|
||||||
|
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||||
|
#default_role = None
|
||||||
|
|
||||||
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
#add_function_parentheses = True
|
||||||
|
|
||||||
|
# If true, the current module name will be prepended to all description
|
||||||
|
# unit titles (such as .. function::).
|
||||||
|
#add_module_names = True
|
||||||
|
|
||||||
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
|
# output. They are ignored by default.
|
||||||
|
#show_authors = False
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'sphinx'
|
||||||
|
|
||||||
|
# A list of ignored prefixes for module index sorting.
|
||||||
|
#modindex_common_prefix = []
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output ---------------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
|
# a list of builtin themes.
|
||||||
|
html_theme = 'default'
|
||||||
|
|
||||||
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
# further. For a list of options available for each theme, see the
|
||||||
|
# documentation.
|
||||||
|
#html_theme_options = {}
|
||||||
|
|
||||||
|
# Add any paths that contain custom themes here, relative to this directory.
|
||||||
|
#html_theme_path = []
|
||||||
|
|
||||||
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
|
# "<project> v<release> documentation".
|
||||||
|
#html_title = None
|
||||||
|
|
||||||
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
|
#html_short_title = None
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
|
# of the sidebar.
|
||||||
|
#html_logo = None
|
||||||
|
|
||||||
|
# The name of an image file (within the static path) to use as favicon of the
|
||||||
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
|
# pixels large.
|
||||||
|
#html_favicon = None
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = ['_static']
|
||||||
|
|
||||||
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
|
# using the given strftime format.
|
||||||
|
#html_last_updated_fmt = '%b %d, %Y'
|
||||||
|
|
||||||
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
|
# typographically correct entities.
|
||||||
|
#html_use_smartypants = True
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
#html_sidebars = {}
|
||||||
|
|
||||||
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
|
# template names.
|
||||||
|
#html_additional_pages = {}
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#html_domain_indices = True
|
||||||
|
|
||||||
|
# If false, no index is generated.
|
||||||
|
#html_use_index = True
|
||||||
|
|
||||||
|
# If true, the index is split into individual pages for each letter.
|
||||||
|
#html_split_index = False
|
||||||
|
|
||||||
|
# If true, links to the reST sources are added to the pages.
|
||||||
|
#html_show_sourcelink = True
|
||||||
|
|
||||||
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||||
|
#html_show_sphinx = True
|
||||||
|
|
||||||
|
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||||
|
#html_show_copyright = True
|
||||||
|
|
||||||
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
|
# base URL from which the finished HTML is served.
|
||||||
|
#html_use_opensearch = ''
|
||||||
|
|
||||||
|
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
|
#html_file_suffix = None
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'GnukDocumentationdoc'
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for LaTeX output --------------------------------------------------
|
||||||
|
|
||||||
|
latex_elements = {
|
||||||
|
# The paper size ('letterpaper' or 'a4paper').
|
||||||
|
#'papersize': 'letterpaper',
|
||||||
|
|
||||||
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
|
#'pointsize': '10pt',
|
||||||
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
#'preamble': '',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
|
latex_documents = [
|
||||||
|
('index', 'GnukDocumentation.tex', u'Gnuk Documentation Documentation',
|
||||||
|
u'Niibe Yutaka', 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
# the title page.
|
||||||
|
#latex_logo = None
|
||||||
|
|
||||||
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
|
# not chapters.
|
||||||
|
#latex_use_parts = False
|
||||||
|
|
||||||
|
# If true, show page references after internal links.
|
||||||
|
#latex_show_pagerefs = False
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
#latex_show_urls = False
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#latex_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#latex_domain_indices = True
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for manual page output --------------------------------------------
|
||||||
|
|
||||||
|
# One entry per manual page. List of tuples
|
||||||
|
# (source start file, name, description, authors, manual section).
|
||||||
|
man_pages = [
|
||||||
|
('index', 'gnukdocumentation', u'Gnuk Documentation Documentation',
|
||||||
|
[u'Niibe Yutaka'], 1)
|
||||||
|
]
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
#man_show_urls = False
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for Texinfo output ------------------------------------------------
|
||||||
|
|
||||||
|
# Grouping the document tree into Texinfo files. List of tuples
|
||||||
|
# (source start file, target name, title, author,
|
||||||
|
# dir menu entry, description, category)
|
||||||
|
texinfo_documents = [
|
||||||
|
('index', 'GnukDocumentation', u'Gnuk Documentation Documentation',
|
||||||
|
u'Niibe Yutaka', 'GnukDocumentation', 'One line description of project.',
|
||||||
|
'Miscellaneous'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#texinfo_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#texinfo_domain_indices = True
|
||||||
|
|
||||||
|
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||||
|
#texinfo_show_urls = 'footnote'
|
||||||
|
|
||||||
|
|
||||||
|
# Example configuration for intersphinx: refer to the Python standard library.
|
||||||
|
intersphinx_mapping = {'http://docs.python.org/': None}
|
||||||
60
doc/development.rst
Normal file
60
doc/development.rst
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
Development Environment
|
||||||
|
=======================
|
||||||
|
|
||||||
|
|
||||||
|
Hardware
|
||||||
|
--------
|
||||||
|
|
||||||
|
JTAG debugger or SWD debugger is required.
|
||||||
|
|
||||||
|
|
||||||
|
GNU Toolchain
|
||||||
|
-------------
|
||||||
|
|
||||||
|
You need GNU toolchain and newlib for 'arm-none-eabi' target.
|
||||||
|
|
||||||
|
See http://github.com/esden/summon-arm-toolchain/ (which includes fix
|
||||||
|
of binutils-2.21.1) for preparation of GNU Toolchain for
|
||||||
|
'arm-none-eabi' target. This is for GCC 4.5.
|
||||||
|
|
||||||
|
Note that we need to link correct C library (for string functions).
|
||||||
|
For this purpose, our src/Makefile.in contains following line:
|
||||||
|
|
||||||
|
MCFLAGS= -mcpu=$(MCU) -mfix-cortex-m3-ldrd
|
||||||
|
|
||||||
|
This should not be needed (as -mcpu=cortex-m3 means
|
||||||
|
-mfix-cortex-m3-ldrd), but it is needed for the configuration of
|
||||||
|
patch-gcc-config-arm-t-arm-elf.diff in summon-arm-toolchain in practice.
|
||||||
|
|
||||||
|
In ChibiOS_2.0.8/os/ports/GCC/ARM/rules.mk, it specifies
|
||||||
|
-mno-thumb-interwork option. This means that you should not link C
|
||||||
|
library which contains ARM (not Thumb) code.
|
||||||
|
|
||||||
|
Recently, there is "gcc-arm-embedded" project. See:
|
||||||
|
https://launchpad.net/gcc-arm-embedded/
|
||||||
|
|
||||||
|
It is based on GCC 4.6. For version 4.6-2012-q2-update, you'd
|
||||||
|
need "-O3 -s" instead of "-O2" and it will be slightly better.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Building Gnuk
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Change directory to ``src``:
|
||||||
|
|
||||||
|
$ cd gnuk-VERSION/src
|
||||||
|
|
||||||
|
Then, run ``configure``:
|
||||||
|
|
||||||
|
$ ./configure --vidpid=<VID:PID>
|
||||||
|
|
||||||
|
Here, you need to specify USB vendor ID and product ID. For FSIJ's,
|
||||||
|
it's: --vidpid=234b:0000 . Please read section 'USB vendor ID and
|
||||||
|
product ID' above.
|
||||||
|
|
||||||
|
Type:
|
||||||
|
|
||||||
|
$ make
|
||||||
|
|
||||||
|
Then, we will have "gnuk.elf".
|
||||||
24
doc/index.rst
Normal file
24
doc/index.rst
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
.. Gnuk Documentation documentation master file, created by
|
||||||
|
sphinx-quickstart on Wed Jul 4 15:29:05 2012.
|
||||||
|
You can adapt this file completely to your liking, but it should at least
|
||||||
|
contain the root `toctree` directive.
|
||||||
|
|
||||||
|
Gnuk Documentation
|
||||||
|
==================
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
intro.rst
|
||||||
|
development.rst
|
||||||
|
|
||||||
|
|
||||||
|
Indices and tables
|
||||||
|
==================
|
||||||
|
|
||||||
|
* :ref:`genindex`
|
||||||
|
* :ref:`modindex`
|
||||||
|
* :ref:`search`
|
||||||
|
|
||||||
45
doc/intro.rst
Normal file
45
doc/intro.rst
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
|
|
||||||
|
What's Gnuk?
|
||||||
|
------------
|
||||||
|
|
||||||
|
Gnuk is an implementation of USB cryptographic token for GNU Privacy
|
||||||
|
Guard. Gnuk supports OpenPGP card protocol version 2, and it runs on
|
||||||
|
STM32F103 processor.
|
||||||
|
|
||||||
|
|
||||||
|
Cryptographic token and feature of Gnuk
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
Cryptographic token is a store of private keys and it computes cryptographic functions on the device.
|
||||||
|
|
||||||
|
|
||||||
|
Development Environment
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
See :doc:`development` for development environment for Gnuk. It builds on Free Software.
|
||||||
|
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
-------------
|
||||||
|
|
||||||
|
* GNU Privacy Guard (GnuPG)
|
||||||
|
|
||||||
|
* libusb
|
||||||
|
|
||||||
|
* [Optional] PC/SC lite (pcscd, libccid)
|
||||||
|
|
||||||
|
* SSH: openssh
|
||||||
|
|
||||||
|
* Web: scute, firefox
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Sign with GnuPG
|
||||||
|
* Decrypt with GnuPG
|
||||||
|
* Use with OpenSSH
|
||||||
|
* Use with Firefox for X.509 client certificate authentication
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
* Random Number Generator
|
* [DONE] Random Number Generator
|
||||||
|
|
||||||
RNG is needed for Data Encryption Key to encrypt private key (P and Q).
|
RNG is needed for Data Encryption Key to encrypt private key (P and Q).
|
||||||
It is important to collect enough entropy. Perhaps, it would
|
It is important to collect enough entropy. Perhaps, it would
|
||||||
@@ -77,7 +77,8 @@ KEYPTR
|
|||||||
<---encrypted----><--- plain ---->
|
<---encrypted----><--- plain ---->
|
||||||
|
|
||||||
key_addr 4-byte
|
key_addr 4-byte
|
||||||
additional_data_encrypted 16-byte
|
initial_vector (random) 16-byte
|
||||||
|
checksum_encrypted 16-byte
|
||||||
dek_encrypted_by_keystring_pw1 16-byte
|
dek_encrypted_by_keystring_pw1 16-byte
|
||||||
dek_encrypted_by_keystring_rc 16-byte
|
dek_encrypted_by_keystring_rc 16-byte
|
||||||
dek_encrypted_by_keystring_pw3 16-byte
|
dek_encrypted_by_keystring_pw3 16-byte
|
||||||
@@ -85,6 +86,4 @@ dek_encrypted_by_keystring_pw3 16-byte
|
|||||||
... decrypted to
|
... decrypted to
|
||||||
|
|
||||||
[ P ][ Q ]
|
[ P ][ Q ]
|
||||||
check 4-byte
|
checksum 16-byte
|
||||||
random 4-byte
|
|
||||||
magic[] 8-byte
|
|
||||||
@@ -793,11 +793,6 @@ gpg_do_write_prvkey (enum kind_of_key kk, const uint8_t *key_data, int key_len,
|
|||||||
memcpy (pd->iv, iv, INITIAL_VECTOR_SIZE);
|
memcpy (pd->iv, iv, INITIAL_VECTOR_SIZE);
|
||||||
memcpy (pd->checksum_encrypted, kdi.checksum, DATA_ENCRYPTION_KEY_SIZE);
|
memcpy (pd->checksum_encrypted, kdi.checksum, DATA_ENCRYPTION_KEY_SIZE);
|
||||||
|
|
||||||
if (kk == GPG_KEY_FOR_SIGNING)
|
|
||||||
ac_reset_pso_cds ();
|
|
||||||
else
|
|
||||||
ac_reset_other ();
|
|
||||||
|
|
||||||
if (ks_pw1)
|
if (ks_pw1)
|
||||||
{
|
{
|
||||||
ks_pw1_len = ks_pw1[0];
|
ks_pw1_len = ks_pw1[0];
|
||||||
@@ -805,12 +800,11 @@ gpg_do_write_prvkey (enum kind_of_key kk, const uint8_t *key_data, int key_len,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uint8_t ks123_pw1[KEYSTRING_SIZE_PW1];
|
uint8_t ks[KEYSTRING_MD_SIZE];
|
||||||
|
|
||||||
ks123_pw1[0] = strlen (OPENPGP_CARD_INITIAL_PW1);
|
s2k (BY_USER, (const uint8_t *)OPENPGP_CARD_INITIAL_PW1,
|
||||||
s2k (BY_USER, (uint8_t *)OPENPGP_CARD_INITIAL_PW1,
|
strlen (OPENPGP_CARD_INITIAL_PW1), ks);
|
||||||
strlen (OPENPGP_CARD_INITIAL_PW1), ks123_pw1+1);
|
encrypt_dek (ks, pd->dek_encrypted_1);
|
||||||
encrypt_dek (ks123_pw1+1, pd->dek_encrypted_1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ks_rc)
|
if (ks_rc)
|
||||||
@@ -1572,26 +1566,27 @@ gpg_do_keygen (uint8_t kk_byte)
|
|||||||
|
|
||||||
if (kk == GPG_KEY_FOR_SIGNING)
|
if (kk == GPG_KEY_FOR_SIGNING)
|
||||||
{
|
{
|
||||||
/* Authintication has been reset within gpg_do_write_prvkey. */
|
|
||||||
/* But GnuPG expects it's ready for signing. */
|
|
||||||
/* Thus, we call verify_pso_cds here. */
|
|
||||||
const uint8_t *ks_pw1 = gpg_do_read_simple (NR_DO_KEYSTRING_PW1);
|
const uint8_t *ks_pw1 = gpg_do_read_simple (NR_DO_KEYSTRING_PW1);
|
||||||
const uint8_t *pw;
|
uint8_t keystring[KEYSTRING_MD_SIZE];
|
||||||
int pw_len;
|
const uint8_t *ks;
|
||||||
|
|
||||||
|
/* GnuPG expects it's ready for signing. */
|
||||||
|
/* Don't call ac_reset_pso_cds here, but load the private key */
|
||||||
|
|
||||||
if (ks_pw1)
|
if (ks_pw1)
|
||||||
{
|
ks = ks_pw1+1;
|
||||||
pw = ks_pw1+1;
|
|
||||||
pw_len = ks_pw1[0];
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pw = (const uint8_t *)OPENPGP_CARD_INITIAL_PW1;
|
const uint8_t * pw = (const uint8_t *)OPENPGP_CARD_INITIAL_PW1;
|
||||||
pw_len = strlen (OPENPGP_CARD_INITIAL_PW3);
|
|
||||||
|
s2k (BY_USER, pw, strlen (OPENPGP_CARD_INITIAL_PW1), keystring);
|
||||||
|
ks = keystring;
|
||||||
}
|
}
|
||||||
|
|
||||||
verify_pso_cds (pw, pw_len);
|
gpg_do_load_prvkey (GPG_KEY_FOR_SIGNING, BY_USER, ks);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
ac_reset_other ();
|
||||||
|
|
||||||
gpg_do_public_key (kk_byte);
|
gpg_do_public_key (kk_byte);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -776,10 +776,15 @@ cmd_pso (void)
|
|||||||
|
|
||||||
/* Skip padding 0x00 */
|
/* Skip padding 0x00 */
|
||||||
len--;
|
len--;
|
||||||
r = rsa_decrypt (apdu.cmd_apdu_data+1, res_APDU, len,
|
if (len != KEY_CONTENT_LEN)
|
||||||
&kd[GPG_KEY_FOR_DECRYPTION]);
|
GPG_CONDITION_NOT_SATISFIED ();
|
||||||
if (r < 0)
|
else
|
||||||
GPG_ERROR ();
|
{
|
||||||
|
r = rsa_decrypt (apdu.cmd_apdu_data+1, res_APDU, len,
|
||||||
|
&kd[GPG_KEY_FOR_DECRYPTION]);
|
||||||
|
if (r < 0)
|
||||||
|
GPG_ERROR ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -258,11 +258,11 @@ static const uint8_t gnukStringLangID[] = {
|
|||||||
#include "usb-strings.c.inc"
|
#include "usb-strings.c.inc"
|
||||||
|
|
||||||
const uint8_t gnukStringSerial[] = {
|
const uint8_t gnukStringSerial[] = {
|
||||||
18*2+2, /* bLength */
|
17*2+2, /* bLength */
|
||||||
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
|
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
/* FSIJ-0.19 */
|
/* FSIJ-1.0 */
|
||||||
'F', 0, 'S', 0, 'I', 0, 'J', 0, '-', 0,
|
'F', 0, 'S', 0, 'I', 0, 'J', 0, '-', 0,
|
||||||
'0', 0, '.', 0, '2', 0, '1', 0, /* Version number of Gnuk */
|
'1', 0, '.', 0, '0', 0, /* Version number of Gnuk */
|
||||||
'-', 0,
|
'-', 0,
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Feature: command GET DATA
|
|||||||
|
|
||||||
Scenario: data object extended capabilities
|
Scenario: data object extended capabilities
|
||||||
When requesting extended capabilities: c0
|
When requesting extended capabilities: c0
|
||||||
Then you should get: \x30\x00\x00\x00\x00\x00\x00\xff\x01\x00
|
Then data should match: \x30\x00\x00\x00[\x00\x08]\x00\x00\xff\x01\x00
|
||||||
|
|
||||||
Scenario: data object algorithm attributes 1
|
Scenario: data object algorithm attributes 1
|
||||||
When requesting algorithm attributes 1: c1
|
When requesting algorithm attributes 1: c1
|
||||||
|
|||||||
@@ -21,6 +21,13 @@ Feature: key generation
|
|||||||
And put the second data to d0
|
And put the second data to d0
|
||||||
Then it should get success
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.1 key (1)
|
||||||
|
Given a message "GnuPG assumes that PW1 keeps valid after keygen."
|
||||||
|
And a public key from token for OPENPGP.1
|
||||||
|
And let a token compute digital signature
|
||||||
|
And verify signature
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
Scenario: verify PW1 (1) after keygen
|
Scenario: verify PW1 (1) after keygen
|
||||||
Given cmd_verify with 1 and "another user pass phrase"
|
Given cmd_verify with 1 and "another user pass phrase"
|
||||||
Then it should get success
|
Then it should get success
|
||||||
|
|||||||
@@ -33,4 +33,4 @@ Feature: compute digital signature
|
|||||||
|
|
||||||
Scenario: data object ds counter
|
Scenario: data object ds counter
|
||||||
When requesting ds counter: 93
|
When requesting ds counter: 93
|
||||||
Then you should get: \x00\x00\x02
|
Then data should match: \x00\x00(\x02|\x03)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Feature: command GET DATA
|
|||||||
|
|
||||||
Scenario: data object extended capabilities
|
Scenario: data object extended capabilities
|
||||||
When requesting extended capabilities: c0
|
When requesting extended capabilities: c0
|
||||||
Then you should get: \x30\x00\x00\x00\x00\x00\x00\xff\x01\x00
|
Then data should match: \x30\x00\x00\x00[\x00\x08]\x00\x00\xff\x01\x00
|
||||||
|
|
||||||
Scenario: data object algorithm attributes 1
|
Scenario: data object algorithm attributes 1
|
||||||
When requesting algorithm attributes 1: c1
|
When requesting algorithm attributes 1: c1
|
||||||
|
|||||||
@@ -21,6 +21,13 @@ Feature: key generation
|
|||||||
And put the second data to d0
|
And put the second data to d0
|
||||||
Then it should get success
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.1 key (1)
|
||||||
|
Given a message "GnuPG assumes that PW1 keeps valid after keygen."
|
||||||
|
And a public key from token for OPENPGP.1
|
||||||
|
And let a token compute digital signature
|
||||||
|
And verify signature
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
Scenario: verify PW1 (1) after keygen
|
Scenario: verify PW1 (1) after keygen
|
||||||
Given cmd_verify with 1 and "another user pass phrase"
|
Given cmd_verify with 1 and "another user pass phrase"
|
||||||
Then it should get success
|
Then it should get success
|
||||||
|
|||||||
@@ -33,4 +33,4 @@ Feature: compute digital signature
|
|||||||
|
|
||||||
Scenario: data object ds counter
|
Scenario: data object ds counter
|
||||||
When requesting ds counter: 93
|
When requesting ds counter: 93
|
||||||
Then you should get: \x00\x00\x02
|
Then data should match: \x00\x00(\x02|\x03)
|
||||||
|
|||||||
43
test/features/770_key_removal.feature
Normal file
43
test/features/770_key_removal.feature
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
Feature: key removal
|
||||||
|
In order to use a token
|
||||||
|
A token should have keys
|
||||||
|
|
||||||
|
Scenario: remove OPENPGP.1 key (sign)
|
||||||
|
When removing a key OPENPGP.1
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove OPENPGP.2 key (decrypt)
|
||||||
|
When removing a key OPENPGP.2
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove OPENPGP.3 key (authentication)
|
||||||
|
When removing a key OPENPGP.3
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW3 (admin-less mode)
|
||||||
|
Given cmd_verify with 3 and "12345678"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Finger print sig
|
||||||
|
Given cmd_put_data with c7 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Finger print dec
|
||||||
|
Given cmd_put_data with c8 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Finger print aut
|
||||||
|
Given cmd_put_data with c9 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object keygeneration data/time sig
|
||||||
|
Given cmd_put_data with ce and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object keygeneration data/time dec
|
||||||
|
Given cmd_put_data with cf and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object keygeneration data/time aut
|
||||||
|
Given cmd_put_data with d0 and ""
|
||||||
|
Then it should get success
|
||||||
27
test/features/780_personalization_reset.feature
Normal file
27
test/features/780_personalization_reset.feature
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Feature: removal of data objects
|
||||||
|
In order to use a token
|
||||||
|
A token should have personalized data
|
||||||
|
|
||||||
|
Scenario: remove data object Login
|
||||||
|
Given cmd_put_data with 5e and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Name
|
||||||
|
Given cmd_put_data with 5b and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Language preference
|
||||||
|
Given cmd_put_data with 5f2d and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Sex
|
||||||
|
Given cmd_put_data with 5f35 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object URL
|
||||||
|
Given cmd_put_data with 5f50 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object pw1 status bytes
|
||||||
|
Given cmd_put_data with c4 and "\x00"
|
||||||
|
Then it should get success
|
||||||
7
test/features/790_reset_passphrase.feature
Normal file
7
test/features/790_reset_passphrase.feature
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Feature: confirm factory setting pass phrase
|
||||||
|
In order to conform OpenPGP card 2.0 specification
|
||||||
|
A token should support pass phrase: PW1, PW3 and reset code
|
||||||
|
|
||||||
|
Scenario: verify PW3 (admin-less mode)
|
||||||
|
Given cmd_verify with 3 and "12345678"
|
||||||
|
Then it should get success
|
||||||
79
test/features/800_empty_check.feature
Normal file
79
test/features/800_empty_check.feature
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
Feature: confirm empty token
|
||||||
|
In order to start tests
|
||||||
|
A token should be empty (no data, no keys)
|
||||||
|
|
||||||
|
Scenario: data object Login
|
||||||
|
When requesting login data: 5e
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object Name
|
||||||
|
When requesting name: 5b
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object Language preference
|
||||||
|
When requesting anguage preference: 5f2d
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object Sex
|
||||||
|
When requesting sex: 5f35
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object URL
|
||||||
|
When requesting URL: 5f50
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object ds counter
|
||||||
|
When requesting ds counter: 93
|
||||||
|
Then you should get: \x00\x00\x00
|
||||||
|
|
||||||
|
Scenario: data object pw1 status bytes
|
||||||
|
When requesting pw1 status bytes: c4
|
||||||
|
Then you should get: \x00\x7f\x7f\x7f\x03\x03\x03
|
||||||
|
|
||||||
|
Scenario: data object finger print 0
|
||||||
|
When requesting finger print: c5
|
||||||
|
Then you should get: \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
|
||||||
|
|
||||||
|
Scenario: data object finger print 1
|
||||||
|
When requesting finger print: c7
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object finger print 2
|
||||||
|
When requesting finger print: c8
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object finger print 3
|
||||||
|
When requesting finger print: c9
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object CA finger print 0
|
||||||
|
When requesting finger print: c6
|
||||||
|
Then you should get: \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
|
||||||
|
|
||||||
|
Scenario: data object CA finger print 1
|
||||||
|
When requesting finger print: ca
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object CA finger print 2
|
||||||
|
When requesting finger print: cb
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object CA finger print 3
|
||||||
|
When requesting finger print: cc
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object date/time of key pair 0
|
||||||
|
When requesting date/time of key pair: cd
|
||||||
|
Then you should get: \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
|
||||||
|
|
||||||
|
Scenario: data object date/time of key pair 1
|
||||||
|
When requesting date/time of key pair: ce
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object date/time of key pair 2
|
||||||
|
When requesting date/time of key pair: cf
|
||||||
|
Then you should get NULL
|
||||||
|
|
||||||
|
Scenario: data object date/time of key pair 3
|
||||||
|
When requesting date/time of key pair: d0
|
||||||
|
Then you should get NULL
|
||||||
15
test/features/801_empty_check_passphrase.feature
Normal file
15
test/features/801_empty_check_passphrase.feature
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
Feature: confirm empty token
|
||||||
|
In order to start tests
|
||||||
|
A token should be empty (no pass phrase)
|
||||||
|
|
||||||
|
Scenario: verify PW1 factory setting (1)
|
||||||
|
Given cmd_verify with 1 and "123456"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW1 factory setting (2)
|
||||||
|
Given cmd_verify with 2 and "123456"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW3 factory setting
|
||||||
|
Given cmd_verify with 3 and "12345678"
|
||||||
|
Then it should get success
|
||||||
27
test/features/802_get_data_static.feature
Normal file
27
test/features/802_get_data_static.feature
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Feature: command GET DATA
|
||||||
|
In order to conform OpenPGP card 2.0 specification
|
||||||
|
A token should support all mandatory features of the specification
|
||||||
|
|
||||||
|
Scenario: data object historical bytes
|
||||||
|
When requesting historical bytes: 5f52
|
||||||
|
Then you should get: \x00\x31\x84\x73\x80\x01\x80\x00\x90\x00
|
||||||
|
|
||||||
|
Scenario: data object extended capabilities
|
||||||
|
When requesting extended capabilities: c0
|
||||||
|
Then data should match: \x30\x00\x00\x00[\x00\x08]\x00\x00\xff\x01\x00
|
||||||
|
|
||||||
|
Scenario: data object algorithm attributes 1
|
||||||
|
When requesting algorithm attributes 1: c1
|
||||||
|
Then you should get: \x01\x08\x00\x00\x20\x00
|
||||||
|
|
||||||
|
Scenario: data object algorithm attributes 2
|
||||||
|
When requesting algorithm attributes 2: c2
|
||||||
|
Then you should get: \x01\x08\x00\x00\x20\x00
|
||||||
|
|
||||||
|
Scenario: data object algorithm attributes 3
|
||||||
|
When requesting algorighm attributes 3: c3
|
||||||
|
Then you should get: \x01\x08\x00\x00\x20\x00
|
||||||
|
|
||||||
|
Scenario: data object AID
|
||||||
|
When requesting AID: 4f
|
||||||
|
Then data should match: \xd2\x76\x00\x01\x24\x01\x02\x00......\x00\x00
|
||||||
15
test/features/810_setup_passphrase.feature
Normal file
15
test/features/810_setup_passphrase.feature
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
Feature: check pass phrase
|
||||||
|
In order to conform OpenPGP card 2.0 specification
|
||||||
|
A token should support pass phrase: PW1, PW3 and reset code
|
||||||
|
|
||||||
|
Scenario: verify PW1 (1)
|
||||||
|
Given cmd_verify with 1 and "123456"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW1 (2)
|
||||||
|
Given cmd_verify with 2 and "123456"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW3
|
||||||
|
Given cmd_verify with 3 and "12345678"
|
||||||
|
Then it should get success
|
||||||
27
test/features/820_personalization_write.feature
Normal file
27
test/features/820_personalization_write.feature
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Feature: personalize token write
|
||||||
|
In order to use a token
|
||||||
|
A token should be personalized with name, sex, url, etc.
|
||||||
|
|
||||||
|
Scenario: data object Login
|
||||||
|
Given cmd_put_data with 5e and "gpg_user"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: data object Name
|
||||||
|
Given cmd_put_data with 5b and "GnuPG User"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: data object Language preference
|
||||||
|
Given cmd_put_data with 5f2d and "ja"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: data object Sex
|
||||||
|
Given cmd_put_data with 5f35 and "1"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: data object URL
|
||||||
|
Given cmd_put_data with 5f50 and "http://www.fsij.org/gnuk/"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: data object pw1 status bytes
|
||||||
|
Given cmd_put_data with c4 and "\x01"
|
||||||
|
Then it should get success
|
||||||
27
test/features/821_personalization_read.feature
Normal file
27
test/features/821_personalization_read.feature
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Feature: personalize token read
|
||||||
|
In order to use a token
|
||||||
|
A token should be personalized with name, sex, url, etc.
|
||||||
|
|
||||||
|
Scenario: data object Login
|
||||||
|
When requesting login data: 5e
|
||||||
|
Then you should get: gpg_user
|
||||||
|
|
||||||
|
Scenario: data object Name
|
||||||
|
When requesting name: 5b
|
||||||
|
Then you should get: GnuPG User
|
||||||
|
|
||||||
|
Scenario: data object Language preference
|
||||||
|
When requesting anguage preference: 5f2d
|
||||||
|
Then you should get: ja
|
||||||
|
|
||||||
|
Scenario: data object Sex
|
||||||
|
When requesting sex: 5f35
|
||||||
|
Then you should get: 1
|
||||||
|
|
||||||
|
Scenario: data object URL
|
||||||
|
When requesting URL: 5f50
|
||||||
|
Then you should get: http://www.fsij.org/gnuk/
|
||||||
|
|
||||||
|
Scenario: data object pw1 status bytes
|
||||||
|
When requesting pw1 status bytes: c4
|
||||||
|
Then you should get: \x01\x7f\x7f\x7f\x03\x03\x03
|
||||||
56
test/features/830_key_registration.feature
Normal file
56
test/features/830_key_registration.feature
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
Feature: import keys to token
|
||||||
|
In order to use a token
|
||||||
|
A token should have keys
|
||||||
|
|
||||||
|
Scenario: importing OPENPGP.1 key (sign)
|
||||||
|
Given a RSA key pair 0
|
||||||
|
And importing it to the token as OPENPGP.1
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: importing OPENPGP.2 key (decrypt)
|
||||||
|
Given a RSA key pair 1
|
||||||
|
And importing it to the token as OPENPGP.2
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: importing OPENPGP.3 key (authentication)
|
||||||
|
Given a RSA key pair 2
|
||||||
|
And importing it to the token as OPENPGP.3
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: setup data object Finger print sig
|
||||||
|
Given a fingerprint of OPENPGP.1 key
|
||||||
|
And put the data to c7
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: setup data object Finger print dec
|
||||||
|
Given a fingerprint of OPENPGP.2 key
|
||||||
|
And put the data to c8
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: setup data object Finger print aut
|
||||||
|
Given a fingerprint of OPENPGP.3 key
|
||||||
|
And put the data to c9
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: setup data object keygeneration data/time sig
|
||||||
|
Given a timestamp of OPENPGP.1 key
|
||||||
|
And put the data to ce
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: setup data object keygeneration data/time dec
|
||||||
|
Given a timestamp of OPENPGP.2 key
|
||||||
|
And put the data to cf
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: setup data object keygeneration data/time aut
|
||||||
|
Given a timestamp of OPENPGP.3 key
|
||||||
|
And put the data to d0
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW1 (1) again
|
||||||
|
Given cmd_verify with 1 and "123456"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW1 (2) again
|
||||||
|
Given cmd_verify with 2 and "123456"
|
||||||
|
Then it should get success
|
||||||
31
test/features/850_compute_signature.feature
Normal file
31
test/features/850_compute_signature.feature
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
Feature: compute digital signature
|
||||||
|
In order to use a token
|
||||||
|
A token should compute digital signature properly
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.1 key (1)
|
||||||
|
Given a message "This is a test message."
|
||||||
|
And let a token compute digital signature
|
||||||
|
And compute digital signature on host with RSA key pair 0
|
||||||
|
Then results should be same
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.1 key (2)
|
||||||
|
Given a message "This is another test message.\nMultiple lines.\n"
|
||||||
|
And let a token compute digital signature
|
||||||
|
And compute digital signature on host with RSA key pair 0
|
||||||
|
Then results should be same
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.3 key (1)
|
||||||
|
Given a message "This is a test message."
|
||||||
|
And let a token authenticate
|
||||||
|
And compute digital signature on host with RSA key pair 2
|
||||||
|
Then results should be same
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.3 key (2)
|
||||||
|
Given a message "This is another test message.\nMultiple lines.\n"
|
||||||
|
And let a token authenticate
|
||||||
|
And compute digital signature on host with RSA key pair 2
|
||||||
|
Then results should be same
|
||||||
|
|
||||||
|
Scenario: data object ds counter
|
||||||
|
When requesting ds counter: 93
|
||||||
|
Then you should get: \x00\x00\x02
|
||||||
16
test/features/851_decryption.feature
Normal file
16
test/features/851_decryption.feature
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
Feature: decryption
|
||||||
|
In order to use a token
|
||||||
|
A token should decrypt encrypted data
|
||||||
|
|
||||||
|
Scenario: decrypt by OPENPGP.2 key (1)
|
||||||
|
Given a plain text "This is a test message."
|
||||||
|
And encrypt it on host with RSA key pair 1
|
||||||
|
And let a token decrypt encrypted data
|
||||||
|
Then decrypted data should be same as a plain text
|
||||||
|
|
||||||
|
Scenario: decrypt by OPENPGP.2 key (2)
|
||||||
|
Given a plain text "RSA decryption is as easy as pie."
|
||||||
|
And encrypt it on host with RSA key pair 1
|
||||||
|
And let a token decrypt encrypted data
|
||||||
|
Then decrypted data should be same as a plain text
|
||||||
|
|
||||||
48
test/features/860_key_removal.feature
Normal file
48
test/features/860_key_removal.feature
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
@keygen
|
||||||
|
Feature: key removal
|
||||||
|
In order to use a token
|
||||||
|
A token should have keys
|
||||||
|
|
||||||
|
Scenario: remove OPENPGP.1 key (sign)
|
||||||
|
When removing a key OPENPGP.1
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove OPENPGP.2 key (decrypt)
|
||||||
|
When removing a key OPENPGP.2
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove OPENPGP.3 key (authentication)
|
||||||
|
When removing a key OPENPGP.3
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Finger print sig
|
||||||
|
Given cmd_put_data with c7 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Finger print dec
|
||||||
|
Given cmd_put_data with c8 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object Finger print aut
|
||||||
|
Given cmd_put_data with c9 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object keygeneration data/time sig
|
||||||
|
Given cmd_put_data with ce and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object keygeneration data/time dec
|
||||||
|
Given cmd_put_data with cf and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: remove data object keygeneration data/time aut
|
||||||
|
Given cmd_put_data with d0 and ""
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW1
|
||||||
|
Given cmd_verify with 1 and "123456"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW2
|
||||||
|
Given cmd_verify with 2 and "123456"
|
||||||
|
Then it should get success
|
||||||
37
test/features/862_keygen.feature
Normal file
37
test/features/862_keygen.feature
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
@keygen
|
||||||
|
Feature: key generation
|
||||||
|
In order to use a token
|
||||||
|
A token should have keys
|
||||||
|
|
||||||
|
Scenario: generate OPENPGP.1 key (sign)
|
||||||
|
When generating a key of OPENPGP.1
|
||||||
|
And put the first data to c7
|
||||||
|
And put the second data to ce
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: generate OPENPGP.2 key (decrypt)
|
||||||
|
When generating a key of OPENPGP.2
|
||||||
|
And put the first data to c8
|
||||||
|
And put the second data to cf
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: generate OPENPGP.3 key (authentication)
|
||||||
|
When generating a key of OPENPGP.3
|
||||||
|
And put the first data to c9
|
||||||
|
And put the second data to d0
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.1 key
|
||||||
|
Given a message "GnuPG assumes that PW1 keeps valid after keygen."
|
||||||
|
And a public key from token for OPENPGP.1
|
||||||
|
And let a token compute digital signature
|
||||||
|
And verify signature
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW1 (1) after keygen
|
||||||
|
Given cmd_verify with 1 and "123456"
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: verify PW1 (2) after keygen
|
||||||
|
Given cmd_verify with 2 and "123456"
|
||||||
|
Then it should get success
|
||||||
36
test/features/870_compute_signature.feature
Normal file
36
test/features/870_compute_signature.feature
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
@keygen
|
||||||
|
Feature: compute digital signature
|
||||||
|
In order to use a token
|
||||||
|
A token should compute digital signature properly
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.1 key (1)
|
||||||
|
Given a message "This is a test message."
|
||||||
|
And a public key from token for OPENPGP.1
|
||||||
|
And let a token compute digital signature
|
||||||
|
And verify signature
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.1 key (2)
|
||||||
|
Given a message "This is another test message.\nMultiple lines.\n"
|
||||||
|
And a public key from token for OPENPGP.1
|
||||||
|
And let a token compute digital signature
|
||||||
|
And verify signature
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.3 key (1)
|
||||||
|
Given a message "This is a test message."
|
||||||
|
And a public key from token for OPENPGP.3
|
||||||
|
And let a token authenticate
|
||||||
|
And verify signature
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: compute digital signature by OPENPGP.3 key (2)
|
||||||
|
Given a message "This is another test message.\nMultiple lines.\n"
|
||||||
|
And a public key from token for OPENPGP.3
|
||||||
|
And let a token authenticate
|
||||||
|
And verify signature
|
||||||
|
Then it should get success
|
||||||
|
|
||||||
|
Scenario: data object ds counter
|
||||||
|
When requesting ds counter: 93
|
||||||
|
Then data should match: \x00\x00(\x02|\x03)
|
||||||
19
test/features/871_decryption.feature
Normal file
19
test/features/871_decryption.feature
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
@keygen
|
||||||
|
Feature: decryption
|
||||||
|
In order to use a token
|
||||||
|
A token should decrypt encrypted data
|
||||||
|
|
||||||
|
Scenario: decrypt by OPENPGP.2 key (1)
|
||||||
|
Given a plain text "This is a test message."
|
||||||
|
And a public key from token for OPENPGP.2
|
||||||
|
And encrypt it on host
|
||||||
|
And let a token decrypt encrypted data
|
||||||
|
Then decrypted data should be same as a plain text
|
||||||
|
|
||||||
|
Scenario: decrypt by OPENPGP.2 key (2)
|
||||||
|
Given a plain text "RSA decryption is as easy as pie."
|
||||||
|
And a public key from token for OPENPGP.2
|
||||||
|
And encrypt it on host
|
||||||
|
And let a token decrypt encrypted data
|
||||||
|
Then decrypted data should be same as a plain text
|
||||||
|
|
||||||
@@ -125,24 +125,24 @@ def compute_signature(keyno, digestinfo):
|
|||||||
sig = t2 + t * q
|
sig = t2 + t * q
|
||||||
return sig
|
return sig
|
||||||
|
|
||||||
def integer_to_bytes(i):
|
def integer_to_bytes_256(i):
|
||||||
s = hex(i)[2:]
|
s = hex(i)[2:]
|
||||||
s = s.rstrip('L')
|
s = s.rstrip('L')
|
||||||
if len(s) & 1:
|
if len(s) & 1:
|
||||||
s = '0' + s
|
s = '0' + s
|
||||||
return unhexlify(s)
|
return string.rjust(unhexlify(s), 256, '\x00')
|
||||||
|
|
||||||
def encrypt(keyno, plaintext):
|
def encrypt(keyno, plaintext):
|
||||||
e = key[keyno][4]
|
e = key[keyno][4]
|
||||||
n = key[keyno][7]
|
n = key[keyno][7]
|
||||||
m = pkcs1_pad_for_crypt(plaintext)
|
m = pkcs1_pad_for_crypt(plaintext)
|
||||||
return '\x00' + integer_to_bytes(pow(m, e, n))
|
return '\x00' + integer_to_bytes_256(pow(m, e, n))
|
||||||
|
|
||||||
def encrypt_with_pubkey(pubkey_info, plaintext):
|
def encrypt_with_pubkey(pubkey_info, plaintext):
|
||||||
n = int(hexlify(pubkey_info[0]), 16)
|
n = int(hexlify(pubkey_info[0]), 16)
|
||||||
e = int(hexlify(pubkey_info[1]), 16)
|
e = int(hexlify(pubkey_info[1]), 16)
|
||||||
m = pkcs1_pad_for_crypt(plaintext)
|
m = pkcs1_pad_for_crypt(plaintext)
|
||||||
return '\x00' + integer_to_bytes(pow(m, e, n))
|
return '\x00' + integer_to_bytes_256(pow(m, e, n))
|
||||||
|
|
||||||
def verify_signature(pubkey_info, digestinfo, sig):
|
def verify_signature(pubkey_info, digestinfo, sig):
|
||||||
n = int(hexlify(pubkey_info[0]), 16)
|
n = int(hexlify(pubkey_info[0]), 16)
|
||||||
|
|||||||
@@ -216,27 +216,31 @@ class stlinkv2(object):
|
|||||||
v = self.execute_get("\xf2\x22\x00", 4)
|
v = self.execute_get("\xf2\x22\x00", 4)
|
||||||
return v[0] + (v[1]<<8) + (v[2]<<16) + (v[3]<<24)
|
return v[0] + (v[1]<<8) + (v[2]<<16) + (v[3]<<24)
|
||||||
|
|
||||||
# For FST-01-00 and FST-01: LED on, USB off
|
# For FST-01-00 and FST-01: LED on, USB connect
|
||||||
def setup_gpio(self):
|
def setup_gpio(self):
|
||||||
apb2enr = self.read_memory_u32(0x40021018)
|
apb2enr = self.read_memory_u32(0x40021018)
|
||||||
apb2enr = apb2enr | 4 | 8 | 0x1000 # Enable port A, port B, and SPI1
|
apb2enr = apb2enr | 4 | 8 | 0x1000 # Enable port A, port B, and SPI1
|
||||||
self.write_memory_u32(0x40021018, apb2enr) # RCC->APB2ENR
|
self.write_memory_u32(0x40021018, apb2enr) # RCC->APB2ENR
|
||||||
self.write_memory_u32(0x4002100c, 4|8|0x1000) # RCC->APB2RSTR
|
self.write_memory_u32(0x4002100c, 4|8|0x1000) # RCC->APB2RSTR
|
||||||
self.write_memory_u32(0x4002100c, 0)
|
self.write_memory_u32(0x4002100c, 0)
|
||||||
self.write_memory_u32(GPIOA+0x0c, 0xfffffbff) # ODR
|
self.write_memory_u32(GPIOA+0x0c, 0xffffffff) # ODR
|
||||||
self.write_memory_u32(GPIOA+0x04, 0x88888383) # CRH
|
self.write_memory_u32(GPIOA+0x04, 0x88888383) # CRH
|
||||||
self.write_memory_u32(GPIOA+0x00, 0xBBB38888) # CRL
|
self.write_memory_u32(GPIOA+0x00, 0xBBB38888) # CRL
|
||||||
self.write_memory_u32(GPIOB+0x0c, 0xffffffff) # ODR
|
self.write_memory_u32(GPIOB+0x0c, 0xffffffff) # ODR
|
||||||
self.write_memory_u32(GPIOB+0x04, 0x88888883) # CRH
|
self.write_memory_u32(GPIOB+0x04, 0x88888888) # CRH
|
||||||
self.write_memory_u32(GPIOB+0x00, 0x88888888) # CRL
|
self.write_memory_u32(GPIOB+0x00, 0x88888883) # CRL
|
||||||
|
|
||||||
# For FST-01-00 and FST-01: LED off, USB off
|
# For FST-01-00 and FST-01: LED on, USB disconnect
|
||||||
|
def usb_disconnect(self):
|
||||||
|
self.write_memory_u32(GPIOA+0x0c, 0xfffffbff) # ODR
|
||||||
|
|
||||||
|
# For FST-01-00 and FST-01: LED off, USB connect
|
||||||
def finish_gpio(self):
|
def finish_gpio(self):
|
||||||
|
self.write_memory_u32(GPIOA+0x0c, 0xfffffeff) # ODR
|
||||||
|
self.write_memory_u32(GPIOB+0x0c, 0xfffffffe) # ODR
|
||||||
apb2enr = self.read_memory_u32(0x40021018)
|
apb2enr = self.read_memory_u32(0x40021018)
|
||||||
apb2enr = apb2enr & ~(4 | 8 | 0x1000)
|
apb2enr = apb2enr & ~(4 | 8 | 0x1000)
|
||||||
self.write_memory_u32(0x40021018, apb2enr) # RCC->APB2ENR
|
self.write_memory_u32(0x40021018, apb2enr) # RCC->APB2ENR
|
||||||
self.write_memory_u32(GPIOA+0x0c, 0xfffffaff) # ODR
|
|
||||||
self.write_memory_u32(GPIOB+0x0c, 0xfffffffe) # ODR
|
|
||||||
|
|
||||||
def spi_flash_init(self):
|
def spi_flash_init(self):
|
||||||
self.write_memory_u32(SPI1+0x00, 0x0004); # CR1 <= MSTR
|
self.write_memory_u32(SPI1+0x00, 0x0004); # CR1 <= MSTR
|
||||||
@@ -562,6 +566,9 @@ def main(show_help, erase_only, no_protect, spi_flash_check,
|
|||||||
if unlock:
|
if unlock:
|
||||||
stl.reset_sys()
|
stl.reset_sys()
|
||||||
stl.option_bytes_write(OPTION_BYTES_ADDR,RDP_KEY)
|
stl.option_bytes_write(OPTION_BYTES_ADDR,RDP_KEY)
|
||||||
|
stl.usb_disconnect()
|
||||||
|
time.sleep(0.100)
|
||||||
|
stl.finish_gpio()
|
||||||
print "Flash ROM read protection disabled. Reset the board, now."
|
print "Flash ROM read protection disabled. Reset the board, now."
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@@ -578,6 +585,8 @@ def main(show_help, erase_only, no_protect, spi_flash_check,
|
|||||||
stl.flash_erase_all()
|
stl.flash_erase_all()
|
||||||
|
|
||||||
if erase_only:
|
if erase_only:
|
||||||
|
stl.usb_disconnect()
|
||||||
|
time.sleep(0.100)
|
||||||
stl.finish_gpio()
|
stl.finish_gpio()
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@@ -606,6 +615,7 @@ def main(show_help, erase_only, no_protect, spi_flash_check,
|
|||||||
print "Flash ROM read protection enabled. Reset the board to enable protection."
|
print "Flash ROM read protection enabled. Reset the board to enable protection."
|
||||||
|
|
||||||
if reset_after_successful_write:
|
if reset_after_successful_write:
|
||||||
|
stl.usb_disconnect()
|
||||||
stl.reset_sys()
|
stl.reset_sys()
|
||||||
stl.run()
|
stl.run()
|
||||||
stl.exit_debug()
|
stl.exit_debug()
|
||||||
|
|||||||
Reference in New Issue
Block a user