Smart cards on Ubuntu on Windows 10?
Since Windows 10 Anniversary it is possible to install Ubuntu 14.04 as a Windows subsystem (or something like that). See "Run Bash on Ubuntu on Windows" or any other documentation.
Of course I was curious and tried. Yes, I have a Windows partition. It is just used to upgrade the laptop firmware since it is not easy or even possible to upgrade the Dell laptop firmware from GNU/Linux.
Build
After some time the tools needed to build pcsc-lite and libccid are installed. The two builds are successful.$ /usr/local/sbin/pcscd --version pcsc-lite version 1.8.18. Copyright (C) 1999-2002 by David Corcoran <corcoran musclecard.com>. Copyright (C) 2001-2015 by Ludovic Rousseau <ludovic .rousseau="" free.fr>. Copyright (C) 2003-2004 by Damien Sauveron <sauveron labri.fr>. Report bugs to <pcsclite-muscle@lists.alioth.debian.org>. Enabled features: Linux x86_64-unknown-linux-gnu serial usb libudev usbdropdir=/usr/local/lib/pcsc/drivers ipcdir=/var/run/pcscd configdir=/usr/local/etc/reader.conf.d
Issues
The build is a success but the execution fails.Not working libudev
$ sudo /usr/local/sbin/pcscd --foreground --debug 00000000 debuglog.c:289:DebugLogSetLevel() debug level=debug 00001975 configfile.l:358:DBGetReaderList() Parsing conf file: /usr/local/etc/reader.conf.d 00001005 pcscdaemon.c:655:main() pcsc-lite 1.8.18 daemon ready. libudev: udev_monitor_enable_receiving: bind failed: Invalid argument 00005302 hotplug_libudev.c:758:HPRegisterForHotplugEvents() udev_monitor_enable_receiving() error: -1 ^C01658892 pcscdaemon.c:188:signal_thread() read failed: Interrupted system call
Not really surprising, libudev fails to register the reception of events. This was expected since udev is a device manager for the Linux kernel and we do not have a Linux kernel here.
We could configure pcsc-lite to use libusb instead of libudev to manage hotplug. But that would also not work, see bellow.
Not working libusb
$ lsusb unable to initialize libusb: -99The libusb library is not usable.
$ strace lsusb [...] gettimeofday({1475313910, 750505}, NULL) = 0 openat(AT_FDCWD, "/dev/bus/usb", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/proc/bus/usb", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/dev", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 brk(0x1bfa000) = 0x1bfa000 getdents(3, /* 20 entries */, 32768) = 481 getdents(3, /* 0 entries */, 32768) = 0 brk(0x1bf2000) = 0x1bf2000 close(3) = 0 write(2, "unable to initialize libusb: -99"..., 33unable to initialize libusb: -99 ) = 33 exit_group(1) = ? +++ exited with 1 +++This is because the file system does not provide the USB virtual files in /dev/bus/usb/ or /proc/bus/usb/.
$ ls -l /dev ls: cannot access /dev/lxss: Operation not permitted ls: /dev/random: Invalid argument total 0 drwxr-xr-x 2 root root 0 Oct 1 10:04 block lrwxrwxrwx 1 root root 13 Oct 1 10:04 fd -> /proc/self/fd crw------- 1 root root 0, 0 Oct 1 11:28 kmsg c????????? ? ? ? ? ? lxss crw-rw-rw- 1 root root 1, 3 Jan 1 1970 null crw-rw-rw- 0 root tty 5, 2 Oct 1 10:31 ptmx drwxr-xr-x 0 root root 0 Oct 1 10:04 pts crw-rw-rw- 1 root root 1, 8 Oct 1 11:28 random lrwxrwxrwx 1 root root 8 Oct 1 10:04 shm -> /run/shm lrwxrwxrwx 1 root root 15 Oct 1 10:04 stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 Oct 1 10:04 stdin -> /proc/self/fd/0 lrwxrwxrwx 1 root root 15 Oct 1 10:04 stdout -> /proc/self/fd/1 crw------- 1 rousseau tty 4, 1 Oct 1 2016 tty crw-rw-rw- 1 root tty 4, 0 Oct 1 2016 tty0 crw------- 1 rousseau tty 4, 1 Oct 1 2016 tty1 crw-rw---- 1 root tty 4, 2 Oct 1 11:28 tty2 crw-rw-rw- 1 root root 1, 9 Oct 1 11:28 urandom crw-rw-rw- 1 root root 0, 0 Oct 1 11:28 zero
$ ls -l /proc total 0 dr-xr-xr-x 1 root root 0 Oct 1 10:07 1 dr-xr-xr-x 1 rousseau rousseau 0 Oct 1 10:07 2 dr-xr-xr-x 1 rousseau rousseau 0 Oct 1 11:29 22063 -r--r--r-- 1 root root 0 Oct 1 10:04 cmdline -r--r--r-- 1 root root 0 Oct 1 10:04 cpuinfo -r--r--r-- 1 root root 0 Oct 1 10:04 filesystems -r--r--r-- 1 root root 0 Oct 1 10:04 interrupts -r--r--r-- 1 root root 0 Oct 1 10:04 loadavg -r--r--r-- 1 root root 0 Oct 1 10:04 meminfo lrwxrwxrwx 1 root root 0 Oct 1 10:04 mounts -> self/mounts lrwxrwxrwx 1 root root 0 Oct 1 10:04 net -> self/net lrwxrwxrwx 1 root root 0 Oct 1 10:04 self -> 22063 -r--r--r-- 1 root root 0 Oct 1 10:04 stat dr-xr-xr-x 1 root root 0 Oct 1 10:04 sys -r--r--r-- 1 root root 0 Oct 1 10:04 uptime -r--r--r-- 1 root root 0 Oct 1 10:04 version
Existing packages
The libccid package is available for this Ubuntu 14.04 in Windows 10.$ apt-cache policy libccid libccid: Installed: (none) Candidate: 1.4.15-1 Version table: 1.4.15-1 0 500 http://archive.ubuntu.com/ubuntu/ trusty/universe amd64 Packagess
Since I made a build from the source code I have not installed this package.
Port or not
I was curious to know if the packages have been rebuilt for "Windows" with a special configuration. So I selected a package at random (in fact I used a short package name to limit the number of key presses needed to enter the package name. The m4 package is a good candidate for that.).m4 package as downloaded by apt from "Windows":
$ pwd /var/cache/apt/archives $ sha1sum m4_1.4.17-2ubuntu1_amd64.deb 4358d262605ae065a7dc9b6e0c80b3c7f44bf1cc m4_1.4.17-2ubuntu1_amd64.deb
m4 package as downloaded from http://packages.ubuntu.com/trusty/amd64/m4/download for amd64 architecture:
$ pwd /mnt/c/Users/Ludovic/Downloads $ sha1sum m4_1.4.17-2ubuntu1_amd64.deb 4358d262605ae065a7dc9b6e0c80b3c7f44bf1cc m4_1.4.17-2ubuntu1_amd64.deb
The two packages are exactly the same.
The apt repository is the same as for a real Ubuntu system.
$ cat /etc/apt/sources.list deb http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
$ dpkg --print-architecture amd64
Conclusion
As expected many Linux features (udev, USB) are missing. Maybe Microsoft will work on that to provide more support.I also note that the system is much slower on Ubuntu in Windows than on a real Linux kernel (and a Debian system) on the same hardware. In particular the file system accesses, when installing packages for example, are around an order of magnitude slower.