{"id":3592,"date":"2019-06-23T10:00:59","date_gmt":"2019-06-23T08:00:59","guid":{"rendered":"https:\/\/www.unicoda.com\/?p=3592"},"modified":"2019-05-31T23:06:08","modified_gmt":"2019-05-31T21:06:08","slug":"jeton-cryptographique-de-depannage","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=3592","title":{"rendered":"Jeton cryptographique de d\u00e9pannage avec Gnuk"},"content":{"rendered":"\n<p>Apr\u00e8s avoir commenc\u00e9 \u00e0 \u00e9tendre l&rsquo;usage de mes clefs gpg via Yubikey \u00e0 diff\u00e9rents aspects de mon informatique, se pose la question de la r\u00e9silience du syst\u00e8me. Que faire en cas de perte, d\u00e9t\u00e9rioration ou malfonction de l&rsquo;outil qui sert \u00e0 acc\u00e9der \u00e0 mon r\u00e9pertoire de mot de passe et \u00e0 me connecter \u00e0 mes serveurs. L&rsquo;id\u00e9al reste de poss\u00e9der une seconde Yubikey NFC vierge en r\u00e9serve, pour pouvoir red\u00e9ployer rapidement ses clefs de s\u00e9curit\u00e9 \u00e0 partir de l&rsquo;une des sauvegardes que l&rsquo;on aura pris soin d&rsquo;effectuer. Une autre solution consiste \u00e0 d\u00e9tourner un mat\u00e9riel de son usage premier pour en faire une cl\u00e9 de s\u00e9curit\u00e9 pr\u00eate \u00e0 accueillir mes cl\u00e9s le temps d&rsquo;effectuer la transition vers une nouvelle Yubikey, ou un autre support du m\u00eame type.<\/p>\n\n\n\n<p>Pour r\u00e9pondre \u00e0 ce besoin, j&rsquo;ai d\u00e9couvert un programme nomm\u00e9 <a rel=\"noreferrer noopener\" aria-label=\"Gnuk (s\u2019ouvre dans un nouvel onglet)\" href=\"http:\/\/www.fsij.org\/doc-gnuk\/\" target=\"_blank\">Gnuk<\/a>, qui permet de transformer un microcontr\u00f4leur de type STM32F103 en une cl\u00e9 de s\u00e9curit\u00e9 supportant le protocole OpenPGP card version 2. Il se trouve que ce type de processeur \u00e9quipe les cartes de programmation ST-Linkv2 et qu&rsquo;on trouve ces derni\u00e8res pour moins de 2 euros sur Aliexpress. Afin de r\u00e9aliser quelques tests, j&rsquo;en ai donc command\u00e9 trois chez deux vendeurs diff\u00e9rents et j&rsquo;ai re\u00e7u l&rsquo;ensemble des cartes apr\u00e8s environ deux dizaines de jours. Il faut un minimum de deux ST-Linkv2, car l&rsquo;un sera utilis\u00e9 pour programmer l&rsquo;autre.<\/p>\n\n\n\n<p>Une fois en possession des ST-Linkv2, je commence donc par retirer leur bo\u00eetier m\u00e9tallique afin d&rsquo;avoir acc\u00e8s \u00e0 la carte. Je v\u00e9rifie la version du microcontr\u00f4leur \u00e9quipant les cartes: STM32F103C8T6, \u00e7a ne devrait pas poser de probl\u00e8me. En examinant les cartes, je constate que j&rsquo;ai re\u00e7u deux mod\u00e8les diff\u00e9rents, l&rsquo;un avec des pastilles m\u00e9talliques, l&rsquo;autre avec des trous pour l&rsquo;acc\u00e8s au processeur. Autre point g\u00eanant que je constaterai lors de mes premiers essais de reprogrammation du processeur, l&rsquo;alternance des \u00ab\u00a0pins\u00a0\u00bb de connexion au bout du ST-Link au bo\u00eetier rouge ne correspond pas \u00e0 ce qui est inscrit sur le bo\u00eetier, attention donc en branchant les c\u00e2bles, de bien v\u00e9rifier directement sur le PCB \u00e0 quoi correspond chaque pin.<\/p>\n\n\n\n<!--more-->\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlinkv2.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"225\" height=\"300\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlinkv2-225x300.jpg\" alt=\"\" class=\"wp-image-3650\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlinkv2-225x300.jpg 225w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlinkv2-768x1024.jpg 768w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlinkv2-1200x1600.jpg 1200w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlinkv2.jpg 1728w\" sizes=\"auto, (max-width: 225px) 85vw, 225px\" \/><\/a><figcaption>Sur le ST-Link de gauche, l&rsquo;ordre des pins ne correspond pas \u00e0 celui indiqu\u00e9 sur le bo\u00eetier.<\/figcaption><\/figure><\/div>\n\n\n\n<p>Avant de s&rsquo;int\u00e9resser au c\u00e2blage et \u00e0 la reprogrammation, je commence donc par r\u00e9cup\u00e9rer les \u00e9l\u00e9ments n\u00e9cessaires \u00e0 la compilation du programme.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo pacman -S arm-none-eabi-binutils arm-none-eabi-gcc arm-none-eabi-newlib arm-none-eabi-gdb\ngit clone https:\/\/salsa.debian.org\/gnuk-team\/gnuk\/gnuk.git\ncd gnuk\/\ngit submodule update --init<\/pre>\n\n\n\n<p>On peut ensuite passer \u00e0 la compilation de Gnuk.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.\/configure --vidpid=234b:0000 --target=ST_DONGLE\nmake\nmake build\/gnuk-vidpid.bin<\/pre>\n\n\n\n<p>Passons \u00e0 l&rsquo;\u00e9tape de c\u00e2blage. Le principe est relativement simple sur le papier (ou sur l&rsquo;\u00e9cran), connecter les sorties SWDIO, GND, SWCLK et 3V3 de la carte qui servira \u00e0 programmer, aux entr\u00e9es SWDIO, GND, SWCLK et 3V3 pr\u00e9sentes sur la carte cible. Si les entr\u00e9es ne sont pas nomm\u00e9es sur la carte, leur ordre est \u00e0 priori le suivant (en commen\u00e7ant par le plus proche du connecteur USB): SWDIO, GND, SWCLK, 3V3. Pour ma part, j&rsquo;ai d\u00fb faire preuve d&rsquo;un peu d&rsquo;astuce pour connecter le tout, ne disposant pas de mat\u00e9riel sp\u00e9cifique pour me connecter sur les pastilles m\u00e9talliques (Existe-t-il un tel mat\u00e9riel ?) et impossible de faire connecter les c\u00e2bles sur la version de la carte \u00e0 trou : trous trop petits ou pointe m\u00e9tallique des fils trop \u00e9paisses, au choix. J&rsquo;ai bien envisag\u00e9 de sortir le fer \u00e0 souder pour raccorder le tout, mais la perspective de tout devoir d\u00e9s-souder ensuite m&rsquo;a pouss\u00e9 \u00e0 chercher une autre solution. Solution qui a donc pris la forme suivante :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlink-overwrite.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"225\" height=\"300\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlink-overwrite-225x300.jpg\" alt=\"\" class=\"wp-image-3651\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlink-overwrite-225x300.jpg 225w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlink-overwrite-768x1024.jpg 768w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlink-overwrite-1200x1600.jpg 1200w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2019\/05\/stlink-overwrite.jpg 1728w\" sizes=\"auto, (max-width: 225px) 85vw, 225px\" \/><\/a><figcaption>Pr\u00eat \u00e0 reprogrammer.<\/figcaption><\/figure><\/div>\n\n\n\n<p>Maintenant que mes ST-Link sont connect\u00e9s, je peux donc passer \u00e0 la derni\u00e8re \u00e9tape, \u00e0 savoir reprogrammation de la carte cible. Je commence donc par installer openocd pour interagir avec le programmateur.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo pacman -S openocd<\/pre>\n\n\n\n<p>Puis vient l&rsquo;\u00e9tape de connexion, dont voici un retour indiquant une r\u00e9ussite de connexion.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo openocd -f interface\/stlink-v2.cfg -f target\/stm32f1x.cfg\nOpen On-Chip Debugger 0.10.0\nLicensed under GNU GPL v2\nFor bug reports, read \n  http:\/\/openocd.org\/doc\/doxygen\/bugs.html\nInfo : auto-selecting first available session transport \"hla_swd\". To override use 'transport select &lt;transport&gt;'.\nInfo : The selected transport took over low-level target control. The results might differ compared to plain JTAG\/SWD\nadapter speed: 1000 kHz\nadapter_nsrst_delay: 100\nnone separate\nInfo : Unable to match requested speed 1000 kHz, using 950 kHz\nInfo : Unable to match requested speed 1000 kHz, using 950 kHz\nInfo : clock speed 950 kHz\nInfo : STLINK v2 JTAG v31 API v2 SWIM v7 VID 0x0483 PID 0x3748\nInfo : using stlink api v2\nInfo : Target voltage: 3.175194\nInfo : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints<\/pre>\n\n\n\n<p>Tout est pr\u00eat pour commencer la reprogrammation. On \u00e9tablit une liaison telnet en local sur le port 4444 afin d&rsquo;envoyer nos instructions \u00e0 la carte de programmation.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">telnet localhost 4444<\/pre>\n\n\n\n<p>Puis place aux instructions (depuis le dossier gnuk):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">halt\nstm32f1x unlock 0\nreset halt\nflash write_bank 0 .\/src\/build\/gnuk-vidpid.bin 0\nstm32f1x lock 0\nreset halt<\/pre>\n\n\n\n<p>Voici le contenu des logs dans le terminal ex\u00e9cutant openocd dans le cas d&rsquo;une programmation r\u00e9ussi.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Info : accepting 'telnet' connection on tcp\/4444\ntarget halted due to debug-request, current mode: Handler HardFault\nxPSR: 0x61000003 pc: 0x08002246 msp: 0x20000794\nInfo : device id = 0x20036410\nWarn : STM32 flash size failed, probe inaccurate - assuming 128k flash\nInfo : flash size = 128kbytes\nInfo : Device Security Bit Set\ntarget halted due to breakpoint, current mode: Handler HardFault\nxPSR: 0x61000003 pc: 0x2000003a msp: 0x20000794stm32x unlocked.\nINFO: a reset or power cycle is required for the new settings to take effect.\ntarget halted due to debug-request, current mode: Thread\nxPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc\ntarget halted due to breakpoint, current mode: Thread\nxPSR: 0x61000000 pc: 0x2000003a msp: 0xfffffffcwrote 109568 bytes from file .\/src\/build\/gnuk-vidpid.bin to flash bank 0 at offset 0x00000000 in 3.311114s (32.315 KiB\/s)\ntarget halted due to breakpoint, current mode: Thread\nxPSR: 0x61000000 pc: 0x2000003a msp: 0xfffffffcstm32x locked\ntarget halted due to debug-request, current mode: Thread\nxPSR: 0x01000000 pc: 0x08000250 msp: 0x20005000\nInfo : dropped 'telnet' connection<\/pre>\n\n\n\n<p>On peut alors d\u00e9brancher la carte cible, la brancher dans un port USB et v\u00e9rifier que celle-ci est bien d\u00e9tect\u00e9e par gpg.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo gpg --card-status\nReader ...........: 0000:0000:FSIJ-1.2.14-XXXXXXXX:0\nApplication ID ...: D276000124010200FFFEXXXXXXXX0000\nVersion ..........: 2.0\nManufacturer .....: unmanaged S\/N range\nSerial number ....: XXXXXXXX\nName of cardholder: [non positionn\u00e9]\nLanguage prefs ...: [non positionn\u00e9]\nSex ..............: non indiqu\u00e9\nURL of public key : [non positionn\u00e9]\nLogin data .......: [non positionn\u00e9]\nSignature PIN ....: forc\u00e9\nKey attributes ...: rsa2048 rsa2048 rsa2048\nMax. PIN lengths .: 127 127 127\nPIN retry counter : 3 3 3\nSignature counter : 0\nKDF setting ......: off\nSignature key ....: [none]\nEncryption key....: [none]\nAuthentication key: [none]\nGeneral key info..: [none]<\/pre>\n\n\n\n<p>\u00c0 l&rsquo;issue de ces op\u00e9rations, je dispose d&rsquo;une cl\u00e9 pr\u00eate \u00e0 accueillir mes clefs GPG en cas de probl\u00e8me avec ma cl\u00e9 de s\u00e9curit\u00e9 principale. Il reste bien \u00e9videmment \u00e0 valider le processus de r\u00e9\u00e9criture des clefs sur la nouvelle cl\u00e9, mais celle-ci \u00e9tant d\u00e9tect\u00e9e correctement, cela ne devrait pas soulever de difficult\u00e9 particuli\u00e8re. Les possibilit\u00e9s offertes par Gnuk et le d\u00e9tournement du ST-Linkv2 sont \u00e0 creuser, mais on pourrait envisager de laisser une telle cl\u00e9 branch\u00e9e en permanence sur son PC fixe, avec bien s\u00fbr tous les risques de s\u00e9curit\u00e9 que cela comporte \u00e9tant donn\u00e9 qu&rsquo;on ne conserve plus la cl\u00e9 en permanence sur soi. De plus, le micro-contr\u00f4leur \u00e9tant facilement accessible, on peut envisager qu&rsquo;il soit plus facile de <a href=\"https:\/\/linuxfr.org\/news\/gnuk-neug-fst-01-entre-cryptographie-et-materiel-libre#protection-des-clefs\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"r\u00e9cup\u00e9rer les clefs stock\u00e9es (s\u2019ouvre dans un nouvel onglet)\">r\u00e9cup\u00e9rer les clefs stock\u00e9es<\/a> que sur un autre jeton cryptographique. Dans le m\u00eame style, il existe \u00e9galement un programme permettant de <a rel=\"noreferrer noopener\" aria-label=\"transformer un STM32F103 en cl\u00e9 U2F (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/github.com\/gl-sergei\/u2f-token\" target=\"_blank\">transformer un STM32F103 en cl\u00e9 U2F<\/a>.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">Source<\/h6>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" aria-label=\"$2 USB crypto token for use with gpg and ssh - danman' blog (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/blog.danman.eu\/2-usb-crypto-token-for-use-with-gpg-and-ssh\/\" target=\"_blank\">$2 USB crypto token for use with gpg and ssh &#8211; danman&rsquo; blog<\/a><\/li><li><a rel=\"noreferrer noopener\" aria-label=\"Gnuk on the ST-LINK v2 (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/nx3d.org\/gnuk-st-link-v2\/\" target=\"_blank\">Gnuk on the ST-LINK v2<\/a><\/li><li><a href=\"https:\/\/wiki.debian.org\/GNUK\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"GNUK - Wiki Debian (s\u2019ouvre dans un nouvel onglet)\">GNUK &#8211; Wiki Debian<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Apr\u00e8s avoir commenc\u00e9 \u00e0 \u00e9tendre l&rsquo;usage de mes clefs gpg via Yubikey \u00e0 diff\u00e9rents aspects de mon informatique, se pose la question de la r\u00e9silience du syst\u00e8me. Que faire en cas de perte, d\u00e9t\u00e9rioration ou malfonction de l&rsquo;outil qui sert \u00e0 acc\u00e9der \u00e0 mon r\u00e9pertoire de mot de passe et \u00e0 me connecter \u00e0 mes &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=3592\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Jeton cryptographique de d\u00e9pannage avec Gnuk&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[377],"tags":[427,430,429,428],"class_list":["post-3592","post","type-post","status-publish","format-standard","hentry","category-crypto","tag-gnuk","tag-openpgp-card","tag-st-linkv2","tag-stm32f103"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/3592","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3592"}],"version-history":[{"count":8,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/3592\/revisions"}],"predecessor-version":[{"id":3673,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/3592\/revisions\/3673"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3592"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3592"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}