{"id":22696094,"url":"https://github.com/zdimension/security-iot-notre-projet","last_synced_at":"2025-10-23T19:08:04.874Z","repository":{"id":97140926,"uuid":"565904751","full_name":"zdimension/security-iot-notre-projet","owner":"zdimension","description":null,"archived":false,"fork":false,"pushed_at":"2024-09-16T15:34:49.000Z","size":1672,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-04T18:52:11.462Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zdimension.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-14T15:15:08.000Z","updated_at":"2024-09-16T15:34:52.000Z","dependencies_parsed_at":"2023-11-12T16:06:07.799Z","dependency_job_id":"375614c2-85e4-4787-bd7a-c31f1d43273e","html_url":"https://github.com/zdimension/security-iot-notre-projet","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zdimension%2Fsecurity-iot-notre-projet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zdimension%2Fsecurity-iot-notre-projet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zdimension%2Fsecurity-iot-notre-projet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zdimension%2Fsecurity-iot-notre-projet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zdimension","download_url":"https://codeload.github.com/zdimension/security-iot-notre-projet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246223321,"owners_count":20743167,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-10T04:14:14.171Z","updated_at":"2025-10-23T19:07:59.838Z","avatar_url":"https://github.com/zdimension.png","language":"Python","readme":"# Projet de sécurité / IoT\n\nDocumentation des composants :\n\n## [Applet JavaCard](card)\n\n## [Clients Python](client_python)\n\n## Rapport de développement\n\nNous sommes partis de l'exemple Hello World fourni, et avons commencé par mettre en place une architecture de code\npermettant de gérer plusieurs instructions (décodage du champ `INS`, appel de la fonction correspondante). De là, nous\navons pu implémenter la gestion du code PIN et de l'authentification ; faute d'une documentation correcte\npour `OwnerPIN`, nous avons pu nous inspirer\nde [ce projet](https://github.com/Toporin/SatochipApplet/blob/master/src/org/satochip/applet/CardEdge.java).\nConcrètement, un objet `OwnerPIN` est stocké de manière persistante dans l'applet et fournit les fonctionnalités\nusuelles d'un PIN (vérifier, gérer le nombre d'essais restant avant blocage, modifier).\n\nPour le chiffrement, nous avons pu utiliser les classes du package `javacard.security` qui correspond plus ou moins aux\nclasses disponibles sur bureau dans `javax.crypto`. Un objet `KeyPair` est instancié lors de la [ré]initialisation de\nl'applet, et est stocké de manière persistante. Cependant, ce package ne supporte pas le hachage SHA-256, celui-ci est\ndonc effectué côté client (ce qui ne change rien à la validité du processus). Côté carte, la charge à signer est\nconstruite à partir du hash transmis et de l'identifiant ASN.1 pour le SHA-256, et le tout est chiffré avec la clé\nprivée pour aboutir à une signature.\n\nLe client a été développé en tandem avec l'applet, et les tests se faisaient ainsi via l'envoi des APDUs à tester depuis\nle REPL du client. L'utilitaire `openssl` sur ordinateur a été utilisé pour s'assurer que les signatures étaient\ncorrectement générées et valides (en effet, on peut vérifier avec `openssl` une signature générée par la carte, et ça\nfonctionne).\n\n### Détail des APDUs\n\nToutes les communications avec l'applet se font en T=0.\n\n| `INS` | Description                             | Entrée      | Sortie           | Authentifié |\n|-------|-----------------------------------------|-------------|------------------|-------------|\n| `01`  | Renvoie un message stocké dans la carte |             | Message          |             |\n| `02`  | S'authentifie dans la carte             | PIN (4 o)   |                  |             |\n| `03`  | Modifie le PIN                          | PIN (4 o)   |                  | Oui         |\n| `04`  | Se désauthentifie de la carte           |             |                  | Oui         |\n| `05`  | Réinitialise le PIN et la paire de clés |             |                  |             |\n| `06`  | Signe le hash SHA-256 fourni            | Hash (32 o) | Signature (64 o) | Oui         |\n| `07`  | Renvoie la clé publique                 |             | Clé publique     |             |\n| `08`  | Renvoie la clé privée                   |             | Clé privée       | Oui         |\n\n#### Format de la clé publique\n\n| Position      | Taille    | Description                      |\n|---------------|-----------|----------------------------------|\n| 0             | 2         | Longueur de l'exposant (`e_len`) |\n| 2             | `e_len`   | Exposant                         |\n| 2 + `e_len`   | 2         | Longueur du module (`n_len`)     |\n| 4 + `e_len`   | `n_len`   | Module                           |\n\nLe couple (e, n) décrit la clé publique et permet de chiffrer des données.\n\n#### Format de la clé privée\n\n| Position    | Taille   | Description               |\n|-------------|----------|---------------------------|\n| 0           | 2        | Longueur de `p` (`p_len`) |\n| 2           | `p_len`  | `p`                       |\n| 2 + `p_len` | 2        | Longueur de `q` (`q_len`) |\n| 4 + `p_len` | `q_len`  | `q`                       |\n\nLes clés privées RSA sont usuellement décrites via le nombre `d` défini comme `d = e^-1 mod (p-1)(q-1)`. Cependant,\nl'API JavaCard ne permet pas d'obtenir `d` directement, et le calculer sur la carte est coûteux en ressources (en\noutre, `BigInteger` n'est pas disponible sur la carte). Nous récupérons donc `p` et `q`, que JavaCard expose, et nous\ncalculons `d` côté client à partir de la clé publiqu et la clé privée à l'aide de la formule citée plus tôt.\n\n### Exemple de communication\n\n```mermaid\nsequenceDiagram\n    participant C as Client\n    participant A as Applet\n\n    critical Load applet\n        C-\u003e\u003e+A: LOAD with applet AID\u003cbr\u003e80 E8 00 00 0A A0 40 41 42 43 44 45 46 10 01 00\n        A-\u003e\u003e-C: OK\u003cbr\u003e90 00\n\n        C-\u003e\u003e+A: SELECT with applet AID\u003cbr\u003e00 A4 04 00 0A A0 40 41 42 43 44 45 46 10 01 00\n        A-\u003e\u003e-C: OK\u003cbr\u003e90 00\n    end\n\n    C-\u003e\u003e+A: HELLO\u003cbr\u003e42 01 00 00 00\n    A-\u003e\u003eC: Bad length value in Le, 19 is the correct exact Le\u003cbr\u003e6C 13\n\n    C-\u003e\u003eA: HELLO\u003cbr\u003e42 01 00 00 13\n    A-\u003e\u003e-C: \"Virtualbox m'a tuer\"\u003cbr\u003e56 69 72 74 75 61 6C 62 6F 78 20 6D 27 61 20 74 75 65 72\u003cbr\u003eOK\u003cbr\u003e90 00\n\n    C-\u003e\u003e+A: LOGIN 1234\u003cbr\u003e42 02 00 00 04 01 02 03 04 00\n    critical Logged in\n        A-\u003e\u003e-C: OK\u003cbr\u003e90 00\n\n        C-\u003e\u003e+A: SIGN (SHA-256 digest of \"bonjour\")\u003cbr\u003e42 06 00 00 20 ......... (32 bytes) 00\n        A-\u003e\u003eC: Success, 64 bytes available using GET RESPONSE\n        C-\u003e\u003eA: GET RESPONSE\u003cbr\u003eA0 C0 00 00 40\n        A-\u003e\u003e-C: Signature\u003cbr\u003e........ (64 bytes)\n\n        C-\u003e\u003e+A: LOGOUT\u003cbr\u003e42 04 00 00 00\n    end\n    A-\u003e\u003e-C: OK\u003cbr\u003e90 00\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzdimension%2Fsecurity-iot-notre-projet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzdimension%2Fsecurity-iot-notre-projet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzdimension%2Fsecurity-iot-notre-projet/lists"}