Calculer le SHA-256 d’un fichier de preuve #47
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Calculer le SHA-256 d’un fichier de preuve
Objectif
Ajouter un module indépendant capable de calculer de manière fiable le SHA-256 d’un fichier destiné à devenir une preuve.
Ce module constituera la première étape technique du futur import de preuves. Il ne doit ni copier, ni renommer, ni modifier le fichier source.
Contexte
EvidenceRecordexige notamment :Le calcul doit fonctionner sur de gros fichiers sans charger leur contenu complet en mémoire. Il doit également pouvoir être interrompu proprement par un
GCancellable.Périmètre
Créer :
Mettre à jour le
Makefileafin de compiler et d’exécuter le nouveau test avecmake test.API attendue
Le module doit exposer un type d’erreur propre et une fonction synchrone.
Proposition d’API :
L’API exacte peut être légèrement adaptée si l’architecture existante l’exige, mais les responsabilités suivantes doivent rester séparées :
Comportement requis
Validation des paramètres
La fonction doit refuser :
NULL;out_sha256absent ;out_size_bytesabsent ;GErrordéjà initialisé.En cas d’échec :
dès que les pointeurs de sortie sont valides.
Type de fichier
Le module doit accepter uniquement un fichier régulier.
Il doit refuser explicitement :
Le contrôle ne doit pas suivre silencieusement un lien symbolique.
Lecture
Le fichier doit être ouvert en lecture seule.
Le contenu doit être lu progressivement avec un tampon de taille fixe. Le fichier complet ne doit jamais être chargé en mémoire.
Une taille de bloc raisonnable peut être utilisée, par exemple :
La taille retournée doit correspondre au nombre total d’octets effectivement lus et intégrés au calcul.
SHA-256
Le résultat doit être :
Il est recommandé d’utiliser
GChecksumavecG_CHECKSUM_SHA256.Annulation
Le paramètre
GCancellableest facultatif.La fonction doit contrôler l’annulation :
Une annulation doit :
FALSE;Erreurs d’entrée-sortie
Les erreurs suivantes doivent être distinguées autant que raisonnablement possible :
Le message doit contenir suffisamment de contexte pour comprendre l’échec, notamment le chemin concerné lorsque cela est pertinent.
Propriété des ressources
Après un succès :
*out_sha256contient une nouvelle chaîne à libérer avecg_free();*out_size_bytescontient le nombre d’octets lus.Après un échec :
GChecksumne reste alloué ;Contraintes de sécurité et d’intégrité
Le module ne doit jamais :
Le chemin doit être transmis directement aux API de fichiers, sans construction de commande.
Tests obligatoires
Le fichier
tests/test_file_hash.cdoit utiliser des fichiers et dossiers temporaires isolés.Fichier vide
Vérifier :
0;Contenu connu
Créer un fichier contenant exactement :
sans saut de ligne.
Vérifier :
3;Fichier sur plusieurs blocs
Créer un fichier plus grand que la taille du tampon de lecture.
Vérifier :
Le test ne doit pas nécessiter un fichier volumineux : quelques centaines de Kio suffisent.
Caractères binaires
Créer un fichier contenant notamment :
Vérifier que le calcul traite les données comme des octets et non comme du texte.
Chemin absent
Vérifier :
FALSE;NULL;0;Dossier
Vérifier qu’un dossier est refusé avec
FILE_HASH_ERROR_NOT_REGULAR.Lien symbolique
Créer un fichier régulier puis un lien symbolique vers celui-ci.
Vérifier que le lien est refusé, même si sa cible est un fichier valide.
Si la plateforme de test ne permet pas de créer un lien symbolique, le test peut être explicitement ignoré avec une justification claire.
Paramètres invalides
Tester au minimum :
NULL;out_sha256 == NULL;out_size_bytes == NULL.Annulation avant lecture
Créer un
GCancellable, l’annuler avant l’appel, puis vérifier :FALSE;Annulation pendant la lecture
Tester une annulation observée entre deux blocs.
Le test doit rester déterministe. Une solution acceptable consiste à prévoir une abstraction interne de lecture ou un mécanisme de test permettant de déclencher l’annulation après un nombre défini de blocs, sans ralentissement artificiel important.
Ne pas utiliser un test dépendant uniquement d’un délai aléatoire ou de la vitesse de la machine.
Appels successifs
Calculer plusieurs fois le hash du même fichier et vérifier que :
Fichier modifié entre deux appels
Calculer le hash, modifier le fichier, puis recalculer.
Vérifier que le second hash est différent et que la nouvelle taille est correcte.
Tests d’erreurs internes
Les tests doivent vérifier que les sorties sont réinitialisées même lorsqu’elles contenaient auparavant des valeurs non nulles :
Le test devra libérer cette ancienne valeur avant l’appel ou respecter précisément le contrat choisi. Le module ne doit pas libérer arbitrairement une chaîne dont il n’est pas propriétaire.
Le contrat recommandé est d’exiger :
à l’entrée, conformément aux conventions GLib des paramètres de sortie alloués. Si ce contrat est retenu, il doit être documenté et testé.
Critères d’acceptation
Le ticket est validé lorsque :
-std=c17 -Wall -Wextra -Werror;abcest exact ;git diff --checkne signale rien ;Commandes de validation
Test ciblé :
Valgrind :
Résultats indispensables :
Hors périmètre
Ce ticket ne doit pas encore :
EvidenceRecord;BackgroundTask.Ces responsabilités seront traitées dans les tickets suivants.
Suite prévue
Le ticket suivant utilisera ce module pour réaliser une copie sûre du fichier vers le dossier des preuves originales, sans écrasement et avec vérification du SHA-256 après copie.