From 77548b1ddd425299660db1281a76b6a7e080d5ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Mesnil?= Date: Thu, 5 Oct 2017 19:04:27 +0200 Subject: [PATCH 01/11] Add quick testing guide --- doc/developper/quick-test.txt | 196 ++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 doc/developper/quick-test.txt diff --git a/doc/developper/quick-test.txt b/doc/developper/quick-test.txt new file mode 100644 index 0000000..5558ce7 --- /dev/null +++ b/doc/developper/quick-test.txt @@ -0,0 +1,196 @@ +Step1: ... +----- +Jump into any temp dir + + +Step2: install nanos +----- +Do a fresh install of gpg application 1.1.0 from google app manager + + +Step3: setup conf +----- +Create a 'manual-test' directory + $ mkdir manual-test + +Create a 'manual-test/gnupg' + $ mkdir manual-test/gnupg + +Create a 'manual-test/gnupg/scdaemon.conf' file with content: + reader-port "Ledger Token [Nano S] (0001) 01 00" + allow-admin + card-timeout 1 + debug-level expert + debug 11 + log-file /tmp/scdaemon.log + +Jump into manual-test dir + +Step4: change to host pin style +----- +Launch gpg NanoS application and: + $ killall scdaemon gpg-agent + $ gpg2 --homedir `pwd`/gnupg --card-edit + gpg: WARNING: unsafe permissions on homedir '/home/cme/Projects/Git/ledgerblue/blue-app-openpgp-card/manual-test/gnupg' + gpg: keybox '/home/cme/Projects/Git/ledgerblue/blue-app-openpgp-card/manual-test/gnupg/pubring.kbx' created + + Reader ...........: Ledger Token [Nano S] (0001) 01 00 + Application ID ...: D2760001240103002C97DDD38BA90000 + Version ..........: 3.0 + Manufacturer .....: unknown + Serial number ....: DDD38BA9 + Name of cardholder: [not set] + Language prefs ...: [not set] + Sex ..............: unspecified + URL of public key : [not set] + Login data .......: [not set] + Signature PIN ....: not forced + Key attributes ...: rsa2048 rsa2048 rsa2048 + Max. PIN lengths .: 12 12 12 + PIN retry counter : 3 0 3 + Signature counter : 0 + Signature key ....: [none] + Encryption key....: [none] + Authentication key: [none] + General key info..: [none] + + gpg/card> verify + + Reader ...........: Ledger Token [Nano S] (0001) 01 00 + Application ID ...: D2760001240103002C97DDD38BA90000 + Version ..........: 3.0 + Manufacturer .....: unknown + Serial number ....: DDD38BA9 + Name of cardholder: [not set] + Language prefs ...: [not set] + Sex ..............: unspecified + URL of public key : [not set] + Login data .......: [not set] + Signature PIN ....: not forced + Key attributes ...: rsa2048 rsa2048 rsa2048 + Max. PIN lengths .: 12 12 12 + PIN retry counter : 3 0 3 + Signature counter : 0 + Signature key ....: [none] + Encryption key....: [none] + Authentication key: [none] + General key info..: [none] + + gpg/card> + +Then on nanos, goto settings->PIN mode, and select 'Host' +Then on nanos, goto settings->PIN mode, and select 'Set as default' + +unplug and replug the nanos + +relaunch the openpgp application + +Goto settings->PIN mode, and check you have "Host # +" (DASH and PLUS) + + +Step5: create 2048bits RSA keys +----- + + +In 'manual-test' directory, ask key generation. Nota that during this phase PIN has to be validate on Nanos + + $ killall scdaemon gpg-agent + $ gpg2 --homedir `pwd`/gnupg --card-edit + gpg: WARNING: unsafe permissions on homedir '/home/cme/Projects/Git/ledgerblue/blue-app-openpgp-card/manual-test/gnupg' + + Reader ...........: Ledger Token [Nano S] (0001) 01 00 + Application ID ...: D2760001240103002C97DDD38BA90000 + Version ..........: 3.0 + Manufacturer .....: unknown + Serial number ....: DDD38BA9 + Name of cardholder: [not set] + Language prefs ...: [not set] + Sex ..............: unspecified + URL of public key : [not set] + Login data .......: [not set] + Signature PIN ....: not forced + Key attributes ...: rsa2048 rsa2048 rsa2048 + Max. PIN lengths .: 12 12 12 + PIN retry counter : 3 0 3 + Signature counter : 0 + Signature key ....: [none] + Encryption key....: [none] + Authentication key: [none] + General key info..: [none] + + gpg/card> admin + Admin commands are allowed + + gpg/card> generate + Make off-card backup of encryption key? (Y/n) n + + Please note that the factory settings of the PINs are + PIN = '123456' Admin PIN = '12345678' + You should change them using the command --change-pin + + What keysize do you want for the Signature key? (2048) 2048 + What keysize do you want for the Encryption key? (2048) 2048 + What keysize do you want for the Authentication key? (2048) 2048 + Please specify how long the key should be valid. + 0 = key does not expire + = key expires in n days + w = key expires in n weeks + m = key expires in n months + y = key expires in n years + Key is valid for? (0) 0 + Key does not expire at all + Is this correct? (y/N) y + + GnuPG needs to construct a user ID to identify your key. + + Real name: testkey + Email address: + Comment: + You selected this USER-ID: + "testkey" + + Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O + gpg: /home/cme/Projects/Git/ledgerblue/blue-app-openpgp-card/manual-test/gnupg/trustdb.gpg: trustdb created + gpg: key 5ED17DF289C757A2 marked as ultimately trusted + gpg: directory '/home/cme/Projects/Git/ledgerblue/blue-app-openpgp-card/manual-test/gnupg/openpgp-revocs.d' created + gpg: revocation certificate stored as '/home/cme/Projects/Git/ledgerblue/blue-app-openpgp-card/manual-test/gnupg/openpgp-revocs.d/7FDC3D2FCD3558CB06631EAB5ED17DF289C757A2.rev' + public and secret key created and signed. + + + gpg/card> quit + pub rsa2048 2017-10-03 [SC] + 7FDC3D2FCD3558CB06631EAB5ED17DF289C757A2 + uid testkey + sub rsa2048 2017-10-03 [A] + sub rsa2047 2017-10-03 [E] + + + +Step6: encrypt/decrypt +----- +encrypt + + $ killall scdaemon gpg-agent + $ echo CLEAR > foo.txt + $ gpg2 --homedir `pwd`/gnupg -e -r testkey foo.txt + gpg: WARNING: unsafe permissions on homedir '/home/cme/Projects/Git/ledgerblue/blue-app-openpgp-card/manual-test/gnupg' + gpg: checking the trustdb + gpg: marginals needed: 3 completes needed: 1 trust model: pgp + gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u + +Force pin to asked + + $ killall gpg-agent scdaemon + +decrypt + + $ gpg2 --homedir `pwd`/gnupg foo.txt.gpg + gpg: WARNING: unsafe permissions on homedir '/home/cme/Projects/Git/ledgerblue/blue-app-openpgp-card/manual-test/gnupg' + gpg: encrypted with 2047-bit RSA key, ID 602FE5EB7BFA4B00, created 2017-10-03 + "testkey" + File 'foo.txt' exists. Overwrite? (y/N) y + +Step7: pin on screen +------ + +Restart from Step1, but skip step4 From 783cf580ab7ae3160fbed512f8d42f86b408c4f3 Mon Sep 17 00:00:00 2001 From: Carl Dong Date: Mon, 30 Oct 2017 00:04:06 -0700 Subject: [PATCH 02/11] Tidy up whitespace in gpgcard.py --- pytools/gpgcard/gpgcard.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/pytools/gpgcard/gpgcard.py b/pytools/gpgcard/gpgcard.py index 39a761c..38cc01b 100644 --- a/pytools/gpgcard/gpgcard.py +++ b/pytools/gpgcard/gpgcard.py @@ -163,9 +163,9 @@ class GPGCard() : sw = (sw1<<8)|sw2 #print("xch S resp: %s %.04x"%(binascii.hexlify(resp),sw)) return resp,sw - + def _disconnect_ledger(self): - return self.token.close() + return self.token.close() def _disconnect_pcsc(self): r = self.connection.disconnect() @@ -266,7 +266,7 @@ class GPGCard() : self.sig_date = dates[0:4] self.dec_date = dates[4:8] self.aut_date = dates[8:12] - + self.cardholder_cert = self.get_data(0x7f21) self.UIF_SIG,sw = self.get_data(0xD6) @@ -289,13 +289,13 @@ class GPGCard() : self.put_data(0x0102, self.private_02) self.put_data(0x0103, self.private_03) self.put_data(0x0104, self.private_04) - + self.put_data(0x5b, self.name) self.put_data(0x5e, self.login) self.put_data(0x5f2d, self.lang) self.put_data(0x5f35, self.sex) self.put_data(0x5f50, self.url) - + self.put_data(0xc1, self.sig_attribute) self.put_data(0xc2, self.dec_attribute) self.put_data(0xc3, self.aut_attribute) @@ -326,13 +326,13 @@ class GPGCard() : self.name, self.login, self.sex, self.url, self.sig_attribute, self.dec_attribute, self.aut_attribute, self.PW_status, - self.sig_fingerprints, self.dec_fingerprints, self.aut_fingerprints, - self.sig_CA_fingerprints, self.dec_CA_fingerprints, self.aut_CA_fingerprints, - self.sig_date, self.dec_date, self.aut_date, + self.sig_fingerprints, self.dec_fingerprints, self.aut_fingerprints, + self.sig_CA_fingerprints, self.dec_CA_fingerprints, self.aut_CA_fingerprints, + self.sig_date, self.dec_date, self.aut_date, self.cardholder_cert, self.UIF_SIG, self.UIF_DEC, self.UIF_AUT), f, 2) - + def restore(self, file_name, seed_key=False): f = open(file_name,mode='r+b') @@ -341,9 +341,9 @@ class GPGCard() : self.name, self.login, self.sex, self.url, self.sig_attribute, self.dec_attribute, self.aut_attribute, self.status, - self.sig_fingerprints, self.dec_fingerprints, self.aut_fingerprints, - self.sig_CA_fingerprints, self.dec_CA_fingerprints, self.aut_CA_fingerprints, - self.sig_date, self.dec_date, self.aut_date, + self.sig_fingerprints, self.dec_fingerprints, self.aut_fingerprints, + self.sig_CA_fingerprints, self.dec_CA_fingerprints, self.aut_CA_fingerprints, + self.sig_date, self.dec_date, self.aut_date, self.cardholder_cert, self.UIF_SIG, self.UIF_DEC, self.UIF_AUT) = pickle.load(f) self.set_all() @@ -742,4 +742,3 @@ class GPGCard() : 'e': tags[0x82], 'd': tags[0x98], } - From 8c835245360d2684cfcb7f8bd769edf6a25703b4 Mon Sep 17 00:00:00 2001 From: Carl Dong Date: Wed, 22 Nov 2017 00:11:56 -0800 Subject: [PATCH 03/11] gpg_data.c: Clear correct bits for 0x4f tag. --- src/gpg_data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gpg_data.c b/src/gpg_data.c index 2c1ac08..90c6074 100644 --- a/src/gpg_data.c +++ b/src/gpg_data.c @@ -282,7 +282,7 @@ int gpg_apdu_put_data(unsigned int ref) { if (G_gpg_vstate.io_length != 4) { THROW(SW_WRONG_LENGTH); } - G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset] &= ~0x07; + G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset + 3] &= ~0x07; nvm_write(&N_gpg_pstate->AID[10], &G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset], 4); break; From 2c06e06261121e2d146cccd205c03f56a139b7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric?= Date: Thu, 22 Feb 2018 11:00:27 +0100 Subject: [PATCH 04/11] Update blue-app-openpgp-card.rst --- doc/user/blue-app-openpgp-card.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/user/blue-app-openpgp-card.rst b/doc/user/blue-app-openpgp-card.rst index 6709545..0d65ce6 100644 --- a/doc/user/blue-app-openpgp-card.rst +++ b/doc/user/blue-app-openpgp-card.rst @@ -121,9 +121,9 @@ Linux You have to have to add the NanoS to /etc/libccid_Info.plist - In ifdVendorID add the entry 0x2C97 - In ifdProductID add the entry 0x0001 - In ifdFriendlyName add the entry Ledger Token + - In ifdVendorID add the entry 0x2C97 + - In ifdProductID add the entry 0x0001 + - In ifdFriendlyName add the entry Ledger Token These 3 entries must be added at the end of each list. @@ -135,9 +135,9 @@ MAC 2. You have to add the Nano S to /usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist - In ifdVendorID add the entry 0x2C97 - In ifdProductID add the entry 0x0001 - In ifdFriendlyName add the entry Ledger Token + - In ifdVendorID add the entry 0x2C97 + - In ifdProductID add the entry 0x0001 + - In ifdFriendlyName add the entry Ledger Token This 3 entries must be added at the end of each list. From e6026d5809f193c45b9a1ef387e77baf81a35fe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric?= Date: Mon, 5 Mar 2018 21:51:57 +0100 Subject: [PATCH 05/11] intermediate commit --- Makefile | 61 ++++++++++------ doc/user/blue-app-openpgp-card.rst | 1 + src/gpg_api.h | 2 +- src/gpg_data.c | 2 +- src/gpg_dispatch.c | 9 ++- src/gpg_init.c | 5 +- src/gpg_io.c | 5 +- src/gpg_main.c | 2 +- src/gpg_pso.c | 40 +++++++++-- src/gpg_select.c | 15 +++- src/gpg_types.h | 4 +- src/gpg_ux_nanos.c | 112 ++++++++++++++++++++++++++++- src/usbd_ccid_impl.c | 5 +- 13 files changed, 219 insertions(+), 44 deletions(-) diff --git a/Makefile b/Makefile index d329bd0..360acd9 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,19 @@ -# Copyright 2017 Cedric Mesnil , Ledger SAS -# +#******************************************************************************* +# Ledger App +# (c) 2017 Ledger +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -# +#******************************************************************************* ifeq ($(BOLOS_SDK),) $(error Environment variable BOLOS_SDK is not set) @@ -19,57 +21,74 @@ endif include $(BOLOS_SDK)/Makefile.defines APPNAME = "OpenPGP" -APP_LOAD_PARAMS=--appFlags 0x40 --path "2152157255" --curve secp256k1 $(COMMON_LOAD_PARAMS) +APP_LOAD_PARAMS=--appFlags 0x50 --path "" --curve secp256k1 $(COMMON_LOAD_PARAMS) APPVERSION_M=1 -APPVERSION_N=1 +APPVERSION_N=2 APPVERSION_P=0 - APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) -SPECVERSION="3.3.1" -ICONNAME=images/icon_pgp.gif +ifeq ($(TARGET_NAME),TARGET_BLUE) +ICONNAME=blue_app_cxt.gif +else +ICONNAME=nanos_app_cxt.gif +endif + + +DEFINES += $(CXT_CONFIG) CXT_VERSION=$(APPVERSION) CXT_NAME=$(APPNAME) SPEC_VERSION=$(SPECVERSION) +DEFINES += DEBUGLEDGER ################ # Default rule # ################ + all: default ############ # Platform # ############ -DEFINES += OS_IO_SEPROXYHAL IO_SEPROXYHAL_BUFFER_SIZE_B=128 -DEFINES += HAVE_BAGL HAVE_PRINTF HAVE_SPRINTF -DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=7 IO_HID_EP_LENGTH=64 HAVE_USB_APDU -DEFINES += HAVE_USB_CLASS_CCID +DEFINES += OS_IO_SEPROXYHAL IO_SEPROXYHAL_BUFFER_SIZE_B=300 +DEFINES += HAVE_BAGL HAVE_SPRINTF +#DEFINES += HAVE_PRINTF PRINTF=screen_printf +DEFINES += PRINTF\(...\)= +DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=6 IO_HID_EP_LENGTH=64 HAVE_USB_APDU + +DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) TCS_LOADER_PATCH_VERSION=0 + +DEFINES += UNUSED\(x\)=\(void\)x +DEFINES += APPVERSION=\"$(APPVERSION)\" -DEFINES += $(GPG_CONFIG) GPG_VERSION=$(APPVERSION) GPG_NAME=$(APPNAME) SPEC_VERSION=$(SPECVERSION) ############## -# Compiler # +# Compiler # ############## #GCCPATH := $(BOLOS_ENV)/gcc-arm-none-eabi-5_3-2016q1/bin/ #CLANGPATH := $(BOLOS_ENV)/clang-arm-fropi/bin/ CC := $(CLANGPATH)clang -#CFLAGS += -O0 -gdwarf-2 -gstrict-dwarf +#CFLAGS += -O0 CFLAGS += -O3 -Os AS := $(GCCPATH)arm-none-eabi-gcc LD := $(GCCPATH)arm-none-eabi-gcc -#LDFLAGS += -O0 -gdwarf-2 -gstrict-dwarf LDFLAGS += -O3 -Os LDLIBS += -lm -lgcc -lc # import rules to compile glyphs(/pone) include $(BOLOS_SDK)/Makefile.glyphs -### computed variables +### variables processed by the common makefile.rules of the SDK to grab source files and include dirs APP_SOURCE_PATH += src -SDK_SOURCE_PATH += lib_stusb lib_stusb_impl +SDK_SOURCE_PATH += lib_stusb qrcode +#use the SDK U2F+HIDGEN USB profile +SDK_SOURCE_PATH += lib_u2f lib_stusb_impl +DEFINES += U2F_PROXY_MAGIC=\"BTC\" +DEFINES += HAVE_IO_U2F HAVE_U2F USB_SEGMENT_SIZE=64 +DEFINES += BLE_SEGMENT_SIZE=20 +DEFINES += HAVE_USB_CLASS_CCID load: all python -m ledgerblue.loadApp $(APP_LOAD_PARAMS) @@ -81,5 +100,5 @@ delete: include $(BOLOS_SDK)/Makefile.rules #add dependency on custom makefile filename -dep/%.d: %.c Makefile.genericwallet +dep/%.d: %.c Makefile diff --git a/doc/user/blue-app-openpgp-card.rst b/doc/user/blue-app-openpgp-card.rst index 6709545..291068a 100644 --- a/doc/user/blue-app-openpgp-card.rst +++ b/doc/user/blue-app-openpgp-card.rst @@ -370,6 +370,7 @@ the reader and the delegated PIN support. Edit the file ~/.gnupg/scdaemon.conf and add the following lines: | ``reader-port "Ledger Token [Nano S] (0001) 01 00"`` + | ``allow-admin`` | ``enable-pinpad-varlen`` diff --git a/src/gpg_api.h b/src/gpg_api.h index fa9f854..da0b912 100644 --- a/src/gpg_api.h +++ b/src/gpg_api.h @@ -28,7 +28,7 @@ int gpg_apdu_get_data(unsigned int ref) ; int gpg_apdu_get_next_data(unsigned int ref) ; int gpg_apdu_put_data(unsigned int ref) ; -int gpg_apdu_pso(unsigned int ref); +int gpg_apdu_pso(void); int gpg_apdu_internal_authenticate(void); int gpg_apdu_gen(void ); int gpg_apdu_get_challenge(void) ; diff --git a/src/gpg_data.c b/src/gpg_data.c index 2c1ac08..4ca86d1 100644 --- a/src/gpg_data.c +++ b/src/gpg_data.c @@ -282,7 +282,7 @@ int gpg_apdu_put_data(unsigned int ref) { if (G_gpg_vstate.io_length != 4) { THROW(SW_WRONG_LENGTH); } - G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset] &= ~0x07; + G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset+3] &= ~0x07; nvm_write(&N_gpg_pstate->AID[10], &G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset], 4); break; diff --git a/src/gpg_dispatch.c b/src/gpg_dispatch.c index 6e907b3..9640a36 100644 --- a/src/gpg_dispatch.c +++ b/src/gpg_dispatch.c @@ -62,7 +62,7 @@ void gpg_check_access_ins() { case INS_PSO: if ((ref == 0x9e9a) && gpg_pin_is_verified(PIN_ID_PW1)) { - //pso:sign + //pso:sign if (N_gpg_pstate->PW_status[0] == 0) { gpg_pin_set_verified(PIN_ID_PW1, 0); } @@ -236,7 +236,9 @@ int gpg_dispatch() { unsigned int tag,t,l; int sw; - if ((G_gpg_vstate.io_cla != 0x00) && (G_gpg_vstate.io_cla != 0x10) && (G_gpg_vstate.io_cla != 0xEF)) { + if ((G_gpg_vstate.io_cla != 0x00) && + (G_gpg_vstate.io_cla != 0x10) && + (G_gpg_vstate.io_cla != 0xEF)) { THROW(SW_CLA_NOT_SUPPORTED); return SW_CLA_NOT_SUPPORTED; } @@ -378,8 +380,9 @@ int gpg_dispatch() { /* --- PSO --- */ case INS_PSO: - sw = gpg_apdu_pso(tag); + sw = gpg_apdu_pso(); break; + case INS_INTERNAL_AUTHENTICATE: sw = gpg_apdu_internal_authenticate(); break; diff --git a/src/gpg_init.c b/src/gpg_init.c index 03207b1..8b89a56 100644 --- a/src/gpg_init.c +++ b/src/gpg_init.c @@ -122,7 +122,7 @@ const unsigned char C_ext_length[8] = { const unsigned char C_default_AID[] = { 0xD2, 0x76, 0x00, 0x01, 0x24, 0x01, //version - 0x03, 0x00, + 0x02, 0x00, //manufacturer 0x2C, 0x97, //serial @@ -289,7 +289,8 @@ int gpg_install(unsigned char app_state) { #if 1 G_gpg_vstate.work.io_buffer[0] = PIN_MODE_CONFIRM; gpg_nvm_write(&N_gpg_pstate->config_pin, G_gpg_vstate.work.io_buffer, 1); - USBD_CCID_activate_pinpad(3); + #warning USBD_CCID_activate_pinpad commented + //USBD_CCID_activate_pinpad(3); #else G_gpg_vstate.work.io_buffer[0] = PIN_MODE_HOST; gpg_nvm_write(&N_gpg_pstate->config_pin, G_gpg_vstate.work.io_buffer, 1); diff --git a/src/gpg_io.c b/src/gpg_io.c index 4fa85b1..9a36db2 100644 --- a/src/gpg_io.c +++ b/src/gpg_io.c @@ -149,10 +149,7 @@ void gpg_io_insert_tlv(unsigned int T, unsigned int L, unsigned char const *V) { /* ----------------------------------------------------------------------- */ /* FECTH data from received buffer */ /* ----------------------------------------------------------------------- */ -void gpg_io_fetch_buffer(unsigned char* buffer, unsigned int len) { - os_memmove(buffer, G_gpg_vstate.work.io_buffer+G_gpg_vstate.io_offset, len); - G_gpg_vstate.io_offset += len; -} + unsigned int gpg_io_fetch_u32() { unsigned int v32; diff --git a/src/gpg_main.c b/src/gpg_main.c index 9390543..78bb5e2 100644 --- a/src/gpg_main.c +++ b/src/gpg_main.c @@ -165,7 +165,7 @@ __attribute__((section(".boot"))) int main(void) { //start communication with MCU io_seproxyhal_init(); - USB_CCID_power(1); + USB_power(1); io_usb_ccid_set_card_inserted(1); diff --git a/src/gpg_pso.c b/src/gpg_pso.c index d98b0e1..07a2b9d 100644 --- a/src/gpg_pso.c +++ b/src/gpg_pso.c @@ -83,7 +83,7 @@ static int gpg_sign(gpg_key_t *sigkey) { if ((sigkey->attributes.value[0] == 19) || (sigkey->attributes.value[0] == 22)) { cx_ecfp_private_key_t *key; - unsigned int sz,i,rs_len; + unsigned int sz,i,rs_len,info; unsigned char *rs; key = &sigkey->key.ecfp256; @@ -97,7 +97,8 @@ static int gpg_sign(gpg_key_t *sigkey) { CX_RND_TRNG, CX_NONE, G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, - G_gpg_vstate.work.io_buffer); + G_gpg_vstate.work.io_buffer, + &info); //reencode r,s in MPI format gpg_io_discard(0); @@ -116,11 +117,12 @@ static int gpg_sign(gpg_key_t *sigkey) { rs += 2; } } else{ - sz = cx_eddsa_sign(key, NULL, + sz = cx_eddsa_sign(key, CX_NONE, CX_SHA512, G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, - G_gpg_vstate.work.io_buffer+128); + NULL, 0, + G_gpg_vstate.work.io_buffer+128, &info); gpg_io_discard(0); gpg_io_insert(G_gpg_vstate.work.io_buffer+128, sz); } @@ -134,8 +136,30 @@ static int gpg_sign(gpg_key_t *sigkey) { return SW_REFERENCED_DATA_NOT_FOUND; } -int gpg_apdu_pso(unsigned int pso) { +int gpg_apdu_pso() { unsigned int t,l,ksz; + + unsigned int pso; + + pso = (G_gpg_vstate.io_p1 << 8) | G_gpg_vstate.io_p2 ; + + //UIF HANDLE + switch(pso) { + // --- PSO:CDS --- + case 0x9e9a: + if ((G_gpg_vstate.kslot->sig.UIF[0]) && ((G_gpg_vstate.UIF_flags)==0)) { + ui_menu_uifconfirm_display(0); + return 0; + } + + case 0x8680: + if ((G_gpg_vstate.kslot->dec.UIF[0]) && ((G_gpg_vstate.UIF_flags)==0)) { + ui_menu_uifconfirm_display(0); + return 0; + } + } + + switch(pso) { // --- PSO:CDS --- case 0x9e9a: { @@ -296,7 +320,6 @@ int gpg_apdu_pso(unsigned int pso) { THROW(SW_REFERENCED_DATA_NOT_FOUND); return SW_REFERENCED_DATA_NOT_FOUND; } - } //--- PSO:yy NOT SUPPPORTED --- @@ -310,6 +333,11 @@ int gpg_apdu_pso(unsigned int pso) { int gpg_apdu_internal_authenticate() { + if ((G_gpg_vstate.kslot->aut.UIF[0]) && ((G_gpg_vstate.UIF_flags)==0)) { + ui_menu_uifconfirm_display(0); + return 0; + } + if (G_gpg_vstate.mse_aut->attributes.value[0] == 1) { if ( G_gpg_vstate.io_length > ((G_gpg_vstate.mse_aut->attributes.value[1]<<8)|G_gpg_vstate.mse_aut->attributes.value[2])*40/100) { THROW(SW_WRONG_LENGTH); diff --git a/src/gpg_select.c b/src/gpg_select.c index 908f874..6c36ac5 100644 --- a/src/gpg_select.c +++ b/src/gpg_select.c @@ -19,10 +19,19 @@ #include "gpg_types.h" #include "gpg_api.h" #include "gpg_vars.h" +const unsigned char C_MF[] = {0x3F, 0x00}; int gpg_apdu_select() { int sw; - if ( (G_gpg_vstate.io_length == 6) && + + //MF + if ( (G_gpg_vstate.io_length == 2) && + (os_memcmp(G_gpg_vstate.work.io_buffer, C_MF, G_gpg_vstate.io_length) == 0) ) { + gpg_io_discard(0); + sw = SW_OK; + } + //AID APP + else if ( (G_gpg_vstate.io_length == 6) && (os_memcmp(G_gpg_vstate.work.io_buffer, N_gpg_pstate->AID, G_gpg_vstate.io_length) == 0) ) { G_gpg_vstate.DO_current = 0; G_gpg_vstate.DO_reccord = 0; @@ -40,7 +49,9 @@ int gpg_apdu_select() { THROW(SW_STATE_TERMINATED); } sw = SW_OK; - } else { + } + //NOT FOUND + else { THROW(SW_FILE_NOT_FOUND); return SW_FILE_NOT_FOUND; } diff --git a/src/gpg_types.h b/src/gpg_types.h index 9b89fc8..0268b9d 100644 --- a/src/gpg_types.h +++ b/src/gpg_types.h @@ -178,6 +178,8 @@ struct gpg_v_state_s { gpg_key_t *mse_dec; unsigned char seed_mode; + unsigned char UIF_flags; + /* io state*/ unsigned char io_cla; @@ -230,7 +232,7 @@ struct gpg_v_state_s { unsigned char pinmode; /* ux menus */ - char menu[64]; + char menu[112]; unsigned char ux_pinentry[12]; unsigned int ux_key; unsigned int ux_type; diff --git a/src/gpg_ux_nanos.c b/src/gpg_ux_nanos.c index 25721e7..d3e4a8c 100644 --- a/src/gpg_ux_nanos.c +++ b/src/gpg_ux_nanos.c @@ -91,6 +91,115 @@ void ui_info(const char* msg1, const char* msg2, const void *menu_display, unsig UX_MENU_DISPLAY(0, G_gpg_vstate.ui_dogsays, NULL); }; + +/* ------------------------------ UIF CONFIRM UX ----------------------------- */ +unsigned int ui_uifconfirm_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); +unsigned int ui_uifconfirm_prepro(const bagl_element_t* element); + +const bagl_element_t ui_uifconfirm_nanos[] = { + // type userid x y w h str rad fill fg bg font_id icon_id + { {BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, + NULL, + 0, + 0, 0, + NULL, NULL, NULL}, + + { {BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CROSS }, + NULL, + 0, + 0, 0, + NULL, NULL, NULL }, + + { {BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CHECK }, + NULL, + 0, + 0, 0, + NULL, NULL, NULL }, + + { {BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, + G_gpg_vstate.menu, + 0, + 0, 0, + NULL, NULL, NULL }, + { {BAGL_LABELINE, 0x02, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px|BAGL_FONT_ALIGNMENT_CENTER, 0 }, + G_gpg_vstate.menu, + 0, + 0, 0, + NULL, NULL, NULL }, +}; + +void ui_menu_uifconfirm_display(unsigned int value) { + UX_DISPLAY(ui_uifconfirm_nanos, (void*)ui_uifconfirm_prepro); +} + +unsigned int ui_uifconfirm_prepro(const bagl_element_t* element) { + if (element->component.userid == 1) { + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "Confirm Operation:"); + return 1; + } + if (element->component.userid == 2) { + unsigned int uif_case = (G_gpg_vstate.io_ins<<16)|(G_gpg_vstate.io_p1<<8)|(G_gpg_vstate.io_p2); + switch (uif_case) { + case 0x002A9E9A: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "Signature"); + return 1; + case 0x002A8680: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "Encryption"); + return 1; + case 0x002A8086: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "Decryption"); + return 1; + case 0x0088000: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "Authentication"); + return 1; + } + } + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "Please Cancel"); + return 1; +} + +unsigned int ui_uifconfirm_nanos_button(unsigned int button_mask, unsigned int button_mask_counter) { + unsigned int sw; + + sw = 0x6985; + switch(button_mask) { + case BUTTON_EVT_RELEASED|BUTTON_LEFT: // CANCEL + gpg_io_discard(1); + gpg_io_insert_u16(sw); + gpg_io_do(IO_RETURN_AFTER_TX); + ui_menu_main_display(0); + sw = 0x6985; + break; + + case BUTTON_EVT_RELEASED|BUTTON_RIGHT: // OK + BEGIN_TRY { + TRY { + G_gpg_vstate.UIF_flags = 1; + sw = gpg_apdu_pso(); + } + CATCH_OTHER(e) { + gpg_io_discard(1); + if ( (e & 0xFFFF0000) || + ( ((e&0xF000)!=0x6000) && ((e&0xF000)!=0x9000) ) ) { + gpg_io_insert_u32(e); + sw = 0x6f42; + } else { + sw = e; + } + } + FINALLY { + G_gpg_vstate.UIF_flags = 0; + gpg_io_insert_u16(sw); + gpg_io_do(IO_RETURN_AFTER_TX); + ui_menu_main_display(0); + } + break; + + } END_TRY; + } + return 0; +} + /* ------------------------------ PIN CONFIRM UX ----------------------------- */ const bagl_element_t ui_pinconfirm_nanos[] = { @@ -663,7 +772,8 @@ void ui_menu_pinmode_action(unsigned int value) { } else { s = 3; } - USBD_CCID_activate_pinpad(s); + #warning USBD_CCID_activate_pinpad commented + //USBD_CCID_activate_pinpad(s); } } else { diff --git a/src/usbd_ccid_impl.c b/src/usbd_ccid_impl.c index 2a54750..178a614 100644 --- a/src/usbd_ccid_impl.c +++ b/src/usbd_ccid_impl.c @@ -40,6 +40,9 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_ccid_core.h" +#include "usbd_ccid_impl.h" +#define CCID_INTR_IN_EP 0x81 +#define CCID_INTR_EPIN_SIZE 16 #ifdef HAVE_USB_CLASS_CCID @@ -57,7 +60,7 @@ static const uint8_t const USBD_PRODUCT_FS_STRING[] = { 'e', 0, }; -#elif TARGET_ID == 0x31100002 // nano s +#elif TARGET_ID == 0x31100003 // nano s #define USBD_PID 0x0001 static const uint8_t const USBD_PRODUCT_FS_STRING[] = { 6*2+2, From 81090d3f235a294e3f72879f4d889a3512a4e227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric?= Date: Mon, 12 Mar 2018 19:18:57 +0100 Subject: [PATCH 06/11] 1.4.1 firmware port Code update for 1.4.1 fw Fix PUT_DATA[serial] command --- Makefile | 65 +- doc/user/blue-app-openpgp-card.rst | 1 + script.ld | 167 +++++ sdk/usbd_ccid_if.c | 591 ------------------ sdk/usbd_ccid_if.h | 209 ------- src/gpg_api.h | 2 + src/gpg_data.c | 2 +- src/gpg_init.c | 15 +- src/gpg_main.c | 2 +- src/gpg_pso.c | 12 +- src/lib_stusb_impl/usbd_ccid_impl.h | 32 + src/lib_stusb_impl/usbd_hid_impl.h | 29 + src/lib_stusb_impl/usbd_impl.c | 913 ++++++++++++++++++++++++++++ src/lib_stusb_impl/usbd_impl.h | 7 + src/usbd_ccid_impl.c | 463 -------------- src/usbd_ccid_impl.h | 24 - 16 files changed, 1218 insertions(+), 1316 deletions(-) create mode 100644 script.ld delete mode 100644 sdk/usbd_ccid_if.c delete mode 100755 sdk/usbd_ccid_if.h create mode 100644 src/lib_stusb_impl/usbd_ccid_impl.h create mode 100644 src/lib_stusb_impl/usbd_hid_impl.h create mode 100644 src/lib_stusb_impl/usbd_impl.c create mode 100644 src/lib_stusb_impl/usbd_impl.h delete mode 100644 src/usbd_ccid_impl.c delete mode 100644 src/usbd_ccid_impl.h diff --git a/Makefile b/Makefile index d329bd0..ddc0ed6 100644 --- a/Makefile +++ b/Makefile @@ -1,53 +1,74 @@ -# Copyright 2017 Cedric Mesnil , Ledger SAS -# +#******************************************************************************* +# Ledger Nano S +# (c) 2016 Ledger +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -# +#******************************************************************************* + ifeq ($(BOLOS_SDK),) $(error Environment variable BOLOS_SDK is not set) endif include $(BOLOS_SDK)/Makefile.defines -APPNAME = "OpenPGP" -APP_LOAD_PARAMS=--appFlags 0x40 --path "2152157255" --curve secp256k1 $(COMMON_LOAD_PARAMS) +APP_LOAD_PARAMS=--appFlags 0x40 --path "2152157255'" --curve secp256k1 $(COMMON_LOAD_PARAMS) + +APPNAME = OpenPGP + +SPECVERSION="3.3.1" APPVERSION_M=1 APPVERSION_N=1 -APPVERSION_P=0 - +APPVERSION_P=1 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) -SPECVERSION="3.3.1" -ICONNAME=images/icon_pgp.gif +ifeq ($(TARGET_NAME),TARGET_BLUE) +ICONNAME=images/icon_pgp_blue.gif +else +ICONNAME=images/icon_pgp.gif +endif + +DEFINES += $(GPG_CONFIG) GPG_VERSION=$(APPVERSION) GPG_NAME=$(APPNAME) SPEC_VERSION=$(SPECVERSION) ################ # Default rule # ################ + all: default ############ # Platform # ############ +#SCRIPT_LD := script.ld + +ifneq ($(NO_CONSENT),) +DEFINES += NO_CONSENT +endif + +DEFINES += OS_IO_SEPROXYHAL IO_SEPROXYHAL_BUFFER_SIZE_B=300 +DEFINES += HAVE_BAGL HAVE_SPRINTF +#DEFINES += HAVE_PRINTF PRINTF=screen_printf +DEFINES += PRINTF\(...\)= +DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=6 IO_HID_EP_LENGTH=64 HAVE_USB_APDU +#DEFINES += HAVE_BLE +DEFINES += UNUSED\(x\)=\(void\)x +DEFINES += APPVERSION=\"$(APPVERSION)\" +DEFINES += CUSTOM_IO_APDU_BUFFER_SIZE=\(255+5+64\) -DEFINES += OS_IO_SEPROXYHAL IO_SEPROXYHAL_BUFFER_SIZE_B=128 -DEFINES += HAVE_BAGL HAVE_PRINTF HAVE_SPRINTF -DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=7 IO_HID_EP_LENGTH=64 HAVE_USB_APDU DEFINES += HAVE_USB_CLASS_CCID -DEFINES += $(GPG_CONFIG) GPG_VERSION=$(APPVERSION) GPG_NAME=$(APPNAME) SPEC_VERSION=$(SPECVERSION) - ############## -# Compiler # +# Compiler # ############## #GCCPATH := $(BOLOS_ENV)/gcc-arm-none-eabi-5_3-2016q1/bin/ #CLANGPATH := $(BOLOS_ENV)/clang-arm-fropi/bin/ @@ -55,6 +76,8 @@ CC := $(CLANGPATH)clang #CFLAGS += -O0 -gdwarf-2 -gstrict-dwarf CFLAGS += -O3 -Os +#CFLAGS += -fno-jump-tables -fno-lookup-tables -fsave-optimization-record +#$(info $(CFLAGS)) AS := $(GCCPATH)arm-none-eabi-gcc @@ -66,9 +89,9 @@ LDLIBS += -lm -lgcc -lc # import rules to compile glyphs(/pone) include $(BOLOS_SDK)/Makefile.glyphs -### computed variables -APP_SOURCE_PATH += src -SDK_SOURCE_PATH += lib_stusb lib_stusb_impl +### variables processed by the common makefile.rules of the SDK to grab source files and include dirs +APP_SOURCE_PATH += src src/lib_stusb_impl +SDK_SOURCE_PATH += lib_stusb load: all @@ -81,5 +104,5 @@ delete: include $(BOLOS_SDK)/Makefile.rules #add dependency on custom makefile filename -dep/%.d: %.c Makefile.genericwallet +dep/%.d: %.c Makefile diff --git a/doc/user/blue-app-openpgp-card.rst b/doc/user/blue-app-openpgp-card.rst index 6709545..291068a 100644 --- a/doc/user/blue-app-openpgp-card.rst +++ b/doc/user/blue-app-openpgp-card.rst @@ -370,6 +370,7 @@ the reader and the delegated PIN support. Edit the file ~/.gnupg/scdaemon.conf and add the following lines: | ``reader-port "Ledger Token [Nano S] (0001) 01 00"`` + | ``allow-admin`` | ``enable-pinpad-varlen`` diff --git a/script.ld b/script.ld new file mode 100644 index 0000000..60b4ced --- /dev/null +++ b/script.ld @@ -0,0 +1,167 @@ +/******************************************************************************* +* Ledger Blue - Secure firmware +* (c) 2016, 2017 Ledger +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +********************************************************************************/ + +/** + * Global chip memory layout and constants + * + */ + +MEMORY +{ + DISCARD (rwx) : ORIGIN = 0xd0000000, LENGTH = 1M + + FLASH (rx) : ORIGIN = 0xc0d00000, LENGTH = 400K + SRAM (rwx) : ORIGIN = 0x20001800, LENGTH = 4K +} + +PAGE_SIZE = 64; +STACK_SIZE = 768; +END_STACK = ORIGIN(SRAM) + LENGTH(SRAM); + +SECTIONS +{ + ENTRY(main) + + /****************************************************************/ + /* This section locates the code in FLASH */ + /****************************************************************/ + + /** put text in Flash memory, VMA will be equal to LMA */ + .text : + { + /* provide start code symbol, shall be zero */ + _text = .; + _nvram = .; + + PROVIDE(_setjmp = setjmp); /*thanks clang*/ + + /* ensure main is always @ 0xC0D00000 */ + *(.boot*) + + /* place the other code and rodata defined BUT nvram variables that are displaced in a r/w area */ + *(.text*) + *(.rodata.[^UN]*) /*.data.rel.ro* not here to detect invalid PIC usage */ + *(.rodata.N[^_]*) + + . = ALIGN(4); + + /* all code placed */ + _etext = .; + + . = ALIGN(PAGE_SIZE); + + _nvram_data = .; + + /* NVM data (ex-filesystem) */ + *(.rodata.USBD_CfgDesc) + *(.bss.N_* .rodata.N_* .rodata.USBD_CfgDesc) + . = ALIGN(PAGE_SIZE); + _install_parameters = .; + PROVIDE(N_install_parameters = .); + _envram = .; + _nvram_data_size = _envram - _nvram_data; + + } > FLASH = 0x00 + + .data (NOLOAD): + { + . = ALIGN(4); + + /** + * Place RAM initialized variables + */ + _data = .; + + *(vtable) + *(.data*) + + _edata = .; + + } > DISCARD /*> SRAM AT>FLASH = 0x00 */ + + .bss : + { + /** + * Place RAM uninitialized variables + */ + _bss = .; + *(.bss*) + _ebss = .; + + + /** + * Reserve stack size + */ + . = ALIGN(4); + app_stack_canary = .; + PROVIDE(app_stack_canary = .); + . += 4; + _stack = .; + . = _stack + STACK_SIZE; + PROVIDE( _stack_size = STACK_SIZE ); + PROVIDE( _estack = ABSOLUTE(END_STACK) ); + + } > SRAM = 0x00 + + /****************************************************************/ + /* DEBUG */ + /****************************************************************/ + + /* remove the debugging information from the standard libraries */ + DEBUG (NOLOAD) : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + +} diff --git a/sdk/usbd_ccid_if.c b/sdk/usbd_ccid_if.c deleted file mode 100644 index b212737..0000000 --- a/sdk/usbd_ccid_if.c +++ /dev/null @@ -1,591 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_if.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the functions for USB Interface for CCID - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2014 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_if.h" - -#ifdef HAVE_USB_CLASS_CCID - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint8_t Ccid_BulkState; -uint8_t ccid_card_inserted; -uint8_t UsbIntMessageBuffer[INTR_MAX_PACKET_SIZE]; /* data buffer*/ -__IO uint8_t PrevXferComplete_IntrIn; -usb_ccid_param_t usb_ccid_param; - -uint8_t* pUsbMessageBuffer; -static uint32_t UsbMessageLength; -Ccid_SlotStatus_t Ccid_SlotStatus; -Protocol0_DataStructure_t Protocol0_DataStructure; - -Ccid_bulk_data_t Ccid_bulk_data; - -/* Private function prototypes -----------------------------------------------*/ -static void CCID_Response_SendData (USBD_HandleTypeDef *pdev, - uint8_t* pbuf, - uint16_t len); -/* Private function ----------------------------------------------------------*/ -/** - * @brief CCID_Init - * Initialize the CCID USB Layer - * @param pdev: device instance - * @retval None - */ -void CCID_Init (USBD_HandleTypeDef *pdev) -{ - memset(&Ccid_BulkState, 0, sizeof(Ccid_BulkState)); - memset(&UsbIntMessageBuffer, 0, sizeof(UsbIntMessageBuffer)); - memset(&PrevXferComplete_IntrIn, 0, sizeof(PrevXferComplete_IntrIn)); - memset(&usb_ccid_param, 0, sizeof(usb_ccid_param)); - memset(&pUsbMessageBuffer, 0, sizeof(pUsbMessageBuffer)); - memset(&UsbMessageLength, 0, sizeof(UsbMessageLength)); - memset(&Ccid_SlotStatus, 0, sizeof(Ccid_SlotStatus)); - memset(&Protocol0_DataStructure, 0, sizeof(Protocol0_DataStructure)); - memset(&Ccid_bulk_data, 0, sizeof(Ccid_bulk_data)); - ccid_card_inserted = 0; - /* CCID Related Initialization */ - CCID_SetIntrTransferStatus(1); /* Transfer Complete Status */ - CCID_UpdSlotChange(1); - SC_InitParams(); - - /* Prepare Out endpoint to receive 1st packet */ - Ccid_BulkState = CCID_STATE_IDLE; - USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); - - // send the smartcard as inserted state at boot time - io_usb_ccid_set_card_inserted(1); -} - -/** - * @brief CCID_DeInit - * Uninitialize the CCID Machine - * @param pdev: device instance - * @retval None - */ -void CCID_DeInit (USBD_HandleTypeDef *pdev) -{ - UNUSED(pdev); - Ccid_BulkState = CCID_STATE_IDLE; -} - -/** - * @brief CCID_Message_In - * Handle Bulk IN & Intr IN data stage - * @param pdev: device instance - * @param uint8_t epnum: endpoint index - * @retval None - */ -void CCID_BulkMessage_In (USBD_HandleTypeDef *pdev, - uint8_t epnum) -{ - if (epnum == (CCID_BULK_IN_EP & 0x7F)) - {/* Filter the epnum by masking with 0x7f (mask of IN Direction) */ - - /*************** Handle Bulk Transfer IN data completion *****************/ - - switch (Ccid_BulkState) - { - case CCID_STATE_SEND_RESP: { - unsigned int remLen = UsbMessageLength; - - // advance with acknowledged sent chunk - pUsbMessageBuffer += MIN(CCID_BULK_EPIN_SIZE, UsbMessageLength); - UsbMessageLength -= MIN(CCID_BULK_EPIN_SIZE, UsbMessageLength); - - // if remaining length is > EPIN_SIZE: send a filled bulk packet - if (UsbMessageLength >= CCID_BULK_EPIN_SIZE) { - CCID_Response_SendData(pdev, pUsbMessageBuffer, - // use the header declared size packet must be well formed - CCID_BULK_EPIN_SIZE); - } - - // if remaining length is 0; send an empty packet and prepare to receive a new command - else if (UsbMessageLength == 0 && remLen == CCID_BULK_EPIN_SIZE) { - CCID_Response_SendData(pdev, pUsbMessageBuffer, - // use the header declared size packet must be well formed - 0); - goto last_xfer; // won't wait ack to avoid missing a command - } - // else if no more data, then last packet sent, go back to idle (done on transfer ack) - else if (UsbMessageLength == 0) { // robustness only - last_xfer: - Ccid_BulkState = CCID_STATE_IDLE; - - /* Prepare EP to Receive First Cmd */ - USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); - } - - // if remaining length is < EPIN_SIZE: send packet and prepare to receive a new command - else if (UsbMessageLength < CCID_BULK_EPIN_SIZE) { - CCID_Response_SendData(pdev, pUsbMessageBuffer, - // use the header declared size packet must be well formed - UsbMessageLength); - goto last_xfer; // won't wait ack to avoid missing a command - } - - break; - } - - default: - break; - } - } - else if (epnum == (CCID_INTR_IN_EP & 0x7F)) - { - /* Filter the epnum by masking with 0x7f (mask of IN Direction) */ - CCID_SetIntrTransferStatus(1); /* Transfer Complete Status */ - } -} - -/** - * @brief CCID_BulkMessage_Out - * Proccess CCID OUT data - * @param pdev: device instance - * @param uint8_t epnum: endpoint index - * @retval None - */ -void CCID_BulkMessage_Out (USBD_HandleTypeDef *pdev, - uint8_t epnum, uint8_t* buffer, uint16_t dataLen) -{ - - switch (Ccid_BulkState) - { - case CCID_STATE_IDLE: - if (dataLen == 0x00) - { /* Zero Length Packet Received */ - Ccid_BulkState = CCID_STATE_IDLE; - } - else if (dataLen >= CCID_MESSAGE_HEADER_SIZE) - { - UsbMessageLength = dataLen; /* Store for future use */ - - /* Expected Data Length Packet Received */ - pUsbMessageBuffer = (uint8_t*) &Ccid_bulk_data; - - /* Fill CCID_BulkOut Data Buffer from USB Buffer */ - memmove(pUsbMessageBuffer, buffer, dataLen); - - /* - Refer : 6 CCID Messages - The response messages always contain the exact same slot number, - and sequence number fields from the header that was contained in - the Bulk-OUT command message. - */ - Ccid_bulk_data.header.bulkin.bSlot = Ccid_bulk_data.header.bulkout.bSlot; - Ccid_bulk_data.header.bulkin.bSeq = Ccid_bulk_data.header.bulkout.bSeq; - - if (dataLen < CCID_BULK_EPOUT_SIZE) - {/* Short message, less than the EP Out Size, execute the command, - if parameter like dwLength is too big, the appropriate command will - give an error */ - CCID_CmdDecode(pdev); - } - else - { /* Long message, receive additional data with command */ - /* (u8dataLen == CCID_BULK_EPOUT_SIZE) */ - - if (Ccid_bulk_data.header.bulkout.dwLength > ABDATA_SIZE) - { /* Check if length of data to be sent by host is > buffer size */ - - /* Too long data received.... Error ! */ - Ccid_BulkState = CCID_STATE_UNCORRECT_LENGTH; - } - - else - { /* Expect more data on OUT EP */ - Ccid_BulkState = CCID_STATE_RECEIVE_DATA; - pUsbMessageBuffer += dataLen; /* Point to new offset */ - - /* Prepare EP to Receive next Cmd */ - USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); - - } /* if (dataLen == CCID_BULK_EPOUT_SIZE) ends */ - } /* if (dataLen >= CCID_BULK_EPOUT_SIZE) ends */ - } /* if (dataLen >= CCID_MESSAGE_HEADER_SIZE) ends */ - break; - - case CCID_STATE_RECEIVE_DATA: - - UsbMessageLength += dataLen; - - if (dataLen < CCID_BULK_EPOUT_SIZE) - {/* Short message, less than the EP Out Size, execute the command, - if parameter like dwLength is too big, the appropriate command will - give an error */ - - /* Full command is received, process the Command */ - memmove(pUsbMessageBuffer, buffer, dataLen); - CCID_CmdDecode(pdev); - } - else if (dataLen == CCID_BULK_EPOUT_SIZE) - { - if (UsbMessageLength < (Ccid_bulk_data.header.bulkout.dwLength + CCID_CMD_HEADER_SIZE)) - { - memmove(pUsbMessageBuffer, buffer, dataLen); - pUsbMessageBuffer += dataLen; - /* Increment the pointer to receive more data */ - - /* Prepare EP to Receive next Cmd */ - USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); - } - else if (UsbMessageLength == (Ccid_bulk_data.header.bulkout.dwLength + CCID_CMD_HEADER_SIZE)) - { - /* Full command is received, process the Command */ - memmove(pUsbMessageBuffer, buffer, dataLen); - CCID_CmdDecode(pdev); - } - else - { - /* Too long data received.... Error ! */ - Ccid_BulkState = CCID_STATE_UNCORRECT_LENGTH; - } - } - - break; - - case CCID_STATE_UNCORRECT_LENGTH: - Ccid_BulkState = CCID_STATE_IDLE; - break; - - default: - break; - } -} - -void CCID_Send_Reply(USBD_HandleTypeDef *pdev) { - /********** Decide for all commands ***************/ - if (Ccid_BulkState == CCID_STATE_SEND_RESP) - { - UsbMessageLength = Ccid_bulk_data.header.bulkin.dwLength+CCID_MESSAGE_HEADER_SIZE; /* Store for future use */ - - /* Expected Data Length Packet Received */ - pUsbMessageBuffer = (uint8_t*) &Ccid_bulk_data; - - CCID_Response_SendData(pdev, pUsbMessageBuffer, - // use the header declared size packet must be well formed - MIN(CCID_BULK_EPIN_SIZE, UsbMessageLength)); - } -} - -/** - * @brief CCID_CmdDecode - * Parse the commands and Proccess command - * @param pdev: device instance - * @retval None - */ -void CCID_CmdDecode(USBD_HandleTypeDef *pdev) -{ - uint8_t errorCode; - - switch (Ccid_bulk_data.header.bulkout.bMessageType) - { - case PC_TO_RDR_ICCPOWERON: - errorCode = PC_to_RDR_IccPowerOn(); - RDR_to_PC_DataBlock(errorCode); - break; - case PC_TO_RDR_ICCPOWEROFF: - errorCode = PC_to_RDR_IccPowerOff(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_GETSLOTSTATUS: - errorCode = PC_to_RDR_GetSlotStatus(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_XFRBLOCK: - errorCode = PC_to_RDR_XfrBlock(); - // asynchronous // RDR_to_PC_DataBlock(errorCode); - break; - case PC_TO_RDR_GETPARAMETERS: - errorCode = PC_to_RDR_GetParameters(); - RDR_to_PC_Parameters(errorCode); - break; - case PC_TO_RDR_RESETPARAMETERS: - errorCode = PC_to_RDR_ResetParameters(); - RDR_to_PC_Parameters(errorCode); - break; - case PC_TO_RDR_SETPARAMETERS: - errorCode = PC_to_RDR_SetParameters(); - RDR_to_PC_Parameters(errorCode); - break; - case PC_TO_RDR_ESCAPE: - errorCode = PC_to_RDR_Escape(); - RDR_to_PC_Escape(errorCode); - break; - case PC_TO_RDR_ICCCLOCK: - errorCode = PC_to_RDR_IccClock(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_ABORT: - errorCode = PC_to_RDR_Abort(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_T0APDU: - errorCode = PC_TO_RDR_T0Apdu(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_MECHANICAL: - errorCode = PC_TO_RDR_Mechanical(); - RDR_to_PC_SlotStatus(errorCode); - break; - case PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY: - errorCode = PC_TO_RDR_SetDataRateAndClockFrequency(); - RDR_to_PC_DataRateAndClockFrequency(errorCode); - break; - case PC_TO_RDR_SECURE: - errorCode = PC_TO_RDR_Secure(); - // asynchronous // RDR_to_PC_DataBlock(errorCode); - break; - default: - RDR_to_PC_SlotStatus(SLOTERROR_CMD_NOT_SUPPORTED); - break; - } - - CCID_Send_Reply(pdev); -} - -/** - * @brief Transfer_Data_Request - * Prepare the request response to be sent to the host - * @param uint8_t* dataPointer: Pointer to the data buffer to send - * @param uint16_t dataLen : number of bytes to send - * @retval None - */ -void Transfer_Data_Request(void) -{ - /********** Update Global Variables ***************/ - Ccid_BulkState = CCID_STATE_SEND_RESP; -} - - -/** - * @brief CCID_Response_SendData - * Send the data on bulk-in EP - * @param pdev: device instance - * @param uint8_t* buf: pointer to data buffer - * @param uint16_t len: Data Length - * @retval None - */ -static void CCID_Response_SendData(USBD_HandleTypeDef *pdev, - uint8_t* buf, - uint16_t len) -{ - // don't ask the MCU to perform bulk split, we could quickly get into a buffer overflow - if (len > CCID_BULK_EPIN_SIZE) { - THROW(EXCEPTION_IO_OVERFLOW); - } - - G_io_seproxyhal_spi_buffer[0] = SEPROXYHAL_TAG_USB_EP_PREPARE; - G_io_seproxyhal_spi_buffer[1] = (3+len)>>8; - G_io_seproxyhal_spi_buffer[2] = (3+len); - G_io_seproxyhal_spi_buffer[3] = CCID_BULK_IN_EP; - G_io_seproxyhal_spi_buffer[4] = SEPROXYHAL_TAG_USB_EP_PREPARE_DIR_IN; - G_io_seproxyhal_spi_buffer[5] = len; - io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 6); - io_seproxyhal_spi_send(buf, len); -} - -/** - * @brief CCID_IntMessage - * Send the Interrupt-IN data to the host - * @param pdev: device instance - * @retval None - */ -void CCID_IntMessage(USBD_HandleTypeDef *pdev) -{ - /* Check if there us change in Smartcard Slot status */ - if ( CCID_IsSlotStatusChange() && CCID_IsIntrTransferComplete() ) - { - /* Check Slot Status is changed. Card is Removed/ Fitted */ - RDR_to_PC_NotifySlotChange(); - - CCID_SetIntrTransferStatus(0); /* Reset the Status */ - CCID_UpdSlotChange(0); /* Reset the Status of Slot Change */ - - G_io_seproxyhal_spi_buffer[0] = SEPROXYHAL_TAG_USB_EP_PREPARE; - G_io_seproxyhal_spi_buffer[1] = (3+2)>>8; - G_io_seproxyhal_spi_buffer[2] = (3+2); - G_io_seproxyhal_spi_buffer[3] = CCID_INTR_IN_EP; - G_io_seproxyhal_spi_buffer[4] = SEPROXYHAL_TAG_USB_EP_PREPARE_DIR_IN; - G_io_seproxyhal_spi_buffer[5] = 2; - io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 6); - io_seproxyhal_spi_send(UsbIntMessageBuffer, 2); - } -} - -/** - * @brief CCID_IsIntrTransferComplete - * Provides the status of previous Interrupt transfer status - * @param None - * @retval uint8_t PrevXferComplete_IntrIn: Value of the previous transfer status - */ -uint8_t CCID_IsIntrTransferComplete (void) -{ - return PrevXferComplete_IntrIn; -} - -/** - * @brief CCID_IsIntrTransferComplete - * Set the value of the Interrupt transfer status - * @param uint8_t xfer_Status: Value of the Interrupt transfer status to set - * @retval None - */ -void CCID_SetIntrTransferStatus (uint8_t xfer_Status) -{ - PrevXferComplete_IntrIn = xfer_Status; -} - - - - - - -uint8_t SC_Detect(void) { - return ccid_card_inserted; -} - -void SC_Poweroff(void) { - // nothing to do - -} - -void SC_InitParams (void) { - // nothing to do -} - -uint8_t SC_SetParams (Protocol0_DataStructure_t* pt0) { - return SLOT_NO_ERROR; -} - -uint8_t SC_ExecuteEscape (uint8_t* escapePtr, uint32_t escapeLen, - uint8_t* responseBuff, - uint16_t* responseLen) { - io_seproxyhal_se_reset(); -} -uint8_t SC_SetClock (uint8_t bClockCommand) { - return SLOT_NO_ERROR; -} -uint8_t SC_Request_GetClockFrequencies(uint8_t* pbuf, uint16_t* len); -uint8_t SC_Request_GetDataRates(uint8_t* pbuf, uint16_t* len); -uint8_t SC_T0Apdu(uint8_t bmChanges, uint8_t bClassGetResponse, - uint8_t bClassEnvelope) { - return SLOTERROR_CMD_NOT_SUPPORTED; -} -uint8_t SC_Mechanical(uint8_t bFunction) { - return SLOTERROR_CMD_NOT_SUPPORTED; -} -uint8_t SC_SetDataRateAndClockFrequency(uint32_t dwClockFrequency, - uint32_t dwDataRate) { - return SLOT_NO_ERROR; -} - -uint8_t SC_Secure(uint32_t dwLength, uint8_t bBWI, uint16_t wLevelParameter, - uint8_t* pbuf, uint32_t* returnLen ) { - // return SLOTERROR_CMD_NOT_SUPPORTED; - uint16_t ret_len,off; - switch(pbuf[0]) { - case 0: // verify pin - //ret_len = dwLength - 15; - ret_len = 5; - off = 15; - break; - - case 1: // modify pin - switch(pbuf[11]) { - case 3: - off = 20; - break; - case 2: - case 1: - off = 19; - break; - default: - off = 18; - break; - } - //ret_len = dwLength - off; - ret_len = 5; - break; - - default: // unsupported - Ccid_bulk_data.header.bulkin.dwLength = 0; - RDR_to_PC_DataBlock(SLOTERROR_CMD_NOT_SUPPORTED); - CCID_Send_Reply(&USBD_Device); - return SLOTERROR_CMD_NOT_SUPPORTED; - } - pbuf += off; - pbuf[0] = 0xEF; - return SC_XferBlock(pbuf, ret_len, &ret_len); -} - -// prepare the apdu to be processed by the application -uint8_t SC_XferBlock (uint8_t* ptrBlock, uint32_t blockLen, uint16_t* expectedLen) { - // check for overflow - if (blockLen > IO_APDU_BUFFER_SIZE) { - return SLOTERROR_BAD_LENTGH; - } - - // copy received apdu - memmove(G_io_apdu_buffer, ptrBlock, blockLen); - G_io_apdu_length = blockLen; - G_io_apdu_media = IO_APDU_MEDIA_USB_CCID; // for application code - G_io_apdu_state = APDU_USB_CCID; // for next call to io_exchange - - return SLOT_NO_ERROR; -} - -void io_usb_ccid_reply(unsigned char* buffer, unsigned short length) { - // avoid memory overflow - if (length > sizeof(Ccid_bulk_data.abData)) { - THROW(EXCEPTION_IO_OVERFLOW); - } - // copy the responde apdu - memmove(Ccid_bulk_data.abData, buffer, length); - Ccid_bulk_data.header.bulkin.dwLength = length; - // forge reply - RDR_to_PC_DataBlock(SLOT_NO_ERROR); - - // start sending rpely - CCID_Send_Reply(&USBD_Device); -} -// ask for power on -void io_usb_ccid_set_card_inserted(unsigned int inserted) { - ccid_card_inserted = inserted; - CCID_UpdSlotChange(1); - CCID_IntMessage(&USBD_Device); -} - - - - - - -#endif // HAVE_USB_CLASS_CCID - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/sdk/usbd_ccid_if.h b/sdk/usbd_ccid_if.h deleted file mode 100755 index 78e042f..0000000 --- a/sdk/usbd_ccid_if.h +++ /dev/null @@ -1,209 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_if.h - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the functions prototypes for USB CCID - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2014 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CCID_IF_H -#define __USBD_CCID_IF_H - -#include "usbd_core.h" - -#ifdef HAVE_USB_CLASS_CCID - - -/* Exported defines ----------------------------------------------------------*/ -/* Bulk-only Command Block Wrapper */ -#define ABDATA_SIZE 261 -#define CCID_CMD_HEADER_SIZE 10 -#define CCID_RESPONSE_HEADER_SIZE 10 - - -#define CCID_INT_BUFF_SIZ 2 - -#define CARD_SLOT_FITTED 1 -#define CARD_SLOT_REMOVED 0 - -#define BULK_MAX_PACKET_SIZE 0x40 -#define CCID_IN_EP_SIZE 0x40 -#define INTR_MAX_PACKET_SIZE 8 -#define CCID_MESSAGE_HEADER_SIZE 10 -#define CCID_NUMBER_OF_SLOTS 1 - /* Number of SLOTS. For single card, this value is 1 */ - -/* Following Parameters used in PC_to_RDR_IccPowerOn */ -#define VOLTAGE_SELECTION_AUTOMATIC 0xFF -#define VOLTAGE_SELECTION_3V 0x02 -#define VOLTAGE_SELECTION_5V 0x01 -#define VOLTAGE_SELECTION_1V8 0x03 - -#define PC_TO_RDR_ICCPOWERON 0x62 -#define PC_TO_RDR_ICCPOWEROFF 0x63 -#define PC_TO_RDR_GETSLOTSTATUS 0x65 -#define PC_TO_RDR_XFRBLOCK 0x6F -#define PC_TO_RDR_GETPARAMETERS 0x6C -#define PC_TO_RDR_RESETPARAMETERS 0x6D -#define PC_TO_RDR_SETPARAMETERS 0x61 -#define PC_TO_RDR_ESCAPE 0x6B -#define PC_TO_RDR_ICCCLOCK 0x6E -#define PC_TO_RDR_T0APDU 0x6A -#define PC_TO_RDR_SECURE 0x69 -#define PC_TO_RDR_MECHANICAL 0x71 -#define PC_TO_RDR_ABORT 0x72 -#define PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY 0x73 - -#define RDR_TO_PC_DATABLOCK 0x80 -#define RDR_TO_PC_SLOTSTATUS 0x81 -#define RDR_TO_PC_PARAMETERS 0x82 -#define RDR_TO_PC_ESCAPE 0x83 -#define RDR_TO_PC_DATARATEANDCLOCKFREQUENCY 0x84 - -#define RDR_TO_PC_NOTIFYSLOTCHANGE 0x50 -#define RDR_TO_PC_HARDWAREERROR 0x51 - -#define OFFSET_INT_BMESSAGETYPE 0 -#define OFFSET_INT_BMSLOTICCSTATE 1 -#define SLOT_ICC_PRESENT 0x01 - /* LSb : (0b = no ICC present, 1b = ICC present) */ - -#define SLOT_ICC_CHANGE 0x02 /* MSb : (0b = no change, 1b = change) */ -/*****************************************************************************/ -/*********************** CCID Bulk Transfer State machine ********************/ -/*****************************************************************************/ -#define CCID_STATE_IDLE 0 /* Idle state */ -#define CCID_STATE_DATA_OUT 1 /* Data Out state */ -#define CCID_STATE_RECEIVE_DATA 2 -#define CCID_STATE_SEND_RESP 3 -#define CCID_STATE_DATAIN 4 -#define CCID_STATE_UNCORRECT_LENGTH 5 - -#define DIR_IN 0 -#define DIR_OUT 1 -#define BOTH_DIR 2 - -/* Exported types ------------------------------------------------------------*/ -#pragma pack(1) -typedef struct -{ - #pragma pack(1) - union { - #pragma pack(1) - struct { - uint8_t bMessageType; /* Offset = 0*/ - uint32_t dwLength; /* Offset = 1, The length field (dwLength) is the length - of the message not including the 10-byte header.*/ - uint8_t bSlot; /* Offset = 5*/ - uint8_t bSeq; /* Offset = 6*/ - uint8_t bSpecific_0; /* Offset = 7*/ - uint8_t bSpecific_1; /* Offset = 8*/ - uint8_t bSpecific_2; /* Offset = 9*/ - } bulkout; - #pragma pack(1) - struct { - uint8_t bMessageType; /* Offset = 0*/ - uint32_t dwLength; /* Offset = 1*/ - uint8_t bSlot; /* Offset = 5, Same as Bulk-OUT message */ - uint8_t bSeq; /* Offset = 6, Same as Bulk-OUT message */ - uint8_t bStatus; /* Offset = 7, Slot status as defined in § 6.2.6*/ - uint8_t bError; /* Offset = 8, Slot error as defined in § 6.2.6*/ - uint8_t bSpecific; /* Offset = 9*/ - } bulkin; - } header; - uint8_t abData [ABDATA_SIZE]; /* Offset = 10, For reference, the absolute - maximum block size for a TPDU T=0 block is 260 bytes - (5 bytes command; 255 bytes data), - or for a TPDU T=1 block is 259 bytes, - or for a short APDU T=1 block is 261 bytes, - or for an extended APDU T=1 block is 65544 bytes.*/ -} Ccid_bulk_data_t; -#pragma pack() - - -#pragma pack() - -typedef struct -{ - __IO uint8_t SlotStatus; - __IO uint8_t SlotStatusChange; -} Ccid_SlotStatus_t; - - -typedef struct -{ - __IO uint8_t bAbortRequestFlag; - __IO uint8_t bSeq; - __IO uint8_t bSlot; -} usb_ccid_param_t; - - -#pragma pack(1) -typedef struct _Protocol0_DataStructure_t -{ - uint8_t bmFindexDindex; - uint8_t bmTCCKST0; - uint8_t bGuardTimeT0; - uint8_t bWaitingIntegerT0; - uint8_t bClockStop; -} Protocol0_DataStructure_t; -#pragma pack() - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_core.h" - -extern usb_ccid_param_t usb_ccid_param; -extern Ccid_bulk_data_t Ccid_bulk_data; /* Buffer for the Out Data */ -extern Ccid_SlotStatus_t Ccid_SlotStatus; -extern uint8_t UsbIntMessageBuffer[]; - -extern Protocol0_DataStructure_t Protocol0_DataStructure; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void CCID_BulkMessage_In (USBD_HandleTypeDef *pdev, - uint8_t epnum); - -void CCID_BulkMessage_Out (USBD_HandleTypeDef *pdev, - uint8_t epnum, uint8_t* buffer, uint16_t buflen); - -void CCID_ReceiveCmdHeader(uint8_t* pDst, uint8_t u8length); -void CCID_CmdDecode(USBD_HandleTypeDef *pdev); - -void CCID_IntMessage(USBD_HandleTypeDef *pdev); -void CCID_Init(USBD_HandleTypeDef *pdev); -void CCID_DeInit(USBD_HandleTypeDef *pdev); - -uint8_t CCID_IsIntrTransferComplete(void); -void CCID_SetIntrTransferStatus (uint8_t ); -void Transfer_Data_Request(void); -void Set_CSW (uint8_t CSW_Status, uint8_t Send_Permission); - -void io_usb_ccid_set_card_inserted(unsigned int inserted); - -#endif // HAVE_USB_CLASS_CCID - -#endif /* __USBD_CCID_IF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/src/gpg_api.h b/src/gpg_api.h index fa9f854..b6e1b57 100644 --- a/src/gpg_api.h +++ b/src/gpg_api.h @@ -16,6 +16,8 @@ #ifndef GPG_API_H #define GPG_API_H +void USBD_CCID_activate_pinpad(int enabled); + int gpg_oid2curve(unsigned char* oid, unsigned int len); void gpg_init(void); diff --git a/src/gpg_data.c b/src/gpg_data.c index 2c1ac08..4ca86d1 100644 --- a/src/gpg_data.c +++ b/src/gpg_data.c @@ -282,7 +282,7 @@ int gpg_apdu_put_data(unsigned int ref) { if (G_gpg_vstate.io_length != 4) { THROW(SW_WRONG_LENGTH); } - G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset] &= ~0x07; + G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset+3] &= ~0x07; nvm_write(&N_gpg_pstate->AID[10], &G_gpg_vstate.work.io_buffer[G_gpg_vstate.io_offset], 4); break; diff --git a/src/gpg_init.c b/src/gpg_init.c index 03207b1..fa82e95 100644 --- a/src/gpg_init.c +++ b/src/gpg_init.c @@ -18,7 +18,8 @@ #include "gpg_types.h" #include "gpg_api.h" #include "gpg_vars.h" -#include "usbd_ccid_impl.h" +#include "usbd_impl.h" + #define SHORT(x) ((x)>>8)&0xFF, (x)&0xFF /* ----------------------*/ /* -- A Kind of Magic -- */ @@ -322,3 +323,15 @@ int gpg_install(unsigned char app_state) { return 0; } + + +#define USBD_OFFSET_CfgDesc_bPINSupport (sizeof(USBD_CfgDesc)-16) +void USBD_CCID_activate_pinpad(int enabled) { + unsigned short length; + uint8_t *cfgDesc; + unsigned char e; + e = enabled?3:0; + length = 0; + cfgDesc = USBD_GetCfgDesc_impl(&length); + nvm_write(cfgDesc+(length-16), &e,1); +} \ No newline at end of file diff --git a/src/gpg_main.c b/src/gpg_main.c index 9390543..78bb5e2 100644 --- a/src/gpg_main.c +++ b/src/gpg_main.c @@ -165,7 +165,7 @@ __attribute__((section(".boot"))) int main(void) { //start communication with MCU io_seproxyhal_init(); - USB_CCID_power(1); + USB_power(1); io_usb_ccid_set_card_inserted(1); diff --git a/src/gpg_pso.c b/src/gpg_pso.c index d98b0e1..d0e5f31 100644 --- a/src/gpg_pso.c +++ b/src/gpg_pso.c @@ -97,7 +97,8 @@ static int gpg_sign(gpg_key_t *sigkey) { CX_RND_TRNG, CX_NONE, G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, - G_gpg_vstate.work.io_buffer); + G_gpg_vstate.work.io_buffer, + NULL); //reencode r,s in MPI format gpg_io_discard(0); @@ -116,11 +117,12 @@ static int gpg_sign(gpg_key_t *sigkey) { rs += 2; } } else{ - sz = cx_eddsa_sign(key, NULL, + sz = cx_eddsa_sign(key, CX_NONE, - CX_SHA512, - G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, - G_gpg_vstate.work.io_buffer+128); + CX_SHA512, G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, + NULL, 0, + G_gpg_vstate.work.io_buffer+128, + NULL); gpg_io_discard(0); gpg_io_insert(G_gpg_vstate.work.io_buffer+128, sz); } diff --git a/src/lib_stusb_impl/usbd_ccid_impl.h b/src/lib_stusb_impl/usbd_ccid_impl.h new file mode 100644 index 0000000..eb8dfe0 --- /dev/null +++ b/src/lib_stusb_impl/usbd_ccid_impl.h @@ -0,0 +1,32 @@ +#ifndef USBD_CCID_IMPL_H +#define USBD_CCID_IMPL_H + +#ifdef HAVE_USB_CLASS_CCID + +// ================================================ +// CCID + +#define TPDU_EXCHANGE 0x01 +#define SHORT_APDU_EXCHANGE 0x02 +#define EXTENDED_APDU_EXCHANGE 0x04 +#define CHARACTER_EXCHANGE 0x00 + +#define EXCHANGE_LEVEL_FEATURE SHORT_APDU_EXCHANGE + +#define CCID_INTF 2 +#define CCID_BULK_IN_EP 0x83 +#define CCID_BULK_EPIN_SIZE 64 +#define CCID_BULK_OUT_EP 0x03 +#define CCID_BULK_EPOUT_SIZE 64 + +#ifdef HAVE_CCID_INTERRUPT +#define CCID_INTR_IN_EP 0x84 +#define CCID_INTR_EPIN_SIZE 16 +#endif // HAVE_CCID_INTERRUPT + +#define IO_CCID_DATA_BUFFER_SIZE IO_APDU_BUFFER_SIZE +#define G_io_ccid_data_buffer G_io_apdu_buffer + +#endif // HAVE_USB_CLASS_CCID + +#endif // USBD_CCID_IMPL_H diff --git a/src/lib_stusb_impl/usbd_hid_impl.h b/src/lib_stusb_impl/usbd_hid_impl.h new file mode 100644 index 0000000..8d69655 --- /dev/null +++ b/src/lib_stusb_impl/usbd_hid_impl.h @@ -0,0 +1,29 @@ +#ifndef USBD_HID_IMPL_H +#define USBD_HID_IMPL_H + +// ================================================ +// HIDGEN + +#define HID_INTF 0 + +#define HID_EPIN_ADDR 0x82 +#define HID_EPIN_SIZE 0x40 + +#define HID_EPOUT_ADDR 0x02 +#define HID_EPOUT_SIZE 0x40 + +#ifdef HAVE_IO_U2F +// ================================================ +// HID U2F + +#define U2F_INTF 1 + +#define U2F_EPIN_ADDR 0x81 +#define U2F_EPIN_SIZE 0x40 + +#define U2F_EPOUT_ADDR 0x01 +#define U2F_EPOUT_SIZE 0x40 +#endif // HAVE_IO_U2F + +#endif // USBD_HID_IMPL_H + diff --git a/src/lib_stusb_impl/usbd_impl.c b/src/lib_stusb_impl/usbd_impl.c new file mode 100644 index 0000000..d511b08 --- /dev/null +++ b/src/lib_stusb_impl/usbd_impl.c @@ -0,0 +1,913 @@ +/** + ****************************************************************************** + * @file usbd_hid.c + * @author MCD Application Team + * @version V2.2.0 + * @date 13-June-2014 + * @brief This file provides the HID core functions. + * + * @verbatim + * + * =================================================================== + * HID Class Description + * =================================================================== + * This module manages the HID class V1.11 following the "Device Class Definition + * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". + * This driver implements the following aspects of the specification: + * - The Boot Interface Subclass + * - Usage Page : Generic Desktop + * - Usage : Vendor + * - Collection : Application + * + * @note In HS mode and when the DMA is used, all variables and data structures + * dealing with the DMA during the transaction process should be 32-bit aligned. + * + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +#include "os.h" + +/* Includes ------------------------------------------------------------------*/ + +#include "usbd_hid.h" +#include "usbd_hid_impl.h" + +#include "usbd_ctlreq.h" + +#include "usbd_core.h" +#include "usbd_conf.h" + +#include "usbd_def.h" +#include "os_io_seproxyhal.h" + +#ifdef HAVE_IO_U2F +#include "u2f_transport.h" +#include "u2f_impl.h" +#endif // HAVE_IO_U2F + +#ifdef HAVE_USB_CLASS_CCID +#include "usbd_ccid_core.h" +#endif // HAVE_USB_CLASS_CCID + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_HID + * @brief usbd core module + * @{ + */ + +/** @defgroup USBD_HID_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_HID_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_HID_Private_Macros + * @{ + */ +/** + * @} + */ +/** @defgroup USBD_HID_Private_FunctionPrototypes + * @{ + */ + + +/** + * @} + */ + +/** @defgroup USBD_HID_Private_Variables + * @{ + */ + +#define HID_EPIN_ADDR 0x82 +#define HID_EPIN_SIZE 0x40 + +#define HID_EPOUT_ADDR 0x02 +#define HID_EPOUT_SIZE 0x40 + +#define USBD_LANGID_STRING 0x409 + +#ifdef HAVE_VID_PID_PROBER +#define USBD_VID 0x2581 +#define USBD_PID 0xf1d1 +#else +#define USBD_VID 0x2C97 +#if defined(TARGET_BLUE) // blue +#define USBD_PID 0x0000 +static const uint8_t const USBD_PRODUCT_FS_STRING[] = { + 4*2+2, + USB_DESC_TYPE_STRING, + 'B', 0, + 'l', 0, + 'u', 0, + 'e', 0, +}; + +#elif defined(TARGET_NANOS) // nano s +#define USBD_PID 0x0001 +static const uint8_t const USBD_PRODUCT_FS_STRING[] = { + 6*2+2, + USB_DESC_TYPE_STRING, + 'N', 0, + 'a', 0, + 'n', 0, + 'o', 0, + ' ', 0, + 'S', 0, +}; +#elif defined(TARGET_ARAMIS) // aramis +#define USBD_PID 0x0002 +static const uint8_t const USBD_PRODUCT_FS_STRING[] = { + 6*2+2, + USB_DESC_TYPE_STRING, + 'A', 0, + 'r', 0, + 'a', 0, + 'm', 0, + 'i', 0, + 's', 0, +}; +#else +#error unknown TARGET_ID +#endif +#endif + +/* USB Standard Device Descriptor */ +static const uint8_t const USBD_LangIDDesc[]= +{ + USB_LEN_LANGID_STR_DESC, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING), +}; + +static const uint8_t const USB_SERIAL_STRING[] = +{ + 4*2+2, + USB_DESC_TYPE_STRING, + '0', 0, + '0', 0, + '0', 0, + '1', 0, +}; + +static const uint8_t const USBD_MANUFACTURER_STRING[] = { + 6*2+2, + USB_DESC_TYPE_STRING, + 'L', 0, + 'e', 0, + 'd', 0, + 'g', 0, + 'e', 0, + 'r', 0, +}; + +#define USBD_INTERFACE_FS_STRING USBD_PRODUCT_FS_STRING +#define USBD_CONFIGURATION_FS_STRING USBD_PRODUCT_FS_STRING + +static const uint8_t const HID_ReportDesc[] = { + 0x06, 0xA0, 0xFF, // Usage page (vendor defined) + 0x09, 0x01, // Usage ID (vendor defined) + 0xA1, 0x01, // Collection (application) + + // The Input report + 0x09, 0x03, // Usage ID - vendor defined + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8 bits) + 0x95, HID_EPIN_SIZE, // Report Count (64 fields) + 0x81, 0x08, // Input (Data, Variable, Absolute) + + // The Output report + 0x09, 0x04, // Usage ID - vendor defined + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8 bits) + 0x95, HID_EPOUT_SIZE, // Report Count (64 fields) + 0x91, 0x08, // Output (Data, Variable, Absolute) + 0xC0 +}; + +#ifdef HAVE_IO_U2F +static const uint8_t const HID_ReportDesc_fido[] = { + 0x06, 0xD0, 0xF1, // Usage page (vendor defined) + 0x09, 0x01, // Usage ID (vendor defined) + 0xA1, 0x01, // Collection (application) + + // The Input report + 0x09, 0x03, // Usage ID - vendor defined + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8 bits) + 0x95, U2F_EPIN_SIZE, // Report Count (64 fields) + 0x81, 0x08, // Input (Data, Variable, Absolute) + + // The Output report + 0x09, 0x04, // Usage ID - vendor defined + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8 bits) + 0x95, U2F_EPOUT_SIZE, // Report Count (64 fields) + 0x91, 0x08, // Output (Data, Variable, Absolute) + 0xC0 +}; +#endif // HAVE_IO_U2F + +#define ARRAY_U2LE(l) (l)&0xFF, (l)>>8 + +/* USB HID device Configuration Descriptor */ +static __ALIGN_BEGIN const uint8_t const N_USBD_CfgDesc[] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + ARRAY_U2LE(0x9 /* wTotalLength: Bytes returned */ + +0x9+0x9+0x7+0x7 +#ifdef HAVE_IO_U2F + +0x9+0x9+0x7+0x7 +#endif // HAVE_IO_U2F +#ifdef HAVE_USB_CLASS_CCID + +0x9+0x36+0x7+0x7 +#endif // HAVE_USB_CLASS_CCID + ), + 1 +#ifdef HAVE_IO_U2F + +1 +#endif // HAVE_IO_U2F +#ifdef HAVE_USB_CLASS_CCID + +1 +#endif // HAVE_USB_CLASS_CCID + , /*bNumInterfaces */ + 0x01, /*bConfigurationValue: Configuration value*/ + USBD_IDX_PRODUCT_STR, /*iConfiguration: Index of string descriptor describing the configuration*/ + 0xC0, /*bmAttributes: bus powered */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + /* HIDGEN ################################################################################################ */ + + /************** Descriptor of KBD HID interface ****************/ + 0x09, /*bLength: Interface Descriptor size*/ + USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ + HID_INTF, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x02, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + USBD_IDX_PRODUCT_STR, /*iInterface: Index of string descriptor*/ + + /******************** Descriptor of HID *************************/ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bHIDUSTOM_HID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + sizeof(HID_ReportDesc),/*wItemLength: Total length of Report descriptor*/ + 0x00, + + /******************** Descriptor of Custom HID endpoints ********************/ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ + HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_EPIN_SIZE, /*wMaxPacketSize: 2 Byte max */ + 0x00, + 0x01, /*bInterval: Polling Interval (20 ms)*/ + + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */ + HID_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address (OUT)*/ + 0x03, /* bmAttributes: Interrupt endpoint */ + HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max */ + 0x00, + 0x01, /* bInterval: Polling Interval (20 ms) */ + +#ifdef HAVE_IO_U2F + /* HID FIDO ################################################################################################ */ + + /************** Descriptor of KBD HID interface ****************/ + 0x09, /*bLength: Interface Descriptor size*/ + USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ + U2F_INTF, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x02, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + USBD_IDX_PRODUCT_STR, /*iInterface: Index of string descriptor*/ + + /******************** Descriptor of HID *************************/ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bHIDUSTOM_HID: HID Class Spec release number*/ + 0x01, + 0x21, /*bCountryCode: Hardware target country*/ // 0x21: US, 0x08: FR, 0x0D: ISO Intl + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + sizeof(HID_ReportDesc_fido),/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Custom HID endpoints ********************/ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ + U2F_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + U2F_EPIN_SIZE, /*wMaxPacketSize: */ + 0x00, + 0x01, /*bInterval: Polling Interval */ + + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */ + U2F_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address (OUT)*/ + 0x03, /* bmAttributes: Interrupt endpoint */ + U2F_EPOUT_SIZE, /* wMaxPacketSize: */ + 0x00, + 0x01,/* bInterval: Polling Interval */ +#endif // HAVE_IO_U2F + +#ifdef HAVE_USB_CLASS_CCID + /* CCID ################################################################################################ */ + + /******************** CCID **** interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + CCID_INTF, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: endpoints used */ + 0x0B, /* bInterfaceClass: user's interface for CCID */ + 0x00, /* bInterfaceSubClass : */ + 0x00, /* nInterfaceProtocol : None */ + 0x05, /* iInterface: */ + + /******************* CCID class descriptor ********************/ + 0x36, /* bLength: CCID Descriptor size */ + 0x21, /* bDescriptorType: Functional Descriptor type. */ + 0x10, /* bcdCCID(LSB): CCID Class Spec release number (1.00) */ + 0x01, /* bcdCCID(MSB) */ + + 0x00, /* bMaxSlotIndex :highest available slot on this device */ + 0x03, /* bVoltageSupport: bit Wise OR for 01h-5.0V 02h-3.0V + 04h 1.8V*/ + + 0x01,0x00,0x00,0x00, /* dwProtocols: 0001h = Protocol T=0 */ + 0x10,0x0E,0x00,0x00, /* dwDefaultClock: 3.6Mhz = 3600kHz = 0x0E10, + for 4 Mhz the value is (0x00000FA0) : + This is used in ETU and waiting time calculations*/ + 0x10,0x0E,0x00,0x00, /* dwMaximumClock: Maximum supported ICC clock frequency + in KHz. So, 3.6Mhz = 3600kHz = 0x0E10, + 4 Mhz (0x00000FA0) : */ + 0x00, /* bNumClockSupported : no setting from PC + If the value is 00h, the + supported clock frequencies are assumed to be the + default clock frequency defined by dwDefaultClock + and the maximum clock frequency defined by + dwMaximumClock */ + + 0xCD,0x25,0x00,0x00, /* dwDataRate: Default ICC I/O data rate in bps + 9677 bps = 0x25CD + for example 10752 bps (0x00002A00) */ + + 0xCD,0x25,0x00,0x00, /* dwMaxDataRate: Maximum supported ICC I/O data + rate in bps */ + 0x00, /* bNumDataRatesSupported : + The number of data rates that are supported by the CCID + If the value is 00h, all data rates between the default + data rate dwDataRate and the maximum data rate + dwMaxDataRate are supported. + Dont support GET_CLOCK_FREQUENCIES + */ + //46 + 0x00,0x00,0x00,0x00, /* dwMaxIFSD: 0 (T=0 only) */ + 0x00,0x00,0x00,0x00, /* dwSynchProtocols */ + 0x00,0x00,0x00,0x00, /* dwMechanical: no special characteristics */ + + 0xBA, 0x06, 0x02, 0x00, + //0x38,0x00,EXCHANGE_LEVEL_FEATURE,0x00, + /* dwFeatures: clk, baud rate, voltage : automatic */ + /* 00000008h Automatic ICC voltage selection + 00000010h Automatic ICC clock frequency change + 00000020h Automatic baud rate change according to + active parameters provided by the Host or self + determined 00000100h CCID can set + ICC in clock stop mode + + Only one of the following values may be present to + select a level of exchange: + 00010000h TPDU level exchanges with CCID + 00020000h Short APDU level exchange with CCID + 00040000h Short and Extended APDU level exchange + If none of those values : character level of exchange*/ + 0x0F,0x01,0x00,0x00, /* dwMaxCCIDMessageLength: Maximum block size + header*/ + /* 261 + 10 */ + + 0x00, /* bClassGetResponse*/ + 0x00, /* bClassEnvelope */ + 0x00,0x00, /* wLcdLayout : 0000h no LCD. */ + 0x00, /* bPINSupport : no PIN verif and modif */ + 0x01, /* bMaxCCIDBusySlots */ + + /******************** CCID Endpoints ********************/ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + CCID_BULK_IN_EP, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(CCID_BULK_EPIN_SIZE), + HIBYTE(CCID_BULK_EPIN_SIZE), + 0x00, /*Polling interval in milliseconds */ + + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + CCID_BULK_OUT_EP, /*Endpoint address (OUT, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(CCID_BULK_EPOUT_SIZE), + HIBYTE(CCID_BULK_EPOUT_SIZE), + 0x00, /*Polling interval in milliseconds*/ +#endif // HAVE_USB_CLASS_CCID +} ; + +#ifdef HAVE_IO_U2F +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN const uint8_t const USBD_HID_Desc_fido[] __ALIGN_END = +{ + /******************** Descriptor of HID *************************/ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bHIDUSTOM_HID: HID Class Spec release number*/ + 0x01, + 0x21, /*bCountryCode: Hardware target country*/ // 0x21: US, 0x08: FR, 0x0D: ISO Intl + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + sizeof(HID_ReportDesc_fido),/*wItemLength: Total length of Report descriptor*/ + 0x00, +}; +#endif // HAVE_IO_U2F + +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN const uint8_t const USBD_HID_Desc[] __ALIGN_END = +{ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bHIDUSTOM_HID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + sizeof(HID_ReportDesc),/*wItemLength: Total length of Report descriptor*/ + 0x00, +}; + +/* USB Standard Device Descriptor */ +static __ALIGN_BEGIN const uint8_t const USBD_DeviceQualifierDesc[] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +/* USB Standard Device Descriptor */ +static const uint8_t const USBD_DeviceDesc[]= { + 0x12, /* bLength */ + USB_DESC_TYPE_DEVICE, /* bDescriptorType */ + 0x00, /* bcdUSB */ + 0x02, + 0x00, /* bDeviceClass */ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ + USB_MAX_EP0_SIZE, /* bMaxPacketSize */ + LOBYTE(USBD_VID), /* idVendor */ + HIBYTE(USBD_VID), /* idVendor */ + LOBYTE(USBD_PID), /* idVendor */ + HIBYTE(USBD_PID), /* idVendor */ + 0x00, /* bcdDevice rel. 2.00 */ + 0x02, + USBD_IDX_MFC_STR, /* Index of manufacturer string */ + USBD_IDX_PRODUCT_STR, /* Index of product string */ + USBD_IDX_SERIAL_STR, /* Index of serial number string */ + 1 /* bNumConfigurations */ +}; /* USB_DeviceDescriptor */ + + +/** + * @brief Returns the device descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_DeviceDesc); + return (uint8_t*)USBD_DeviceDesc; +} + +/** + * @brief Returns the LangID string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_LangIDDesc); + return (uint8_t*)USBD_LangIDDesc; +} + +/** + * @brief Returns the product string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_PRODUCT_FS_STRING); + return (uint8_t*)USBD_PRODUCT_FS_STRING; +} + +/** + * @brief Returns the manufacturer string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_MANUFACTURER_STRING); + return (uint8_t*)USBD_MANUFACTURER_STRING; +} + +/** + * @brief Returns the serial number string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USB_SERIAL_STRING); + return (uint8_t*)USB_SERIAL_STRING; +} + +/** + * @brief Returns the configuration string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_CONFIGURATION_FS_STRING); + return (uint8_t*)USBD_CONFIGURATION_FS_STRING; +} + +/** + * @brief Returns the interface string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_INTERFACE_FS_STRING); + return (uint8_t*)USBD_INTERFACE_FS_STRING; +} + +/** +* @brief DeviceQualifierDescriptor +* return Device Qualifier descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +uint8_t *USBD_GetDeviceQualifierDesc_impl (uint16_t *length) +{ + *length = sizeof (USBD_DeviceQualifierDesc); + return (uint8_t*)USBD_DeviceQualifierDesc; +} + +/** + * @brief USBD_CUSTOM_HID_GetCfgDesc + * return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +uint8_t *USBD_GetCfgDesc_impl (uint16_t *length) +{ + *length = sizeof (N_USBD_CfgDesc); + return (uint8_t*)N_USBD_CfgDesc; +} + +uint8_t* USBD_HID_GetHidDescriptor_impl(uint16_t* len) { + switch (USBD_Device.request.wIndex&0xFF) { +#ifdef HAVE_IO_U2F + case U2F_INTF: + *len = sizeof(USBD_HID_Desc_fido); + return (uint8_t*)USBD_HID_Desc_fido; +#endif // HAVE_IO_U2F + case HID_INTF: + *len = sizeof(USBD_HID_Desc); + return (uint8_t*)USBD_HID_Desc; + } + *len = 0; + return 0; +} + +uint8_t* USBD_HID_GetReportDescriptor_impl(uint16_t* len) { + switch (USBD_Device.request.wIndex&0xFF) { +#ifdef HAVE_IO_U2F + case U2F_INTF: + + // very dirty work due to lack of callback when USB_HID_Init is called + USBD_LL_OpenEP(&USBD_Device, + U2F_EPIN_ADDR, + USBD_EP_TYPE_INTR, + U2F_EPIN_SIZE); + + USBD_LL_OpenEP(&USBD_Device, + U2F_EPOUT_ADDR, + USBD_EP_TYPE_INTR, + U2F_EPOUT_SIZE); + + /* Prepare Out endpoint to receive 1st packet */ + USBD_LL_PrepareReceive(&USBD_Device, U2F_EPOUT_ADDR, U2F_EPOUT_SIZE); + + + *len = sizeof(HID_ReportDesc_fido); + return (uint8_t*)HID_ReportDesc_fido; +#endif // HAVE_IO_U2F + case HID_INTF: + *len = sizeof(HID_ReportDesc); + return (uint8_t*)HID_ReportDesc; + } + *len = 0; + return 0; +} + +/** + * @} + */ + + +/** + * @brief USBD_HID_DataOut + * handle data OUT Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + * + * This function is the default behavior for our implementation when data are sent over the out hid endpoint + */ +extern volatile unsigned short G_io_apdu_length; + +#ifdef HAVE_IO_U2F +uint8_t USBD_U2F_DataIn_impl (USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + UNUSED(pdev); + // only the data hid endpoint will receive data + switch (epnum) { + // FIDO endpoint + case (U2F_EPIN_ADDR&0x7F): + // advance the u2f sending machine state + u2f_transport_sent(&G_io_u2f, U2F_MEDIA_USB); + break; + } + return USBD_OK; +} + +uint8_t USBD_U2F_DataOut_impl (USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t* buffer) +{ + switch (epnum) { + // FIDO endpoint + case (U2F_EPOUT_ADDR&0x7F): + USBD_LL_PrepareReceive(pdev, U2F_EPOUT_ADDR , U2F_EPOUT_SIZE); + u2f_transport_received(&G_io_u2f, buffer, io_seproxyhal_get_ep_rx_size(U2F_EPOUT_ADDR), U2F_MEDIA_USB); + break; + } + + return USBD_OK; +} +#endif // HAVE_IO_U2F + +uint8_t USBD_HID_DataOut_impl (USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t* buffer) +{ + // only the data hid endpoint will receive data + switch (epnum) { + + // HID gen endpoint + case (HID_EPOUT_ADDR&0x7F): + // prepare receiving the next chunk (masked time) + USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR , HID_EPOUT_SIZE); + + // avoid troubles when an apdu has not been replied yet + if (G_io_apdu_media == IO_APDU_MEDIA_NONE) { + // add to the hid transport + switch(io_usb_hid_receive(io_usb_send_apdu_data, buffer, io_seproxyhal_get_ep_rx_size(HID_EPOUT_ADDR))) { + default: + break; + + case IO_USB_APDU_RECEIVED: + G_io_apdu_media = IO_APDU_MEDIA_USB_HID; // for application code + G_io_apdu_state = APDU_USB_HID; // for next call to io_exchange + G_io_apdu_length = G_io_usb_hid_total_length; + break; + } + } + break; + } + + return USBD_OK; +} + +/** @defgroup USBD_HID_Private_Functions + * @{ + */ + +// note: how core lib usb calls the hid class +const USBD_DescriptorsTypeDef const HID_Desc = { + USBD_DeviceDescriptor, + USBD_LangIDStrDescriptor, + USBD_ManufacturerStrDescriptor, + USBD_ProductStrDescriptor, + USBD_SerialStrDescriptor, + USBD_ConfigStrDescriptor, + USBD_InterfaceStrDescriptor, + NULL, +}; + +#ifdef HAVE_IO_U2F +static const USBD_ClassTypeDef const USBD_U2F = +{ + USBD_HID_Init, + USBD_HID_DeInit, + USBD_HID_Setup, + NULL, /*EP0_TxSent*/ + NULL, /*EP0_RxReady*/ /* STATUS STAGE IN */ + USBD_U2F_DataIn_impl, /*DataIn*/ + USBD_U2F_DataOut_impl, /*DataOut*/ + NULL, /*SOF */ + NULL, + NULL, + USBD_GetCfgDesc_impl, + USBD_GetCfgDesc_impl, + USBD_GetCfgDesc_impl, + USBD_GetDeviceQualifierDesc_impl, +}; +#endif // HAVE_IO_U2F + +static const USBD_ClassTypeDef const USBD_HID = +{ + USBD_HID_Init, + USBD_HID_DeInit, + USBD_HID_Setup, + NULL, /*EP0_TxSent*/ + NULL, /*EP0_RxReady*/ /* STATUS STAGE IN */ + NULL, /*DataIn*/ + USBD_HID_DataOut_impl, /*DataOut*/ + NULL, /*SOF */ + NULL, + NULL, + USBD_GetCfgDesc_impl, + USBD_GetCfgDesc_impl, + USBD_GetCfgDesc_impl, + USBD_GetDeviceQualifierDesc_impl, +}; + +#ifdef HAVE_USB_CLASS_CCID +static const USBD_ClassTypeDef USBD_CCID = +{ + USBD_CCID_Init, + USBD_CCID_DeInit, + USBD_CCID_Setup, + NULL, /*EP0_TxSent*/ + NULL, /*EP0_RxReady*/ + USBD_CCID_DataIn, + USBD_CCID_DataOut, + NULL, /*SOF */ + NULL, /*ISOIn*/ + NULL, /*ISOOut*/ + USBD_GetCfgDesc_impl, + USBD_GetCfgDesc_impl, + USBD_GetCfgDesc_impl, + USBD_GetDeviceQualifierDesc_impl, +}; + +uint8_t SC_AnswerToReset (uint8_t voltage, uint8_t* atr_buffer) { + UNUSED(voltage); + // return the atr length + atr_buffer[0] = 0x3B; + atr_buffer[1] = 0; + return 2; +} + +void SC_Poweroff(void) { + // nothing to do ? +} + +uint8_t SC_ExecuteEscape (uint8_t* escapePtr, uint32_t escapeLen, + uint8_t* responseBuff, + uint16_t* responseLen) { + UNUSED(escapePtr); + UNUSED(escapeLen); + UNUSED(responseBuff); + UNUSED(responseLen); + // nothing to do ? + return 0; +} +#endif // HAVE_USB_CLASS_CCID + +void USB_power(unsigned char enabled) { + os_memset(&USBD_Device, 0, sizeof(USBD_Device)); + + if (enabled) { + os_memset(&USBD_Device, 0, sizeof(USBD_Device)); + /* Init Device Library */ + USBD_Init(&USBD_Device, (USBD_DescriptorsTypeDef*)&HID_Desc, 0); + + /* Register the HID class */ + USBD_RegisterClassForInterface(HID_INTF, &USBD_Device, (USBD_ClassTypeDef*)&USBD_HID); +#ifdef HAVE_IO_U2F + USBD_RegisterClassForInterface(U2F_INTF, &USBD_Device, (USBD_ClassTypeDef*)&USBD_U2F); + // initialize the U2F tunnel transport + u2f_transport_init(&G_io_u2f, G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); +#endif // HAVE_IO_U2F +#ifdef HAVE_USB_CLASS_CCID + USBD_RegisterClassForInterface(CCID_INTF, &USBD_Device, (USBD_ClassTypeDef*)&USBD_CCID); +#endif // HAVE_USB_CLASS_CCID + + + /* Start Device Process */ + USBD_Start(&USBD_Device); + } + else { + USBD_DeInit(&USBD_Device); + } +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/src/lib_stusb_impl/usbd_impl.h b/src/lib_stusb_impl/usbd_impl.h new file mode 100644 index 0000000..a20edef --- /dev/null +++ b/src/lib_stusb_impl/usbd_impl.h @@ -0,0 +1,7 @@ +#ifndef USBD_IMPL_H +#define USBD_IMPL_H + + +uint8_t *USBD_GetCfgDesc_impl (uint16_t *length); + +#endif //USBD_IMPL_H \ No newline at end of file diff --git a/src/usbd_ccid_impl.c b/src/usbd_ccid_impl.c deleted file mode 100644 index 2a54750..0000000 --- a/src/usbd_ccid_impl.c +++ /dev/null @@ -1,463 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_core.c - * @author MCD Application Team - * @version V1.0.1 - * @date 31-January-2014 - * @brief This file provides all the CCID core functions. - * - * @verbatim - * - * =================================================================== - * CCID Class Description - * =================================================================== - * This module manages the Specification for Integrated Circuit(s) - * Cards Interface Revision 1.1 - * This driver implements the following aspects of the specification: - * - Bulk Transfers - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2014 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_core.h" - -#ifdef HAVE_USB_CLASS_CCID - -#define USBD_LANGID_STRING 0x409 - -#define USBD_VID 0x2C97 -#if TARGET_ID == 0x31000002 // blue -#define USBD_PID 0x0000 -static const uint8_t const USBD_PRODUCT_FS_STRING[] = { - 4*2+2, - USB_DESC_TYPE_STRING, - 'B', 0, - 'l', 0, - 'u', 0, - 'e', 0, -}; - -#elif TARGET_ID == 0x31100002 // nano s -#define USBD_PID 0x0001 -static const uint8_t const USBD_PRODUCT_FS_STRING[] = { - 6*2+2, - USB_DESC_TYPE_STRING, - 'N', 0, - 'a', 0, - 'n', 0, - 'o', 0, - ' ', 0, - 'S', 0, -}; -#elif TARGET_ID == 0x31200002 // aramis -#define USBD_PID 0x0002 -static const uint8_t const USBD_PRODUCT_FS_STRING[] = { - 6*2+2, - USB_DESC_TYPE_STRING, - 'A', 0, - 'r', 0, - 'a', 0, - 'm', 0, - 'i', 0, - 's', 0, -}; -#else -#error unknown TARGET_ID -#endif - - -/* USB Standard Device Descriptor */ -static __ALIGN_BEGIN const uint8_t const USBD_DeviceQualifierDesc[] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; - -/* USB Standard Device Descriptor */ -static const uint8_t const USBD_LangIDDesc[]= -{ - USB_LEN_LANGID_STR_DESC, - USB_DESC_TYPE_STRING, - LOBYTE(USBD_LANGID_STRING), - HIBYTE(USBD_LANGID_STRING), -}; - -static const uint8_t const USB_SERIAL_STRING[] = -{ - 4*2+2, - USB_DESC_TYPE_STRING, - '0', 0, - '0', 0, - '0', 0, - '1', 0, -}; - -static const uint8_t const USBD_MANUFACTURER_STRING[] = { - 6*2+2, - USB_DESC_TYPE_STRING, - 'L', 0, - 'e', 0, - 'd', 0, - 'g', 0, - 'e', 0, - 'r', 0, -}; - -#define USBD_INTERFACE_FS_STRING USBD_PRODUCT_FS_STRING -#define USBD_CONFIGURATION_FS_STRING USBD_PRODUCT_FS_STRING - - -/* USB Standard Device Descriptor */ -static const uint8_t const USBD_DeviceDesc[]= { - 0x12, /* bLength */ - USB_DESC_TYPE_DEVICE, /* bDescriptorType */ - 0x00, /* bcdUSB */ - 0x02, - 0x00, /* bDeviceClass */ - 0x00, /* bDeviceSubClass */ - 0x00, /* bDeviceProtocol */ - USB_MAX_EP0_SIZE, /* bMaxPacketSize */ - LOBYTE(USBD_VID), /* idVendor */ - HIBYTE(USBD_VID), /* idVendor */ - LOBYTE(USBD_PID), /* idVendor */ - HIBYTE(USBD_PID), /* idVendor */ - 0x00, /* bcdDevice rel. 2.00 */ - 0x02, - USBD_IDX_MFC_STR, /* Index of manufacturer string */ - USBD_IDX_PRODUCT_STR, /* Index of product string */ - USBD_IDX_SERIAL_STR, /* Index of serial number string */ - USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */ -}; /* USB_DeviceDescriptor */ - - -/* USB Mass storage device Configuration Descriptor */ -/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ -#define USBD_OFFSET_CfgDesc_bPINSupport 70 -const uint8_t N_USBD_CfgDesc[] = -{ - - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - 0x9+0x9+0x36+0x7+0x7+0x7, - - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - 0x04, /* iConfiguration: */ - 0x80, /*bmAttributes: bus powered */ - 0x32, /* MaxPower 100 mA */ - - /******************** CCID **** interface ********************/ - 0x09, /* bLength: Interface Descriptor size */ - 0x04, /* bDescriptorType: */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x03, /* bNumEndpoints: 3 endpoints used */ - 0x0B, /* bInterfaceClass: user's interface for CCID */ - 0x00, /* bInterfaceSubClass : */ - 0x00, /* nInterfaceProtocol : None */ - 0x05, /* iInterface: */ - - /******************* CCID class descriptor ********************/ - 0x36, /* bLength: CCID Descriptor size */ - 0x21, /* bDescriptorType: Functional Descriptor type. */ - 0x10, /* bcdCCID(LSB): CCID Class Spec release number (1.00) */ - 0x01, /* bcdCCID(MSB) */ - - 0x00, /* bMaxSlotIndex :highest available slot on this device */ - 0x03, /* bVoltageSupport: bit Wise OR for 01h-5.0V 02h-3.0V - 04h 1.8V*/ - - 0x01,0x00,0x00,0x00, /* dwProtocols: 0001h = Protocol T=0 */ - 0x10,0x0E,0x00,0x00, /* dwDefaultClock: 3.6Mhz = 3600kHz = 0x0E10, - for 4 Mhz the value is (0x00000FA0) : - This is used in ETU and waiting time calculations*/ - 0x10,0x0E,0x00,0x00, /* dwMaximumClock: Maximum supported ICC clock frequency - in KHz. So, 3.6Mhz = 3600kHz = 0x0E10, - 4 Mhz (0x00000FA0) : */ - 0x00, /* bNumClockSupported : no setting from PC - If the value is 00h, the - supported clock frequencies are assumed to be the - default clock frequency defined by dwDefaultClock - and the maximum clock frequency defined by - dwMaximumClock */ - - 0xCD,0x25,0x00,0x00, /* dwDataRate: Default ICC I/O data rate in bps - 9677 bps = 0x25CD - for example 10752 bps (0x00002A00) */ - - 0xCD,0x25,0x00,0x00, /* dwMaxDataRate: Maximum supported ICC I/O data - rate in bps */ - 0x00, /* bNumDataRatesSupported : - The number of data rates that are supported by the CCID - If the value is 00h, all data rates between the default - data rate dwDataRate and the maximum data rate - dwMaxDataRate are supported. - Dont support GET_CLOCK_FREQUENCIES - */ - //46 - 0x00,0x00,0x00,0x00, /* dwMaxIFSD: 0 (T=0 only) */ - 0x00,0x00,0x00,0x00, /* dwSynchProtocols */ - 0x00,0x00,0x00,0x00, /* dwMechanical: no special characteristics */ - - 0x38,0x00,EXCHANGE_LEVEL_FEATURE,0x00, - /* dwFeatures: clk, baud rate, voltage : automatic */ - /* 00000008h Automatic ICC voltage selection - 00000010h Automatic ICC clock frequency change - 00000020h Automatic baud rate change according to - active parameters provided by the Host or self - determined 00000100h CCID can set - ICC in clock stop mode - - Only one of the following values may be present to - select a level of exchange: - 00010000h TPDU level exchanges with CCID - 00020000h Short APDU level exchange with CCID - 00040000h Short and Extended APDU level exchange - If none of those values : character level of exchange*/ - #if 1 - 0x0F,0x01,0x00,0x00, /* dwMaxCCIDMessageLength: Maximum block size + header*/ - /* 261 + 10 */ - #else - 0xF8,0x00,0x00,0x00, /* dwMaxCCIDMessageLength: Maximum block size + header*/ - /* EEh + 10 */ - #endif - 0x00, /* bClassGetResponse*/ - 0x00, /* bClassEnvelope */ - 0x00,0x00, /* wLcdLayout : 0000h no LCD. */ - 0x03, /* bPINSupport : no PIN verif and modif */ //<= offset: 70 - 0x01, /* bMaxCCIDBusySlots */ - - //72 - /******************** CCID Endpoints ********************/ - 0x07, /*Endpoint descriptor length = 7*/ - 0x05, /*Endpoint descriptor type */ - CCID_BULK_IN_EP, /*Endpoint address (IN, address 1) */ - 0x02, /*Bulk endpoint type */ - LOBYTE(CCID_BULK_EPIN_SIZE), - HIBYTE(CCID_BULK_EPIN_SIZE), - 0x00, /*Polling interval in milliseconds */ - - 0x07, /*Endpoint descriptor length = 7 */ - 0x05, /*Endpoint descriptor type */ - CCID_BULK_OUT_EP, /*Endpoint address (OUT, address 1) */ - 0x02, /*Bulk endpoint type */ - LOBYTE(CCID_BULK_EPOUT_SIZE), - HIBYTE(CCID_BULK_EPOUT_SIZE), - 0x00, /*Polling interval in milliseconds*/ - - - 0x07, /*bLength: Endpoint Descriptor size*/ - 0x05, /*bDescriptorType:*/ - CCID_INTR_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ - 0x03, /* bmAttributes: Interrupt endpoint */ - LOBYTE(CCID_INTR_EPIN_SIZE), - HIBYTE(CCID_INTR_EPIN_SIZE), - 0x18 /*Polling interval in milliseconds */ -}; - - - -static uint8_t *USBD_GetCfgDesc_impl (uint16_t *length) -{ - *length = sizeof (N_USBD_CfgDesc); - return (uint8_t*)(N_USBD_CfgDesc); -} - -/** - * @brief Returns the device descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -static uint8_t *USBD_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_DeviceDesc); - return (uint8_t*)USBD_DeviceDesc; -} - -/** - * @brief Returns the LangID string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -static uint8_t *USBD_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_LangIDDesc); - return (uint8_t*)USBD_LangIDDesc; -} - -/** - * @brief Returns the product string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -static uint8_t *USBD_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_PRODUCT_FS_STRING); - return (uint8_t*)USBD_PRODUCT_FS_STRING; -} - -/** - * @brief Returns the manufacturer string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -static uint8_t *USBD_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_MANUFACTURER_STRING); - return (uint8_t*)USBD_MANUFACTURER_STRING; -} - -/** - * @brief Returns the serial number string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -static uint8_t *USBD_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USB_SERIAL_STRING); - return (uint8_t*)USB_SERIAL_STRING; -} - -/** - * @brief Returns the configuration string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -static uint8_t *USBD_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_CONFIGURATION_FS_STRING); - return (uint8_t*)USBD_CONFIGURATION_FS_STRING; -} - -/** - * @brief Returns the interface string descriptor. - * @param speed: Current device speed - * @param length: Pointer to data length variable - * @retval Pointer to descriptor buffer - */ -static uint8_t *USBD_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_INTERFACE_FS_STRING); - return (uint8_t*)USBD_INTERFACE_FS_STRING; -} - -/** -* @brief DeviceQualifierDescriptor -* return Device Qualifier descriptor -* @param length : pointer data length -* @retval pointer to descriptor buffer -*/ -static uint8_t *USBD_GetDeviceQualifierDesc_impl (uint16_t *length) -{ - *length = sizeof (USBD_DeviceQualifierDesc); - return (uint8_t*)USBD_DeviceQualifierDesc; -} - - -uint8_t SC_AnswerToReset (uint8_t voltage, uint8_t* atr_buffer) { - // return the atr length - atr_buffer[0] = 0x3B; - atr_buffer[1] = 0; - return 2; -} - - -// note: how core lib usb calls the hid class -static const USBD_DescriptorsTypeDef const CCID_Desc = { - USBD_DeviceDescriptor, - USBD_LangIDStrDescriptor, - USBD_ManufacturerStrDescriptor, - USBD_ProductStrDescriptor, - USBD_SerialStrDescriptor, - USBD_ConfigStrDescriptor, - USBD_InterfaceStrDescriptor, - NULL, -}; - -static const USBD_ClassTypeDef USBD_CCID = -{ - USBD_CCID_Init, - USBD_CCID_DeInit, - USBD_CCID_Setup, - NULL, /*EP0_TxSent*/ - NULL, /*EP0_RxReady*/ - USBD_CCID_DataIn, - USBD_CCID_DataOut, - NULL, /*SOF */ - NULL, /*ISOIn*/ - NULL, /*ISOOut*/ - USBD_GetCfgDesc_impl, - USBD_GetCfgDesc_impl, - USBD_GetCfgDesc_impl, - USBD_GetDeviceQualifierDesc_impl, -}; - - -void USBD_CCID_activate_pinpad(int enabled) { - unsigned char e; - e = enabled?3:0; - nvm_write(((char*)PIC(N_USBD_CfgDesc))+USBD_OFFSET_CfgDesc_bPINSupport, &e,1); -} - -void USB_CCID_power(unsigned char enabled) { - os_memset(&USBD_Device, 0, sizeof(USBD_Device)); - - if (enabled) { - os_memset(&USBD_Device, 0, sizeof(USBD_Device)); - /* Init Device Library */ - USBD_Init(&USBD_Device, (USBD_DescriptorsTypeDef*)&CCID_Desc, 0); - - /* Register the HID class */ - USBD_RegisterClass(&USBD_Device, (USBD_ClassTypeDef*)&USBD_CCID); - - /* Start Device Process */ - USBD_Start(&USBD_Device); - } - else { - USBD_DeInit(&USBD_Device); - } -} - -#endif // HAVE_USB_CLASS_CCID diff --git a/src/usbd_ccid_impl.h b/src/usbd_ccid_impl.h deleted file mode 100644 index b254b71..0000000 --- a/src/usbd_ccid_impl.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef USBD_CCID_IMPL_H -#define USBD_CCID_IMPL_H - -#define TPDU_EXCHANGE 0x01 -#define SHORT_APDU_EXCHANGE 0x02 -#define EXTENDED_APDU_EXCHANGE 0x04 -#define CHARACTER_EXCHANGE 0x00 - -#define EXCHANGE_LEVEL_FEATURE SHORT_APDU_EXCHANGE - - -#define CCID_BULK_IN_EP 0x82 -#define CCID_BULK_EPIN_SIZE 64 -#define CCID_BULK_OUT_EP 0x02 -#define CCID_BULK_EPOUT_SIZE 64 -#define CCID_INTR_IN_EP 0x81 -#define CCID_INTR_EPIN_SIZE 16 - -#define CCID_EP0_BUFF_SIZ 64 - -void USB_CCID_power(unsigned char enabled); -void USBD_CCID_activate_pinpad(int enabled); - -#endif // USBD_CCID_IMPL_H \ No newline at end of file From b71d2d02d7e1080e101e32856a679f9036974067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric?= Date: Mon, 28 May 2018 10:38:04 +0200 Subject: [PATCH 07/11] port SDK 1.4.2.1 --- Makefile | 6 ++++++ doc/user/blue-app-openpgp-card.rst | 2 +- src/gpg_challenge.c | 8 ++++---- src/gpg_data.c | 9 +++++++-- src/gpg_gen.c | 13 ++++++------- src/gpg_init.c | 10 +++++++--- src/gpg_pin.c | 4 ++-- src/gpg_pso.c | 19 ++++++++++--------- src/gpg_types.h | 2 +- src/lib_stusb_impl/usbd_impl.c | 2 +- 10 files changed, 45 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index ddc0ed6..543444d 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,12 @@ # limitations under the License. #******************************************************************************* +BOLOS_SDK=/home/cme/Projects/Git/ledger/nanos-secure-sdk-cslashm + + +CLANGPATH=/home/cme/Projects/Git/ledger/compilers/clang+llvm-4.0.0-x86_64-linux-gnu-ubuntu-16.10/bin/ +GCCPATH=/home/cme/Projects/Git/ledger/compilers/gcc-arm-none-eabi-5_3-2016q1/bin/ + ifeq ($(BOLOS_SDK),) $(error Environment variable BOLOS_SDK is not set) diff --git a/doc/user/blue-app-openpgp-card.rst b/doc/user/blue-app-openpgp-card.rst index 291068a..52cf5b8 100644 --- a/doc/user/blue-app-openpgp-card.rst +++ b/doc/user/blue-app-openpgp-card.rst @@ -1,5 +1,5 @@ .. - Copyright 2017 Cedric Mesnil , Ledger SAS + Copyright 2018 Cedric Mesnil , Ledger SAS Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/src/gpg_challenge.c b/src/gpg_challenge.c index 1a655f7..7144574 100644 --- a/src/gpg_challenge.c +++ b/src/gpg_challenge.c @@ -44,16 +44,16 @@ int gpg_apdu_get_challenge() { chain[0] = 'r'; chain[1]='n'; chain[2] = 'd'; cx_sha256_init(&G_gpg_vstate.work.md.sha256); - cx_hash((cx_hash_t *)&G_gpg_vstate.work.md.sha256, 0, Sr, 32, NULL); - cx_hash((cx_hash_t *)&G_gpg_vstate.work.md.sha256, 0, chain, 3, NULL); + cx_hash((cx_hash_t *)&G_gpg_vstate.work.md.sha256, 0, Sr, 32, NULL, 0); + cx_hash((cx_hash_t *)&G_gpg_vstate.work.md.sha256, 0, chain, 3, NULL, 0); hlen=cx_hash((cx_hash_t *)&G_gpg_vstate.work.md.sha256, CX_LAST, G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, - G_gpg_vstate.work.io_buffer); + G_gpg_vstate.work.io_buffer, 32); cx_sha3_xof_init(&G_gpg_vstate.work.md.sha3, 256, olen); cx_hash((cx_hash_t *)&G_gpg_vstate.work.md.sha3, CX_LAST, G_gpg_vstate.work.io_buffer, hlen, - G_gpg_vstate.work.io_buffer); + G_gpg_vstate.work.io_buffer,olen); } else { cx_rng(G_gpg_vstate.work.io_buffer, olen); } diff --git a/src/gpg_data.c b/src/gpg_data.c index 4ca86d1..65c7d1c 100644 --- a/src/gpg_data.c +++ b/src/gpg_data.c @@ -67,7 +67,7 @@ int gpg_apdu_get_data(unsigned int ref) { break; /* ----------------- Config RSA exponent ----------------- */ case 0x01F8: - gpg_io_insert_u32(N_gpg_pstate->default_RSA_exponent); + gpg_io_insert(N_gpg_pstate->default_RSA_exponent,4); break; /* ----------------- Application ----------------- */ @@ -433,7 +433,12 @@ int gpg_apdu_put_data(unsigned int ref) { os_memset(pq+ksz, 0, ksz-len_q); //regenerate RSA private key - cx_rsa_generate_pair(ksz<<1, rsa_pub, rsa_priv, e, pq); + unsigned char _e[4]; + _e[0] = e>>24; + _e[1] = e>>16; + _e[2] = e>>8; + _e[3] = e>>0; + cx_rsa_generate_pair(ksz<<1, rsa_pub, rsa_priv, _e, 4, pq); //write keys nvm_write(&keygpg->pub_key.rsa, rsa_pub->e, 4); diff --git a/src/gpg_gen.c b/src/gpg_gen.c index e7de95d..33ecf72 100644 --- a/src/gpg_gen.c +++ b/src/gpg_gen.c @@ -46,12 +46,12 @@ static void gpg_pso_derive_key_seed(unsigned char *Sn, unsigned char* key_name, h[1] = idx; cx_sha256_init(&G_gpg_vstate.work.md.sha256); - cx_hash((cx_hash_t*)&G_gpg_vstate.work.md.sha256, 0, Sn, 32, NULL); - cx_hash((cx_hash_t*)&G_gpg_vstate.work.md.sha256, 0, (unsigned char *)key_name, 4, NULL); - cx_hash((cx_hash_t*)&G_gpg_vstate.work.md.sha256, CX_LAST, h , 2, h); + cx_hash((cx_hash_t*)&G_gpg_vstate.work.md.sha256, 0, Sn, 32, NULL, 0); + cx_hash((cx_hash_t*)&G_gpg_vstate.work.md.sha256, 0, (unsigned char *)key_name, 4, NULL, 0); + cx_hash((cx_hash_t*)&G_gpg_vstate.work.md.sha256, CX_LAST, h , 2, h,32); cx_sha3_xof_init(&G_gpg_vstate.work.md.sha3, 256, Ski_len); - cx_hash((cx_hash_t*)&G_gpg_vstate.work.md.sha3, CX_LAST, h, 32, Ski); + cx_hash((cx_hash_t*)&G_gpg_vstate.work.md.sha3, CX_LAST, h, 32, Ski, Ski_len); } @@ -153,8 +153,7 @@ int gpg_apdu_gen() { cx_math_next_prime(pq+size,size); } - - cx_rsa_generate_pair(ksz, rsa_pub, rsa_priv, N_gpg_pstate->default_RSA_exponent, pq); + cx_rsa_generate_pair(ksz, rsa_pub, rsa_priv, N_gpg_pstate->default_RSA_exponent, 4, pq); nvm_write(pkey, rsa_priv, pkey_size); nvm_write(&keygpg->pub_key.rsa[0], rsa_pub->e, 4); @@ -262,7 +261,7 @@ int gpg_apdu_gen() { curve = gpg_oid2curve(keygpg->attributes.value+1, keygpg->attributes.length-1); if (curve == CX_CURVE_Ed25519) { os_memmove(G_gpg_vstate.work.io_buffer+128, keygpg->pub_key.ecfp256.W,keygpg->pub_key.ecfp256.W_len); - cx_edward_compress_point(CX_CURVE_Ed25519, G_gpg_vstate.work.io_buffer+128); + cx_edward_compress_point(CX_CURVE_Ed25519, G_gpg_vstate.work.io_buffer+128, 65); gpg_io_insert_tlv(0x86, 32, G_gpg_vstate.work.io_buffer+129); //129: discard 02 } else if (curve == CX_CURVE_Curve25519) { unsigned int i,len; diff --git a/src/gpg_init.c b/src/gpg_init.c index fa82e95..29c5f15 100644 --- a/src/gpg_init.c +++ b/src/gpg_init.c @@ -283,8 +283,12 @@ int gpg_install(unsigned char app_state) { gpg_nvm_write(&N_gpg_pstate->config_slot, G_gpg_vstate.work.io_buffer, 3); //config rsa pub - l = GPG_RSA_DEFAULT_PUB; - nvm_write(&N_gpg_pstate->default_RSA_exponent, &l, sizeof(unsigned int)); + #define GPG_RSA_DEFAULT_PUB 0x00010001 + G_gpg_vstate.work.io_buffer[0] = (GPG_RSA_DEFAULT_PUB>>24)&0xFF; + G_gpg_vstate.work.io_buffer[1] = (GPG_RSA_DEFAULT_PUB>>16)&0xFF; + G_gpg_vstate.work.io_buffer[2] = (GPG_RSA_DEFAULT_PUB>>8)&0xFF; + G_gpg_vstate.work.io_buffer[3] = (GPG_RSA_DEFAULT_PUB>>0)&0xFF; + nvm_write(&N_gpg_pstate->default_RSA_exponent, G_gpg_vstate.work.io_buffer, 4); //config pin #if 1 @@ -300,7 +304,7 @@ int gpg_install(unsigned char app_state) { //default key template: RSA 2048) for (int s = 0; s< GPG_KEYS_SLOTS; s++) { -#if 1 +#if 0 l = sizeof(C_default_AlgoAttrRSA); gpg_nvm_write(&N_gpg_pstate->keys[s].sig.attributes.value, (void*)C_default_AlgoAttrRSA, l); gpg_nvm_write(&N_gpg_pstate->keys[s].sig.attributes.length, &l, sizeof(unsigned int)); diff --git a/src/gpg_pin.c b/src/gpg_pin.c index 7def70f..4ed7aa2 100644 --- a/src/gpg_pin.c +++ b/src/gpg_pin.c @@ -63,7 +63,7 @@ static int gpg_pin_check_internal(gpg_pin_t *pin, unsigned char *pin_val, int p counter = pin->counter-1; gpg_nvm_write(&(pin->counter), &counter, sizeof(int)); cx_sha256_init(&sha256); - cx_hash((cx_hash_t*)&sha256, CX_LAST, pin_val, pin_len, NULL); + cx_hash((cx_hash_t*)&sha256, CX_LAST, pin_val, pin_len, NULL, 0); if (os_memcmp(sha256.acc, pin->value, 32)) { return SW_SECURITY_STATUS_NOT_SATISFIED; } @@ -103,7 +103,7 @@ void gpg_pin_set(gpg_pin_t *pin, unsigned char *pin_val, unsigned int pin_len) { gpg_pin_t newpin; cx_sha256_init(&sha256); - cx_hash((cx_hash_t*)&sha256, CX_LAST, pin_val, pin_len, newpin.value); + cx_hash((cx_hash_t*)&sha256, CX_LAST, pin_val, pin_len, newpin.value, 32); newpin.length = pin_len; newpin.counter = 3; diff --git a/src/gpg_pso.c b/src/gpg_pso.c index d0e5f31..e820d17 100644 --- a/src/gpg_pso.c +++ b/src/gpg_pso.c @@ -93,11 +93,12 @@ static int gpg_sign(gpg_key_t *sigkey) { } //sign if (sigkey->attributes.value[0] == 19) { + sz = cx_ecdsa_sign(key, CX_RND_TRNG, CX_NONE, - G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, - G_gpg_vstate.work.io_buffer, + G_gpg_vstate.work.io_buffer, 32/*G_gpg_vstate.io_length*/, + G_gpg_vstate.work.io_buffer, GPG_IO_BUFFER_LENGTH, NULL); //reencode r,s in MPI format gpg_io_discard(0); @@ -121,7 +122,7 @@ static int gpg_sign(gpg_key_t *sigkey) { CX_NONE, CX_SHA512, G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, NULL, 0, - G_gpg_vstate.work.io_buffer+128, + G_gpg_vstate.work.io_buffer+128, GPG_IO_BUFFER_LENGTH-128, NULL); gpg_io_discard(0); gpg_io_insert(G_gpg_vstate.work.io_buffer+128, sz); @@ -162,7 +163,7 @@ int gpg_apdu_pso(unsigned int pso) { sz = cx_aes(key, CX_ENCRYPT|CX_CHAIN_CBC|CX_LAST, G_gpg_vstate.work.io_buffer+G_gpg_vstate.io_offset, msg_len, - G_gpg_vstate.work.io_buffer+1); + G_gpg_vstate.work.io_buffer+1, GPG_IO_BUFFER_LENGTH-1); //send gpg_io_discard(0); G_gpg_vstate.work.io_buffer[0] = 0x02; @@ -232,7 +233,7 @@ int gpg_apdu_pso(unsigned int pso) { sz = cx_aes(key, CX_DECRYPT|CX_CHAIN_CBC|CX_LAST, G_gpg_vstate.work.io_buffer+G_gpg_vstate.io_offset, msg_len, - G_gpg_vstate.work.io_buffer); + G_gpg_vstate.work.io_buffer, GPG_IO_BUFFER_LENGTH); //send gpg_io_discard(0); gpg_io_inserted(sz); @@ -275,8 +276,8 @@ int gpg_apdu_pso(unsigned int pso) { G_gpg_vstate.work.io_buffer[511] = 0x02; sz = cx_ecdh(key, CX_ECDH_X, - G_gpg_vstate.work.io_buffer+511, - G_gpg_vstate.work.io_buffer+256); + G_gpg_vstate.work.io_buffer+511, 65, + G_gpg_vstate.work.io_buffer+256, 160); for (i = 0; i <=31; i++) { G_gpg_vstate.work.io_buffer[128+i] = G_gpg_vstate.work.io_buffer[287-i]; } @@ -284,8 +285,8 @@ int gpg_apdu_pso(unsigned int pso) { } else { sz = cx_ecdh(key, CX_ECDH_X, - G_gpg_vstate.work.io_buffer+G_gpg_vstate.io_offset, - G_gpg_vstate.work.io_buffer+128); + G_gpg_vstate.work.io_buffer+G_gpg_vstate.io_offset, 65, + G_gpg_vstate.work.io_buffer+128, 160); } //send gpg_io_discard(0); diff --git a/src/gpg_types.h b/src/gpg_types.h index 9b89fc8..5b99298 100644 --- a/src/gpg_types.h +++ b/src/gpg_types.h @@ -116,7 +116,7 @@ struct gpg_nv_state_s { /* 01F1 (01F2 is volatile)*/ unsigned char config_slot[3]; /* RSA exponent */ - unsigned int default_RSA_exponent; + unsigned char default_RSA_exponent[4]; /* 0101 0102 0103 0104 */ LV(private_DO1, GPG_EXT_PRIVATE_DO_LENGTH); diff --git a/src/lib_stusb_impl/usbd_impl.c b/src/lib_stusb_impl/usbd_impl.c index d511b08..212e3b8 100644 --- a/src/lib_stusb_impl/usbd_impl.c +++ b/src/lib_stusb_impl/usbd_impl.c @@ -322,7 +322,7 @@ static __ALIGN_BEGIN const uint8_t const N_USBD_CfgDesc[] __ALIGN_END = #ifdef HAVE_IO_U2F /* HID FIDO ################################################################################################ */ - /************** Descriptor of KBD HID interface ****************/ + /************** Descriptor of HID FIDO interface ****************/ 0x09, /*bLength: Interface Descriptor size*/ USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ U2F_INTF, /*bInterfaceNumber: Number of Interface*/ From 281ea42cbb4e66832c9bb1687f42970d96df5798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric?= Date: Mon, 28 May 2018 16:51:23 +0200 Subject: [PATCH 08/11] 1.2.0 code SDK 1.4.2.x port Add uif support Refactor memory layout Try to add more curve gpg 2.2.x handle curves other than ed25519 in a such strange way that it is very difficult to do such support. So secp256k1, secp256r1 and brainpoolp256 seems works, but according to gpg code it works by side effects :-/ Update user documentation for UIF There is still an issue with ssh authentication with Ed25519. It works with NIST-P256, Brainpool256 curves --- Makefile | 17 +- Makefile.rules | 29 + doc/user/blue-app-openpgp-card.pdf | Bin 1253899 -> 1234878 bytes doc/user/blue-app-openpgp-card.rst | 51 +- src/gpg_api.h | 4 +- src/gpg_data.c | 39 +- src/gpg_gen.c | 48 +- src/gpg_init.c | 171 ++- src/gpg_pso.c | 79 +- src/gpg_types.h | 71 +- src/gpg_ux_msg.c | 2 + src/gpg_ux_msg.h | 5 + src/gpg_ux_nanos.c | 178 ++- src/gpg_ux_nanos.h | 1 + src/sdk/usbd_ccid_cmd.c | 1057 ++++++++++++++++++ src/sdk/usbd_ccid_if.c | 617 ++++++++++ src/{lib_stusb_impl => sdk}/usbd_ccid_impl.h | 0 src/{lib_stusb_impl => sdk}/usbd_hid_impl.h | 0 src/{lib_stusb_impl => sdk}/usbd_impl.c | 3 + src/{lib_stusb_impl => sdk}/usbd_impl.h | 0 20 files changed, 2197 insertions(+), 175 deletions(-) create mode 100644 Makefile.rules create mode 100755 src/sdk/usbd_ccid_cmd.c create mode 100755 src/sdk/usbd_ccid_if.c rename src/{lib_stusb_impl => sdk}/usbd_ccid_impl.h (100%) rename src/{lib_stusb_impl => sdk}/usbd_hid_impl.h (100%) rename src/{lib_stusb_impl => sdk}/usbd_impl.c (96%) rename src/{lib_stusb_impl => sdk}/usbd_impl.h (100%) diff --git a/Makefile b/Makefile index af12712..219c2c3 100644 --- a/Makefile +++ b/Makefile @@ -15,13 +15,6 @@ # limitations under the License. #******************************************************************************* -BOLOS_SDK=/home/cme/Projects/Git/ledger/nanos-secure-sdk-cslashm - - -CLANGPATH=/home/cme/Projects/Git/ledger/compilers/clang+llvm-4.0.0-x86_64-linux-gnu-ubuntu-16.10/bin/ -GCCPATH=/home/cme/Projects/Git/ledger/compilers/gcc-arm-none-eabi-5_3-2016q1/bin/ - - ifeq ($(BOLOS_SDK),) $(error Environment variable BOLOS_SDK is not set) endif @@ -34,8 +27,8 @@ APPNAME = OpenPGP SPECVERSION="3.3.1" APPVERSION_M=1 -APPVERSION_N=1 -APPVERSION_P=1 +APPVERSION_N=2 +APPVERSION_P=0 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) ifeq ($(TARGET_NAME),TARGET_BLUE) @@ -81,7 +74,7 @@ DEFINES += HAVE_USB_CLASS_CCID CC := $(CLANGPATH)clang #CFLAGS += -O0 -gdwarf-2 -gstrict-dwarf -CFLAGS += -O3 -Os +CFLAGS += -O3 -Os #CFLAGS += -fno-jump-tables -fno-lookup-tables -fsave-optimization-record #$(info $(CFLAGS)) @@ -96,7 +89,7 @@ LDLIBS += -lm -lgcc -lc include $(BOLOS_SDK)/Makefile.glyphs ### variables processed by the common makefile.rules of the SDK to grab source files and include dirs -APP_SOURCE_PATH += src src/lib_stusb_impl +APP_SOURCE_PATH += src SDK_SOURCE_PATH += lib_stusb @@ -107,7 +100,7 @@ delete: python -m ledgerblue.deleteApp $(COMMON_DELETE_PARAMS) # import generic rules from the sdk -include $(BOLOS_SDK)/Makefile.rules +include Makefile.rules #add dependency on custom makefile filename dep/%.d: %.c Makefile diff --git a/Makefile.rules b/Makefile.rules new file mode 100644 index 0000000..7c2d312 --- /dev/null +++ b/Makefile.rules @@ -0,0 +1,29 @@ +#******************************************************************************* +# Ledger SDK +# (c) 2017 Ledger +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#******************************************************************************* + + +#Make the SDK modified SDK sources prioritar to the original ones + +SOURCE_PATH += $(dir $(foreach libdir, $(APP_SOURCE_PATH), $(dir $(shell find $(libdir) | grep "\.c$$")))) $(BOLOS_SDK)/src $(foreach libdir, $(SDK_SOURCE_PATH), $(dir $(shell find $(BOLOS_SDK)/$(libdir) | grep "\.c$$"))) +SOURCE_FILES := $(foreach path, $(SOURCE_PATH),$(shell find $(path) | grep "\.c$$") ) $(GLYPH_DESTC) +INCLUDES_PATH := $(dir $(foreach libdir, $(APP_SOURCE_PATH), $(dir $(shell find $(libdir) | grep "\.h$$")))) $(dir $(foreach libdir, $(SDK_SOURCE_PATH), $(dir $(shell find $(BOLOS_SDK)/$(libdir) | grep "\.h$$")))) include $(BOLOS_SDK)/include $(BOLOS_SDK)/include/arm + +VPATH := $(dir $(SOURCE_FILES)) +OBJECT_FILES := $(sort $(addprefix obj/, $(addsuffix .o, $(basename $(notdir $(SOURCE_FILES)))))) +DEPEND_FILES := $(sort $(addprefix dep/, $(addsuffix .d, $(basename $(notdir $(SOURCE_FILES)))))) + +include $(BOLOS_SDK)/Makefile.rules_generic \ No newline at end of file diff --git a/doc/user/blue-app-openpgp-card.pdf b/doc/user/blue-app-openpgp-card.pdf index d7e603f9a7c71d7dd1e311fd807121bc7bcc056c..da6874fb6449ef4e71ae417991ffb438ab26bf59 100644 GIT binary patch delta 194736 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 delta 212844 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⪼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�VOIb}izwJrGA-jSZIi_#) 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˜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 aBvMjQl$yq6Xk=<+W@5&rs_N?R#svV!)+FEn diff --git a/doc/user/blue-app-openpgp-card.rst b/doc/user/blue-app-openpgp-card.rst index 52cf5b8..cbbbb9e 100644 --- a/doc/user/blue-app-openpgp-card.rst +++ b/doc/user/blue-app-openpgp-card.rst @@ -185,6 +185,7 @@ The full menu layout is : | Set on | Set off | PIN mode +| UIF mode | \ *Choose:* | Host | On Screen @@ -246,8 +247,39 @@ A key template is defined by the OpenGPG card application specification. It describes the key to be generated with the ``generate`` command in ``gpg --card-edit`` -The problem is there is no way with the ``gpg`` command line to easily set -up the desired template. The menu fixes that. +The problem is there is no way with the ``gpg --card-edit`` command line +to easily set up the desired template, except for Ed25519. + +To set up a new ECC template you have tow choice: the NanoS menu or the +gpg-connect-agent tools. + + + +**gpg-connect-agent** (recommended) + +This method suppose you have correctly configured your GnuPG tool. +See the dedicated section for that. + +In a terminal launch : + + gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 " /bye + gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 " /bye + gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 " /bye + +This 3 commands fix, in that order, the template for Signature, Decryption, Authentication keys. + +Supported curve name are: + +- secp256k1 with tag 19 +- nistp256 with tag 19 +- brainpoolP256r1 with tag 19 +- cv25519 (only for key 2) +- ed25519 with tag 22 (only for key 1 and 3) + + +To show the current template use the ``gpg --card-status`` command. + +**NanoS menu** First under *Choose Key* menu, select the one of three keys for which you want to modify the template. Then under "Choose Type", select the desired key template. @@ -255,10 +287,11 @@ Finally select "Set Template" entry to set it. To show the current template use the ``gpg --card-status`` command. - Seed mode ~~~~~~~~~ +**WARNING** : SEED MODE IS EXPERIMENTAL + When generating new keys on NanoS, those keys can be generated randomly or in a deterministic way. The deterministic way is specified in [GPGADD]. The current mode is displayed in the first sub menu. To activate the seeded @@ -266,6 +299,7 @@ The current mode is displayed in the first sub menu. To activate the seeded When the application starts, the seeded mode is always set to *OFF* +**WARNING** : SEED MODE IS EXPERIMENTAL PIN mode ~~~~~~~~ @@ -340,6 +374,17 @@ This is the default mode after application installation. Act as if the PIN is always validated. This is a dangerous mode which should only be used in a highly secure environment. +UIF mode +~~~~~~~~ + + +By activating UIF mode for either signature, decryption or authentication, a user validation +will be ask by the device each time the related operation is performed. + +To activate or deactivate the UIF, select the operation to protect and press both button. +When activated, a '+' symbol appears after the operation name. + + Reset ~~~~~ diff --git a/src/gpg_api.h b/src/gpg_api.h index 6886c16..378fd01 100644 --- a/src/gpg_api.h +++ b/src/gpg_api.h @@ -18,7 +18,9 @@ void USBD_CCID_activate_pinpad(int enabled); -int gpg_oid2curve(unsigned char* oid, unsigned int len); +unsigned int gpg_oid2curve(unsigned char* oid, unsigned int len); +unsigned char* gpg_curve2oid(unsigned int cv, unsigned int *len); +unsigned int gpg_curve2domainlen(unsigned int cv); void gpg_init(void); void gpg_init_ux(void); diff --git a/src/gpg_data.c b/src/gpg_data.c index 65c7d1c..8273bf9 100644 --- a/src/gpg_data.c +++ b/src/gpg_data.c @@ -367,34 +367,25 @@ int gpg_apdu_put_data(unsigned int ref) { //check length ksz = (keygpg->attributes.value[1]<<8)|keygpg->attributes.value[2]; ksz = ksz >> 3; + rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa.public; + rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa.private; + pkey = &keygpg->priv_key.rsa; switch(ksz) { case 1024/8: - rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa1024.public; - rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa1024.private; - pkey = (cx_rsa_private_key_t*)&keygpg->key.rsa1024; pkey_size = sizeof(cx_rsa_1024_private_key_t); - pq = G_gpg_vstate.work.rsa1024.public.n; + pq = G_gpg_vstate.work.rsa.public1024.n; break; case 2048/8: - rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa2048.public; - rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa2048.private; - pkey = (cx_rsa_private_key_t*)&keygpg->key.rsa2048; pkey_size = sizeof(cx_rsa_2048_private_key_t); - pq = G_gpg_vstate.work.rsa2048.public.n; + pq = G_gpg_vstate.work.rsa.public2048.n; break; case 3072/8: - rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa3072.public; - rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa3072.private; - pkey = (cx_rsa_private_key_t*)&keygpg->key.rsa3072; pkey_size = sizeof(cx_rsa_3072_private_key_t); - pq = G_gpg_vstate.work.rsa3072.public.n; + pq = G_gpg_vstate.work.rsa.public3072.n; break; case 4096/8: - rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa4096.public; - rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa4096.private; - pkey = (cx_rsa_private_key_t*)&keygpg->key.rsa4096; pkey_size = sizeof(cx_rsa_4096_private_key_t); - pq = G_gpg_vstate.work.rsa4096.public.n; + pq = G_gpg_vstate.work.rsa.public4096.n; break; } ksz = ksz>>1; @@ -460,14 +451,14 @@ int gpg_apdu_put_data(unsigned int ref) { THROW(SW_WRONG_DATA); return 0; } - ksz = 32; - if (ksz == 32) { - G_gpg_vstate.work.ecfp256.private.curve = curve; - G_gpg_vstate.work.ecfp256.private.d_len = ksz; - os_memmove(G_gpg_vstate.work.ecfp256.private.d, G_gpg_vstate.work.io_buffer+G_gpg_vstate.io_offset,ksz); - cx_ecfp_generate_pair(curve, &G_gpg_vstate.work.ecfp256.public, &G_gpg_vstate.work.ecfp256.private, 1); - nvm_write(&keygpg->pub_key.ecfp256, &G_gpg_vstate.work.ecfp256.public, sizeof(cx_ecfp_public_key_t)); - nvm_write(&keygpg->key.ecfp256, &G_gpg_vstate.work.ecfp256.private, sizeof(cx_ecfp_private_key_t)); + ksz = gpg_curve2domainlen(curve); + if (ksz == len_p) { + G_gpg_vstate.work.ecfp.private.curve = curve; + G_gpg_vstate.work.ecfp.private.d_len = ksz; + os_memmove(G_gpg_vstate.work.ecfp.private.d, G_gpg_vstate.work.io_buffer+G_gpg_vstate.io_offset,ksz); + cx_ecfp_generate_pair(curve, &G_gpg_vstate.work.ecfp.public, &G_gpg_vstate.work.ecfp.private, 1); + nvm_write(&keygpg->pub_key.ecfp, &G_gpg_vstate.work.ecfp.public, sizeof(cx_ecfp_public_key_t)); + nvm_write(&keygpg->priv_key.ecfp, &G_gpg_vstate.work.ecfp.private, sizeof(cx_ecfp_private_key_t)); if (reset_cnt) { reset_cnt = 0; nvm_write(&G_gpg_vstate.kslot->sig_count,&reset_cnt,sizeof(unsigned int)); diff --git a/src/gpg_gen.c b/src/gpg_gen.c index 33ecf72..22564f4 100644 --- a/src/gpg_gen.c +++ b/src/gpg_gen.c @@ -113,29 +113,20 @@ int gpg_apdu_gen() { ksz = (keygpg->attributes.value[1]<<8)|keygpg->attributes.value[2]; ksz = ksz >> 3; + rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa.public; + rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa.private; + pkey = &keygpg->priv_key.rsa; switch(ksz) { case 1024/8: - rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa1024.public; - rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa1024.private; - pkey = (cx_rsa_private_key_t*)&keygpg->key.rsa1024; pkey_size = sizeof(cx_rsa_1024_private_key_t); break; case 2048/8: - rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa2048.public; - rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa2048.private; - pkey = (cx_rsa_private_key_t*)&keygpg->key.rsa2048; pkey_size = sizeof(cx_rsa_2048_private_key_t); break; case 3072/8: - rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa3072.public; - rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa3072.private; - pkey = (cx_rsa_private_key_t*)&keygpg->key.rsa3072; pkey_size = sizeof(cx_rsa_3072_private_key_t); break; case 4096/8: - rsa_pub = (cx_rsa_public_key_t*)&G_gpg_vstate.work.rsa4096.public; - rsa_priv = (cx_rsa_private_key_t*)&G_gpg_vstate.work.rsa4096.private; - pkey = (cx_rsa_private_key_t*)&keygpg->key.rsa4096; pkey_size = sizeof(cx_rsa_4096_private_key_t); break; } @@ -173,19 +164,24 @@ int gpg_apdu_gen() { unsigned int curve,keepprivate; keepprivate = 0; curve = gpg_oid2curve(keygpg->attributes.value+1, keygpg->attributes.length-1); + if (curve == CX_CURVE_NONE) { + THROW(SW_REFERENCED_DATA_NOT_FOUND); + return SW_REFERENCED_DATA_NOT_FOUND; + } if ((G_gpg_vstate.io_p2 == 0x01) | (G_gpg_vstate.seed_mode)) { + ksz = gpg_curve2domainlen(curve); gpg_pso_derive_slot_seed(G_gpg_vstate.slot, seed); - gpg_pso_derive_key_seed(seed, name, 1, seed, 32); - cx_ecfp_init_private_key(curve,seed, 32, &G_gpg_vstate.work.ecfp256.private); + gpg_pso_derive_key_seed(seed, name, 1, seed, ksz); + cx_ecfp_init_private_key(curve,seed, ksz, &G_gpg_vstate.work.ecfp.private); keepprivate = 1; } cx_ecfp_generate_pair(curve, - &G_gpg_vstate.work.ecfp256.public, - &G_gpg_vstate.work.ecfp256.private, + &G_gpg_vstate.work.ecfp.public, + &G_gpg_vstate.work.ecfp.private, keepprivate); - nvm_write(&keygpg->key.ecfp256, &G_gpg_vstate.work.ecfp256.private, sizeof(cx_ecfp_private_key_t)); - nvm_write(&keygpg->pub_key.ecfp256, &G_gpg_vstate.work.ecfp256.public, sizeof(cx_ecfp_public_key_t)); + nvm_write(&keygpg->priv_key.ecfp, &G_gpg_vstate.work.ecfp.private, sizeof(cx_ecfp_private_key_t)); + nvm_write(&keygpg->pub_key.ecfp, &G_gpg_vstate.work.ecfp.public, sizeof(cx_ecfp_public_key_t)); if (reset_cnt) { reset_cnt = 0; nvm_write(&G_gpg_vstate.kslot->sig_count,&reset_cnt,sizeof(unsigned int)); @@ -207,32 +203,32 @@ int gpg_apdu_gen() { gpg_io_mark(); switch(ksz) { case 1024/8: - if (keygpg->key.rsa1024.size == 0) { + if (keygpg->priv_key.rsa1024.size == 0) { THROW (SW_REFERENCED_DATA_NOT_FOUND); return SW_REFERENCED_DATA_NOT_FOUND; } - gpg_io_insert_tlv(0x81,ksz,(unsigned char*)&keygpg->key.rsa1024.n); + gpg_io_insert_tlv(0x81,ksz,(unsigned char*)&keygpg->priv_key.rsa1024.n); break; case 2048/8: - if (keygpg->key.rsa2048.size == 0) { + if (keygpg->priv_key.rsa2048.size == 0) { THROW (SW_REFERENCED_DATA_NOT_FOUND); return SW_REFERENCED_DATA_NOT_FOUND; } - gpg_io_insert_tlv(0x81,ksz,(unsigned char*)&keygpg->key.rsa2048.n); + gpg_io_insert_tlv(0x81,ksz,(unsigned char*)&keygpg->priv_key.rsa2048.n); break; case 3072/8: - if (keygpg->key.rsa3072.size == 0) { + if (keygpg->priv_key.rsa3072.size == 0) { THROW (SW_REFERENCED_DATA_NOT_FOUND); return SW_REFERENCED_DATA_NOT_FOUND; } - gpg_io_insert_tlv(0x81,ksz,(unsigned char*)&keygpg->key.rsa3072.n); + gpg_io_insert_tlv(0x81,ksz,(unsigned char*)&keygpg->priv_key.rsa3072.n); break; case 4096/8: - if (keygpg->key.rsa4096.size == 0) { + if (keygpg->priv_key.rsa4096.size == 0) { THROW (SW_REFERENCED_DATA_NOT_FOUND); return SW_REFERENCED_DATA_NOT_FOUND; } - gpg_io_insert_tlv(0x81,ksz,(unsigned char*)&keygpg->key.rsa4096.n); + gpg_io_insert_tlv(0x81,ksz,(unsigned char*)&keygpg->priv_key.rsa4096.n); break; } gpg_io_insert_tlv(0x82, 4, keygpg->pub_key.rsa); diff --git a/src/gpg_init.c b/src/gpg_init.c index 8bf7e20..07e4d85 100644 --- a/src/gpg_init.c +++ b/src/gpg_init.c @@ -32,24 +32,47 @@ const unsigned char C_MAGIC[8] = { /* --ECC OID -- */ /* ----------------------*/ +/* +//brainpool 256t1: 1.3.36.3.3.2.8.1.1.8 +const unsigned char C_OID_BRAINPOOL256T1[9] = { + 0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x07 +}; +*/ + +//secp256r1 / NIST P256 /ansi-x9.62 : 1.2.840.10045.3.1.7 +const unsigned char C_OID_SECP256R1[8] = { + 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07 +}; +//secp384r1 / NIST P384 /ansi-x9.62 :1.3.132.0.34 +const unsigned char C_OID_SECP384R1[5] = { + 0x2B, 0x81, 0x04, 0x00 , 0x22 +}; +//secp521r1 / NIST P521 /ansi-x9.62 : 1.3.132.0.35 +const unsigned char C_OID_SECP521R1[5] = { + 0x2B, 0x81, 0x04, 0x00, 0x23 +}; + + //secp256k1: 1.3.132.0.10 const unsigned char C_OID_SECP256K1[5] = { 0x2B, 0x81, 0x04, 0x00, 0x0A }; -//secp256r1 / NIST P256 /ansi-x9.62 : 1.2.840.10045.3.1.7 -const unsigned char C_OID_SECP256R1[8] = { - 0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x07 -}; //brainpool 256r1: 1.3.36.3.3.2.8.1.1.7 const unsigned char C_OID_BRAINPOOL256R1[9] = { - 0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x08 + 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x08 }; -//brainpool 256t1: 1.3.36.3.3.2.8.1.1.8 -const unsigned char C_OID_BRAINPOOL256T1[9] = { - 0x2B,0x24,0x03,0x03,0x02,0x08,0x01,0x01,0x07 +//brainpool 284r1: 1.3.36.3.3.2.8.1.1.11 +const unsigned char C_OID_BRAINPOOL384R1[9] = { + 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B }; +//brainpool 512r1: 1.3.36.3.3.2.8.1.1.13 +const unsigned char C_OID_BRAINPOOL512R1[9] = { + 0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D +}; + + //Ed25519/curve25519: 1.3.6.1.4.1.11591.15.1 const unsigned char C_OID_Ed25519[9] = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01, @@ -60,10 +83,29 @@ const unsigned char C_OID_cv25519[10] = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01, }; -int gpg_oid2curve(unsigned char* oid, unsigned int len) { +unsigned int gpg_oid2curve(unsigned char* oid, unsigned int len) { + if ( (len == sizeof(C_OID_SECP256K1)) && (os_memcmp(oid, C_OID_SECP256K1, len)==0) ) { + return CX_CURVE_SECP256K1; + } if ( (len == sizeof(C_OID_SECP256R1)) && (os_memcmp(oid, C_OID_SECP256R1, len)==0) ) { - return CX_CURVE_256R1; + return CX_CURVE_SECP256R1; + } + if ( (len == sizeof(C_OID_SECP384R1)) && (os_memcmp(oid, C_OID_SECP384R1, len)==0) ) { + return CX_CURVE_SECP384R1; + } + if ( (len == sizeof(C_OID_SECP521R1)) && (os_memcmp(oid, C_OID_SECP521R1, len)==0) ) { + return CX_CURVE_SECP521R1; + } + + if ( (len == sizeof(C_OID_BRAINPOOL256R1)) && (os_memcmp(oid, C_OID_BRAINPOOL256R1, len)==0) ) { + return CX_CURVE_BrainPoolP256R1; + } + if ( (len == sizeof(C_OID_BRAINPOOL384R1)) && (os_memcmp(oid, C_OID_BRAINPOOL384R1, len)==0) ) { + return CX_CURVE_BrainPoolP384R1; + } + if ( (len == sizeof(C_OID_BRAINPOOL512R1)) && (os_memcmp(oid, C_OID_BRAINPOOL512R1, len)==0) ) { + return CX_CURVE_BrainPoolP512R1; } if ( (len == sizeof(C_OID_Ed25519)) && (os_memcmp(oid, C_OID_Ed25519, len)==0) ) { @@ -73,21 +115,87 @@ int gpg_oid2curve(unsigned char* oid, unsigned int len) { if ( (len == sizeof(C_OID_cv25519)) && (os_memcmp(oid, C_OID_cv25519, len)==0) ) { return CX_CURVE_Curve25519; } - + + /* if ( (len == sizeof(C_OID_SECP256K1)) && (os_memcmp(oid, C_OID_SECP256K1, len)==0) ) { return CX_CURVE_256K1; } - - if ( (len == sizeof(C_OID_BRAINPOOL256R1)) && (os_memcmp(oid, C_OID_BRAINPOOL256R1, len)==0) ) { - return CX_CURVE_BrainPoolP256R1; - } - if ( (len == sizeof(C_OID_BRAINPOOL256T1)) && (os_memcmp(oid, C_OID_BRAINPOOL256T1, len)==0) ) { return CX_CURVE_BrainPoolP256T1; } + */ return CX_CURVE_NONE; } + +unsigned char* gpg_curve2oid(unsigned int cv, unsigned int *len) { + switch (cv) { + + case CX_CURVE_SECP256K1: + *len = sizeof(C_OID_SECP256K1); + return (unsigned char*)PIC(C_OID_SECP256K1); + + case CX_CURVE_SECP256R1: + *len = sizeof(C_OID_SECP256R1); + return (unsigned char*)PIC(C_OID_SECP256R1); + + case CX_CURVE_SECP384R1: + *len = sizeof(C_OID_SECP384R1); + return (unsigned char*)PIC(C_OID_SECP384R1); + + case CX_CURVE_SECP521R1: + *len = sizeof(C_OID_SECP521R1); + return (unsigned char*)PIC(C_OID_SECP521R1); + + case CX_CURVE_BrainPoolP256R1: + *len = sizeof(C_OID_SECP256R1); + return (unsigned char*)PIC(C_OID_SECP256R1); + + case CX_CURVE_BrainPoolP384R1: + *len = sizeof(C_OID_SECP384R1); + return (unsigned char*)PIC(C_OID_SECP384R1); + + case CX_CURVE_BrainPoolP512R1: + *len = sizeof(C_OID_SECP521R1); + return (unsigned char*)PIC(C_OID_SECP521R1); + + case CX_CURVE_Ed25519: + *len = sizeof(C_OID_Ed25519); + return (unsigned char*)PIC(C_OID_Ed25519); + + case CX_CURVE_Curve25519: + *len = sizeof(C_OID_cv25519); + return (unsigned char*)PIC(C_OID_cv25519); + } + + *len = 0; + return NULL; +} + +unsigned int gpg_curve2domainlen(unsigned int cv) { + switch (cv) { + + case CX_CURVE_SECP256K1: + case CX_CURVE_SECP256R1: + case CX_CURVE_BrainPoolP256R1: + case CX_CURVE_Ed25519: + case CX_CURVE_Curve25519: + return 32; + + case CX_CURVE_SECP384R1: + case CX_CURVE_BrainPoolP384R1: + return 48; + + case CX_CURVE_BrainPoolP512R1: + return 64; + + case CX_CURVE_SECP521R1: + return 66; + } + + return 0; +} + /* -------------------------------*/ /* -- Non Mutable Capabilities -- */ /* -------------------------------*/ @@ -123,7 +231,7 @@ const unsigned char C_ext_length[8] = { const unsigned char C_default_AID[] = { 0xD2, 0x76, 0x00, 0x01, 0x24, 0x01, //version - 0x03, 0x00, + 0x03, 0x03, //manufacturer 0x2C, 0x97, //serial @@ -155,7 +263,7 @@ const unsigned char C_default_AlgoAttrRSA[] = { 0x01 }; -#if 1 +#if 0 const unsigned char C_default_AlgoAttrECC_sig[] = { // ecdsa 0x13, @@ -168,8 +276,20 @@ const unsigned char C_default_AlgoAttrECC_dec[] = { // NIST-P256 0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x07 }; - -#else +#elif 0 +const unsigned char C_default_AlgoAttrECC_sig[] = { + // ecdsa + 0x13, + // NIST-P384 + 0x2B, 0x81, 0x04, 0x00 , 0x22 +}; +const unsigned char C_default_AlgoAttrECC_dec[] = { + // ecdh + 0x12, + // NIST-P384 + 0x2B, 0x81, 0x04, 0x00 , 0x22 +}; +#elif 1 const unsigned char C_default_AlgoAttrECC_sig[] = { // eddsa 0x16, @@ -283,7 +403,6 @@ int gpg_install(unsigned char app_state) { gpg_nvm_write(&N_gpg_pstate->config_slot, G_gpg_vstate.work.io_buffer, 3); //config rsa pub - #define GPG_RSA_DEFAULT_PUB 0x00010001 G_gpg_vstate.work.io_buffer[0] = (GPG_RSA_DEFAULT_PUB>>24)&0xFF; G_gpg_vstate.work.io_buffer[1] = (GPG_RSA_DEFAULT_PUB>>16)&0xFF; G_gpg_vstate.work.io_buffer[2] = (GPG_RSA_DEFAULT_PUB>>8)&0xFF; @@ -304,7 +423,10 @@ int gpg_install(unsigned char app_state) { //default key template: RSA 2048) for (int s = 0; s< GPG_KEYS_SLOTS; s++) { -#if 0 + unsigned char uif[2]; + uif[0] = 0x00; + uif[1] = 0x20; +#if 1 l = sizeof(C_default_AlgoAttrRSA); gpg_nvm_write(&N_gpg_pstate->keys[s].sig.attributes.value, (void*)C_default_AlgoAttrRSA, l); gpg_nvm_write(&N_gpg_pstate->keys[s].sig.attributes.length, &l, sizeof(unsigned int)); @@ -322,6 +444,11 @@ int gpg_install(unsigned char app_state) { gpg_nvm_write(&N_gpg_pstate->keys[s].dec.attributes.value, (void*)C_default_AlgoAttrECC_dec, l); gpg_nvm_write(&N_gpg_pstate->keys[s].dec.attributes.length, &l, sizeof(unsigned int)); #endif + gpg_nvm_write(&N_gpg_pstate->keys[s].sig.UIF, &uif, 2); + gpg_nvm_write(&N_gpg_pstate->keys[s].dec.UIF, &uif, 2); + gpg_nvm_write(&N_gpg_pstate->keys[s].aut.UIF, &uif, 2); + + } } diff --git a/src/gpg_pso.c b/src/gpg_pso.c index f4d77fb..8d1895c 100644 --- a/src/gpg_pso.c +++ b/src/gpg_pso.c @@ -18,6 +18,7 @@ #include "gpg_types.h" #include "gpg_api.h" #include "gpg_vars.h" +#include "gpg_ux_nanos.h" const unsigned char gpg_oid_sha256[] = { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 @@ -41,16 +42,16 @@ static int gpg_sign(gpg_key_t *sigkey) { ksz = ksz>>3; switch(ksz) { case 1024/8: - key = (cx_rsa_private_key_t *)&sigkey->key.rsa1024; + key = (cx_rsa_private_key_t *)&sigkey->priv_key.rsa1024; break; case 2048/8: - key = (cx_rsa_private_key_t *)&sigkey->key.rsa2048; + key = (cx_rsa_private_key_t *)&sigkey->priv_key.rsa2048; break; case 3072/8: - key = (cx_rsa_private_key_t *)&sigkey->key.rsa3072; + key = (cx_rsa_private_key_t *)&sigkey->priv_key.rsa3072; break; case 4096/8: - key = (cx_rsa_private_key_t *)&sigkey->key.rsa4096; + key = (cx_rsa_private_key_t *)&sigkey->priv_key.rsa4096; break; } if (key->size != ksz) { @@ -83,21 +84,21 @@ static int gpg_sign(gpg_key_t *sigkey) { if ((sigkey->attributes.value[0] == 19) || (sigkey->attributes.value[0] == 22)) { cx_ecfp_private_key_t *key; - unsigned int sz,i,rs_len,info; + unsigned int sz,i,rs_len; unsigned char *rs; - key = &sigkey->key.ecfp256; - if (key->d_len != 32) { - THROW(SW_CONDITIONS_NOT_SATISFIED); - return SW_CONDITIONS_NOT_SATISFIED; - } + key = &sigkey->priv_key.ecfp; //sign if (sigkey->attributes.value[0] == 19) { - + sz = gpg_curve2domainlen(key->curve); + if ((sz == 0) || (key->d_len != sz)) { + THROW(SW_CONDITIONS_NOT_SATISFIED); + return SW_CONDITIONS_NOT_SATISFIED; + } sz = cx_ecdsa_sign(key, CX_RND_TRNG, CX_NONE, - G_gpg_vstate.work.io_buffer, 32/*G_gpg_vstate.io_length*/, + G_gpg_vstate.work.io_buffer, sz, G_gpg_vstate.work.io_buffer, GPG_IO_BUFFER_LENGTH, NULL); //reencode r,s in MPI format @@ -149,19 +150,27 @@ int gpg_apdu_pso() { switch(pso) { // --- PSO:CDS --- case 0x9e9a: - if ((G_gpg_vstate.kslot->sig.UIF[0]) && ((G_gpg_vstate.UIF_flags)==0)) { - ui_menu_uifconfirm_display(0); - return 0; + if (G_gpg_vstate.kslot->sig.UIF[0]) { + if ((G_gpg_vstate.UIF_flags)==0) { + ui_menu_uifconfirm_display(0); + return 0; + } + G_gpg_vstate.UIF_flags = 0; } - - case 0x8680: - if ((G_gpg_vstate.kslot->dec.UIF[0]) && ((G_gpg_vstate.UIF_flags)==0)) { - ui_menu_uifconfirm_display(0); - return 0; + break; + // --- PSO:DEC --- + case 0x8096: + if (G_gpg_vstate.kslot->dec.UIF[0]) { + if ((G_gpg_vstate.UIF_flags)==0) { + ui_menu_uifconfirm_display(0); + return 0; + } + G_gpg_vstate.UIF_flags = 0; } + break; } - + // --- PSO:ENC --- switch(pso) { // --- PSO:CDS --- case 0x9e9a: { @@ -214,16 +223,16 @@ int gpg_apdu_pso() { key = NULL; switch(ksz) { case 1024/8: - key = (cx_rsa_private_key_t *)&G_gpg_vstate.mse_dec->key.rsa1024; + key = (cx_rsa_private_key_t *)&G_gpg_vstate.mse_dec->priv_key.rsa1024; break; case 2048/8: - key = (cx_rsa_private_key_t *)&G_gpg_vstate.mse_dec->key.rsa2048; + key = (cx_rsa_private_key_t *)&G_gpg_vstate.mse_dec->priv_key.rsa2048; break; case 3072/8: - key = (cx_rsa_private_key_t *)&G_gpg_vstate.mse_dec->key.rsa3072; + key = (cx_rsa_private_key_t *)&G_gpg_vstate.mse_dec->priv_key.rsa3072; break; case 4096/8: - key = (cx_rsa_private_key_t *)&G_gpg_vstate.mse_dec->key.rsa4096; + key = (cx_rsa_private_key_t *)&G_gpg_vstate.mse_dec->priv_key.rsa4096; break; } @@ -272,11 +281,7 @@ int gpg_apdu_pso() { THROW(SW_CONDITIONS_NOT_SATISFIED); return SW_CONDITIONS_NOT_SATISFIED; } - key = &G_gpg_vstate.mse_dec->key.ecfp256; - if (key->d_len != 32) { - THROW(SW_CONDITIONS_NOT_SATISFIED); - return SW_CONDITIONS_NOT_SATISFIED; - } + key = &G_gpg_vstate.mse_dec->priv_key.ecfp; gpg_io_fetch_l(&l); gpg_io_fetch_tl(&t, &l); if (t != 0x7f49) { @@ -290,6 +295,10 @@ int gpg_apdu_pso() { } curve = gpg_oid2curve(G_gpg_vstate.mse_dec->attributes.value+1, G_gpg_vstate.mse_dec->attributes.length-1); + if (key->curve != curve) { + THROW(SW_CONDITIONS_NOT_SATISFIED); + return SW_CONDITIONS_NOT_SATISFIED; + } if (curve == CX_CURVE_Curve25519) { unsigned int i; @@ -335,9 +344,13 @@ int gpg_apdu_pso() { int gpg_apdu_internal_authenticate() { - if ((G_gpg_vstate.kslot->aut.UIF[0]) && ((G_gpg_vstate.UIF_flags)==0)) { - ui_menu_uifconfirm_display(0); - return 0; + // --- PSO:AUTH --- + if (G_gpg_vstate.kslot->aut.UIF[0]) { + if ((G_gpg_vstate.UIF_flags)==0) { + ui_menu_uifconfirm_display(0); + return 0; + } + G_gpg_vstate.UIF_flags = 0; } if (G_gpg_vstate.mse_aut->attributes.value[0] == 1) { diff --git a/src/gpg_types.h b/src/gpg_types.h index d34fc63..c98b766 100644 --- a/src/gpg_types.h +++ b/src/gpg_types.h @@ -36,7 +36,7 @@ #define GPG_KEY_ATTRIBUTES_LENGTH 12 -#define GPG_RSA_DEFAULT_PUB 0x010001U +#define GPG_RSA_DEFAULT_PUB 0x00010001U struct gpg_pin_s { unsigned int ref; @@ -66,15 +66,25 @@ typedef struct gpg_key_s { LV(attributes,GPG_KEY_ATTRIBUTES_LENGTH); /* key value */ union { + cx_rsa_private_key_t rsa; cx_rsa_1024_private_key_t rsa1024; cx_rsa_2048_private_key_t rsa2048; cx_rsa_3072_private_key_t rsa3072; cx_rsa_4096_private_key_t rsa4096; - cx_ecfp_private_key_t ecfp256; - } key; + + cx_ecfp_private_key_t ecfp; + cx_ecfp_256_private_key_t ecfp256; + cx_ecfp_384_private_key_t ecfp384; + cx_ecfp_512_private_key_t ecfp512; + cx_ecfp_640_private_key_t ecfp640; + } priv_key; union { - unsigned char rsa[4]; - cx_ecfp_public_key_t ecfp256; + unsigned char rsa[4]; + cx_ecfp_public_key_t ecfp; + cx_ecfp_256_public_key_t ecfp256; + cx_ecfp_384_public_key_t ecfp384; + cx_ecfp_512_public_key_t ecfp512; + cx_ecfp_640_public_key_t ecfp640; } pub_key; /* C7 C8 C9 , C5 = C7|C8|C9*/ unsigned char fingerprints[20]; @@ -193,26 +203,41 @@ struct gpg_v_state_s { unsigned short io_mark; union { unsigned char io_buffer[GPG_IO_BUFFER_LENGTH]; + struct { - cx_rsa_1024_public_key_t public; - cx_rsa_1024_private_key_t private; - }rsa1024; + union { + cx_rsa_public_key_t public; + cx_rsa_1024_public_key_t public1024; + cx_rsa_2048_public_key_t public2048; + cx_rsa_3072_public_key_t public3072; + cx_rsa_4096_public_key_t public4096; + }; + union { + cx_rsa_private_key_t private; + cx_rsa_1024_private_key_t private1024; + cx_rsa_2048_private_key_t private2048; + cx_rsa_3072_private_key_t private3072; + cx_rsa_4096_private_key_t private4096; + }; + } rsa; + struct { - cx_rsa_2048_public_key_t public; - cx_rsa_2048_private_key_t private; - }rsa2048; - struct { - cx_rsa_3072_public_key_t public; - cx_rsa_3072_private_key_t private; - }rsa3072; - struct { - cx_rsa_4096_public_key_t public; - cx_rsa_4096_private_key_t private; - }rsa4096; - struct { - cx_ecfp_public_key_t public; - cx_ecfp_private_key_t private; - }ecfp256; + union{ + cx_ecfp_public_key_t public; + cx_ecfp_256_public_key_t public256; + cx_ecfp_384_public_key_t public384; + cx_ecfp_512_public_key_t public512; + cx_ecfp_640_public_key_t public640; + }; + union { + cx_ecfp_private_key_t private; + cx_ecfp_256_private_key_t private256; + cx_ecfp_384_private_key_t private384; + cx_ecfp_512_private_key_t private512; + cx_ecfp_640_private_key_t private640; + }; + }ecfp; + struct { unsigned char md_buffer[GPG_IO_BUFFER_LENGTH-MAX(sizeof(cx_sha3_t),sizeof(cx_sha256_t))]; union { diff --git a/src/gpg_ux_msg.c b/src/gpg_ux_msg.c index e455438..c684890 100644 --- a/src/gpg_ux_msg.c +++ b/src/gpg_ux_msg.c @@ -34,3 +34,5 @@ const char * const C_NOT_ALLOWED = "Not Allowed "; const char * const C_DEFAULT_MODE = "Default mode"; + +const char * const C_UIF_LOCKED = "UIF locked"; diff --git a/src/gpg_ux_msg.h b/src/gpg_ux_msg.h index 1090930..38847a6 100644 --- a/src/gpg_ux_msg.h +++ b/src/gpg_ux_msg.h @@ -36,6 +36,9 @@ extern const char * const C_NOT_ALLOWED; extern const char * const C_DEFAULT_MODE; +extern const char * const C_UIF_LOCKED; +extern const char * const C_UIF_INVALID; + #define PICSTR(x) ((char*)PIC(x)) #define TEMPLATE_TYPE PICSTR(C_TEMPLATE_TYPE) @@ -54,5 +57,7 @@ extern const char * const C_DEFAULT_MODE; #define ALLOWED PICSTR(C_ALLOWED) #define NOT_ALLOWED PICSTR(C_NOT_ALLOWED) #define DEFAULT_MODE PICSTR(C_DEFAULT_MODE) +#define UIF_LOCKED PICSTR(C_UIF_LOCKED) +#define UIF_INVALID PICSTR(C_UIF_INVALID) #endif diff --git a/src/gpg_ux_nanos.c b/src/gpg_ux_nanos.c index e909c4c..d9e1808 100644 --- a/src/gpg_ux_nanos.c +++ b/src/gpg_ux_nanos.c @@ -134,7 +134,7 @@ void ui_menu_uifconfirm_display(unsigned int value) { unsigned int ui_uifconfirm_prepro(const bagl_element_t* element) { if (element->component.userid == 1) { - snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "Confirm Operation:"); + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "Confirm:"); return 1; } if (element->component.userid == 2) { @@ -175,7 +175,14 @@ unsigned int ui_uifconfirm_nanos_button(unsigned int button_mask, unsigned int b BEGIN_TRY { TRY { G_gpg_vstate.UIF_flags = 1; - sw = gpg_apdu_pso(); + if (G_gpg_vstate.io_ins == INS_PSO) { + sw = gpg_apdu_pso(); + } else if (G_gpg_vstate.io_ins == INS_INTERNAL_AUTHENTICATE) { + sw = gpg_apdu_internal_authenticate(); + } else { + gpg_io_discard(1); + sw = 0x6985; + } } CATCH_OTHER(e) { gpg_io_discard(1); @@ -499,12 +506,17 @@ static unsigned int validate_pin() { #define LABEL_AUT "Authentication" #define LABEL_DEC "Decryption" -#define LABEL_RSA2048 "RSA 2048" -#define LABEL_RSA3072 "RSA 3072" -#define LABEL_RSA4096 "RSA 4096" -#define LABEL_NISTP256 "NIST P256" -#define LABEL_BPOOLR1 "Brainpool R1" -#define LABEL_Ed25519 "Ed25519" +#define LABEL_RSA2048 "RSA 2048" +#define LABEL_RSA3072 "RSA 3072" +#define LABEL_RSA4096 "RSA 4096" +#define LABEL_NISTP256 "NIST P256" +//#define LABEL_NISTP384 "NIST P384" +//#define LABEL_NISTP521 "NIST P521" +#define LABEL_SECP256K1 "SEPC 256K1" +#define LABEL_BPOOL256R1 "Brainpool 256R1" +//#define LABEL_BPOOL384R1 "Brainpool 384R1" +//#define LABEL_BPOOL512R1 "Brainpool 512R1" +#define LABEL_Ed25519 "Ed25519" const ux_menu_entry_t ui_menu_template[] = { {ui_menu_tmpl_key, NULL, -1, NULL, "Choose key...", NULL, 0, 0}, @@ -548,12 +560,34 @@ const bagl_element_t* ui_menu_template_preprocessor(const ux_menu_entry_t* entry case 4096: snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_RSA4096); break; + case CX_CURVE_SECP256R1: snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_NISTP256); break; - case CX_CURVE_BrainPoolP256R1: - snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_BPOOLR1); + /* + case CX_CURVE_SECP384R1: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_NISTP384); break; + case CX_CURVE_SECP521R1: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_NISTP521); + break; + */ + case CX_CURVE_SECP256K1: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_SECP256K1); + break; + + case CX_CURVE_BrainPoolP256R1: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_BPOOL256R1); + break; + /* + case CX_CURVE_BrainPoolP384R1: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_BPOOL384R1); + break; + case CX_CURVE_BrainPoolP512R1: + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_BPOOL512R1); + break; + */ + case CX_CURVE_Ed25519: snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu)," %s", LABEL_Ed25519); break; @@ -574,7 +608,8 @@ void ui_menu_tmpl_set_action(unsigned int value) { LV(attributes,GPG_KEY_ATTRIBUTES_LENGTH); gpg_key_t* dest; const char* err; - + const unsigned char *oid; + unsigned int oid_len; err = NULL; os_memset(&attributes, 0, sizeof(attributes)); @@ -591,24 +626,21 @@ void ui_menu_tmpl_set_action(unsigned int value) { attributes.length = 6; break; + case CX_CURVE_SECP256K1: case CX_CURVE_SECP256R1: - if (G_gpg_vstate.ux_key == 2) { - attributes.value[0] = 18; //ecdh - } else { - attributes.value[0] = 19; //ecdsa - } - os_memmove(attributes.value+1, C_OID_SECP256R1, sizeof(C_OID_SECP256R1)); - attributes.length = 1+sizeof(C_OID_SECP256R1); - break; - + //case CX_CURVE_SECP384R1: + //case CX_CURVE_SECP521R1: case CX_CURVE_BrainPoolP256R1: - if (G_gpg_vstate.ux_key == 2) { + //case CX_CURVE_BrainPoolP384R1: + //case CX_CURVE_BrainPoolP512R1: + if (G_gpg_vstate.ux_key == 2) { attributes.value[0] = 18; //ecdh } else { attributes.value[0] = 19; //ecdsa } - os_memmove(attributes.value+1, C_OID_BRAINPOOL256R1, sizeof(C_OID_BRAINPOOL256R1)); - attributes.length = 1+sizeof(C_OID_BRAINPOOL256R1); + oid = gpg_curve2oid(G_gpg_vstate.ux_type, &oid_len); + os_memmove(attributes.value+1, oid, sizeof(oid_len)); + attributes.length = 1+oid_len; break; case CX_CURVE_Ed25519: @@ -623,7 +655,7 @@ void ui_menu_tmpl_set_action(unsigned int value) { } break; - default: + default: err = TEMPLATE_TYPE; goto ERROR; } @@ -670,13 +702,18 @@ void ui_menu_tmpl_key_action(unsigned int value) { const ux_menu_entry_t ui_menu_tmpl_type[] = { - {NULL, ui_menu_tmpl_type_action, 2048, NULL, LABEL_RSA2048, NULL, 0, 0}, - {NULL, ui_menu_tmpl_type_action, 3072, NULL, LABEL_RSA3072, NULL, 0, 0}, - {NULL, ui_menu_tmpl_type_action, 4096, NULL, LABEL_RSA4096, NULL, 0, 0}, - {NULL, ui_menu_tmpl_type_action, CX_CURVE_SECP256R1, NULL, LABEL_NISTP256, NULL, 0, 0}, - {NULL, ui_menu_tmpl_type_action, CX_CURVE_BrainPoolP256R1, NULL, LABEL_BPOOLR1, NULL, 0, 0}, - {NULL, ui_menu_tmpl_type_action, CX_CURVE_Ed25519, NULL, LABEL_Ed25519, NULL, 0, 0}, - {ui_menu_template, NULL, 1, &C_badge_back, "Back", NULL, 61, 40}, + {NULL, ui_menu_tmpl_type_action, 2048, NULL, LABEL_RSA2048, NULL, 0, 0}, + {NULL, ui_menu_tmpl_type_action, 3072, NULL, LABEL_RSA3072, NULL, 0, 0}, + {NULL, ui_menu_tmpl_type_action, 4096, NULL, LABEL_RSA4096, NULL, 0, 0}, + {NULL, ui_menu_tmpl_type_action, CX_CURVE_SECP256R1, NULL, LABEL_NISTP256, NULL, 0, 0}, +// {NULL, ui_menu_tmpl_type_action, CX_CURVE_SECP384R1, NULL, LABEL_NISTP384, NULL, 0, 0}, +// {NULL, ui_menu_tmpl_type_action, CX_CURVE_SECP521R1, NULL, LABEL_NISTP521, NULL, 0, 0}, + {NULL, ui_menu_tmpl_type_action, CX_CURVE_SECP256K1, NULL, LABEL_SECP256K1, NULL, 0, 0}, + {NULL, ui_menu_tmpl_type_action, CX_CURVE_BrainPoolP256R1, NULL, LABEL_BPOOL256R1, NULL, 0, 0}, +// {NULL, ui_menu_tmpl_type_action, CX_CURVE_BrainPoolP384R1, NULL, LABEL_BPOOL384R1, NULL, 0, 0}, +// {NULL, ui_menu_tmpl_type_action, CX_CURVE_BrainPoolP512R1, NULL, LABEL_BPOOL512R1, NULL, 0, 0}, + {NULL, ui_menu_tmpl_type_action, CX_CURVE_Ed25519, NULL, LABEL_Ed25519, NULL, 0, 0}, + {ui_menu_template, NULL, 1, &C_badge_back, "Back", NULL, 61, 40}, UX_MENU_END }; @@ -803,6 +840,84 @@ void ui_menu_pinmode_action(unsigned int value) { // redisplay first entry of the idle menu ui_menu_pinmode_display(0); } + + + +/* ------------------------------- UIF MODE UX ------------------------------ */ +const ux_menu_entry_t ui_menu_uifmode[]; +void ui_menu_uifmode_display(unsigned int value); +const bagl_element_t* ui_menu_uifmode_preprocessor(const ux_menu_entry_t* entry, bagl_element_t* element); +void ui_menu_uifmode_action(unsigned int value); + +const ux_menu_entry_t ui_menu_uifmode[] = { + {NULL, NULL, -1, NULL, "Activate (+) for:", NULL, 0, 0}, + {NULL, ui_menu_uifmode_action, 1, NULL, "Signature", NULL, 0, 0}, + {NULL, ui_menu_uifmode_action, 2, NULL, "Decryption", NULL, 0, 0}, + {NULL, ui_menu_uifmode_action, 3, NULL, "Authentication", NULL, 0, 0}, + {ui_menu_settings, NULL, 1, &C_badge_back, "Back", NULL, 61, 40}, + UX_MENU_END +}; + +void ui_menu_uifmode_display(unsigned int value) { + UX_MENU_DISPLAY(value, ui_menu_uifmode, ui_menu_uifmode_preprocessor); +} + +const bagl_element_t* ui_menu_uifmode_preprocessor(const ux_menu_entry_t* entry, bagl_element_t* element) { + if (element->component.userid==0x20) { + if ((entry->userid >= 1) && (entry->userid<=3)) { + unsigned char uif[2] ; + uif[0] = 0; + uif[1] = 0; + switch (entry->userid) { + case 1: + *uif = G_gpg_vstate.kslot->sig.UIF[0]?'+':' '; + break; + case 2: + *uif = G_gpg_vstate.kslot->dec.UIF[0]?'+':' '; + break; + case 3: + *uif = G_gpg_vstate.kslot->aut.UIF[0]?'+':' '; + break; + } + snprintf(G_gpg_vstate.menu, sizeof(G_gpg_vstate.menu), "%s %s", + (char*)PIC(entry->line1), uif); + element->text = G_gpg_vstate.menu; + element->component.height = 32; + } + } + return element; +} + +void ui_menu_uifmode_action(unsigned int value) { + unsigned char *uif; + unsigned char new_uif; + switch (value) { + case 1: + uif = &G_gpg_vstate.kslot->sig.UIF[0]; + break; + case 2: + uif = &G_gpg_vstate.kslot->dec.UIF[0]; + break; + case 3: + uif = &G_gpg_vstate.kslot->aut.UIF[0]; + break; + default: + ui_info(INVALID_SELECTION, NULL, ui_menu_uifmode_display,0); + return; + } + if (uif[0] == 0) { + new_uif = 1; + gpg_nvm_write(&uif[0], &new_uif, 1); + } else if (uif[0] == 1) { + new_uif = 0; + gpg_nvm_write(&uif[0], &new_uif, 1) ; + } else /*if (uif[0] == 2 )*/ { + ui_info(UIF_LOCKED, NULL, ui_menu_uifmode_display,0); + return; + } + ui_menu_uifmode_display(value); +} + /* -------------------------------- RESET UX --------------------------------- */ const ux_menu_entry_t ui_menu_reset[] = { @@ -829,6 +944,7 @@ const ux_menu_entry_t ui_menu_settings[] = { {NULL, ui_menu_template_display, 0, NULL, "Key template", NULL, 0, 0}, {NULL, ui_menu_seed_display, 0, NULL, "Seed mode", NULL, 0, 0}, {NULL, ui_menu_pinmode_display, 0, NULL, "PIN mode", NULL, 0, 0}, + {NULL, ui_menu_uifmode_display, 0, NULL, "UIF mode", NULL, 0, 0}, {ui_menu_reset, NULL, 0, NULL, "Reset", NULL, 0, 0}, {NULL, ui_menu_main_display, 2, &C_badge_back, "Back", NULL, 61, 40}, UX_MENU_END diff --git a/src/gpg_ux_nanos.h b/src/gpg_ux_nanos.h index 499c86b..ba41bf4 100644 --- a/src/gpg_ux_nanos.h +++ b/src/gpg_ux_nanos.h @@ -22,4 +22,5 @@ void ui_init(void); void ui_main_display(unsigned int value); void ui_menu_pinconfirm_display(unsigned int value); void ui_menu_pinentry_display(unsigned int value); +void ui_menu_uifconfirm_display(unsigned int value); #endif \ No newline at end of file diff --git a/src/sdk/usbd_ccid_cmd.c b/src/sdk/usbd_ccid_cmd.c new file mode 100755 index 0000000..1558d3d --- /dev/null +++ b/src/sdk/usbd_ccid_cmd.c @@ -0,0 +1,1057 @@ +/** + ****************************************************************************** + * @file usbd_ccid_cmd.c + * @author MCD Application Team + * @version V1.0.1 + * @date 31-January-2014 + * @brief CCID Commands handling + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +#pragma message "Override SDK source file :" __FILE__ + + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ccid_cmd.h" + +#ifdef HAVE_USB_CLASS_CCID + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +#define CCID_UpdateCommandStatus(cmd_status,icc_status)\ + G_io_ccid.bulk_header.bulkin.bStatus=(cmd_status|icc_status) + /* + The Above Macro can take any of following Values + #define BM_ICC_PRESENT_ACTIVE 0x00 + #define BM_ICC_PRESENT_INACTIVE 0x01 + #define BM_ICC_NO_ICC_PRESENT 0x02 + + #define BM_COMMAND_STATUS_OFFSET 0x06 + #define BM_COMMAND_STATUS_NO_ERROR 0x00 + #define BM_COMMAND_STATUS_FAILED (0x01 << BM_COMMAND_STATUS_OFFSET) + #define BM_COMMAND_STATUS_TIME_EXTN (0x02 << BM_COMMAND_STATUS_OFFSET) + */ + +/* Private function prototypes -----------------------------------------------*/ +static uint8_t CCID_CheckCommandParams (uint32_t param_type); + +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief PC_to_RDR_IccPowerOn + * PC_TO_RDR_ICCPOWERON message execution, apply voltage and get ATR + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_IccPowerOn(void) +{ + /* Apply the ICC VCC + Fills the Response buffer with ICC ATR + This Command is returned with RDR_to_PC_DataBlock(); + */ + + uint8_t voltage; + uint8_t sc_voltage = 0; + uint8_t error; + + G_io_ccid.bulk_header.bulkin.dwLength = 0; /* Reset Number of Bytes in abData */ + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_DWLENGTH | \ + CHK_PARAM_abRFU2 |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_ABORT ); + if (error != 0) + { + return error; + } + + /* Voltage that is applied to the ICC + 00h – Automatic Voltage Selection + 01h – 5.0 volts + 02h – 3.0 volts + 03h – 1.8 volts + */ + /* G_io_ccid.bulk_header.bulkout.bSpecific_0 Contains bPowerSelect */ + voltage = G_io_ccid.bulk_header.bulkout.bSpecific_0; + if (voltage >= VOLTAGE_SELECTION_1V8) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + return SLOTERROR_BAD_POWERSELECT; /* The Voltage specified is out of Spec */ + } + + /* Correct Voltage Requested by the Host */ + if ((voltage == VOLTAGE_SELECTION_AUTOMATIC) || + (voltage == VOLTAGE_SELECTION_3V)) + { + /* voltage == 00 Voltage Automatic + voltage == 01 Voltage Automatic = 5.0V + voltage == 02 Voltage Automatic = 3V + voltage == 03 Voltage Automatic = 1.8V + */ + sc_voltage = SC_VOLTAGE_3V; + } + else if (voltage == VOLTAGE_SELECTION_5V) + { + sc_voltage = SC_VOLTAGE_5V; + } + + G_io_ccid.bulk_header.bulkin.dwLength = SC_AnswerToReset(sc_voltage, G_io_ccid_data_buffer); + + /* Check if the Card has come to Active State*/ + error = CCID_CheckCommandParams(CHK_ACTIVE_STATE); + if (error != 0) + { + /* Check if Voltage is not Automatic */ + if (voltage != 0) + { /* If Specific Voltage requested by Host i.e 3V or 5V*/ + return error; + } + else + {/* Automatic Voltage selection requested by Host */ + + if (sc_voltage != SC_VOLTAGE_5V) + { /* If voltage selected was Automatic and 5V is not yet tried */ + sc_voltage = SC_VOLTAGE_5V; + G_io_ccid.bulk_header.bulkin.dwLength = SC_AnswerToReset(sc_voltage, G_io_ccid_data_buffer); + + /* Check again the State */ + error = CCID_CheckCommandParams(CHK_ACTIVE_STATE); + if (error != 0) + return error; + + } + else + { /* Voltage requested from Host was 5V already*/ + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_INACTIVE); + return error; + } + } /* Voltage Selection was automatic */ + } /* If Active State */ + + /* ATR is received, No Error Condition Found */ + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + + return SLOT_NO_ERROR; +} + +/** + * @brief PC_to_RDR_IccPowerOff + * Icc VCC is switched Off + * @param None + * @retval uint8_t error: status of the command execution + */ +uint8_t PC_to_RDR_IccPowerOff(void) +{ + /* The response to this command message is the RDR_to_PC_SlotStatus + response message. */ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_abRFU3 |\ + CHK_PARAM_DWLENGTH ); + if (error != 0) + { + return error; + } + + /* Command is ok, Check for Card Presence */ + if (SC_Detect()) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR,BM_ICC_PRESENT_INACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR,BM_ICC_NO_ICC_PRESENT); + } + + /* Power OFF the card */ + SC_Poweroff(); + + return SLOT_NO_ERROR; +} + +/** + * @brief PC_to_RDR_GetSlotStatus + * Provides the Slot status to the host + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_GetSlotStatus(void) +{ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_DWLENGTH |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU3 ); + if (error != 0) + { + return error; + } + + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR,BM_ICC_PRESENT_ACTIVE); + return SLOT_NO_ERROR; +} + + +/** + * @brief PC_to_RDR_XfrBlock + * Handles the Block transfer from Host. + * Response to this command message is the RDR_to_PC_DataBlock + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_XfrBlock(void) +{ + uint16_t expectedLength, reqlen; + + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU3 |\ + CHK_PARAM_ABORT |\ + CHK_ACTIVE_STATE ); + if (error != 0) + return error; + + if (G_io_ccid.bulk_header.bulkout.dwLength > IO_CCID_DATA_BUFFER_SIZE) + { /* Check amount of Data Sent by Host is > than memory allocated ? */ + + return SLOTERROR_BAD_DWLENGTH; + } + + + /* wLevelParameter = Size of expected data to be returned by the + bulk-IN endpoint */ + expectedLength = (G_io_ccid.bulk_header.bulkout.bSpecific_2 << 8) | + G_io_ccid.bulk_header.bulkout.bSpecific_1; + + reqlen = G_io_ccid.bulk_header.bulkout.dwLength; + + G_io_ccid.bulk_header.bulkin.dwLength = (uint16_t)expectedLength; + + + error = SC_XferBlock(&G_io_ccid_data_buffer[0], + reqlen, + &expectedLength); + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + error = SLOT_NO_ERROR; + } + + return error; +} + + +/** + * @brief PC_to_RDR_GetParameters + * Provides the ICC parameters to the host + * Response to this command message is the RDR_to_PC_Parameters + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_GetParameters(void) +{ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_DWLENGTH |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU3 ); + if (error != 0) + return error; + + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + + return SLOT_NO_ERROR; +} + + +/** + * @brief PC_to_RDR_ResetParameters + * Set the ICC parameters to the default + * Response to this command message is the RDR_to_PC_Parameters + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_ResetParameters(void) +{ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_DWLENGTH |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU3 |\ + CHK_ACTIVE_STATE); + if (error != 0) + return error; + + /* This command resets the slot parameters to their default values */ + G_io_ccid.Protocol0_DataStructure.bmFindexDindex = DEFAULT_FIDI; + G_io_ccid.Protocol0_DataStructure.bmTCCKST0 = DEFAULT_T01CONVCHECKSUM; + G_io_ccid.Protocol0_DataStructure.bGuardTimeT0 = DEFAULT_EXTRA_GUARDTIME; + G_io_ccid.Protocol0_DataStructure.bWaitingIntegerT0 = DEFAULT_WAITINGINTEGER; + G_io_ccid.Protocol0_DataStructure.bClockStop = DEFAULT_CLOCKSTOP; + + error = SC_SetParams(&G_io_ccid.Protocol0_DataStructure); + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + error = SLOT_NO_ERROR; + } + + return error; +} + + +/** + * @brief PC_to_RDR_SetParameters + * Set the ICC parameters to the host defined parameters + * Response to this command message is the RDR_to_PC_Parameters + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_SetParameters(void) +{ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU2 |\ + CHK_ACTIVE_STATE); + if (error != 0) + return error; + + error = SLOT_NO_ERROR; + + /* for Protocol T=0 (bProtocolNum=0) (dwLength=00000005h) */ + if ( (G_io_ccid.bulk_header.bulkout.dwLength == 5) && + (G_io_ccid.bulk_header.bulkout.bSpecific_0 != 0)) + error = SLOTERROR_BAD_PROTOCOLNUM; + + /* for Protocol T=1 (bProtocolNum=1) (dwLength=00000007h) */ + if ( (G_io_ccid.bulk_header.bulkout.dwLength == 7) && + (G_io_ccid.bulk_header.bulkout.bSpecific_0 != 1)) + error = SLOTERROR_CMD_NOT_SUPPORTED; + + /* For T0, Waiting Integer 0 supported */ + if (G_io_ccid_data_buffer[3] != 0) + error = SLOTERROR_BAD_WAITINGINTEGER; + + if (G_io_ccid_data_buffer[4] != DEFAULT_CLOCKSTOP) + error = SLOTERROR_BAD_CLOCKSTOP; + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + + os_memmove(&G_io_ccid.Protocol0_DataStructure, (Protocol0_DataStructure_t*)(&(G_io_ccid_data_buffer[0])), sizeof(Protocol0_DataStructure_t)); + error = SC_SetParams(&G_io_ccid.Protocol0_DataStructure); + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + error = SLOT_NO_ERROR; + } + + return error; +} + + +/** + * @brief PC_to_RDR_Escape + * Execute the Escape command. This is user specific Implementation + * Response to this command message is the RDR_to_PC_Escape + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_Escape(void) +{ + uint8_t error; + uint16_t size; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU3 |\ + CHK_PARAM_ABORT |\ + CHK_ACTIVE_STATE); + + if (error != 0) + return error; + + error = SC_ExecuteEscape(&G_io_ccid_data_buffer[0], + G_io_ccid.bulk_header.bulkout.dwLength, + &G_io_ccid_data_buffer[0], + &size); + + G_io_ccid.bulk_header.bulkin.dwLength = size; + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + } + + return error; +} + + +/** + * @brief PC_to_RDR_IccClock + * Execute the Clock specific command from host + * Response to this command message is the RDR_to_PC_SlotStatus + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_IccClock(void) +{ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU2 |\ + CHK_PARAM_DWLENGTH|\ + CHK_ACTIVE_STATE); + if (error != 0) + return error; + + /* bClockCommand • 00h restarts Clock + • 01h Stops Clock in the state shown in the bClockStop + field of the PC_to_RDR_SetParameters command + and RDR_to_PC_Parameters message.*/ + if (G_io_ccid.bulk_header.bulkout.bSpecific_0 > 1) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + return SLOTERROR_BAD_CLOCKCOMMAND; + } + + error = SC_SetClock(G_io_ccid.bulk_header.bulkout.bSpecific_0); + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + } + + return error; +} + + +/** + * @brief PC_to_RDR_Abort + * Execute the Abort command from host, This stops all Bulk transfers + * from host and ICC + * Response to this command message is the RDR_to_PC_SlotStatus + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_to_RDR_Abort(void) +{ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_abRFU3 |\ + CHK_PARAM_DWLENGTH); + if (error != 0) + return error; + + CCID_CmdAbort (G_io_ccid.bulk_header.bulkout.bSlot, G_io_ccid.bulk_header.bulkout.bSeq); + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR,BM_ICC_PRESENT_ACTIVE); + return SLOT_NO_ERROR; +} + +/** + * @brief CCID_CmdAbort + * Execute the Abort command from Bulk EP or from Control EP, + * This stops all Bulk transfers from host and ICC + * @param uint8_t slot: slot number that host wants to abort + * @param uint8_t seq : Seq number for PC_to_RDR_Abort + * @retval uint8_t status of the command execution + */ +uint8_t CCID_CmdAbort(uint8_t slot, uint8_t seq) +{ + /* This function is called for REQUEST_ABORT & PC_to_RDR_Abort */ + + if (slot >= CCID_NUMBER_OF_SLOTS) + { /* This error condition is possible only from CLASS_REQUEST, otherwise + Slot is already checked in parameters from PC_to_RDR_Abort request */ + /* Slot requested is more than supported by Firmware */ + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_NO_ICC_PRESENT); + return SLOTERROR_BAD_SLOT; + } + + if ( G_io_ccid.usb_ccid_param.bAbortRequestFlag == 1) + { /* Abort Command was already received from ClassReq or PC_to_RDR */ + if (( G_io_ccid.usb_ccid_param.bSeq == seq) && (G_io_ccid.usb_ccid_param.bSlot == slot)) + { + /* CLASS Specific request is already Received, Reset the abort flag */ + G_io_ccid.usb_ccid_param.bAbortRequestFlag = 0; + } + } + else + { + /* Abort Command was NOT received from ClassReq or PC_to_RDR, + so save them for next ABORT command to verify */ + G_io_ccid.usb_ccid_param.bAbortRequestFlag = 1; + G_io_ccid.usb_ccid_param.bSeq = seq ; + G_io_ccid.usb_ccid_param.bSlot = slot; + } + + return 0; +} + +/** + * @brief PC_TO_RDR_T0Apdu + * Execute the PC_TO_RDR_T0APDU command from host + * Response to this command message is the RDR_to_PC_SlotStatus + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_TO_RDR_T0Apdu(void) +{ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_DWLENGTH | + CHK_PARAM_ABORT ); + if (error != 0) + return error; + + if (G_io_ccid.bulk_header.bulkout.bSpecific_0 > 0x03) + {/* Bit 0 is associated with field bClassGetResponse + Bit 1 is associated with field bClassEnvelope + Other bits are RFU.*/ + + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + return SLOTERROR_BAD_BMCHANGES; + } + + error = SC_T0Apdu(G_io_ccid.bulk_header.bulkout.bSpecific_0, + G_io_ccid.bulk_header.bulkout.bSpecific_1, + G_io_ccid.bulk_header.bulkout.bSpecific_2); + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + } + + return error; +} + +/** + * @brief PC_TO_RDR_Mechanical + * Execute the PC_TO_RDR_MECHANICAL command from host + * Response to this command message is the RDR_to_PC_SlotStatus + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_TO_RDR_Mechanical(void) +{ + uint8_t error; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU2 |\ + CHK_PARAM_DWLENGTH + ); + if (error != 0) + return error; + + if (G_io_ccid.bulk_header.bulkout.bSpecific_0 > 0x05) + {/* 01h – Accept Card + 02h – Eject Card + 03h – Capture Card + 04h – Lock Card + 05h – Unlock Card*/ + + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + return SLOTERROR_BAD_BFUNCTION_MECHANICAL; + } + + error = SC_Mechanical(G_io_ccid.bulk_header.bulkout.bSpecific_0); + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + } + + return error; +} + +/** + * @brief PC_TO_RDR_SetDataRateAndClockFrequency + * Set the required Card Frequency and Data rate from the host. + * Response to this command message is the + * RDR_to_PC_DataRateAndClockFrequency + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_TO_RDR_SetDataRateAndClockFrequency(void) +{ + uint8_t error; + uint32_t clockFrequency; + uint32_t dataRate; + uint32_t temp =0; + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_abRFU3); + if (error != 0) + return error; + + if (G_io_ccid.bulk_header.bulkout.dwLength != 0x08) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_ACTIVE); + return SLOTERROR_BAD_LENTGH; + } + + /* HERE we avoiding to an unaligned memory access*/ + clockFrequency = U4LE(G_io_ccid_data_buffer, 0); + dataRate = U4LE(G_io_ccid_data_buffer, 4); + + error = SC_SetDataRateAndClockFrequency(clockFrequency, dataRate); + G_io_ccid.bulk_header.bulkin.bError = error; + + if (error != SLOT_NO_ERROR) + { + G_io_ccid.bulk_header.bulkin.dwLength = 0; + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + G_io_ccid.bulk_header.bulkin.dwLength = 8; + + (G_io_ccid_data_buffer[0]) = clockFrequency & 0x000000FF ; + (G_io_ccid_data_buffer[1]) = (clockFrequency & 0x0000FF00) >> 8; + (G_io_ccid_data_buffer[2]) = (clockFrequency & 0x00FF0000) >> 16; + (G_io_ccid_data_buffer[3]) = (clockFrequency & 0xFF000000) >> 24; + (G_io_ccid_data_buffer[4]) = dataRate & 0x000000FF ; + (G_io_ccid_data_buffer[5]) = (dataRate & 0x0000FF00) >> 8; + (G_io_ccid_data_buffer[6]) = (dataRate & 0x00FF0000) >> 16; + (G_io_ccid_data_buffer[7]) = (dataRate & 0xFF000000) >> 24; + + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + } + + return error; +} + +/** + * @brief PC_TO_RDR_Secure + * Execute the Secure Command from the host. + * Response to this command message is the RDR_to_PC_DataBlock + * @param None + * @retval uint8_t status of the command execution + */ +uint8_t PC_TO_RDR_Secure(void) +{ + uint8_t error; + uint8_t bBWI; + uint16_t wLevelParameter; + uint32_t responseLen; + + + error = CCID_CheckCommandParams(CHK_PARAM_SLOT |\ + CHK_PARAM_CARD_PRESENT |\ + CHK_PARAM_ABORT ); + + if (error != 0) { + G_io_ccid.bulk_header.bulkin.dwLength = 0; + return error; + } + + bBWI = G_io_ccid.bulk_header.bulkout.bSpecific_0; + wLevelParameter = (G_io_ccid.bulk_header.bulkout.bSpecific_1 + ((uint16_t)G_io_ccid.bulk_header.bulkout.bSpecific_2<<8)); + + if ((EXCHANGE_LEVEL_FEATURE == TPDU_EXCHANGE) || + (EXCHANGE_LEVEL_FEATURE == SHORT_APDU_EXCHANGE)) + { + /* TPDU level & short APDU level, wLevelParameter is RFU, = 0000h */ + if (wLevelParameter != 0 ) + { + G_io_ccid.bulk_header.bulkin.dwLength = 0; + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + error = SLOTERROR_BAD_LEVELPARAMETER; + return error; + } + } + + error = SC_Secure(G_io_ccid.bulk_header.bulkout.dwLength - CCID_HEADER_SIZE, bBWI, wLevelParameter, + &G_io_ccid_data_buffer[0], &responseLen); + + G_io_ccid.bulk_header.bulkin.dwLength = responseLen; + + if (error != SLOT_NO_ERROR) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED, BM_ICC_PRESENT_ACTIVE); + } + else + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_NO_ERROR, BM_ICC_PRESENT_ACTIVE); + } + + return error; +} + +/******************************************************************************/ +/* BULK IN ROUTINES */ +/******************************************************************************/ + +/** + * @brief RDR_to_PC_DataBlock + * Provide the data block response to the host + * Response for PC_to_RDR_IccPowerOn, PC_to_RDR_XfrBlock + * @param uint8_t errorCode: code to be returned to the host + * @retval None + */ +void RDR_to_PC_DataBlock(uint8_t errorCode) +{ + G_io_ccid.bulk_header.bulkin.bMessageType = RDR_TO_PC_DATABLOCK; + G_io_ccid.bulk_header.bulkin.bError = errorCode; + G_io_ccid.bulk_header.bulkin.bSpecific=0; /* bChainParameter */ + + /* void the Length Specified in Command */ + if(errorCode != SLOT_NO_ERROR) + { + G_io_ccid.bulk_header.bulkin.dwLength = 0; + } + + Transfer_Data_Request(); + +} + + +/** + * @brief RDR_to_PC_SlotStatus + * Provide the Slot status response to the host + * Response for PC_to_RDR_IccPowerOff + * PC_to_RDR_GetSlotStatus + * PC_to_RDR_IccClock + * PC_to_RDR_T0APDU + * PC_to_RDR_Mechanical + * Also the device sends this response message when it has completed + * aborting a slot after receiving both the Class Specific ABORT request + * and PC_to_RDR_Abort command message. + * @param uint8_t errorCode: code to be returned to the host + * @retval None + */ +void RDR_to_PC_SlotStatus(uint8_t errorCode) +{ + + G_io_ccid.bulk_header.bulkin.bMessageType = RDR_TO_PC_SLOTSTATUS; + G_io_ccid.bulk_header.bulkin.dwLength =0; + G_io_ccid.bulk_header.bulkin.bError = errorCode; + G_io_ccid.bulk_header.bulkin.bSpecific=0; /* bClockStatus = 00h Clock running + 01h Clock stopped in state L + 02h Clock stopped in state H + 03h Clock stopped in an unknown state + All other values are RFU. */ + + Transfer_Data_Request(); + +} + +/** + * @brief RDR_to_PC_Parameters + * Provide the data block response to the host + * Response for PC_to_RDR_GetParameters, PC_to_RDR_ResetParameters + * PC_to_RDR_SetParameters + * @param uint8_t errorCode: code to be returned to the host + * @retval None + */ +void RDR_to_PC_Parameters(uint8_t errorCode) +{ + + G_io_ccid.bulk_header.bulkin.bMessageType = RDR_TO_PC_PARAMETERS; + G_io_ccid.bulk_header.bulkin.bError = errorCode; + + if(errorCode == SLOT_NO_ERROR) + { + G_io_ccid.bulk_header.bulkin.dwLength = LEN_PROTOCOL_STRUCT_T0; + } + else + { + G_io_ccid.bulk_header.bulkin.dwLength = 0; + } + + os_memmove(G_io_ccid_data_buffer, &G_io_ccid.Protocol0_DataStructure, sizeof(G_io_ccid.Protocol0_DataStructure)); + + /* bProtocolNum */ + G_io_ccid.bulk_header.bulkin.bSpecific = BPROTOCOL_NUM_T0; + + Transfer_Data_Request(); +} + +/** + * @brief RDR_to_PC_Escape + * Provide the Escaped data block response to the host + * Response for PC_to_RDR_Escape + * @param uint8_t errorCode: code to be returned to the host + * @retval None + */ +void RDR_to_PC_Escape(uint8_t errorCode) +{ + G_io_ccid.bulk_header.bulkin.bMessageType = RDR_TO_PC_ESCAPE; + + G_io_ccid.bulk_header.bulkin.bSpecific=0; /* Reserved for Future Use */ + G_io_ccid.bulk_header.bulkin.bError = errorCode; + + /* void the Length Specified in Command */ + if(errorCode != SLOT_NO_ERROR) + { + G_io_ccid.bulk_header.bulkin.dwLength = 0; + } + + Transfer_Data_Request(); +} + + + +/** + * @brief RDR_to_PC_DataRateAndClockFrequency + * Provide the Clock and Data Rate information to host + * Response for PC_TO_RDR_SetDataRateAndClockFrequency + * @param uint8_t errorCode: code to be returned to the host + * @retval None + */ +void RDR_to_PC_DataRateAndClockFrequency(uint8_t errorCode) +{ + /* + uint16_t length = CCID_RESPONSE_HEADER_SIZE; + */ + + G_io_ccid.bulk_header.bulkin.bMessageType = RDR_TO_PC_DATARATEANDCLOCKFREQUENCY; + G_io_ccid.bulk_header.bulkin.bError = errorCode; + G_io_ccid.bulk_header.bulkin.bSpecific=0; /* Reserved for Future Use */ + + /* void the Length Specified in Command */ + if(errorCode != SLOT_NO_ERROR) + { + G_io_ccid.bulk_header.bulkin.dwLength = 0; + } + + Transfer_Data_Request(); +} + +#ifdef HAVE_CCID_INTERRUPT +/** + * @brief RDR_to_PC_NotifySlotChange + * Interrupt message to be sent to the host, Checks the card presence + * status and update the buffer accordingly + * @param None + * @retval None + */ +void RDR_to_PC_NotifySlotChange(void) +{ + G_io_ccid.UsbIntMessageBuffer[OFFSET_INT_BMESSAGETYPE] = RDR_TO_PC_NOTIFYSLOTCHANGE; + + if (SC_Detect() ) + { + /* + SLOT_ICC_PRESENT 0x01 : LSb : (0b = no ICC present, 1b = ICC present) + SLOT_ICC_CHANGE 0x02 : MSb : (0b = no change, 1b = change). + */ + G_io_ccid.UsbIntMessageBuffer[OFFSET_INT_BMSLOTICCSTATE] = SLOT_ICC_PRESENT | + SLOT_ICC_CHANGE; + } + else + { + G_io_ccid.UsbIntMessageBuffer[OFFSET_INT_BMSLOTICCSTATE] = SLOT_ICC_CHANGE; + + /* Power OFF the card */ + SC_Poweroff(); + } +} +#endif // HAVE_CCID_INTERRUPT + + +/** + * @brief CCID_UpdSlotStatus + * Updates the variable for the slot status + * @param uint8_t slotStatus : slot status from the calling function + * @retval None + */ +void CCID_UpdSlotStatus (uint8_t slotStatus) +{ + G_io_ccid.Ccid_SlotStatus.SlotStatus = slotStatus; +} + +/** + * @brief CCID_UpdSlotChange + * Updates the variable for the slot change status + * @param uint8_t changeStatus : slot change status from the calling function + * @retval None + */ +void CCID_UpdSlotChange (uint8_t changeStatus) +{ + G_io_ccid.Ccid_SlotStatus.SlotStatusChange = changeStatus; +} + +/** + * @brief CCID_IsSlotStatusChange + * Provides the value of the variable for the slot change status + * @param None + * @retval uint8_t slot change status + */ +uint8_t CCID_IsSlotStatusChange (void) +{ + return G_io_ccid.Ccid_SlotStatus.SlotStatusChange; +} + +/** + * @brief CCID_CheckCommandParams + * Checks the specific parameters requested by the function and update + * status accordingly. This function is called from all + * PC_to_RDR functions + * @param uint32_t param_type : Parameter enum to be checked by calling function + * @retval uint8_t status + */ +static uint8_t CCID_CheckCommandParams (uint32_t param_type) +{ + uint32_t parameter; + + G_io_ccid.bulk_header.bulkin.bStatus = BM_ICC_PRESENT_ACTIVE | BM_COMMAND_STATUS_NO_ERROR ; + + parameter = (uint32_t)param_type; + + if (parameter & CHK_PARAM_SLOT) + { + /* + The slot number (bSlot) identifies which ICC slot is being addressed + by the message, if the CCID supports multiple slots. + The slot number is zero-relative, and is in the range of zero to FFh. + */ + + /* SLOT Number is 0 onwards, so always < CCID_NUMBER_OF_SLOTs */ + /* Error Condition !!! */ + if (G_io_ccid.bulk_header.bulkout.bSlot >= CCID_NUMBER_OF_SLOTS) + { /* Slot requested is more than supported by Firmware */ + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_NO_ICC_PRESENT); + return SLOTERROR_BAD_SLOT; + } + } + + if (parameter & CHK_PARAM_CARD_PRESENT) + { + /* Commands Parameters ok, Check the Card Status */ + if (SC_Detect() == 0) + { /* Card is Not detected */ + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_NO_ICC_PRESENT); + return SLOTERROR_ICC_MUTE; + } + } + + /* Check that DwLength is 0 */ + if (parameter & CHK_PARAM_DWLENGTH) + { + if (G_io_ccid.bulk_header.bulkout.dwLength != 0) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_ACTIVE); + return SLOTERROR_BAD_LENTGH; + } + } + + /* abRFU 2 : Reserved for Future Use*/ + if (parameter & CHK_PARAM_abRFU2) + { + + if ((G_io_ccid.bulk_header.bulkout.bSpecific_1 != 0) || + (G_io_ccid.bulk_header.bulkout.bSpecific_2 != 0)) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_ACTIVE); + return SLOTERROR_BAD_ABRFU_2B; /* bSpecific_1 */ + } + } + + if (parameter & CHK_PARAM_abRFU3) + { + /* abRFU 3 : Reserved for Future Use*/ + if ((G_io_ccid.bulk_header.bulkout.bSpecific_0 != 0) || + (G_io_ccid.bulk_header.bulkout.bSpecific_1 != 0) || + (G_io_ccid.bulk_header.bulkout.bSpecific_2 != 0)) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_ACTIVE); + return SLOTERROR_BAD_ABRFU_3B; + } + } + + + if (parameter & CHK_PARAM_ABORT) + { + if( G_io_ccid.usb_ccid_param.bAbortRequestFlag ) + { + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_INACTIVE); + return SLOTERROR_CMD_ABORTED; + } + } + + if (parameter & CHK_ACTIVE_STATE) + { + /* Commands Parameters ok, Check the Card Status */ + /* Card is detected */ + if (! SC_Detect()) + { + /* Check that from Lower Layers, the SmartCard come to known state */ + CCID_UpdateCommandStatus(BM_COMMAND_STATUS_FAILED,BM_ICC_PRESENT_INACTIVE); + return SLOTERROR_HW_ERROR; + } + } + + return 0; +} + +#endif // HAVE_USB_CLASS_CCID + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/src/sdk/usbd_ccid_if.c b/src/sdk/usbd_ccid_if.c new file mode 100755 index 0000000..a709032 --- /dev/null +++ b/src/sdk/usbd_ccid_if.c @@ -0,0 +1,617 @@ +/** + ****************************************************************************** + * @file usbd_ccid_if.c + * @author MCD Application Team + * @version V1.0.1 + * @date 31-January-2014 + * @brief This file provides all the functions for USB Interface for CCID + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +#pragma message "Override SDK source file :" __FILE__ + +/* Includes ------------------------------------------------------------------*/ +#include "os.h" +#include "usbd_ccid_if.h" + +#ifdef HAVE_USB_CLASS_CCID + +#if CCID_BULK_EPIN_SIZE > USB_SEGMENT_SIZE + #error configuration error, the USB MAX SEGMENT SIZE does not support the CCID endpoint (CCID_BULK_EPIN_SIZE vs USB_SEGMENT_SIZE) +#endif + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +usb_class_ccid_t G_io_ccid; + +/* Private function prototypes -----------------------------------------------*/ +static void CCID_Response_SendData (USBD_HandleTypeDef *pdev, + uint8_t* pbuf, + uint16_t len); +/* Private function ----------------------------------------------------------*/ +/** + * @brief CCID_Init + * Initialize the CCID USB Layer + * @param pdev: device instance + * @retval None + */ +void CCID_Init (USBD_HandleTypeDef *pdev) +{ + memset(&G_io_ccid, 0, sizeof(G_io_ccid)); + + /* CCID Related Initialization */ +#ifdef HAVE_CCID_INTERRUPT + CCID_SetIntrTransferStatus(1); /* Transfer Complete Status */ +#endif // HAVE_CCID_INTERRUPT + CCID_UpdSlotChange(1); + SC_InitParams(); + + /* Prepare Out endpoint to receive 1st packet */ + G_io_ccid.Ccid_BulkState = CCID_STATE_IDLE; + USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); + + // send the smartcard as inserted state at boot time + io_usb_ccid_set_card_inserted(1); +} + +/** + * @brief CCID_DeInit + * Uninitialize the CCID Machine + * @param pdev: device instance + * @retval None + */ +void CCID_DeInit (USBD_HandleTypeDef *pdev) +{ + UNUSED(pdev); + G_io_ccid.Ccid_BulkState = CCID_STATE_IDLE; +} + +/** + * @brief CCID_Message_In + * Handle Bulk IN & Intr IN data stage + * @param pdev: device instance + * @param uint8_t epnum: endpoint index + * @retval None + */ +void CCID_BulkMessage_In (USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + if (epnum == (CCID_BULK_IN_EP & 0x7F)) + {/* Filter the epnum by masking with 0x7f (mask of IN Direction) */ + + /*************** Handle Bulk Transfer IN data completion *****************/ + + switch (G_io_ccid.Ccid_BulkState) + { + case CCID_STATE_SEND_RESP: { + unsigned int remLen = G_io_ccid.UsbMessageLength; + + // advance with acknowledged sent chunk + if (G_io_ccid.pUsbMessageBuffer == &G_io_ccid.bulk_header) { + // first part of the bulk in sent. + // advance in the data buffer to transmit. (mixed source leap) + G_io_ccid.pUsbMessageBuffer = G_io_ccid_data_buffer+MIN(CCID_BULK_EPIN_SIZE, G_io_ccid.UsbMessageLength)-CCID_HEADER_SIZE; + } + else { + G_io_ccid.pUsbMessageBuffer += MIN(CCID_BULK_EPIN_SIZE, G_io_ccid.UsbMessageLength); + } + G_io_ccid.UsbMessageLength -= MIN(CCID_BULK_EPIN_SIZE, G_io_ccid.UsbMessageLength); + + // if remaining length is > EPIN_SIZE: send a filled bulk packet + if (G_io_ccid.UsbMessageLength >= CCID_BULK_EPIN_SIZE) { + CCID_Response_SendData(pdev, G_io_ccid.pUsbMessageBuffer, + // use the header declared size packet must be well formed + CCID_BULK_EPIN_SIZE); + } + + // if remaining length is 0; send an empty packet and prepare to receive a new command + else if (G_io_ccid.UsbMessageLength == 0 && remLen == CCID_BULK_EPIN_SIZE) { + CCID_Response_SendData(pdev, G_io_ccid.pUsbMessageBuffer, + // use the header declared size packet must be well formed + 0); + goto last_xfer; // won't wait ack to avoid missing a command + } + // else if no more data, then last packet sent, go back to idle (done on transfer ack) + else if (G_io_ccid.UsbMessageLength == 0) { // robustness only + last_xfer: + G_io_ccid.Ccid_BulkState = CCID_STATE_IDLE; + + /* Prepare EP to Receive First Cmd */ + // not timeout compliant // USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); + } + + // if remaining length is < EPIN_SIZE: send packet and prepare to receive a new command + else if (G_io_ccid.UsbMessageLength < CCID_BULK_EPIN_SIZE) { + CCID_Response_SendData(pdev, G_io_ccid.pUsbMessageBuffer, + // use the header declared size packet must be well formed + G_io_ccid.UsbMessageLength); + goto last_xfer; // won't wait ack to avoid missing a command + } + + break; + } + + default: + break; + } + } +#ifdef HAVE_CCID_INTERRUPT + else if (epnum == (CCID_INTR_IN_EP & 0x7F)) + { + /* Filter the epnum by masking with 0x7f (mask of IN Direction) */ + CCID_SetIntrTransferStatus(1); /* Transfer Complete Status */ + } +#endif // HAVE_CCID_INTERRUPT +} + +void CCID_Send_Reply(USBD_HandleTypeDef *pdev) { + /********** Decide for all commands ***************/ + if (G_io_ccid.Ccid_BulkState == CCID_STATE_SEND_RESP) + { + G_io_ccid.UsbMessageLength = G_io_ccid.bulk_header.bulkin.dwLength+CCID_HEADER_SIZE; /* Store for future use */ + + /* Expected Data Length Packet Received */ + G_io_ccid.pUsbMessageBuffer = (uint8_t*) &G_io_ccid.bulk_header; + + // send bulk header and first pat of the message at once + os_memmove(G_io_usb_ep_buffer, &G_io_ccid.bulk_header, CCID_HEADER_SIZE); + if (G_io_ccid.UsbMessageLength>CCID_HEADER_SIZE) { + // copy start of data if bigger size than a header + os_memmove(G_io_usb_ep_buffer+CCID_HEADER_SIZE, G_io_ccid_data_buffer, MIN(CCID_BULK_EPIN_SIZE, G_io_ccid.UsbMessageLength)-CCID_HEADER_SIZE); + } + // send the first mixed source chunk + CCID_Response_SendData(pdev, G_io_usb_ep_buffer, + // use the header declared size packet must be well formed + MIN(CCID_BULK_EPIN_SIZE, G_io_ccid.UsbMessageLength)); + } +} + +/** + * @brief CCID_BulkMessage_Out + * Proccess CCID OUT data + * @param pdev: device instance + * @param uint8_t epnum: endpoint index + * @retval None + */ +void CCID_BulkMessage_Out (USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t* buffer, uint16_t dataLen) +{ + if (epnum == (CCID_BULK_OUT_EP & 0x7F)) { + switch (G_io_ccid.Ccid_BulkState) + { + + // after a timeout, could be in almost any state :) therefore, clean it and process the newly received command + default: + G_io_ccid.Ccid_BulkState = CCID_STATE_IDLE; + // no break is intentional + + case CCID_STATE_IDLE: + // prepare to receive another packet later on (to avoid troubles with timeout due to other hid command timeouting the ccid endpoint reply) + USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); + + if (dataLen == 0x00) + { /* Zero Length Packet Received, end of transfer */ + G_io_ccid.Ccid_BulkState = CCID_STATE_IDLE; + } + else if (dataLen >= CCID_HEADER_SIZE) + { + G_io_ccid.UsbMessageLength = dataLen; /* Store for future use */ + + /* Expected Data Length Packet Received */ + // endianness is little :) useful for our ARM convention + G_io_ccid.pUsbMessageBuffer = (uint8_t*) &G_io_ccid.bulk_header; + + // copy the ccid bulk header only + os_memmove(G_io_ccid.pUsbMessageBuffer, buffer, CCID_HEADER_SIZE); + // copy remaining part in the data buffer (split from the ccid to allow for overlaying with another ressource buffer) + if (dataLen>CCID_HEADER_SIZE) { + os_memmove(G_io_ccid_data_buffer, buffer+CCID_HEADER_SIZE, dataLen-CCID_HEADER_SIZE); + // we're now receiving in the data buffer (all subsequent calls) + G_io_ccid.pUsbMessageBuffer = G_io_ccid_data_buffer; + } + + if (G_io_ccid.bulk_header.bulkout.dwLength > IO_CCID_DATA_BUFFER_SIZE) + { /* Check if length of data to be sent by host is > buffer size */ + + /* Too long data received.... Error ! */ + G_io_ccid.Ccid_BulkState = CCID_STATE_UNCORRECT_LENGTH; + } + else + // everything received in the first packet + if (G_io_ccid.UsbMessageLength == (G_io_ccid.bulk_header.bulkout.dwLength + CCID_HEADER_SIZE)) { + /* Short message, less than the EP Out Size, execute the command, + if parameter like dwLength is too big, the appropriate command will + give an error */ + CCID_CmdDecode(pdev); + } + else + { /* Long message, receive additional data with command */ + G_io_ccid.Ccid_BulkState = CCID_STATE_RECEIVE_DATA; + G_io_ccid.pUsbMessageBuffer += dataLen-CCID_HEADER_SIZE; /* Point to new offset */ + } + } + break; + + case CCID_STATE_RECEIVE_DATA: + + USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); + + G_io_ccid.UsbMessageLength += dataLen; + + if (dataLen < CCID_BULK_EPOUT_SIZE) + {/* Short message, less than the EP Out Size, execute the command, + if parameter like dwLength is too big, the appropriate command will + give an error */ + + /* Full command is received, process the Command */ + os_memmove(G_io_ccid.pUsbMessageBuffer, buffer, dataLen); + CCID_CmdDecode(pdev); + } + else //if (dataLen == CCID_BULK_EPOUT_SIZE) + { + if (G_io_ccid.UsbMessageLength < (G_io_ccid.bulk_header.bulkout.dwLength + CCID_HEADER_SIZE)) + { + os_memmove(G_io_ccid.pUsbMessageBuffer, buffer, dataLen); + G_io_ccid.pUsbMessageBuffer += dataLen; + /* Increment the pointer to receive more data */ + + /* Prepare EP to Receive next Cmd */ + // not timeout compliant // USBD_LL_PrepareReceive(pdev, CCID_BULK_OUT_EP, CCID_BULK_EPOUT_SIZE); + } + else if (G_io_ccid.UsbMessageLength == (G_io_ccid.bulk_header.bulkout.dwLength + CCID_HEADER_SIZE)) + { + /* Full command is received, process the Command */ + os_memmove(G_io_ccid.pUsbMessageBuffer, buffer, dataLen); + CCID_CmdDecode(pdev); + } + else + { + /* Too long data received.... Error ! */ + G_io_ccid.Ccid_BulkState = CCID_STATE_UNCORRECT_LENGTH; + } + } + + break; + + /* + case CCID_STATE_UNCORRECT_LENGTH: + G_io_ccid.Ccid_BulkState = CCID_STATE_IDLE; + break; + + default: + + break; + */ + } + } +} + +/** + * @brief CCID_CmdDecode + * Parse the commands and Proccess command + * @param pdev: device instance + * @retval None + */ +void CCID_CmdDecode(USBD_HandleTypeDef *pdev) +{ + uint8_t errorCode; + + switch (G_io_ccid.bulk_header.bulkout.bMessageType) + { + case PC_TO_RDR_ICCPOWERON: + errorCode = PC_to_RDR_IccPowerOn(); + RDR_to_PC_DataBlock(errorCode); + break; + case PC_TO_RDR_ICCPOWEROFF: + errorCode = PC_to_RDR_IccPowerOff(); + RDR_to_PC_SlotStatus(errorCode); + break; + case PC_TO_RDR_GETSLOTSTATUS: + errorCode = PC_to_RDR_GetSlotStatus(); + RDR_to_PC_SlotStatus(errorCode); + break; + case PC_TO_RDR_XFRBLOCK: + errorCode = PC_to_RDR_XfrBlock(); + // asynchronous // RDR_to_PC_DataBlock(errorCode); + break; + case PC_TO_RDR_GETPARAMETERS: + errorCode = PC_to_RDR_GetParameters(); + RDR_to_PC_Parameters(errorCode); + break; + case PC_TO_RDR_RESETPARAMETERS: + errorCode = PC_to_RDR_ResetParameters(); + RDR_to_PC_Parameters(errorCode); + break; + case PC_TO_RDR_SETPARAMETERS: + errorCode = PC_to_RDR_SetParameters(); + RDR_to_PC_Parameters(errorCode); + break; + case PC_TO_RDR_ESCAPE: + errorCode = PC_to_RDR_Escape(); + RDR_to_PC_Escape(errorCode); + break; + case PC_TO_RDR_ICCCLOCK: + errorCode = PC_to_RDR_IccClock(); + RDR_to_PC_SlotStatus(errorCode); + break; + case PC_TO_RDR_ABORT: + errorCode = PC_to_RDR_Abort(); + RDR_to_PC_SlotStatus(errorCode); + break; + case PC_TO_RDR_T0APDU: + errorCode = PC_TO_RDR_T0Apdu(); + RDR_to_PC_SlotStatus(errorCode); + break; + case PC_TO_RDR_MECHANICAL: + errorCode = PC_TO_RDR_Mechanical(); + RDR_to_PC_SlotStatus(errorCode); + break; + case PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY: + errorCode = PC_TO_RDR_SetDataRateAndClockFrequency(); + RDR_to_PC_DataRateAndClockFrequency(errorCode); + break; + case PC_TO_RDR_SECURE: + errorCode = PC_TO_RDR_Secure(); + // asynchronous // RDR_to_PC_DataBlock(errorCode); + break; + default: + RDR_to_PC_SlotStatus(SLOTERROR_CMD_NOT_SUPPORTED); + break; + } + + CCID_Send_Reply(pdev); +} + +/** + * @brief Transfer_Data_Request + * Prepare the request response to be sent to the host + * @param uint8_t* dataPointer: Pointer to the data buffer to send + * @param uint16_t dataLen : number of bytes to send + * @retval None + */ +void Transfer_Data_Request(void) +{ + /********** Update Global Variables ***************/ + G_io_ccid.Ccid_BulkState = CCID_STATE_SEND_RESP; +} + + +/** + * @brief CCID_Response_SendData + * Send the data on bulk-in EP + * @param pdev: device instance + * @param uint8_t* buf: pointer to data buffer + * @param uint16_t len: Data Length + * @retval None + */ +static void CCID_Response_SendData(USBD_HandleTypeDef *pdev, + uint8_t* buf, + uint16_t len) +{ + UNUSED(pdev); + // don't ask the MCU to perform bulk split, we could quickly get into a buffer overflow + if (len > CCID_BULK_EPIN_SIZE) { + THROW(EXCEPTION_IO_OVERFLOW); + } + + G_io_seproxyhal_spi_buffer[0] = SEPROXYHAL_TAG_USB_EP_PREPARE; + G_io_seproxyhal_spi_buffer[1] = (3+len)>>8; + G_io_seproxyhal_spi_buffer[2] = (3+len); + G_io_seproxyhal_spi_buffer[3] = CCID_BULK_IN_EP; + G_io_seproxyhal_spi_buffer[4] = SEPROXYHAL_TAG_USB_EP_PREPARE_DIR_IN; + G_io_seproxyhal_spi_buffer[5] = len; + io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 6); + io_seproxyhal_spi_send(buf, len); +} + +#ifdef HAVE_CCID_INTERRUPT +/** + * @brief CCID_IntMessage + * Send the Interrupt-IN data to the host + * @param pdev: device instance + * @retval None + */ +void CCID_IntMessage(USBD_HandleTypeDef *pdev) +{ + UNUSED(pdev); + /* Check if there us change in Smartcard Slot status */ + if ( CCID_IsSlotStatusChange() && CCID_IsIntrTransferComplete() ) + { +#ifdef HAVE_CCID_INTERRUPT + /* Check Slot Status is changed. Card is Removed/ Fitted */ + RDR_to_PC_NotifySlotChange(); +#endif // HAVE_CCID_INTERRUPT + + CCID_SetIntrTransferStatus(0); /* Reset the Status */ + CCID_UpdSlotChange(0); /* Reset the Status of Slot Change */ + + G_io_seproxyhal_spi_buffer[0] = SEPROXYHAL_TAG_USB_EP_PREPARE; + G_io_seproxyhal_spi_buffer[1] = (3+2)>>8; + G_io_seproxyhal_spi_buffer[2] = (3+2); + G_io_seproxyhal_spi_buffer[3] = CCID_INTR_IN_EP; + G_io_seproxyhal_spi_buffer[4] = SEPROXYHAL_TAG_USB_EP_PREPARE_DIR_IN; + G_io_seproxyhal_spi_buffer[5] = 2; + io_seproxyhal_spi_send(G_io_seproxyhal_spi_buffer, 6); + io_seproxyhal_spi_send(G_io_ccid.UsbIntMessageBuffer, 2); + } +} + +/** + * @brief CCID_IsIntrTransferComplete + * Provides the status of previous Interrupt transfer status + * @param None + * @retval uint8_t PrevXferComplete_IntrIn: Value of the previous transfer status + */ +uint8_t CCID_IsIntrTransferComplete (void) +{ + return G_io_ccid.PrevXferComplete_IntrIn; +} + +/** + * @brief CCID_IsIntrTransferComplete + * Set the value of the Interrupt transfer status + * @param uint8_t xfer_Status: Value of the Interrupt transfer status to set + * @retval None + */ +void CCID_SetIntrTransferStatus (uint8_t xfer_Status) +{ + G_io_ccid.PrevXferComplete_IntrIn = xfer_Status; +} +#endif // HAVE_CCID_INTERRUPT + + + + + + +uint8_t SC_Detect(void) { + return G_io_ccid.ccid_card_inserted; +} + +void SC_InitParams (void) { + // nothing to do +} + +uint8_t SC_SetParams (Protocol0_DataStructure_t* pt0) { + UNUSED(pt0); + return SLOT_NO_ERROR; +} + + +uint8_t SC_SetClock (uint8_t bClockCommand) { + UNUSED(bClockCommand); + return SLOT_NO_ERROR; +} + +uint8_t SC_Request_GetClockFrequencies(uint8_t* pbuf, uint16_t* len); +uint8_t SC_Request_GetDataRates(uint8_t* pbuf, uint16_t* len); +uint8_t SC_T0Apdu(uint8_t bmChanges, uint8_t bClassGetResponse, + uint8_t bClassEnvelope) { + UNUSED(bmChanges); + UNUSED(bClassGetResponse); + UNUSED(bClassEnvelope); + return SLOTERROR_CMD_NOT_SUPPORTED; +} +uint8_t SC_Mechanical(uint8_t bFunction) { + UNUSED(bFunction); + return SLOTERROR_CMD_NOT_SUPPORTED; +} +uint8_t SC_SetDataRateAndClockFrequency(uint32_t dwClockFrequency, + uint32_t dwDataRate) { + UNUSED(dwClockFrequency); + UNUSED(dwDataRate); + return SLOT_NO_ERROR; +} +uint8_t SC_Secure(uint32_t dwLength, uint8_t bBWI, uint16_t wLevelParameter, + uint8_t* pbuf, uint32_t* returnLen ) { + UNUSED(bBWI); + UNUSED(wLevelParameter); + UNUSED(returnLen); + // return SLOTERROR_CMD_NOT_SUPPORTED; + uint16_t ret_len,off; + switch(pbuf[0]) + { + case 0: // verify pin + off = 15; + //ret_len = dwLength - 15; + ret_len = 5; + break; + case 1: // modify pin + switch(pbuf[11]) + { + case 3: + off = 20; + break; + case 2: + case 1: + off = 19; + break; + // 0 and 4-0xFF + default: + off = 18; + break; + } + //ret_len = dwLength - off; + ret_len = 5; + break; + default: // unsupported + G_io_ccid.bulk_header.bulkin.dwLength = 0; + RDR_to_PC_DataBlock(SLOTERROR_CMD_NOT_SUPPORTED); + CCID_Send_Reply(&USBD_Device); + return SLOTERROR_CMD_NOT_SUPPORTED; + } + pbuf += off; + pbuf[0] = 0xEF; + return SC_XferBlock(pbuf, ret_len, &ret_len); +} + +// prepare the apdu to be processed by the application +uint8_t SC_XferBlock (uint8_t* ptrBlock, uint32_t blockLen, uint16_t* expectedLen) { + UNUSED(expectedLen); + + // check for overflow + if (blockLen > IO_APDU_BUFFER_SIZE) { + return SLOTERROR_BAD_LENTGH; + } + + // copy received apdu // if G_io_ccid_data_buffer is the buffer apdu, then the memmove will do nothing + os_memmove(G_io_apdu_buffer, ptrBlock, blockLen); + G_io_apdu_length = blockLen; + G_io_apdu_media = IO_APDU_MEDIA_USB_CCID; // for application code + G_io_apdu_state = APDU_USB_CCID; // for next call to io_exchange + + return SLOT_NO_ERROR; +} + +void io_usb_ccid_reply(unsigned char* buffer, unsigned short length) { + // avoid memory overflow + if (length > IO_CCID_DATA_BUFFER_SIZE) { + THROW(EXCEPTION_IO_OVERFLOW); + } + // copy the responde apdu + os_memmove(G_io_ccid_data_buffer, buffer, length); + G_io_ccid.bulk_header.bulkin.dwLength = length; + // forge reply + RDR_to_PC_DataBlock(SLOT_NO_ERROR); + + // start sending rpely + CCID_Send_Reply(&USBD_Device); +} + +// ask for power on +void io_usb_ccid_set_card_inserted(unsigned int inserted) { + G_io_ccid.ccid_card_inserted = inserted; + CCID_UpdSlotChange(1); +#ifdef HAVE_CCID_INTERRUPT + CCID_IntMessage(&USBD_Device); +#endif // HAVE_CCID_INTERRUPT +} + + + + + + + +#endif // HAVE_USB_CLASS_CCID + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/src/lib_stusb_impl/usbd_ccid_impl.h b/src/sdk/usbd_ccid_impl.h similarity index 100% rename from src/lib_stusb_impl/usbd_ccid_impl.h rename to src/sdk/usbd_ccid_impl.h diff --git a/src/lib_stusb_impl/usbd_hid_impl.h b/src/sdk/usbd_hid_impl.h similarity index 100% rename from src/lib_stusb_impl/usbd_hid_impl.h rename to src/sdk/usbd_hid_impl.h diff --git a/src/lib_stusb_impl/usbd_impl.c b/src/sdk/usbd_impl.c similarity index 96% rename from src/lib_stusb_impl/usbd_impl.c rename to src/sdk/usbd_impl.c index 212e3b8..9c82900 100644 --- a/src/lib_stusb_impl/usbd_impl.c +++ b/src/sdk/usbd_impl.c @@ -44,8 +44,11 @@ * ****************************************************************************** */ +#pragma message "Override SDK source file :" __FILE__ + #include "os.h" + /* Includes ------------------------------------------------------------------*/ #include "usbd_hid.h" diff --git a/src/lib_stusb_impl/usbd_impl.h b/src/sdk/usbd_impl.h similarity index 100% rename from src/lib_stusb_impl/usbd_impl.h rename to src/sdk/usbd_impl.h From c07cb00cb61035fe13af668c3caf11f2ea0af044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric?= Date: Mon, 4 Jun 2018 17:54:46 +0200 Subject: [PATCH 09/11] Fix SSH authentication with Ed25519. When message to sign was too long, it overlayd the signature destination. --- Makefile | 2 +- doc/user/blue-app-openpgp-card.rst | 10 +--------- src/gpg_pso.c | 15 +++++++++------ 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 219c2c3..9378403 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ SPECVERSION="3.3.1" APPVERSION_M=1 APPVERSION_N=2 -APPVERSION_P=0 +APPVERSION_P=1 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) ifeq ($(TARGET_NAME),TARGET_BLUE) diff --git a/doc/user/blue-app-openpgp-card.rst b/doc/user/blue-app-openpgp-card.rst index 6ff16dd..97a778d 100644 --- a/doc/user/blue-app-openpgp-card.rst +++ b/doc/user/blue-app-openpgp-card.rst @@ -96,15 +96,7 @@ The application is ready to use! From source ~~~~~~~~~~~~~ -Building from sources requires the the Nano S SDK 1.3.1.4 on firmware 1.3.1. See https://github.com/LedgerHQ/nanos-secure-sdk - -The SDK must be slightly modified: - - - replace lib_stusb/STM32_USB_Device_Library/Class/CCID/src/usbd_ccid_if.c - and lib_stusb/STM32_USB_Device_Library/Class/CCID/inc/usbd_ccid_if.h by the - one provided in sdk/ directory - - edit script.ld and modify the stack size : STACK_SIZE = 832; - +Building from sources requires the the Nano S SDK 1.4.2.1 on firmware 1.4.2. See https://github.com/LedgerHQ/nanos-secure-sdk Refer to the SDK documentation for the compiling/loading... diff --git a/src/gpg_pso.c b/src/gpg_pso.c index 8d1895c..1d389b0 100644 --- a/src/gpg_pso.c +++ b/src/gpg_pso.c @@ -88,7 +88,9 @@ static int gpg_sign(gpg_key_t *sigkey) { unsigned char *rs; key = &sigkey->priv_key.ecfp; + //sign + #define RS (G_gpg_vstate.work.io_buffer+(GPG_IO_BUFFER_LENGTH-256)) if (sigkey->attributes.value[0] == 19) { sz = gpg_curve2domainlen(key->curve); if ((sz == 0) || (key->d_len != sz)) { @@ -99,13 +101,13 @@ static int gpg_sign(gpg_key_t *sigkey) { CX_RND_TRNG, CX_NONE, G_gpg_vstate.work.io_buffer, sz, - G_gpg_vstate.work.io_buffer, GPG_IO_BUFFER_LENGTH, + RS, 256, NULL); //reencode r,s in MPI format gpg_io_discard(0); - rs_len = G_gpg_vstate.work.io_buffer[3]; - rs = &G_gpg_vstate.work.io_buffer[4]; + rs_len = RS[3]; + rs = &RS[4]; for (i = 0; i<2; i++) { if (*rs == 0) { @@ -124,12 +126,13 @@ static int gpg_sign(gpg_key_t *sigkey) { CX_SHA512, G_gpg_vstate.work.io_buffer, G_gpg_vstate.io_length, NULL, 0, - G_gpg_vstate.work.io_buffer+128, GPG_IO_BUFFER_LENGTH-128, + RS, 256, NULL); gpg_io_discard(0); - gpg_io_insert(G_gpg_vstate.work.io_buffer+128, sz); + gpg_io_insert(RS, sz); } - + #undef RS + //send gpg_pso_reset_PW1(); return SW_OK; From 27cd81de7a3ba4e087ae12cae975150094236cbd Mon Sep 17 00:00:00 2001 From: nyanloutre Date: Tue, 10 Jul 2018 00:21:33 +0200 Subject: [PATCH 10/11] =?UTF-8?q?Restauration=20cl=C3=A9=20PGP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytools/gpgcard/restore_perso.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 pytools/gpgcard/restore_perso.py diff --git a/pytools/gpgcard/restore_perso.py b/pytools/gpgcard/restore_perso.py new file mode 100644 index 0000000..a95bf49 --- /dev/null +++ b/pytools/gpgcard/restore_perso.py @@ -0,0 +1,30 @@ +import binascii + +from gpgcard import GPGCard + +gpgcard = GPGCard() +gpgcard.connect("pcsc:Ledger") +gpgcard.get_all() + +gpgcard.verify_pin(0x81, "123456") +gpgcard.verify_pin(0x83, "12345678") + +gpgcard.generate_asym_key_pair(0x80, 0xb600) +gpgcard.generate_asym_key_pair(0x80, 0xb800) +gpgcard.generate_asym_key_pair(0x80, 0xa400) + +# Use 'gpg -k --with-subkey-fingerprint' to find fingerprints + +sig_fingerprint = b'A3F35A5124D47C3195FF07B7F85D93686A3A9063' +aut_fingerprint = b'9C686F97A39B4A34E0C9D37CDBF45893AB524BBC' +dec_fingerprint = b'E4FE54969060DBF2756FC0EFD8203245E390CAEA' + +sig_fingerprint_bin = binascii.unhexlify(sig_fingerprint) +aut_fingerprint_bin = binascii.unhexlify(aut_fingerprint) +dec_fingerprint_bin = binascii.unhexlify(dec_fingerprint) + +gpgcard.sig_fingerprints = sig_fingerprint_bin +gpgcard.aut_fingerprints = aut_fingerprint_bin +gpgcard.dec_fingerprints = dec_fingerprint_bin + +gpgcard.set_all() From 1e23cb6425c728150e874ed91cf2d97c3e0fd211 Mon Sep 17 00:00:00 2001 From: nyanloutre Date: Tue, 10 Jul 2018 00:32:48 +0200 Subject: [PATCH 11/11] More output --- pytools/gpgcard/restore_perso.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pytools/gpgcard/restore_perso.py b/pytools/gpgcard/restore_perso.py index a95bf49..9c20560 100644 --- a/pytools/gpgcard/restore_perso.py +++ b/pytools/gpgcard/restore_perso.py @@ -2,6 +2,7 @@ import binascii from gpgcard import GPGCard +print("Connecting to device ...") gpgcard = GPGCard() gpgcard.connect("pcsc:Ledger") gpgcard.get_all() @@ -9,12 +10,16 @@ gpgcard.get_all() gpgcard.verify_pin(0x81, "123456") gpgcard.verify_pin(0x83, "12345678") +print("Generating key 1/3 ...") gpgcard.generate_asym_key_pair(0x80, 0xb600) +print("Generating key 2/3 ...") gpgcard.generate_asym_key_pair(0x80, 0xb800) +print("Generating key 3/3 ...") gpgcard.generate_asym_key_pair(0x80, 0xa400) # Use 'gpg -k --with-subkey-fingerprint' to find fingerprints +print("Setting fingerprints ...") sig_fingerprint = b'A3F35A5124D47C3195FF07B7F85D93686A3A9063' aut_fingerprint = b'9C686F97A39B4A34E0C9D37CDBF45893AB524BBC' dec_fingerprint = b'E4FE54969060DBF2756FC0EFD8203245E390CAEA'