UBports Robot Logo UBports Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    Using GnuPG in the UbuntuPhone BQ E4.5 (part2: OpenPGP CCID Card)

    Scheduled Pinned Locked Moved Support
    1 Posts 1 Posters 240 Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • G Offline
      guru
      last edited by guru

      Final step is getting support for the GnuPG-card to not have to key-in
      longish passphrases with the OSK.
      UbuntuPhone-GnuPG-card.png

      We need the 'pcscd' daemon.
      Its build is a bit tricky because it must later, on start from outside the
      chrooted syste, find the ccid driver.

      We compile the following pieces inside the chroot'ed system in that order:

      pcsc-lite-1.8.23
      ccid-1.4.30
      

      first we need some more packages:

      phablet@ubuntu-phablet-bq:~$ sudo chroot myRoot
      phablet@ubuntu-phablet-bq:~# su - phablet
      phablet@ubuntu-phablet-bq:~$ sudo apt-get install libusb-dev
      phablet@ubuntu-phablet-bq:~$ sudo apt-get install libusb-1.0-0-dev
      phablet@ubuntu-phablet-bq:~$ sudo apt-get install pkg-config
      

      now we make pcsc-lite-1.8.23 with the following options set on ./configure ...

      phablet@ubuntu-phablet-bq:~$ cd pcsc-lite-1.8.23
      phablet@ubuntu-phablet-bq:~/pcsc-lite-1.8.23$ ./configure --enable-usbdropdir=/home/phablet/myRoot/usr/local/lib/pcsc/drivers --enable-confdir=/home/phablet/myRoot/etc/reader.conf.d --disable-libsystemd
      
      ...
      PC/SC lite has been configured with following options:
      
      Version:             1.8.23
      System binaries:     /usr/local/sbin
      Configuration dir:   /usr/local/etc/reader.conf.d
      
      
      Host:                armv7l-unknown-linux-gnueabihf
      Compiler:            gcc
      Preprocessor flags:  -I${top_srcdir}/src
      Compiler flags:      -Wall -fno-common -g -O2
      Preprocessor flags:  -I${top_srcdir}/src
      Linker flags:
      Libraries:           -ldl  -lrt
      
      PTHREAD_CFLAGS:      -pthread
      PTHREAD_LIBS:
      PCSC_ARCH:           Linux
      
      pcscd binary            /usr/local/sbin/pcscd
      polkit support:         no
      polkit policy dir:
      libudev support:        yes
      libusb support:         no
      USB drop directory:     /home/phablet/myRoot/usr/local/lib/pcsc/drivers
      ATR parsing messages:   false
      ipcdir:                 /var/run/pcscd
      use serial:             yes
      use usb:                yes
      systemd unit directory: /lib/systemd/system
      serial config dir.:     /home/phablet/myRoot/etc/reader.conf.d
      filter:                 no
      
      PCSCLITE_FEATURES:       Linux armv7l-unknown-linux-gnueabihf serial usb libudev usbdropdir=/home/phablet/myRoot/usr/local/lib/pcsc/drivers ipcdir=/var/run/pcscd configdir=/home/phablet/myRoot/etc/reader.conf.d
      
      checking that generated files are newer than configure... done
      ...
      
      phablet@ubuntu-phablet-bq:~/pcsc-lite-1.8.23$ make
      phablet@ubuntu-phablet-bq:~/pcsc-lite-1.8.23$ make install
      

      ok, now the 'ccid' driver, installed (copied) to be seen by the daemon:

      phablet@ubuntu-phablet-bq:~$ cd ccid-1.4.30
      phablet@ubuntu-phablet:~/ccid-1.4.30$ ./configure -enable-usbdropdir=/home/phablet/myRoot/usr/local/lib/pcsc/drivers
      ...
      libccid has been configured with following options:
      
      Version:             1.4.30
      User binaries:       /usr/local/bin
      Configuration files: /usr/local/etc
      
      
      Host:                armv7l-unknown-linux-gnueabihf
      Compiler:            gcc
      Preprocessor flags:
      Compiler flags:      -g -O2
      Preprocessor flags:
      Linker flags:
      Libraries:
      
      PCSC_CFLAGS:         -pthread -I/usr/local/include/PCSC
      PCSC_LIBS:           -L/usr/local/lib -lpcsclite
      PTHREAD_CFLAGS:      -pthread
      PTHREAD_LIBS:
      BUNDLE_HOST:         Linux
      DYN_LIB_EXT:         so
      LIBUSB_CFLAGS:       -I/usr/include/libusb-1.0
      LIBUSB_LIBS:         -lusb-1.0
      SYMBOL_VISIBILITY:   -fvisibility=hidden
      NOCLASS:
      
      libusb support:          yes
      composite as multislot:  no
      multi threading:         yes
      bundle directory name:   ifd-ccid.bundle
      USB drop directory:      /home/phablet/myRoot/usr/local/lib/pcsc/drivers
      serial Twin support:     no
      serial twin install dir: /home/phablet/myRoot/usr/local/lib/pcsc/drivers/serial
      serial config directory: /home/phablet/myRoot/etc/reader.conf.d
      compiled for pcsc-lite:  yes
      syslog debug:            no
      class driver:            yes
      
      ...
      
      phablet@ubuntu-phablet:~/ccid-1.4.30$ make
      phablet@ubuntu-phablet:~/ccid-1.4.30$ sudo make install
      

      the driver libccid.so and its control file Info.plist ended up as configured:

      phablet@ubuntu-phablet:~$ find /home/phablet/myRoot/usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents/
      /home/phablet/myRoot/usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents/
      /home/phablet/myRoot/usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux
      /home/phablet/myRoot/usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/libccid.so
      /home/phablet/myRoot/usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
      

      but if we rund the daemon from outside the chrooted system, it must be in
      /usr/local/lib/pcsc/drivers/ifd-ccid.bundle because /home/phablet/myRoot gets
      added in front; so we copy them over to the correct place:

      phablet@ubuntu-phablet:~$ sudo mkdir -p /usr/local/lib/pcsc/drivers/ifd-ccid.bundle
      phablet@ubuntu-phablet:~$ sudo cp -rp /home/phablet/myRoot/usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents /usr/local/lib/pcsc/drivers/ifd-ccid.bundle
      phablet@ubuntu-phablet:~$ find /usr/local/lib/pcsc/drivers/ifd-ccid.bundle
      /usr/local/lib/pcsc/drivers/ifd-ccid.bundle
      /usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents
      /usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux
      /usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/libccid.so
      /usr/local/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
      

      from outside the chrooted system we can now start the daemon as:

      $ sudo /home/phablet/myRoot/usr/local/sbin/pcscd --foreground --debug | tee pcscd.log
      

      and check the log file pcscd.log to see if it sees the card attaching;

      Now we start in the phone the pcscd daemon as:

      $ sudo /home/phablet/myRoot/usr/local/sbin/pcscd
      $ ps ax | grep pcscd
      31669 pts/53   Sl     0:00 /home/phablet/myRoot/usr/local/sbin/pcscd
      

      to restart the pcscd after device reboot we put the above line into
      a small script ~phablet/pcscd.sh; this script allows to start and stop the daemon:

      $ ./pcscd.sh 
      [sudo] password for phablet: 
      started pcscd pid 9187
      
      $ ./pcscd.sh 
      killing pcscd pid 9187
      

      its logic is simple:

      $ cat ./pcscd.sh 
      #!/bin/sh
        
      # if pcscd is running, we only kill it, else we start it
      #
      test -f /run/pcscd/pcscd.pid &&  {
          echo killing pcscd pid `cat /run/pcscd/pcscd.pid`
          sudo kill `cat /run/pcscd/pcscd.pid`
          rm -f /run/pcscd/pcscd.pid
          exit 0
      }
      sudo /home/phablet/myRoot/usr/local/sbin/pcscd --auto-exit
      test -f /run/pcscd/pcscd.pid && echo started pcscd pid `cat /run/pcscd/pcscd.pid`
      

      We can now run the gpg --card-status to see if it finds the card on attach:

      $ ./gpg.sh --card-status
      Reader ...........: Identiv uTrust 3512 SAM slot Token [CCID Interface] (55511514602745) 00 00
      Application ID ...: D27600012401020100050000532B0000
      Version ..........: 2.1
      Manufacturer .....: ZeitControl
      Serial number ....: 0000532B
      Name of cardholder: Matthias Apitz
      Language prefs ...: en
      Sex ..............: unspecified
      URL of public key : http://www.unixarea.de/ccid--export-key-guru.pub
      Login data .......: [not set]
      Signature PIN ....: not forced
      Key attributes ...: rsa4096 rsa4096 rsa4096
      Max. PIN lengths .: 32 32 32
      PIN retry counter : 3 0 3
      Signature counter : 457
      Signature key ....: 5E69 FBAC 1618 562C B3CB  FBC1 47CC F7E4 76FE 9D11
            created ....: 2017-05-14 18:20:07
      Encryption key....: EB62 00DA 13A1 9E80 679B  1A13 61F1 ECB6 25C9 A6C3
            created ....: 2017-05-14 18:20:07
      Authentication key: E51D D2D6 C727 35D6 651D  EA4B 6AA5 C5C4 51A1 CD1C
            created ....: 2017-05-14 18:20:07
      General key info..: [none]
      

      We rename ~/.gnupg (to save the *.conf files) and copied over from my
      real netbook the ~/.password-store and the key material for the GnuPG-card;

      phablet@ubuntu-phablet:~$ mv .gnupg .gnupg-localkey
      phablet@ubuntu-phablet:~$ mv .password-store .password-store-localkey
      phablet@ubuntu-phablet:~$ mkdir .password-store
      phablet@ubuntu-phablet:~$ chmod 0700 .password-store
      

      from the host:

      $ scp -rp .gnupg-ccid     phablet@10.42.0.1:.
      $ scp -rp .password-store phablet@10.42.0.1:.
      
      phablet@ubuntu-phablet:~$ mv .gnupg-ccid .gnupg
      phablet@ubuntu-phablet:~$ cp -p .gnupg-localkey/*.conf .gnupg
      

      let's see if ./pass.sh can unlock the card (via the gpg-agent) and decipher the
      crypted information:

      $ ./pass.sh cards/cuba
      
                                ┌─────────────────────────────────────────────┐
                                │ Please insert the card with serial number:  │
                                │                                             │
                                │ 0005 0000532B                               │
                                │                                             │
                                │      <OK>                       <Cancel>    │
                                └─────────────────────────────────────────────┘
      
                                ┌──────────────────────────────────────────────┐
                                │ Please unlock the card                       │
                                │                                              │
                                │ Number: 0005 0000532B                        │
                                │ Holder: Matthias Apitz                       │
                                │                                              │
                                │ PIN ________________________________________ │
                                │                                              │
                                │      <OK>                        <Cancel>    │
                                └──────────────────────────────────────────────┘
      
      4711
      $
      

      on the 2nd run it does not need anymore the PIN:

      $ ./pass.sh askubuntu.com/guru@unixarea.de
      4711
      

      i.e. all is fine! The OpenPGP card remains unlocked until power-off, i.e.
      until withdraw the card.

      1 Reply Last reply Reply Quote 2

      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

      With your input, this post could be even better 💗

      Register Login
      • First post
        Last post