{
"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
}