{ "cells": [ { "cell_type": "markdown", "id": "ade33c98", "metadata": {}, "source": [ "# Smartcards" ] }, { "cell_type": "markdown", "id": "2d945579", "metadata": {}, "source": [ "This notebook showcases how to use **pyecsca** to communicate with a smartcard target, either via a PCSC-compatible reader or a [LEIA](https://h2lab.org/devices/leia/boards_leia/) board. The target in this notebook is the [ECTester](https://github.com/crocs-muni/ECTester) applet running on a JavaCard." ] }, { "cell_type": "markdown", "id": "b266ea5a", "metadata": {}, "source": [ "But first, a showcase of the raw LEIA and PCSC APIs" ] }, { "cell_type": "code", "execution_count": null, "id": "4602cb9a", "metadata": {}, "outputs": [], "source": [ "from pyecsca.sca.target.leia import LEIATarget\n", "from pyecsca.sca.target.PCSC import PCSCTarget\n", "from smartleia import LEIA\n", "from smartcard.System import readers" ] }, { "cell_type": "markdown", "id": "b4a1cb25", "metadata": {}, "source": [ "## LEIA\n", "For the following lines to work you need a LEIA board connected and a card inserted inside of it." ] }, { "cell_type": "code", "execution_count": null, "id": "1edeed22", "metadata": {}, "outputs": [], "source": [ "sl = LEIA()\n", "leia = LEIATarget(sl)" ] }, { "cell_type": "code", "execution_count": null, "id": "eb60372e", "metadata": {}, "outputs": [], "source": [ "leia.connect()" ] }, { "cell_type": "code", "execution_count": null, "id": "2b07c714", "metadata": {}, "outputs": [], "source": [ "leia.atr.hex()" ] }, { "cell_type": "code", "execution_count": null, "id": "5962f0ee", "metadata": {}, "outputs": [], "source": [ "leia.select(bytes.fromhex(\"73696D706C656170706C6574\"))" ] }, { "cell_type": "code", "execution_count": null, "id": "dd384310", "metadata": {}, "outputs": [], "source": [ "leia.disconnect()" ] }, { "cell_type": "markdown", "id": "8df2666b", "metadata": {}, "source": [ "## PCSC\n", "For the following lines to work you need a PCSC-compatible reader connected and a card inserted inside of it.\n", "On Linux you also likely need the [PCSClite](https://pcsclite.apdu.fr/) service running. This code picks the first reader it finds, but it can be adjusted to pick the correct one in a multi-reader setup." ] }, { "cell_type": "code", "execution_count": null, "id": "f7ca966c", "metadata": {}, "outputs": [], "source": [ "rs = readers()\n", "reader = rs[0]\n", "pcsc = PCSCTarget(reader)" ] }, { "cell_type": "code", "execution_count": null, "id": "ac6177b2", "metadata": {}, "outputs": [], "source": [ "pcsc.connect()" ] }, { "cell_type": "code", "execution_count": null, "id": "2170c4df", "metadata": {}, "outputs": [], "source": [ "pcsc.atr.hex()" ] }, { "cell_type": "code", "execution_count": null, "id": "f4e869a2", "metadata": {}, "outputs": [], "source": [ "pcsc.select(bytes.fromhex(\"73696D706C656170706C6574\"))" ] }, { "cell_type": "code", "execution_count": null, "id": "33cbb320", "metadata": {}, "outputs": [], "source": [ "pcsc.disconnect()" ] }, { "cell_type": "markdown", "id": "91d2746b", "metadata": {}, "source": [ "## ECTester\n", "The following lines assume that the [ECTester](https://github.com/crocs-muni/ECTester) applet is installed on a card connected via a PCSC-compatible reader." ] }, { "cell_type": "code", "execution_count": null, "id": "7e37dd61", "metadata": {}, "outputs": [], "source": [ "from pyecsca.sca.target.ectester import ECTesterTargetPCSC, KeyAgreementEnum" ] }, { "cell_type": "code", "execution_count": null, "id": "f6c64af4", "metadata": {}, "outputs": [], "source": [ "rs = readers()\n", "for reader in rs:\n", " if \"Gemalto\" in reader.name:\n", " break\n", "target = ECTesterTargetPCSC(reader)" ] }, { "cell_type": "code", "execution_count": null, "id": "69d047e2", "metadata": { "scrolled": true }, "outputs": [], "source": [ "target.connect()" ] }, { "cell_type": "code", "execution_count": null, "id": "cc92ebb2", "metadata": {}, "outputs": [], "source": [ "target.select_applet()" ] }, { "cell_type": "code", "execution_count": null, "id": "c10b744d", "metadata": {}, "outputs": [], "source": [ "target.atr.hex()" ] }, { "cell_type": "code", "execution_count": null, "id": "f8d55215", "metadata": {}, "outputs": [], "source": [ "target.allocate_ka(KeyAgreementEnum.ALG_EC_SVDP_DH_PLAIN)" ] }, { "cell_type": "code", "execution_count": null, "id": "ba2b2ba9", "metadata": {}, "outputs": [], "source": [ "target.info()" ] }, { "cell_type": "code", "execution_count": null, "id": "74df43e9", "metadata": {}, "outputs": [], "source": [ "target.disconnect()" ] }, { "cell_type": "code", "execution_count": null, "id": "d0081236", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9" } }, "nbformat": 4, "nbformat_minor": 5 }