From d6fb7c0e468b95ecc3c7f27094b11ca78890bfdb Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Sun, 19 Jul 2026 13:48:35 +0200 Subject: [PATCH] feat: compute evidence file sha256 --- Makefile | 16 +- include/core/file_hash.h | 99 +++ labfy-investigation | Bin 372864 -> 383160 bytes src/core/file_hash.c | 553 ++++++++++++++++ tests/test_file_hash | Bin 0 -> 36752 bytes tests/test_file_hash.c | 1355 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 2021 insertions(+), 2 deletions(-) create mode 100644 include/core/file_hash.h create mode 100644 src/core/file_hash.c create mode 100755 tests/test_file_hash create mode 100644 tests/test_file_hash.c diff --git a/Makefile b/Makefile index 809146d..a918eac 100644 --- a/Makefile +++ b/Makefile @@ -52,6 +52,7 @@ TEST_TOOL_PROCESS := tests/test_tool_process TEST_TOOL_TASK := tests/test_tool_task TEST_TOOL_CATALOG := tests/test_tool_catalog TEST_TOOL_INITIALIZER := tests/test_tool_initializer +TEST_FILE_HASH := tests/test_file_hash all: $(TARGET) @@ -212,6 +213,13 @@ $(TEST_TOOL_INITIALIZER): \ src/core/tool_process.c $(CC) $(TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) +$(TEST_FILE_HASH): \ + tests/test_file_hash.c \ + src/core/file_hash.c + $(CC) $(TEST_CFLAGS) \ + -DFILE_HASH_ENABLE_TEST_HOOKS \ + $^ -o $@ $(TEST_LDFLAGS) + test: \ $(TEST_NODE) \ $(TEST_TREE_MODEL) \ @@ -232,7 +240,8 @@ test: \ $(TEST_TOOL_PROCESS) \ $(TEST_TOOL_TASK) \ $(TEST_TOOL_CATALOG) \ - $(TEST_TOOL_INITIALIZER) + $(TEST_TOOL_INITIALIZER) \ + $(TEST_FILE_HASH) @echo "Exécution des tests..." @./$(TEST_NODE) @./$(TEST_TREE_MODEL) @@ -254,6 +263,7 @@ test: \ @$(TEST_TOOL_TASK) @$(TEST_TOOL_CATALOG) @$(TEST_TOOL_INITIALIZER) + @$(TEST_FILE_HASH) @echo "Tous les tests sont valides." %.o: %.c @@ -283,6 +293,8 @@ clean: $(TEST_TOOL_PROCESS) \ $(TEST_TOOL_TASK) \ $(TEST_TOOL_CATALOG) \ - $(TEST_TOOL_INITIALIZER) + $(TEST_TOOL_INITIALIZER) \ + $(TEST_FILE_HASH) + .PHONY: clean run test diff --git a/include/core/file_hash.h b/include/core/file_hash.h new file mode 100644 index 0000000..b430b8b --- /dev/null +++ b/include/core/file_hash.h @@ -0,0 +1,99 @@ +/****************************************************************************** + * @file file_hash.h + * @brief Calcul des empreintes cryptographiques des fichiers de preuve. + ******************************************************************************/ + +#ifndef LABFY_INVESTIGATION_FILE_HASH_H +#define LABFY_INVESTIGATION_FILE_HASH_H + +#include +#include + +/** + * @brief Catégories d’erreurs du module FileHash. + */ +typedef enum +{ + FILE_HASH_ERROR_INVALID_ARGUMENT, + FILE_HASH_ERROR_NOT_FOUND, + FILE_HASH_ERROR_NOT_REGULAR, + FILE_HASH_ERROR_OPEN, + FILE_HASH_ERROR_READ, + FILE_HASH_ERROR_CANCELLED, + FILE_HASH_ERROR_MEMORY +} FileHashError; + +/** + * @brief Domaine d’erreurs du module FileHash. + */ +#define FILE_HASH_ERROR \ + file_hash_error_quark() + +/** + * @brief Retourne le domaine d’erreurs du module FileHash. + */ +GQuark file_hash_error_quark(void); + +/** + * @brief Calcule le SHA-256 et la taille d’un fichier régulier. + * + * Le fichier est lu progressivement et n’est jamais chargé intégralement + * en mémoire. + * + * Le chemin final ne doit pas être un lien symbolique. + * + * Avant l’appel : + * + * - out_sha256 doit être valide ; + * - *out_sha256 doit valoir NULL ; + * - out_size_bytes doit être valide ; + * - error doit être NULL ou pointer vers NULL. + * + * Après un succès : + * + * - *out_sha256 contient une chaîne de 64 caractères hexadécimaux + * minuscules, à libérer avec g_free() ; + * - *out_size_bytes contient le nombre d’octets effectivement lus. + * + * Après un échec : + * + * - *out_sha256 reste NULL ; + * - *out_size_bytes vaut 0. + * + * @param file_path Chemin du fichier à analyser. + * @param cancellable Objet d’annulation facultatif. + * @param out_sha256 Destination de la chaîne SHA-256. + * @param out_size_bytes Destination de la taille du fichier. + * @param error Adresse recevant une éventuelle erreur. + * + * @return TRUE en cas de succès, sinon FALSE. + */ +gboolean file_hash_compute_sha256( + const char *file_path, + GCancellable *cancellable, + char **out_sha256, + guint64 *out_size_bytes, + GError **error +); + +#ifdef FILE_HASH_ENABLE_TEST_HOOKS + +/** + * @brief Crochet appelé après chaque bloc lu, réservé aux tests. + */ +typedef void (*FileHashTestBlockHook)( + guint64 total_size_bytes, + gpointer user_data +); + +/** + * @brief Configure le crochet de lecture réservé aux tests. + */ +void file_hash_test_set_block_hook( + FileHashTestBlockHook block_hook, + gpointer user_data +); + +#endif + +#endif diff --git a/labfy-investigation b/labfy-investigation index 18572e4c80b2622294186859be683791f366987b..f806d19453a785483d2f61b48cef4db16888d8bb 100755 GIT binary patch delta 151642 zcmZ@>34BdQ7k_h;kc1>pWM5>l#hPacK@m%Mwu-G%l-QSAf&{g_5L846Q$|&ZeJL7y zsui)cQM7{6RB1!CZY&j4o7(c7bMAfbjp&!(uipFr&zUnbXU?3NJNMq#l$$;|`+PI~ zJc|+y^cSOj7;?T}QFoi`nf@9)(|^UahL$fzFoM=kgHe+r>xf?qG!)0< z0*H+7Dx_c>`}${`hgL38`{W-o&nkm7m6Gw+Pri!{_VkO_p#75vD78G}b=v;PdjoCP zvXff_9TdAgF;jMMz0;_DgTU(>RG@@LABDsOawk8^0~wdv`H1^s>sPr8x6 z=)uErhfCAiFZ`G9b_n%1f~U|~*nP047{UzB$W`ILJJe&p@kdU++~}CcYV)wlzFc)Q zvE{sxlP~k-LqTG8@?+QG+YnX*F*EYXL4Hu?IGfKeI{LB}RH~?gpVJRj42EzX=1`Rz zD;BaCDy>%ZV^7K2Q`BQQypi(|c7(5Rj$|tioN%tKuwAIQvXY4%>*~ zsJ_lvnnzdmWBYio%8~3OpI3Q0^PpOdZhq_=Y(ERYw(tly6HBCeuJFlj%UL(l@^d${ zx2dg;q&34m0osJUE_C-}>kd3}-=MH~9_H!Gejv5Sq?T93%<56)p`LzhE>!NvCs*`k z+sUZO$&at`G_%16ZhD3=_7`=+D^DcWcXH&Xy|%DT)Q=SJLNVfGpnnW@Herxo#O`b3$IdR0$q}P~qemtU88LSB$f-#( zJ8H^Eabkm0@PWdHA2>KpN*p%asrdi zrku^8c_Z=Qf2*LAE(k4GpqI{@%JJ{(d`vlhvChYpM%khqvHBV%f;{$a*yByyLc#6Nga)J(efr4^;Pn|C+#}Cl?l5+fToj1Jy`VdUi z`Ox#I2XsEB9Di8n#>j^;2xTR=?qlE?8_6X!EZ?=QIBg zpH+?z)p2$?{s-MoPC5RDMHl3i7wCLJIo_n>qH_E#U0*H7m*{-S|KTkLeT!lpf*4)V zSdRZ&H{@52H~gv%S?K@aP38DF-F}S5TWr(MNjGFJSD=c{$Ccy#bv~gSpP*NeSdPzh z(t>ctYdnnq8C{U_n!sSltDqHFT#hf%`OI>>Uu8{yO*uZrP2;o5@g?rSWBlzXCm3VY z3S^h#*XVpsIle&W^UCoKRWv(i%JC68A3sCU=D&69k-)#KN!llF`}Bp3_#F}-MvV4P zw!~M_!hr-i65mbI&$IIu!!=28#x5{8ONNT{9yo!nQQ}pJ_mp@;qSk?mpfA(T60d3K z^WP{59Ha*MNjzOU=(13W$3|KIA|xKYXZA1d*s5+5${hROC>P+j7kCEij)5*Q^x zO^NrD_*xPlD)F@?K0@LnB;F+Pbu?a^f6o$Ue4NBLkob6sZz%Bz zlPz`^MM{D(QUR01CrW%HiJu|yjU_%s;+shPVk?jRZz>5gtpebpBz}#=HCQAGiNq>gKPnGx-iBGcfIR1+zL9$f1yqTjC-Ef`KVRZYB|cT+4N3M{uz+}d{y9s6g;D{d#4nO~KZ*ZP;zK2VvBXD6 ze450YERtY}B#4&ybcv6V_@xqWmiP>bkCXUi5+ASgwEtf&2@<3NnG!!n;#Wv~qQtM1 z_!$z8;#W)j8i^MYpC$2YBz}j)e{ADn{Iey&TAKiNL=yjr z#OF!;I*C6c@t;b3fyA$u_(J3{{&4zjkOW0ifh>tvC4QsCmq`33i7%D-%@S`&w$B2~ z7D?bN3AReSQR25ryr0Bxm-tYL-y!i462DX9wfSd~1iPdH(Gvfe#K%bdZizQb{2qyq zllZ+7AD=Ak|38-m2~vS{KCGm!7I18ZvIQ>pb0%sCv{MQn1l=yEX-cRE5B|cQ* z&q#cP#D8n^KPZ?a!C9$5w8Wp2_!x;lFY#uH|4!oLB>sDyr~2b1!3C*6g2Wd{{1}P9 zDDjCBe@WtJNc?4qPnjm||9_AKi=_frBtBE(uS)zHiT_dJvn0My;&<41=>JcWAloJ| z7=D)c9Era!@p%$|L*ma!{4Ww;Ao0HO; z-YoHdN_?EeKeYKD6yha8iBup#;vY%;7>R!@@re@uMB-;i{9jfc$3I09JhckobFsw# zE%BKW|BuA4k@!-H&yx6mC4L9+6n~fjpGksjslaoI&yn~S5}zmWFD3qr#J`gG0y}Rp zlu3d@yWq8h`yz>F%w9m1ctzq%B;G;dOC{csc;xXv$;-WJ6t9cSJ8ZRy&d=xRJkK#PS`w=@J&L+GI zu_NLv!kZ8~0k#xp60sJE3aF4mcqL*SgW^QOOAtFFP9QuVu?ylj!ZQ)OB90+E1#uHlfM_dJQ0pXU2JrU;- zZj87p;%vfo5qlxdA{>s`8)sc{CJ_Nh_@F`xVNb-qh!Y9BBKAX^Kv+TSk2sF-Gq{O3 zCIE2^;m3#r5t|6#MI3}Ul<+OY!5H<$Mk1~uQ4O(y@Fm0{h)Z6g2hJi6MO;MqB;qi{ z1%!_x4o93vct7Imh_earLRML~J138*wD!k{1*Mh)sx# z2)9Sv2yp@7mWUf8&Li9yaTCPZgzF-1ia3jKxI656#zY~JNkjlDG(((1*b{Mc#EFDm z5l16VAgmy6fjExvGq}M#rX}JS!jBQRLTn;@7x7z&LkZtgiUGt4h>HlHL_8F60pX*Fhat`*ydUv!#My**As&G^ z>tCq9tmY;pMk0|(3TqLMLYzW)CF0SD6A3RtjH^*`0^#|H$0Cj+JQMLa#4&`YAbuaQ ziSRhY;}M7c3-y=P9EQXMB#fjm0P#e`2Ex4&PeNQ$iuzpG zI1ObT z2)9SP0&xN1mWWp(&Li9yF-M$DxGv(4X#LM3A{>cTsE|oG0P$+XDTF-{3&e?pT@kNA zoIqGX{4wG zBzz5VE@A`WONfsnE_p&RfH)6v5#f`FParNJd=&9X#Ce4GBR+*VoA53R5~q>KB4QKb zuMuYwUW@n}#3_VVBF;ygNO%e2Gl&xi&qw?%;yA)H5uZgILwE|}bBIlZE#r_lk3=XD z!w`Rm*hqK);_nd~2=_*O0ddJ=iUGt0h>HlfM|=@+0pXU2FCoq&+!*m?#My`~HR~er z0}@%J5RUi?;!MH;h_50}A?%6xN5qMQT@e=|P9Urx{t0m$;b+c(uOW^h{21}ih)sYk zWi{_2aUF?JQn-cq24W-OYlweAY#@9I@vn$W9#IS+E<#*H_$1<+hzkfGMSKf!9^w6n ze?y%8h}QpINZdvuixf5?{vB~9;kAhWK%7E&CE`1X6A3RttRhYzJRfl};yA)H5#L1| zLwE|}dx%YsEZBo_NZdyvloW;`et_6WcmU!*5gQ2iM*I+QNePzkins)E5#jcTA0aLv z+!FC)#Ce1pBYuK7+d@QLB>qAoi*PvNr-(BN2O$0%aSCBi#Qz{pBi2>2P|7{ZScKSyja5pfrZ7f6H>zJ>TDVk6;eh+iQ#5Wa-C3~|XriUGvoOGct2u1kFgYI6R`^kJcudIBD@JPp1%}l5?+fK&s~aB2(Ltp z=PkvFgqI-32Stk$2+v21=Pt!@gs;6~hEcd&)87-1YR?)y=#qAEFdvXurT0cyM9RER zfy!T_8hV7_zQkZKXSD7DM$8#b?eU{UX_B`&-Dw&q;dzNmS&>Ib3hJHGKSAH0^rJj0 zD*RYtfYR?3|0yxJ{uO*mIJrqbb82f(C~YvO{hs7zPH%k}_%d$;Q0j2-;WtjZD=0jC za)L7MPkww(m?)aeD)QZvBYX;>2j;ZcQgeE&in$mp1i@$8(^9Nyl!Ii(4_8st57KJ(^lrjBMkRwi-g&p%4q#IEw@$%zhI zAC-xHpRyY8j?#tX=ByL1IIRiu16@q`a@0Wu{mAR3aF-|&=YFNPTq0G zVwS?cn=zV=;ZYw9fr?grkjOe8s4#OfV_W%*S#=#<@068^UT#qPm$O3IWPW|tFy_wN z&Q4Go^x+$4d$Vc$$m|&`gPZ2`Z8<}Q{(_GyQdjP^hH6W5je2$6Zk3fS%uCi~VI*_Z zWsy90&Mf7?P2Os5V`X|@K54FBjjhFHW%mZZW}^2^G?CN=Npxj6|7>oE(wp>|ng2dF z9$pP=V~J4yzQxB_swv<1K}&2Y-)ISEY5cUMw&T3t%gXqQ$zFU?NhR){(n|TQh<8hA z!X|P{iZ{Fmwkjo(E#_aRq$qcO<(=o%Q0D!@v#$q>(9O&_;wU)dUS+7g0Bc|OXIU9_ zwD>Z_353}D55UtP=);fBYrsZwbzXnw#$)D(v%7rw{5HzH-}&bGO<6x)IKR2l`ZjMj zKMY=7Ymyon5)?<#z`N5>Y2##zh&?y>ywqAS9*q`+!y8}cQtSFp2S=FG`xThedt^g% zip*)>W5ofk+#Pg+P*eH$Ht)Bf2D{8>E-(kz{aJSYG$^CyTAlCCe_hZ}vHZq87Fu9z zmoKd89DR+{Tk$H3LU7O*)?x#=!=eUgdQpR*&>qxW(WQLw9=cX0%H}gazH(7tc=PSf zqUNk25Bac(^6Vz>`{6*B2i-Ie#qyjFrzz{ZanoX7<>}A7%i<-$jZj8$T4+wYcobY} zpAOOUio0qWZ;11tx%aAqLkiJ=IqfPsqt#XPQLH+`T+gv)1XxRQQhoWhw5c^y zQId8NgxR|8KAp*kJ!4M$#+>$}+LpIj65!MHMp;?f2~a$9v?^H8ynKOATvFW_c!kUt zruRFY78j~^=Np&QRNn5&&n)?Xwc_p5=O{0)@)PN^F(Q}t3JXT{wAd1`Rf4U1d7X-v zm{aqd5zjf0y%b)Mdwh|9m2pk^;}T!9Y#M9BJ(im=gqFv!^L*a&+RTgZT;9iLaYyvO z)4%wU_6_dp4C?tS+%vO=GO;6%&J6Qza@kg0p|y&(d}3xm&|d|5#ZYNHG(xQeS4q(4 z4DY%f`IgKU(B5A%L*U<6nVpTzK{*$FcN~+38qfQ!7{ey<+!YOdW3WRR-rqbWb1)sr z>8{*iWfzvfd#sG8BYvbdQ1-L7;mP;FrOqieBn5&eXc8A);po3} z{8VZ!)I=*(q7@?dh4S}!vax+TSQ|VdPfT-r>|u0j+K%7ijf2;mqZX;@F`=oYEU5$3 zqgpL>=Z!vsnehYf_fZFUf_X!$E@naYVi+O1uKQ;__kG@mE+&?hpXx;!_VPFSNeM`k*uwzVm{mpzYi(EH3{JiEGYDU57va-}Ue;JbM zsC}UpiqjvW`N?(Tl$4Xa;inNW6eXVq@e8}%c*>{MAboB4G)~Dl1+Fo(sl4U-80Atv zpS?apDLl!yt)Jxi4;oK{j0tlZ+x%f3uf1Ug+rzUq_$Y_J<~bX}l}#u3^$iJC3bfvW zi!@b;>a6a{<;|9k57DV-#-Uo40mS z(oOu{)_}kdzp}1Acv+cive{quB@f-UQTZ&FpW4>U2VM`xR52T^TAh9&mwRllqs)%v zEw@i&gZRGf@3CdvV@ECKd!X5l2-`QR9Z@^#f3}DFz z{B~Ve*bM%3cNFe6_Lx`|K4{NSrK}D=z9&$5T!&xZ6QHa<$V>OM@_F|NMoT|Tf%e@{ z4c=vMEuS6-%gVkz)ekmU(AM}mSZ%&KgD>2B%=>5rwT0J}+OmlE|9qe_E`lHYJlZSs z3)&P!snRZtd~bI9YA>)2>9LE=>CWc#g?L8_ zT9l$MpAWhFzLCnuwR!TsrA^Wg>8U?OO8vERXk838ryeswSwm6)Six`D-Y&f9{x0kS zpS!;a`-Jb`AFd?S;#c?ARL0igFZWM|Y(D8gBlmx5GJ|a|IE3##5aoVQrh@pR13s|b zaz5A{wlw_?hAMY<^XUgCD+g=vy9cMUfqdAZE^H&;eW)pJ4-bX2F5K~OXU7w}U}LlK zloua12>^$)F$Q6bgh%dG)OG0R5UTx=@M>{A#Z98z~ zXe*}t70f-qYGiyI48Bf}U4uD2-TSjJ-sh_@Mcv7#eH9(H1!c5EYTMOiTd?!6AxiH7 z|9LkL;}^b)f`&UCn;w+6n?|NN*vdAi$2+TKJM|IzE{Lx=7VPmO6uwsz*6nQA3hxTy zr;o)dJcw7yt>uyxgl+KtA%wTg?W&9k;)`nS}a_$8}L^TZJ6ORWgY1Mef@hEsv{?zeC0cSRWLi&59wy^s=5PO!dLKNf;_kJHy zhSLbGyV?@lpD)UbQ)&hB!o2RzMpQ_TP2rEWda>@j-3e1Q2c7DY2C1do4yG)NFFz5g zI0f>3CjyicS^T>bEuF6fXf{L@H|E90@){>2aP2&~TRE_vKR*dC{PXUo0+mDleC(;u zSyS$RdZBk4UusxqfB3LY=(_yC>E_BfKYstTSuy+ZW?z4xJoV-KzK(Z1uucn$17Y6` zW9-`l3-VVohw0voU;N3x(twY_2dSq+2eum|$~G`qRKMM%JouEevjN^Sy{K)4MDC_2>FDdcGd5 zIVv#Lkk@IeU|z4!rSyKVm=u^@pFBUiF~0nAkn!d+efBJd*>e!cFE792 zz~R&DhlvgY;4|_{NPwCFN=?;I{-(m|8F4t88Qx<-oclwNvOj}g{~^vHM$?8A)$__O z)`vg4Vq)RE-qqO-FDo&=>uQklO*%hwHB$LHozH$4EcVQTE8O58{XM5G!Qh}PT-p)5 zvy!)7^EO}o<3!8>g&*MpSvZj;ahIRoVGnr1PZJ&9cA?-?HZA7&e>&$d!I|-+*V;M^ zhtC(+nupX$r=;PkU0FSZb<>>T))5W}ARDZLX7>KMSI8GoD_jTaIu=dm1sp1XP6N<6 z`ExUe+Z7pq{_|Tfu+i72vAz8B>$TW)e)W2?!-)!vzkMS}310|TVE#O}$eA7I%Wi~w zE{9_ZIkzoMM&zqwOSZYvydjvo_V~{%`oNJhrI92NcJsXaI?3AkAqfO2`~+K=q;1-ViE6s zs|RjuZiP7vSF}d%w%8g8tHy5~6|Ypdx~<7>@WkIbg>Qp%pDt;zzy3x`tc&K*;97Hg zZRly?Z_Qb2ZoJ(T7X8@U6JPfA+)_DqB-@j@=Sj_PMs@%)E(eDs0xZ~{O6$WPfiiMLzj zLzgkjCh*Y57@2X8d*emQEq}_V)i< z#Q1^TT|D)#a2H=9qs)Kvy?^=p^#hc4g3hd@@;#@Di$0Lb-1Y`>_ow|`oZ*BQlBoKW z3_0$E5fORQSeT0!38G@3@_kQDjz5owVJo{@ojd;>82+LI_6;*-4>+ahSA=0{+Xo(s zf>(va+|H~SpY``_rTYf{@82oP*D!GZ_`BR_4=*y{^|#1s#C-U-&y9TC?EpUUZ)g7d zKY>0=;XE3;z7S4{ZIj~61nyH>R~i3=w=aE58TEvxl=f5FKH)!>nv|#~+~wbPO867r z{oi<{^fBM|Z?E7RaLA1T^=)kic?}nTw3rdq=`o-Eya}9PWItc+u=zh3(46k%DHlgSn2UMrq%xM{4mouUZ9;eog)(%y3=4E{I=#wWz7XXnC2! z!A|eD1sdKD?l_n;VzbjOn$sTV#sCksXzercjIt)mi^u$ASx4pS!&T0#k&-&h>hf_> z#rRAQ{*z{=W-ZsmOx*B|5NOl4qMZY)?xNy|WkfmuDJD3up~|0wu{Z65o3#Wwbxxrn z*&kXw7L}|{SUyNZII3zFffoaUpbL3k!`-#}e$CKn6@$vs~%XOdZ`K{$K8 zL`pn!6W1JBwUFE3F6{sirX$o#%j$)JNam~ChoO3?Xzs+SD=V9dK~5~7TFv^xU+C#hXV#>F0i5whC-3z~5>7Pxsp+wQVFX=JYXgTD zi@taWwnVwuRP1(PgIGu5;>r?ShGPgoGt!%dj;Kh zW`WApJED>s3#fIiA1H)q3I(WON--ExOW1E5JVKd`PH-u?l8f|5B<60Vp6pyYx(Vu?GO#QKP5?hH2kqMirycb~D) z-oKjjMQ;z*#Iw1^X<-i@ESe{T2NYQ-&UmnyPHA&WGv5;@HnULWB@;2O%)9b0gQ0qs zNy|Imb0%m7xV^Jeyk&7WC>isa<;Q7&zt6CGD1nZ80iPTvfpt+Up3L} zmgG8VPFJ5nM2Qu%Sam)_xLJ}aLJNyRlQ3jmHPu4f8od)#sqSKY%;I=E_(y#SkqJJ9 z{Uz>%u-Nn4)bhgI3VIDwY{eEKlOGGo-(a{mkrpwGSXSV1*pR0>dK|Xo0STd9*^^QY zJ8ND8xws{Si^pL{=f&E^v#p57;k?u$54t-6M)J%Vaf~|7PNsbeS;;{w#-LbgYzc}= z%&lUJrohESto_hq1~wN4VY)Epo7EQ*Q7Gh0W{kGUx0rOjnjTTr_`a*J+ zy>)5-QRY2c87C^Us?dUsN?)k?o7SXfpku$#{RJ;fv?k^noLzC?w8`)ZT-B$M>r#)Q z0}UQ&_-vBOVFIKZ(#Vym$Izill8g4mE4f*E1~TUKRoG`(p#v@UR<@%fEZm+zC{Tnv zf$dFkk^^K;G8B;<3cjdhFOdrgmJ~lk#crTj-hKtUvfVuBQK^rhl%?1kpgChz474kq z`U7h-MCTmHyWoZn>S+j5Ylq64FSrF|wQ+gVd^2p+5on@zC0)}1v#_-x1#SvrH;!pV zEf`a_ew=s)MHWI4@DK`KADQ7`5H8Ud_6LRI@Sj2Lf*C1|rU1kX%>?q%3e7m#wkCy< zXuA#;#dl=X+_$Ny1?LQurKv+@7yU=sx>)v4oT2~KuJa(pcAX-H3^b*A@+j5>n^$mW z3d{>=Db6~mjV9j*aq75tEOzH=gY4+BU^8^Byr-+#TV?kl{o1$gkbI1X#qO(%_o zhEiSW)Ew|5I!8ZJJY<0re?eX!5mBJw|yrsf8K}TML+l`D#VlQowGK(kA$; zS&;!wkk0U=xm82n>WQI;WpFivyYODtyYTzL;GicpUgl35ijo>GYzkTj0 zYE@w|oepRVwYDYoShyS`0rzl_RXVDFo1t>(MQi~*b)b#oMKB4QhgzhDyZsDrchOE^ zK8olePFG=(A@AUXhrJB0pT{8hic>VJaKN3f7Mq2qC+i**2veI{R)XwH@EjB&jg7s; zOixzLu~%m}C0PE6zc}Q{{FKU_#06j*bngV3cnzH4{RkfEgF;|{`n(d81wdP7zSuzo zRAn`q-RqzUu%Zhv=$Yl*_cQd!dO@I>`nV%h4fl-1VkqzRU3X}zwt0g4-e~2sKD^O~ zVa7EmfI!i9RWtjDM^)J%<*VMJrx$Blc@&sUi@gpB#Tx3XY1?|6CNSBoX`!N!9 ztx?!Yy-5SQi4%Uzt4hZ<6sU>77eTaqr`41>EO__@Hnm0Ier-mj$A_xT&}tfv z6_#<<4aGr2&1t`26JlHI7U270SV=*Xn$ucqPB8hrkp^CSfagJ5yjESts*2sUnX7o! zk5v|R0$7c=?vrtd&eV*JA%NJm&6mk<5m7>y{`u*nW8RJ@pwr^h+AL7q2!N~o_#pPa;`5gHI*5f>Vj+agX{Xfpu(6ttJfT|faJD&3 zfts_iwHe+{S1_n)Ts*b*qTnbb*|Oa6u%EzIe5`dC1-3qWqkA+fwoPjloGPhvb{LZC zis8Y`({dY{ZB@e62aSbF#;kK}d`r-Sb1}FueyW$qh#CTqM#C*O7w?|Kxgc*OmuEzDaWkVg2Y~CA+|5W$r+xx#-?4>=6@cT$+LCzQ7qIA zH-xm~U-dEhGxm)71-6;I+1^>54N6*kf|G3VX<6L@%0f}H{;rlyNx^3QBOp}^jW$NN zT>4!oj5gtM81e)?MYaIR45tOes^JNv% zC?PA_?7|bAA60j35!}zvt2qw-hiVF;g@v}JUjyf32PY;x18g>w0ZjzP^ zm&8{sIH)6SQ61xF8;eY+PMt-)!sZs~GoYAiKnCU|Iie!X8G72lPwo0ffgCD8zP$nQ zphnmz!y}xhs`FWVOZs~M*fSzqfLAAdq(TRXTW4c^}I+& zhF;sSDjboF)(c8W(&(aCT8jk*O(O|~xKY=rhO<2*ifLs7+S|+iqLuxw00IU^L!1a> zK0%ozPL$B&xcssgIL$}iXry?Nl$hs{OzaMmC=4$R!cQ{lJqixIx`!7mlzOV
  • DC|YiOjKHib&kVzZzLI3u!j*R+nJ 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 Z+d#?niuB?j(PX#V)oOV}jN9$D_&=jpLv8>7 delta 141693 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%0D)ca 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 Ol>N_`>W&ZHD*q47I9-hZ diff --git a/src/core/file_hash.c b/src/core/file_hash.c new file mode 100644 index 0000000..e7b1576 --- /dev/null +++ b/src/core/file_hash.c @@ -0,0 +1,553 @@ +/****************************************************************************** + * @file file_hash.c + * @brief Calcul progressif du SHA-256 des fichiers de preuve. + ******************************************************************************/ + +#define _POSIX_C_SOURCE 200809L + +#include "core/file_hash.h" + +#include +#include +#include +#include + +/** + * @brief Taille du tampon de lecture. + */ +#define FILE_HASH_BLOCK_SIZE (64U * 1024U) + +/** + * @brief Nombre d’octets composant un SHA-256. + */ +#define FILE_HASH_SHA256_DIGEST_SIZE 32U + +/** + * @brief Nombre de caractères hexadécimaux composant un SHA-256. + */ +#define FILE_HASH_SHA256_TEXT_SIZE 64U + +#ifdef FILE_HASH_ENABLE_TEST_HOOKS + +static FileHashTestBlockHook file_hash_test_block_hook = NULL; +static gpointer file_hash_test_block_hook_data = NULL; + +void file_hash_test_set_block_hook( + FileHashTestBlockHook block_hook, + gpointer user_data +) +{ + file_hash_test_block_hook = block_hook; + file_hash_test_block_hook_data = user_data; +} + +static void file_hash_test_notify_block( + guint64 total_size_bytes +) +{ + if (file_hash_test_block_hook == NULL) + { + return; + } + + file_hash_test_block_hook( + total_size_bytes, + file_hash_test_block_hook_data + ); +} + +#else + +static void file_hash_test_notify_block( + guint64 total_size_bytes +) +{ + /* + * Le paramètre est volontairement inutilisé dans la version + * de production. + */ + (void) total_size_bytes; +} + +#endif + +/** + * @brief Enregistre une erreur littérale. + */ +static void file_hash_set_error_literal( + GError **error, + FileHashError error_code, + const char *error_message +) +{ + if (error == NULL) + { + return; + } + + g_set_error_literal( + error, + FILE_HASH_ERROR, + error_code, + error_message + ); +} + +/** + * @brief Enregistre une erreur contenant un chemin et une erreur système. + */ +static void file_hash_set_system_error( + GError **error, + FileHashError error_code, + const char *context, + const char *file_path, + int system_error +) +{ + if (error == NULL) + { + return; + } + + g_set_error( + error, + FILE_HASH_ERROR, + error_code, + "%s '%s' : %s", + context, + file_path, + g_strerror(system_error) + ); +} + +/** + * @brief Vérifie si une annulation a été demandée. + */ +static gboolean file_hash_check_cancelled( + GCancellable *cancellable, + GError **error +) +{ + if (cancellable == NULL || + !g_cancellable_is_cancelled(cancellable)) + { + return FALSE; + } + + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_CANCELLED, + "Le calcul du SHA-256 a été annulé." + ); + + return TRUE; +} + +/** + * @brief Convertit le condensat SHA-256 en texte hexadécimal minuscule. + */ +static char *file_hash_digest_to_hex( + const guint8 *digest, + gsize digest_size, + GError **error +) +{ + static const char hexadecimal_digits[] = + "0123456789abcdef"; + + char *sha256 = NULL; + gsize digest_index = 0; + + if (digest == NULL || + digest_size != FILE_HASH_SHA256_DIGEST_SIZE) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_INVALID_ARGUMENT, + "Le condensat SHA-256 est invalide." + ); + + return NULL; + } + + sha256 = g_try_malloc0( + FILE_HASH_SHA256_TEXT_SIZE + 1U + ); + + if (sha256 == NULL) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_MEMORY, + "Impossible d’allouer la chaîne SHA-256." + ); + + return NULL; + } + + for (digest_index = 0; + digest_index < digest_size; + digest_index++) + { + sha256[digest_index * 2U] = + hexadecimal_digits[ + digest[digest_index] >> 4U + ]; + + sha256[digest_index * 2U + 1U] = + hexadecimal_digits[ + digest[digest_index] & 0x0FU + ]; + } + + return sha256; +} + +GQuark file_hash_error_quark(void) +{ + return g_quark_from_static_string( + "file-hash-error-quark" + ); +} + +gboolean file_hash_compute_sha256( + const char *file_path, + GCancellable *cancellable, + char **out_sha256, + guint64 *out_size_bytes, + GError **error +) +{ + GChecksum *checksum = NULL; + + guint8 *read_buffer = NULL; + guint8 digest[FILE_HASH_SHA256_DIGEST_SIZE]; + + struct stat file_status; + + char *sha256 = NULL; + + gsize digest_size = + FILE_HASH_SHA256_DIGEST_SIZE; + + guint64 total_size_bytes = 0; + + ssize_t read_size = 0; + + int file_descriptor = -1; + int saved_errno = 0; + + gboolean success = FALSE; + + g_return_val_if_fail( + error == NULL || *error == NULL, + FALSE + ); + + if (out_size_bytes != NULL) + { + *out_size_bytes = 0; + } + + if (file_path == NULL || + file_path[0] == '\0' || + out_sha256 == NULL || + out_size_bytes == NULL) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_INVALID_ARGUMENT, + "Les paramètres du calcul SHA-256 sont invalides." + ); + + return FALSE; + } + + /* + * Le module ne doit jamais libérer une ancienne chaîne appartenant + * à l’appelant. + */ + if (*out_sha256 != NULL) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_INVALID_ARGUMENT, + "La destination SHA-256 doit initialement valoir NULL." + ); + + return FALSE; + } + + if (file_hash_check_cancelled( + cancellable, + error + )) + { + return FALSE; + } + + /* + * O_NOFOLLOW refuse un lien symbolique utilisé comme dernier composant. + * + * O_NONBLOCK évite de rester bloqué lors de l’ouverture accidentelle + * d’un tube nommé ou d’un fichier spécial. + */ + file_descriptor = open( + file_path, + O_RDONLY | + O_CLOEXEC | + O_NOFOLLOW | + O_NONBLOCK + ); + + if (file_descriptor < 0) + { + saved_errno = errno; + + if (saved_errno == ENOENT || + saved_errno == ENOTDIR) + { + file_hash_set_system_error( + error, + FILE_HASH_ERROR_NOT_FOUND, + "Le fichier est introuvable", + file_path, + saved_errno + ); + } + else if (saved_errno == ELOOP) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_NOT_REGULAR, + "Le chemin désigne un lien symbolique." + ); + } + else + { + file_hash_set_system_error( + error, + FILE_HASH_ERROR_OPEN, + "Impossible d’ouvrir le fichier", + file_path, + saved_errno + ); + } + + goto cleanup; + } + + if (fstat( + file_descriptor, + &file_status + ) != 0) + { + saved_errno = errno; + + file_hash_set_system_error( + error, + FILE_HASH_ERROR_OPEN, + "Impossible d’inspecter le fichier", + file_path, + saved_errno + ); + + goto cleanup; + } + + if (!S_ISREG(file_status.st_mode)) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_NOT_REGULAR, + "Le chemin ne désigne pas un fichier régulier." + ); + + goto cleanup; + } + + if (file_hash_check_cancelled( + cancellable, + error + )) + { + goto cleanup; + } + + checksum = g_checksum_new( + G_CHECKSUM_SHA256 + ); + + if (checksum == NULL) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_MEMORY, + "Impossible d’allouer le calculateur SHA-256." + ); + + goto cleanup; + } + + read_buffer = g_try_malloc( + FILE_HASH_BLOCK_SIZE + ); + + if (read_buffer == NULL) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_MEMORY, + "Impossible d’allouer le tampon de lecture." + ); + + goto cleanup; + } + + while (TRUE) + { + if (file_hash_check_cancelled( + cancellable, + error + )) + { + goto cleanup; + } + + read_size = read( + file_descriptor, + read_buffer, + FILE_HASH_BLOCK_SIZE + ); + + if (read_size < 0) + { + saved_errno = errno; + + if (saved_errno == EINTR) + { + continue; + } + + file_hash_set_system_error( + error, + FILE_HASH_ERROR_READ, + "Impossible de lire le fichier", + file_path, + saved_errno + ); + + goto cleanup; + } + + if (read_size == 0) + { + break; + } + + g_checksum_update( + checksum, + read_buffer, + (gssize) read_size + ); + + total_size_bytes += + (guint64) read_size; + + file_hash_test_notify_block( + total_size_bytes + ); + + if (file_hash_check_cancelled( + cancellable, + error + )) + { + goto cleanup; + } + } + + if (file_hash_check_cancelled( + cancellable, + error + )) + { + goto cleanup; + } + + g_checksum_get_digest( + checksum, + digest, + &digest_size + ); + + if (digest_size != + FILE_HASH_SHA256_DIGEST_SIZE) + { + file_hash_set_error_literal( + error, + FILE_HASH_ERROR_READ, + "La taille du condensat SHA-256 est invalide." + ); + + goto cleanup; + } + + sha256 = file_hash_digest_to_hex( + digest, + digest_size, + error + ); + + if (sha256 == NULL) + { + goto cleanup; + } + + /* + * Les sorties ne sont publiées qu’après le succès complet. + */ + *out_sha256 = sha256; + *out_size_bytes = total_size_bytes; + + sha256 = NULL; + success = TRUE; + +cleanup: + + g_free( + sha256 + ); + + g_free( + read_buffer + ); + + if (checksum != NULL) + { + g_checksum_free( + checksum + ); + } + + if (file_descriptor >= 0) + { + if (close( + file_descriptor + ) != 0 && + success) + { + /* + * Une erreur de fermeture en lecture seule ne modifie pas + * le condensat déjà calculé. Elle est néanmoins signalée. + */ + g_warning( + "Impossible de fermer proprement le fichier '%s' : %s", + file_path, + g_strerror(errno) + ); + } + } + + return success; +} diff --git a/tests/test_file_hash b/tests/test_file_hash new file mode 100755 index 0000000000000000000000000000000000000000..27ec998c2c13725bda9e27b08a11f46d5f844929 GIT binary patch literal 36752 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≈UWF{% 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 +#include +#include +#include + +#include +#include + +#include + +/** + * @brief Environnement temporaire des tests FileHash. + */ +typedef struct +{ + char *temporary_directory; +} TestFileHashFixture; + +/** + * @brief Contexte d’annulation déclenchée après un bloc. + */ +typedef struct +{ + GCancellable *cancellable; + guint block_count; +} TestFileHashCancellationContext; + +/** + * @brief Vérifie une erreur FileHash. + */ +static void test_file_hash_assert_error( + const GError *error, + FileHashError expected_error +) +{ + assert(error != NULL); + assert(error->domain == FILE_HASH_ERROR); + + assert( + error->code == + (gint) expected_error + ); + + assert(error->message != NULL); + assert(error->message[0] != '\0'); +} + +/** + * @brief Crée un dossier temporaire isolé. + */ +static TestFileHashFixture test_file_hash_fixture_create(void) +{ + TestFileHashFixture fixture = {0}; + GError *error = NULL; + + fixture.temporary_directory = + g_dir_make_tmp( + "labfy-file-hash-test-XXXXXX", + &error + ); + + assert(fixture.temporary_directory != NULL); + assert(error == NULL); + + return fixture; +} + +/** + * @brief Supprime le dossier temporaire. + * + * Tous les fichiers qu’il contient doivent avoir été supprimés avant. + */ +static void test_file_hash_fixture_clear( + TestFileHashFixture *fixture +) +{ + assert(fixture != NULL); + assert(fixture->temporary_directory != NULL); + + assert( + g_rmdir( + fixture->temporary_directory + ) == 0 + ); + + g_free( + fixture->temporary_directory + ); + + fixture->temporary_directory = NULL; +} + +/** + * @brief Construit le chemin d’un fichier dans la fixture. + */ +static char *test_file_hash_build_path( + const TestFileHashFixture *fixture, + const char *file_name +) +{ + assert(fixture != NULL); + assert(fixture->temporary_directory != NULL); + assert(file_name != NULL); + + return g_build_filename( + fixture->temporary_directory, + file_name, + NULL + ); +} + +/** + * @brief Vérifie le SHA-256 d’un fichier vide. + */ +static void test_file_hash_empty_file(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + char *file_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 42; + + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "empty.bin" + ); + + assert(file_path != NULL); + + assert( + g_file_set_contents( + file_path, + "", + 0, + &error + ) + ); + + assert(error == NULL); + + assert( + file_hash_compute_sha256( + file_path, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(error == NULL); + assert(sha256 != NULL); + assert(size_bytes == 0); + + assert( + strlen( + sha256 + ) == 64 + ); + + assert( + strcmp( + sha256, + "e3b0c44298fc1c149afbf4c8996fb924" + "27ae41e4649b934ca495991b7852b855" + ) == 0 + ); + + g_free( + sha256 + ); + + assert( + g_remove( + file_path + ) == 0 + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie le SHA-256 du contenu connu « abc ». + */ +static void test_file_hash_known_content(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + char *file_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 0; + + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "abc.txt" + ); + + assert(file_path != NULL); + + /* + * Aucun saut de ligne ne doit être ajouté. + */ + assert( + g_file_set_contents( + file_path, + "abc", + 3, + &error + ) + ); + + assert(error == NULL); + + assert( + file_hash_compute_sha256( + file_path, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(error == NULL); + assert(sha256 != NULL); + assert(size_bytes == 3); + + assert( + strlen( + sha256 + ) == 64 + ); + + assert( + strcmp( + sha256, + "ba7816bf8f01cfea414140de5dae2223" + "b00361a396177a9cb410ff61f20015ad" + ) == 0 + ); + + g_free( + sha256 + ); + + assert( + g_remove( + file_path + ) == 0 + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie le calcul d’un fichier réparti sur plusieurs blocs. + */ +static void test_file_hash_multiple_blocks(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + const gsize data_size = + (200U * 1024U) + 123U; + + guint8 *data = NULL; + + char *file_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 0; + gsize data_index = 0; + + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "multiple_blocks.bin" + ); + + assert(file_path != NULL); + + data = g_malloc( + data_size + ); + + assert(data != NULL); + + /* + * Motif déterministe couvrant toutes les limites de blocs. + */ + for (data_index = 0; + data_index < data_size; + data_index++) + { + data[data_index] = + (guint8) (data_index % 251U); + } + + assert( + g_file_set_contents( + file_path, + (const char *) data, + (gssize) data_size, + &error + ) + ); + + assert(error == NULL); + + assert( + file_hash_compute_sha256( + file_path, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(error == NULL); + assert(sha256 != NULL); + + assert( + size_bytes == + (guint64) data_size + ); + + assert( + strcmp( + sha256, + "bc5ad58e926b1f79d9840418910f47ba" + "1e947fb137170b8d5403a537b888c4af" + ) == 0 + ); + + g_free( + sha256 + ); + + g_free( + data + ); + + assert( + g_remove( + file_path + ) == 0 + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie que les données sont traitées comme des octets. + */ +static void test_file_hash_binary_content(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + static const guint8 binary_data[] = + { + 0x00, + 0xFF, + 0x80, + 0x41, + 0x00, + 0x7F, + 0x10 + }; + + char *file_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 0; + + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "binary.bin" + ); + + assert(file_path != NULL); + + assert( + g_file_set_contents( + file_path, + (const char *) binary_data, + (gssize) sizeof(binary_data), + &error + ) + ); + + assert(error == NULL); + + assert( + file_hash_compute_sha256( + file_path, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(error == NULL); + assert(sha256 != NULL); + + assert( + size_bytes == + sizeof(binary_data) + ); + + assert( + strcmp( + sha256, + "c90d3a7754f84abc867e780e5a0c0f8d" + "a5c663bd1766ad89e538536a3763f367" + ) == 0 + ); + + g_free( + sha256 + ); + + assert( + g_remove( + file_path + ) == 0 + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie le refus des paramètres invalides. + */ +static void test_file_hash_invalid_arguments(void) +{ + char *sha256 = NULL; + guint64 size_bytes = 123; + + GError *error = NULL; + + assert( + !file_hash_compute_sha256( + NULL, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(sha256 == NULL); + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + size_bytes = 123; + + assert( + !file_hash_compute_sha256( + "", + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(sha256 == NULL); + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + size_bytes = 123; + + assert( + !file_hash_compute_sha256( + "/tmp/file-hash-invalid", + NULL, + NULL, + &size_bytes, + &error + ) + ); + + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + assert( + !file_hash_compute_sha256( + "/tmp/file-hash-invalid", + NULL, + &sha256, + NULL, + &error + ) + ); + + assert(sha256 == NULL); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); +} + +/** + * @brief Vérifie que le module ne remplace pas une chaîne appartenant + * déjà à l’appelant. + */ +static void test_file_hash_non_null_output(void) +{ + char *sha256 = + g_strdup( + "ancienne-valeur" + ); + + guint64 size_bytes = 123; + + GError *error = NULL; + + assert(sha256 != NULL); + + assert( + !file_hash_compute_sha256( + "/tmp/file-hash-output-test", + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + /* + * La chaîne reste la propriété de l’appelant et n’est pas modifiée. + */ + assert( + strcmp( + sha256, + "ancienne-valeur" + ) == 0 + ); + + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_INVALID_ARGUMENT + ); + + g_clear_error( + &error + ); + + g_free( + sha256 + ); +} + +/** + * @brief Vérifie l’erreur produite pour un chemin absent. + */ +static void test_file_hash_missing_file(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + char *file_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 123; + + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "absent.bin" + ); + + assert(file_path != NULL); + + assert( + !file_hash_compute_sha256( + file_path, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(sha256 == NULL); + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_NOT_FOUND + ); + + g_clear_error( + &error + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie qu’un dossier est refusé. + */ +static void test_file_hash_directory(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + char *sha256 = NULL; + guint64 size_bytes = 123; + + GError *error = NULL; + + assert( + !file_hash_compute_sha256( + fixture.temporary_directory, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(sha256 == NULL); + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_NOT_REGULAR + ); + + g_clear_error( + &error + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie qu’un lien symbolique n’est jamais suivi. + */ +static void test_file_hash_symbolic_link(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + char *target_path = NULL; + char *link_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 123; + + GError *error = NULL; + + target_path = + test_file_hash_build_path( + &fixture, + "target.bin" + ); + + link_path = + test_file_hash_build_path( + &fixture, + "link.bin" + ); + + assert(target_path != NULL); + assert(link_path != NULL); + + assert( + g_file_set_contents( + target_path, + "contenu", + 7, + &error + ) + ); + + assert(error == NULL); + + assert( + symlink( + target_path, + link_path + ) == 0 + ); + + assert( + !file_hash_compute_sha256( + link_path, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(sha256 == NULL); + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_NOT_REGULAR + ); + + g_clear_error( + &error + ); + + assert( + g_remove( + link_path + ) == 0 + ); + + assert( + g_remove( + target_path + ) == 0 + ); + + g_free( + link_path + ); + + g_free( + target_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie une annulation demandée avant l’ouverture du fichier. + */ +static void test_file_hash_cancelled_before_start(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + GCancellable *cancellable = NULL; + + char *file_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 123; + + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "cancelled.bin" + ); + + assert(file_path != NULL); + + assert( + g_file_set_contents( + file_path, + "abc", + 3, + &error + ) + ); + + assert(error == NULL); + + cancellable = + g_cancellable_new(); + + assert(cancellable != NULL); + + g_cancellable_cancel( + cancellable + ); + + assert( + !file_hash_compute_sha256( + file_path, + cancellable, + &sha256, + &size_bytes, + &error + ) + ); + + assert(sha256 == NULL); + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_CANCELLED + ); + + g_clear_error( + &error + ); + + g_object_unref( + cancellable + ); + + assert( + g_remove( + file_path + ) == 0 + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Annule le calcul après la lecture du premier bloc. + */ +static void test_file_hash_cancel_after_first_block( + guint64 total_size_bytes, + gpointer user_data +) +{ + TestFileHashCancellationContext *context = + user_data; + + assert(context != NULL); + assert(context->cancellable != NULL); + assert(total_size_bytes > 0); + + context->block_count++; + + if (context->block_count == 1) + { + g_cancellable_cancel( + context->cancellable + ); + } +} + +/** + * @brief Vérifie une annulation observée entre deux blocs. + */ +static void test_file_hash_cancelled_during_read(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + TestFileHashCancellationContext context = {0}; + + const gsize data_size = + 256U * 1024U; + + guint8 *data = NULL; + char *file_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 123; + gsize data_index = 0; + + gboolean result = FALSE; + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "cancelled_during_read.bin" + ); + + assert(file_path != NULL); + + data = g_malloc( + data_size + ); + + assert(data != NULL); + + for (data_index = 0; + data_index < data_size; + data_index++) + { + data[data_index] = + (guint8) (data_index % 251U); + } + + assert( + g_file_set_contents( + file_path, + (const char *) data, + (gssize) data_size, + &error + ) + ); + + assert(error == NULL); + + context.cancellable = + g_cancellable_new(); + + assert(context.cancellable != NULL); + + file_hash_test_set_block_hook( + test_file_hash_cancel_after_first_block, + &context + ); + + result = + file_hash_compute_sha256( + file_path, + context.cancellable, + &sha256, + &size_bytes, + &error + ); + + /* + * Le crochet doit toujours être retiré avant de poursuivre les tests. + */ + file_hash_test_set_block_hook( + NULL, + NULL + ); + + assert(!result); + assert(sha256 == NULL); + assert(size_bytes == 0); + assert(context.block_count == 1); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_CANCELLED + ); + + g_clear_error( + &error + ); + + g_object_unref( + context.cancellable + ); + + g_free( + data + ); + + assert( + g_remove( + file_path + ) == 0 + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie que plusieurs calculs successifs sont indépendants. + */ +static void test_file_hash_successive_calls(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + char *file_path = NULL; + char *first_sha256 = NULL; + char *second_sha256 = NULL; + + guint64 first_size_bytes = 0; + guint64 second_size_bytes = 0; + + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "successive_calls.bin" + ); + + assert(file_path != NULL); + + assert( + g_file_set_contents( + file_path, + "contenu stable", + 14, + &error + ) + ); + + assert(error == NULL); + + assert( + file_hash_compute_sha256( + file_path, + NULL, + &first_sha256, + &first_size_bytes, + &error + ) + ); + + assert(error == NULL); + assert(first_sha256 != NULL); + + assert( + file_hash_compute_sha256( + file_path, + NULL, + &second_sha256, + &second_size_bytes, + &error + ) + ); + + assert(error == NULL); + assert(second_sha256 != NULL); + + assert(first_size_bytes == 14); + assert(second_size_bytes == 14); + + assert( + strcmp( + first_sha256, + second_sha256 + ) == 0 + ); + + /* + * Chaque appel doit retourner sa propre chaîne. + */ + assert(first_sha256 != second_sha256); + + g_free( + second_sha256 + ); + + g_free( + first_sha256 + ); + + assert( + g_remove( + file_path + ) == 0 + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie que la modification d’un fichier change son empreinte. + */ +static void test_file_hash_modified_file(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + char *file_path = NULL; + char *first_sha256 = NULL; + char *second_sha256 = NULL; + + guint64 first_size_bytes = 0; + guint64 second_size_bytes = 0; + + GError *error = NULL; + + file_path = + test_file_hash_build_path( + &fixture, + "modified_file.bin" + ); + + assert(file_path != NULL); + + assert( + g_file_set_contents( + file_path, + "abc", + 3, + &error + ) + ); + + assert(error == NULL); + + assert( + file_hash_compute_sha256( + file_path, + NULL, + &first_sha256, + &first_size_bytes, + &error + ) + ); + + assert(error == NULL); + assert(first_sha256 != NULL); + assert(first_size_bytes == 3); + + assert( + g_file_set_contents( + file_path, + "abcdef", + 6, + &error + ) + ); + + assert(error == NULL); + + assert( + file_hash_compute_sha256( + file_path, + NULL, + &second_sha256, + &second_size_bytes, + &error + ) + ); + + assert(error == NULL); + assert(second_sha256 != NULL); + assert(second_size_bytes == 6); + + assert( + strcmp( + first_sha256, + second_sha256 + ) != 0 + ); + + g_free( + second_sha256 + ); + + g_free( + first_sha256 + ); + + assert( + g_remove( + file_path + ) == 0 + ); + + g_free( + file_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +/** + * @brief Vérifie qu’un tube nommé est refusé sans blocage. + */ +static void test_file_hash_named_pipe(void) +{ + TestFileHashFixture fixture = + test_file_hash_fixture_create(); + + char *pipe_path = NULL; + char *sha256 = NULL; + + guint64 size_bytes = 123; + + GError *error = NULL; + + pipe_path = + test_file_hash_build_path( + &fixture, + "preuve.fifo" + ); + + assert(pipe_path != NULL); + + assert( + mkfifo( + pipe_path, + 0600 + ) == 0 + ); + + assert( + !file_hash_compute_sha256( + pipe_path, + NULL, + &sha256, + &size_bytes, + &error + ) + ); + + assert(sha256 == NULL); + assert(size_bytes == 0); + + test_file_hash_assert_error( + error, + FILE_HASH_ERROR_NOT_REGULAR + ); + + g_clear_error( + &error + ); + + assert( + g_remove( + pipe_path + ) == 0 + ); + + g_free( + pipe_path + ); + + test_file_hash_fixture_clear( + &fixture + ); +} + +int main(void) +{ + test_file_hash_empty_file(); + test_file_hash_known_content(); + test_file_hash_multiple_blocks(); + test_file_hash_binary_content(); + test_file_hash_invalid_arguments(); + test_file_hash_non_null_output(); + test_file_hash_missing_file(); + test_file_hash_directory(); + test_file_hash_symbolic_link(); + test_file_hash_cancelled_before_start(); + test_file_hash_cancelled_during_read(); + test_file_hash_successive_calls(); + test_file_hash_modified_file(); + test_file_hash_named_pipe(); + + printf( + "FileHash : tests des contenus connus valides.\n" + ); + + return 0; +}