From f47a446e87f9cd0d0314fe28aac4503eec98e06a Mon Sep 17 00:00:00 2001 From: neeserg <n.parajuli@student.unimelb.edu.au> Date: Thu, 24 May 2018 13:39:54 +1000 Subject: [PATCH] done everything but csv --- .DS_Store | Bin 8196 -> 0 bytes certexample | Bin 15212 -> 14776 bytes certexample.c | 226 ++---------------------------------- headers.h | 29 +++++ helper_checker.c | 296 +++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 329 insertions(+), 222 deletions(-) delete mode 100644 .DS_Store create mode 100644 headers.h diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index d5e0a6428dc8765cd85a6dbeeffa32ba01fd23f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmZQzU|@7AO)+F(kYHe7;9!8z0^AH(0Z1N%F(jFwA}k>D7#IW?7;+d=8R8j|8B!UF zpmL+sXb6mkz-S1JhQMeDjE2DA3IRrlb2xC+`w-btax?@+LtsRP0H}OWfVAxy9H4Xq zga%15FfuTJy8w&~44^ImIE)y<{Qw4#97rpO25AM+Agv6HAQspRuvP{}s8&XBHw2_l z0BR0cI|C!wW{@~oI|C!wW(EdEh;{}>sLhPf9ttBwI|Cy`I|C!wcCeA7#ApbNh5%X! zfU*w{Loq`lLoP!BO8>otp*X3$xF9JfKZ${X;Z#yVPG)h5fx&e~CT12^Hg*mUE)FhU zuGrv={PN(E#FEltr^KRY5HBFHBqIsR4$05YfwL2n!ZK6K;{`;V^Ycm)GxJi5K+1zN zQ&N)>i(<kv^HTE5o$^cbQi{RmKqWXhI5{}u1thDhbq$RzbQFwCO=@)%s?98nbrejD z&1!2oImA^BZ9NlmE32w&YU^e}d<ZKj82BN4I60evfdQwFbBfEHAwFiB1oQC?n2$NR zxFtP2y}059gvv5g%l!*VGV}9_!%~ZiGxPJ}1^A0I^2<Gw^Ya3VQbF?J$@w{@xp~F$ z0)okjImx9ti6yCyIXS_ZRjI`hC8-r9AXZdyeo=`tSYbqFa(*62EM7pMv^X^=H7Bto zvn<smu_U!vfRS@GkEpDYnzn(dm7VhyUOs*SE+H<F@UqO}%%q&u(DKZbl8ng2;^fr4 zl+3*JsLYhqypqhc%+w-IK}H?Uki5j))GK1*5(1J^k}|k-aR?}LM3g3F7M5m~R6^{K zmsI2w*vb);l30@Jo1X$QF$F9mDKDwY!4VA-cP>gzEJ;ndBEZMbtF9r*6;hm8l`4?P z!3h@8(dFU_$<EA65h&(_h!`4iNrvVmCZ*;Gq;PV86`7fHNrsm}LQ=pRDrhalB^i;N zpPQSSS5nN$0kPIW(uqUh1V<dmVxPp~690nKJdoYu5@Ig$l9G`iamSRD)D#X54rK=o zNVJ2!uk2s|;c+r>Fi0}!F*q=IFvKvVG88aWGW0O?G4wOcW>~_ohG7%K9){x#Cm2pM zoME`gaEsv)!wZH_44)akGJIqB&&a{Z$;i#f!zjt9#Hh@u!f3!~$!N#u!05>6#OTc! zz!=0B%oxHL%b3iV%9zHO&RD=$!C1vu%~-?O%Gk%)&p3f`CgUu|IgE1|*D!8n+|PJ` z@gU<N#?y=!7;i$H#{{k77<?dn7|D2xK+1*YRi;R6DObwH)op-M?oA$0aupO377>+G z*3dOFw{d_+D_T4vrzdbSf}|60`hlenaAcw;NHK8<NhxVASzHM_G&3(HwSohb69m|= zNQz5{$ty@n34jt32bim(DkUYrB(Rl(1C&W5xwNEoI0X_p1en2GDSa+O4uKR-0ah@V z%Y@5}Q=phrfCbEzvgESn5b)*{U;`UvE6v3vz`)4~=5VS?adB{xo)8x?tY+B7aE#$J z!$pQ`4EGowGkjq9$;ima&M3$z&M3hs%_zet$EePz$*9e!!>G$>#%RH4#c0iF!|2NB z#^}N5$>_}(!WhaJ&KSWM#hA>P0#1sVj75yajHQfaj1`QHjLnQK@FY2raTeoz#ubpH z22X$<5I&4#T!}9MmIW8(<>cq3gBy1+Eu-`x4gqF}+ay5!e^&+uT;u-`Rior+2#kin zunYl47MEZbCp_ggsILv`PbWaV4{D%*y5o$XemO)RNC~KG59&{VXlQpFtN^4HBnIw^ XGcquMv<}=rz-awHTK_}S@kpisyFu$L diff --git a/certexample b/certexample index 846f93a4a6f291f1bcb633c3917453db801a64b4..2ea29dbca7ad1eaeebd9e98a82c350f58bed7196 100755 GIT binary patch literal 14776 zcmb<-^>JfjWMqH=CI&kOFptjxECeAL7=9RnxnRP9!GeL4!GS@ZL56{ifq{XQfq?<0 z&H>7T(Lcb3F)+Yr4zLLf49pA+3@i)`3>Hif0ShLG2{2j)BFq4zp~isS2C@$-jbbxM zj71hiGBChs1_lMN07yT`tqgKtE(3#H0)zpj1wamBU|=wS(lC7>=YjM|K=nyL)x+oq zAcGkg7+^Hae;~hsa0ti%1_p)@sQ+NJ3&eH?7!6Vj5(;=)k^*8ENP&0^3<Xk<aDmY^ z5Mc%w4N?md3Vd3U0&*vaO$-)*Dhh(yhbvqdpzep!Q13G6=VT_Cnds-F=;mbRl~(9h zSeWUWndlYg>luOL6=Xh0t-D_+*d~xMAoqb{1LS5A21ptJ$yem<Twr&=C?Y|aU%KU_ zCzF|2cQ8o35(5J`zCrrH3<iiRK;o94x?xEJY(6?6z{tQLgf0k*Uj|srqDtE15Z{Qy zoN@;2<`?2ne+P#+C|_W6=O!HHci=F`5QjJ`4slTUgW>`;6c`w0;jq^ZhdD(!)Cc1T z&nr08=i(5L$6@a|9O8aB#Q)$he<BX?NjS{ehC}=#4)NnS#2avkzrrD|f<yc&4)JF= z{PmcTfkBW#ia|jUQvSipD~6oRq~xN?f|7ht9yZi7&@*6&_YCokPf0CGP0uVYNi7QT zb<WApOASd(%1LF2k5A9d&x<cENh~Ufk7tPYDvJ+-s&mdsEG|whhG@sCIl|PyGCr*+ zHI)I(@^kccjZaT4i7!d5D2Y$1jQ8_&VQ}*Fk54Ws%3*K~3X0FkPfUr2I4{1qq$o2l zy_ms2z|}7}*e5<QB_%#FCnr8JCq2I?vm_(8I6f~wIX^FrA;8r)z9=;@B|a%LKOSTg z#5#~o#idDEsmUerd5O8H3_-z;@x_@{sbD*c<I^&8pbi76L~;_y2(UX-D@wp>L0$ma zjWD;MG$}i^63h=Xj(3d+i7zP1%qwAV4GV}5@OF&^X*Y}y3U*|04E8gO5ApPMjZeu; zO9LC1ms$>{i{o=sa}oXqg#^sgpjZM$kQqZkX-P3de0*_9VsdtTaz=K1T4H7nLvcw_ zNq#nnDlREv$W6^nE~sS4P0Y#3Pi81CNl7g#Vn{15$}C9*DM`*PV2F<g83{6`s3bl& zF*A?B-N)0(Io?Rm&;-szu#EIf;Q<dyBt|Ga15jxKD!D;rI}-y712Y3N0}~X23U4NG zy$=yV$go1yfkfCCAZi#Hm>HHcGBAMZ5l{^{W#Tk81_m|;E+&YWNM<H4sO2FF<(Eoj za)NA?hgi?R$iM`yGC=x4u2Ry@Vgt1}w4v%1z<eeKOQ`xE@{s%hs%xM^AZ_q`0%~)B z>K(8k0|SGE0z^GKw2p#_D<Fx3>N%LW29h|)ESR_fk~qk2n79R!ILHo|xC4?nJnu3v zFnAz|bHWreFfarliE|-|M<9uFBZ(&<iSr<dXCR65A&D0tiSr|gS0IVQ;s7MwfFzDw z?{y%F3xgCw@dPAsP@M%8W|)B_E(#N5U|?8)Brb*|z5+>H97%iwlDGtt_zom-NhI+D zNaD~Y8d&xOlDITj1VUUu5=U;Z+&~hCHd(<M9w3QBo19?r7f9mrU=axM0ZAOWKL3Fv zt_V>ICOw+paCmgH{uNeW@Mt|y!usMhBLjm+^AV22U}=W`rk{ir82+n%5msQ}mv><J zuL|O4fFxf&`2YX^f7MsQ3Je*brrpa6VE!WzACzTY9su)if%u?S^vexk{v{9}loehs z0P|0Q_@FHCasrrt2*d{^{g(}3{w@$7l;mF)fccw1d{9z<nE>Xm0`Wmf{AB=`zX-$! zCGD3EVE!x+AC#nD8i4teKzvYAeyITFcY*l43=9k}1;G3!5FeDJUowFCRUkenDZl*i z59Hq>5FeC;Up@fyvp{@7kp2r`eiDceO3E(}fca4%J}3#l+yLeWf%u@L`*H!8?*-z6 zlI+U~V7?QG4@#;p8^C-k5FeC8UlxG*Mj$>YX}(MV^R+;HP?CHZ0Ol)!_@Jct(gDnu z0`Wmf@TCEmF9hO)lHN-NFrP_Cfgx=IC_+Kl@U3U(#W;`7M;^^jJ_Lk#9zReZ>A>J| z{2&9EI{uB%f#HSwzyJTgr18tUFfi;8S4?0C_0SbiOknV6{=w(b`Ls-W2goE)auST) z50d!*AdO$X1tiE2dl;08()3{beIWTzkH&W(+T-9qW{=LN9-SXN4!*GWU_9n=@n4B3 z+%#^OY5ejGv4<h{H`o>mDKIdU3Wj=gK7En*|NsBkW2|vP3Ji>&!8Yv|kOMi)o}rZW z^<;i|2Do7#K^p#Fh<#c0|Nnmw+oSo7fX8vy4=rGiy8c)QqPs(Xcyzmd@aVke(Rus@ zDC4vqDB;<^QPP3o1>@iU|6g<M-wtAb{qz4n*yxjop=K#~bk@G`=q!EU(e3&Iq*)G> zu{vFUcyxz?#C|}{e9y?h(CPZ6JM@c3w=Y!U97z3kCI*Jq1EmW44}dI~^5_45k8al= zAeo52P|IGP0G0Gm(f=$^^+!SKQ;^haz}3${Qon)~tX_8iDUf;-B=tXFo_U=Ov+^NK z@p+J9b|l58;fn2GiVfMJCf^1rzV#d7@_BH@f-uG1AR$ok0S`F?kIvc~9>-l@fD#NS zMxgW$5dGrz@BjZ_Z2R;7{|iA7@dspj=kXU$Ku+p(ec{m^dIJ*T7k7aQoqahVFLxe) zQ4CVhdZ1L*qnp)SK!L%d^WZK}1-=ht_x=|kmu>(#1!T$VXpj**LCjqsVjqYAh5R|N zZLS|YnrlBWfQ@>?4>1aqp&&+aOF1ySNQE0E05S@s*9oMz+w}v~pN($}zzJgSjer0D zdvtCE6&@)b-7KmaU<bSYFg)PV-3pOB{=yaH`p(uDAhkO@i;GKBixiwaI$J?SlE)4| z1wa1~1vh_>&ek6w6~|jaMOUbw3xh}RRF419)Up#)uXuD`|Ln2aqjxG;XE)fyouHP{ zK2Q+|a;Md=|Njy4AZI~SssuPemay*th1hFWaB}zP_WhCKVax+|bqVVW-QWNJLp|91 zCcvY!_Jl`g>4DDBJ!oEQuHC~>!UZ<z<tk7(bi1C|1uAa$frbY_&Y1l3|NqWI9^I}d zAbC$26nveo4?LP{A25`1fo*@857K(v^#VA4peg3X$)BJAJ^tb%$RnMuA3VCjneYQ5 zK0)R?|N8&G^+2hdM>nemA0!Szg(M^nH9&E=5Tw7`6-nPdP&ES5tOk<m4ZQ#<8!kc; zNijI$j=$gpNp`zl@aSgnXg<IQQqKl<5-4?ogh5H-f=9Op2PA2Lb9)F}6G--j2jhif z3=9zY<1eQF0B4~W`&^_P7(nJdgP3>YwXa9F>kW_I02YsK*8|XaDqsL*zY=+f<Bq>L z3DphK`1i;E|KL!6Z4NeUKPcp0Ootlh(Oi3jp>z#Q;{+s)M?e}uiqT`-`X^G1BNuuP z__s0GXqEbTbb}%d6b_)M2>k%@6u3NH53&GMBsSOnU?^n=$LVVek8ZFcSONL!2PmTW zryStlcHp%%wDf!d_3K$ANqD*g7a(W}4jfM13?AJM3Lf1K93G&eqPg}3JSBl@Cy(yX z7aqN(Pds{EA9!>^Vigo<7T^E>?{<CAdZ2>6+x1E7fl8=LgHa4+@BpPXaKQkTHwOCz zY9KiEflPb#4ZCTq;CMj~-aFqhf)`q!D18SdbJq_Z$6diCBP`auAmTqfkONf-R@}yX z|NsBs17=$W4hB$&BV}cH@Hv38EoSgR^Jh3Tm4E(<nm?N%)}rQ5K}i0*0Zuru{Hgg3 z<nZG!3?Vvj<j=+5K+z7)pB-FS^Cu%nKlc3D2C||TToZhN#pFI%{>%hPg0c-Ff2Mr} zISHIUZ+LWra^MZL{J90L2_%b@Kliyq^Q6<a|NlE(ufU=q7-S?gs@lK)|KD7Dg#nU? z(WCh1SEMM$ANY09z%ToP8u)A=*P$1VSOb5}7m!bnzt{qD9w@<LEgaRp!ULb16KmkN zfb?Szd`^%QuE2i-vL7|@Uw#HT318rwgG>Z#LJ#}^Xy6|O1qdSWuYrt&20qspe1Tu{ z1r+#*_NZgHW0+&-f5%YA5T9PvcPt7Fp&q@uAUfEy^P6YqRUgf#;6BsAzsxW8fBOI5 zqxEfxg5hmgd)BA(l~3n4m(Kr=|3&V2G#_U4uzX$m3e=&Bj&+Q2jCG82j6Xa9Vc+M& zpzhWi4v-2^mkTsbp{HM*m|KvO8lRk6R8p*8l3H9+oLZKer<Yt*!cbmbu9sQ?me)(p z&t(X6^zn3I@brVw48e|m3JfKgxv31G;UxxVf4|_6AV*KXkYI+?iV_9TU=%1bGPo8M z<rgVr<|%*%#4_{J6+m_=IC=UjfQGxk!(ebFpwTv%lFYQs<iwIxO#P`9C8>GEnfZCe z3_1!7&W=`Yjy}Pz3?V+j3gM|q3c;yGWvN99j-@3Tsd*(JGcxn@Kw~A+%+{c}3s8q^ z!N>pqK`q(|pa1^{wN%@_{Qv)ffq~)Dm;e7k<M%w@{{IIxn!bGd|383{f#K@+|NjdZ z85oZL{QrLfBLjo)umAryFfuTx{r>;|0wV)M&+q^LKQJ;daQ^-OUx0~$0o1=T0QF4& z|NmbBq8S(%KpinqfG}1CF)&sLFiP{Vb4*}l7XXQa+H@a2{r|58QUJvuaS#(#Jp+RZ z0|R(&>cWTr|G{%Vd;)HK5?=h=<s1zR_EOeb#wwuJCRhz<j;HVQ|NlN9gB<w;+L)Yq z*_hmU*f}6(q%bfr?E3uwzZIx-hRHLVGJ+I<+ytttu6+6bAKXBO$um6$NrTN_!oa{V z=j;Ff4^hm&1D8L-z`zju?f?HzDCWO~oBxD?fkFSr|Nm_$`WxZ;Sr{1@rvCW<|0at3 z6}UWTY})VV|Nm(y@`-SH7e)q#DL?=JuSK!H0&af_BLl<7U)beAVb{XQz!350|Nm5w z`A&QS{Y*}L5`E0Bd<wlRPJ9|YtR8#@ZEPNV7R~Iwd=5o?7LI%dj(i$Ud<sr{5>9*q zPJA5Tct69)z|ipL|9@yw0GT%8@dfBS?*=Fh3lLCLf!OFYXiOF)4jNDa(I2=$qq7VQ zpxy+CUm^+Ng9a!-eAqlIsI3j+g9dUyG-$vAL~}srQ$gt*%m)z+3=CiY{m%z6XF%so zK?6o0J_j4be9(Xqh<^Yo4;lah@!g@33u?K8_@IFk5Dgk|0nsoF>MMfT&~Y-THijKg z1}xu$2BJXfKm#%$+JX~eKTMnh%7^(2JOs|bzyKPc0;z}D|L;H4KO7MK|Dk-SbqpV% z`~avtNH0AwY#tlkE;SyAJI$c98<Y-%(rHk-3`(~_>1j}U8I;}zrH?`BYf$<bl>P># z*?1xLi9u;KC~XF%-Jo<Blum=vWl*{eN>78*%b@f&D18h{UxU)mpftL_-JPAS6f{DU zO7lue6-@O^^bB;(O2ItCIzux(0~0+<O^CRHk%6I^fti6Nx)B(BW(GzE*t!N}Nzi-; zY&`&~I5R^DG+m>LvoOH&1FASH11uk)inB4m@(ZdsI|H_K#>~LMFat~aV`kuFfTeR( zbGR5_`2kg&n*mlXpo;S_2teZ-Rh*aM1D5z;X5eFBKr5F(`j{E`8DQlMh!4Ze3<3-d z(DDZ+2BMi61mWu_KztZxW)Ncd09{`J69duA48n-@As_)LW@Zp!fR$HJAuz?vAj$w5 zb_8>f2xbN`25k9@nL(TZHs6G#oPn7^f`I{A9-)d$GB7~rYf;4!^SG$uu+kPG3M$80 z7(V_-h(K7Na-0#1`$6S569XTE0b2NjOa_S;po!}-fadr37|`nxQ2ouwAjO~obw9`* zAe%w!0~oP{XBE^OSiJ;N3&Nnb2_u$xSqff9gz2x%IK)BrV+#jR8;KFLVnh~F4uR|h z;Y*-4E0*v9$ze0+9!LU9diw}A2Qz-zK@MUN#z<EZP;prO2{x92fkB%Qv?c~KUG*@7 z*0o@!6B8Wk1H!@Ld<>w`evsL)dT0VOXk7~;-@)3#=}`5R;*jtGx8)cZ7)lvI_JT}6 z#h^AD@_ZCbb_UoS7!N^%1_gx}_!!JZAm)SO8zj3Ihx$aYIA%HU3@pyakRk{%2izuR zU|{$T76+M#ib3<opvfClQ3eK0CQvw_i!v~H;1I9GAwCI*_&TsSAA_q9#GT-_IRgX3 zKCn2Zy*HS!hw~R4>ZPIa=)?~(AKbS9t$$($t^Yujlc0$?kZty0^&l21j>92d08VeH zYC*g%X3+dRW;&dX!<-#B#4q9y{{$B2W7rE#C*VE_0|UcfkiVED89>uYAa}qpCkys? zlx1OH5M+{M;DDA(F!fqs^?VGV=`WBNxX;1Bz+eRy2Z^BKC>-KNIK;ca;(QF#L?Q74 z?lUnkFw6#vqnZuk?Pmdnrxb?2PUBGj9EbRC9OA;@H5O6~258~H&x$?V)WG6=41b{R zhm`~7te|v-sE=UnVQ;W{kWWx?JPz?{R*-)&<FN^c`l(=XK86|rNO*$#$P5e&^TFb% zc7k|Ez~X!ipm|LYAKWKrU|=u-hYyx^OL9?3aY<=fnqD$Pe7u))P`r<4a7cVS17clN zd`WJ6GH7KKXgy9!etddPeo|sid`d}vQE_}?X$3=aK4^5OBsE3P+|<&9AwC|9qWHAT zyv+E-qN2pg_|&|TqDqFeqQu<P_>|Jz+)9S{cqCqYW?p6qic-*64t$J=AtN=XAhjqy zIU_YWJGBVxZnq%N5-V3f7tm5IurFY2cfZhhSC4pz0uPrUhIn@$e<w$ucz-vyVAqiN z5Jx8;*La3_R7+D(1;DGo7~)+b{TzKgox!W0KntDX5o@O$9AL|}K&yrfV9Sn@i%Y>C zX8=1EtR6ICMa1GV(DEk-2iRIA(6S_m5t(W6rA0aMWr;bNDG-NXTV00k9Ee`fC>T^H z>gp_1<wnp2RjAfuETlq}hIt?7YBf|l3=j*!ut}s9rKW-wo}tS@{85~k2la-Nr+++T zK^wYCd~5q~thhrr0vyJPC6HlD*f?Q4$i|YC%)I#0;#6o1fR@og7RI3)0rCfGIDy@T zb<tpad`e<TB4ni+=F&cNlfi5CAjZRj9+L7fR^p-SgoGh@NHsn_#Me0<l2wXJii%5$ z&>S0|Qk);3k(iePUJ(giNe4>OpbQF5d|^my0MYG%tvW;(2gMm^;Ul^@#9alYNjaIx z@t|A+k0y`~=mJ4>P4V$b#l_GtLtiY2@QVp_H6TI+l%XJN2~ovBR^_FZqgw-UTXKG0 zaY<1kXuTt3ts$yj$ihQZF>o}2(no4V3A&;2sh|jlE@DJzGc;iU4N!vz%fW#RE^3e$ zbfOysUe?H<S6rD}l9<Gx2l5w~&VaEp^GZ^S3K;bA@=H?n9GyIMOA^zey!5<My`<92 zoD|*66b3yIFC(!ygF!E)GOxHY7ebd5L1fBOi$DY7D4h5r2EC%xoJ5cYD61f+gh3CS zMDz-BO7zn6OBnP(D_<G(Ky?6vUQs^S-+HMT&{97mrHBE}gJ^{m{}3H8c2;r`*gc84 znaK<wV?o9<=s^riDlTRK%^&2Z=9PfzJxVdC9|-EA!1@ia@eSC14%m1e%pQ<h7#l<@ zGcYiK#?WB;VdEgM{SxSX2Ut55q!)xi+fk79!^TTWpaz1*=RxXV7+pW8U;6F;|9q%& z__)dpr~phqeB2Rc5R~>~U|;}^F+!EY$6pRW1w5bwjG%E!kl$hLA=r3e7<B&wR5^T{ zh6AL5fq?-wjtR96v|<Cs1k-U044^e1aQDN;a{{0ixq($NfcNHrm@s=_bT$J6187VV z#)pmj%z)|#Eh+%%133qz1}Y2^0%K4=9TcV@IgkKse29Y+#A9H9jf0|xAI$%tISr70 zCx~+RIFbcaKWrQpq#vXQW<Q7x($WX+PlHwjgLn+^@um-;NMT@LfQ>IhWI-!`VJryU ziKZVmE+qgO5JB3{15piXlR{Xag@7Q|6g2&?@v9HefpD06L25x5oj(^%KYW}EG%?1& zz)%GB2S_gn!|VmIL3lBme%N?e325L3Y5W<a7KA}z4WeOqB~(8w{$S%~4N(2>U<#o$ zy8Abx>4)u4g6&%Z&GA9Cf+=+SK?_kp`2uD?Y#i<bG~z^H5@6j7pydlt7KA#<zyKN@ z1g|Fti$LcQVEdTR-HXn@%D}(?TI31Mrtt9>4(Os=boJ<b(6|D~{V@Ho@jn3~^@H|j zfbtehKWv;3w$BVar^tXv-!S`O=>Rleiflh@Jn;u~aWG6hIBXaY;Rh3c4~;*V{qS)| zSiuW29HtqI{vYW2Vf{zYnn?yket{VQvlqty2Q?FBKWsmW01o{yXTkI{gU7)T<qS+5 zrr!i60HtBxfzhA^yfC|=O2E`hXu-t;QwSCXjk!S?PzofCmPEla9#Hq+fR<yR<Nz`f f=6_iE1(L>Qzk)W{7>1Lef)Bz3lOX%R3@8BrQ*?JH literal 15212 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 SX$hXcj8ClqPi8{$Ap-y;KtTln diff --git a/certexample.c b/certexample.c index fdda0bf..c329938 100644 --- a/certexample.c +++ b/certexample.c @@ -2,234 +2,32 @@ Example certifcate code gcc -o certexample certexample.c -lssl -lcrypto */ -#include <openssl/x509.h> -#include <openssl/x509v3.h> -#include <openssl/bio.h> -#include <openssl/pem.h> -#include <openssl/err.h> -#include <openssl/rsa.h> -#include <openssl/evp.h> -#include <stdio.h> -#include <string.h> -int check_san_valid(X509* cert, char* URL, int in_host); -int check_if_url_valid(char* URL, char* domain); -int check_name_valid(X509* cert, char* URL); -void printTime(X509* cert); -int check_public_key(X509 *cert); +#include "headers.h" + int main() { + char* filename = "./sample_certs/testseven.crt"; + char* url = "www.example.com"; - char* URL = "mega.google.com"; - - const char test_cert_example[] = "./sample_certs/testtwo.crt"; - BIO *certificate_bio = NULL; - X509 *cert = NULL; - X509_CINF *cert_inf = NULL; - STACK_OF(X509_EXTENSION) * ext_list; - - //initialise openSSL - OpenSSL_add_all_algorithms(); - ERR_load_BIO_strings(); - ERR_load_crypto_strings(); - - //create BIO object to read certificate - certificate_bio = BIO_new(BIO_s_file()); - - //Read certificate into BIO - if (!(BIO_read_filename(certificate_bio, test_cert_example))) - { - fprintf(stderr, "Error in reading cert BIO filename"); - exit(EXIT_FAILURE); - } - if (!(cert = PEM_read_bio_X509(certificate_bio, NULL, 0, NULL))) - { - fprintf(stderr, "Error in loading certificate"); - exit(EXIT_FAILURE); - } - - //cert contains the x509 certificate and can be used to analyse the certificate - int in_host = check_name_valid(cert, URL); - + if (validate_certificate(filename, url)) + { + printf("VALID\n"); + } - //List of extensions available at https://www.openssl.org/docs/man1.1.0/crypto/X509_REVOKED_get0_extensions.html - //Need to check extension exists and is not null - if (check_san_valid(cert,URL, in_host)) - { - printf("valid\n"); - } - - else{ - printf("invalid\n"); - } - - printTime(cert); - check_public_key(cert); - - //********************* - // End of Example code - //********************* - - X509_free(cert); - BIO_free_all(certificate_bio); - exit(0); + else{ + printf("INVALID\n"); + } + } -void printTime(X509* cert){ - ASN1_TIME *after = X509_get_notBefore(cert); - - int day; - int sec; - - ASN1_TIME_diff(&day, &sec, after, NULL); - - printf("%d -- %d\n", day, sec); - - BUF_MEM *bptr = NULL; - char *buf = NULL; - - BIO *bio = BIO_new(BIO_s_mem()); - if (!ASN1_TIME_print(bio, after)) - { - fprintf(stderr, "Error in reading extensions"); - } - BIO_flush(bio); - BIO_get_mem_ptr(bio, &bptr); - - //bptr->data is not NULL terminated - add null character - buf = (char *)malloc((bptr->length + 1) * sizeof(char)); - memcpy(buf, bptr->data, bptr->length); - buf[bptr->length] = '\0'; - - printf("%s\n", buf); - - BIO_free_all(bio); - free(buf); - - - ASN1_TIME *tm; - time_t t; - BIO *b; - t = time(NULL); - tm = ASN1_TIME_adj(NULL, t, 0, 0); - b = BIO_new_fp(stdout, BIO_NOCLOSE); - ASN1_TIME_print(b, tm); - ASN1_STRING_free(tm); - BIO_free(b); - -} - -int check_name_valid(X509* cert, char* URL){ - X509_NAME *cert_issuer = X509_get_subject_name(cert); - char subj_cn[256] = "Issuer CN NOT FOUND"; - X509_NAME_get_text_by_NID(cert_issuer, NID_commonName, subj_cn, 256); - if (check_if_url_valid(URL, subj_cn)) - { - return 1; - } - - return 0; -} - -int check_san_valid(X509* cert, char* URL, int in_host){ - if (in_host){ - return 1; - } - X509_EXTENSION *ex = X509_get_ext(cert, X509_get_ext_by_NID(cert, NID_subject_alt_name, -1)); - if (ex == NULL) - { - return 0; - } - ASN1_OBJECT *obj = X509_EXTENSION_get_object(ex); - char buff[2048]; - OBJ_obj2txt(buff, 2048, obj, 0); - printf("Extension:%s\n", buff); - - BUF_MEM *bptr = NULL; - char *buf = NULL; - - BIO *bio = BIO_new(BIO_s_mem()); - if (!X509V3_EXT_print(bio, ex, 0, 0)) - { - fprintf(stderr, "Error in reading extensions"); - } - BIO_flush(bio); - BIO_get_mem_ptr(bio, &bptr); - - //bptr->data is not NULL terminated - add null character - buf = (char *)malloc((bptr->length + 1) * sizeof(char)); - memcpy(buf, bptr->data, bptr->length); - buf[bptr->length] = '\0'; - - //Can print or parse value - char *tok = strtok(buf, ", "); - while (tok !=NULL){ - printf("%s\n", tok); - if (check_if_url_valid(URL, tok+4)){ - BIO_free_all(bio); - free(buf); - return 1; - } - tok = strtok(NULL, ", "); - - } - - BIO_free_all(bio); - free(buf); - - return 0; -} - - - - - - -int check_if_url_valid(char* URL, char* domain){ -if (domain[0] == '*'){ - char* domain_1 = domain+1; - char *sub_url = strstr(URL, domain_1); - - if (sub_url == NULL) - { - return 0; - } - - else{ - return (strcmp(sub_url, domain_1) == 0); - } - -} -else -{ - return (strcmp(URL, domain) == 0); - - -} - -return 0; - - -} -int check_public_key(X509 *cert){ - EVP_PKEY *key = X509_get_pubkey(cert); - RSA *rsa = NULL; - if ((rsa = EVP_PKEY_get1_RSA(key)) == NULL) - { - return 0; - } - if(8*RSA_size(rsa)==2048){ - return 1; - } - return 1; -} \ No newline at end of file diff --git a/headers.h b/headers.h new file mode 100644 index 0000000..41777a0 --- /dev/null +++ b/headers.h @@ -0,0 +1,29 @@ + +#ifndef HEADER +#define HEADER + + +#include <openssl/x509.h> +#include <openssl/x509v3.h> +#include <openssl/bio.h> +#include <openssl/pem.h> +#include <openssl/err.h> +#include <openssl/rsa.h> +#include <openssl/evp.h> +#include <stdio.h> +#include <string.h> + + + +X509 *load_cert(char * filename); +int check_san_valid(X509* cert, char* URL, int in_host); +int check_if_url_valid(char* URL, char* domain); +int check_name_valid(X509* cert, char* URL); +int check_time(X509* cert); +int check_public_key(X509 *cert); +int check_constraint(X509 *cert); +int check_ext_key(X509 *cert); +int validate_certificate(char* filename, char* URL); + + +#endif \ No newline at end of file diff --git a/helper_checker.c b/helper_checker.c index a9d6b98..1e1d09f 100644 --- a/helper_checker.c +++ b/helper_checker.c @@ -1,14 +1,294 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> +#include "headers.h" -int check_if_url_valid(char* URL, char* domain); +int validate_certificate(char* filename, char* URL){ + X509* cert = load_cert(filename); + int in_host = check_name_valid(cert, URL); + if (!check_san_valid(cert, URL, in_host)) + { + printf("SAN \n"); + X509_free(cert); + return 0; + } -int main(int argc, char const *argv[]) + if (!check_time(cert)) + { + printf("time\n"); + X509_free(cert); + return 0; + } + + if (!check_public_key(cert)) + { + printf("PKEY\n"); + X509_free(cert); + return 0; + } + + if (!check_constraint(cert)) + { + printf("CONSTRAINTS\n"); + X509_free(cert); + return 0; + } + + if (!check_ext_key(cert)) + { + printf("ext key\n"); + X509_free(cert); + return 0; + } + + X509_free(cert); + return 1; + +} + +X509 *load_cert(char * filename){ + BIO *certificate_bio = NULL; + X509 *cert = NULL; + X509_CINF *cert_inf = NULL; + STACK_OF(X509_EXTENSION) * ext_list; + + //initialise openSSL + OpenSSL_add_all_algorithms(); + ERR_load_BIO_strings(); + ERR_load_crypto_strings(); + + //create BIO object to read certificate + certificate_bio = BIO_new(BIO_s_file()); + + //Read certificate into BIO + if (!(BIO_read_filename(certificate_bio, filename))) + { + fprintf(stderr, "Error in reading cert BIO filename"); + return NULL; + } + if (!(cert = PEM_read_bio_X509(certificate_bio, NULL, 0, NULL))) + { + fprintf(stderr, "Error in loading certificate"); + return NULL; + } + + + BIO_free_all(certificate_bio); + return cert; +} + + + + + +int check_name_valid(X509* cert, char* URL){ + X509_NAME *cert_issuer = X509_get_subject_name(cert); + char subj_cn[256] = "Issuer CN NOT FOUND"; + X509_NAME_get_text_by_NID(cert_issuer, NID_commonName, subj_cn, 256); + if (check_if_url_valid(URL, subj_cn)) + { + return 1; + } + + return 0; +} + + + + + +int check_san_valid(X509* cert, char* URL, int in_host){ + if (in_host){ + return 1; + } + X509_EXTENSION *ex = X509_get_ext(cert, X509_get_ext_by_NID(cert, NID_subject_alt_name, -1)); + if (ex == NULL) + { + return 0; + } + BUF_MEM *bptr = NULL; + char *buf = NULL; + + BIO *bio = BIO_new(BIO_s_mem()); + if (!X509V3_EXT_print(bio, ex, 0, 0)) + { + fprintf(stderr, "Error in reading extensions"); + } + BIO_flush(bio); + BIO_get_mem_ptr(bio, &bptr); + + //bptr->data is not NULL terminated - add null character + buf = (char *)malloc((bptr->length + 1) * sizeof(char)); + memcpy(buf, bptr->data, bptr->length); + buf[bptr->length] = '\0'; + printf("%s\n", buf); + + //Can print or parse value + char *tok = strtok(buf, ", "); + while (tok !=NULL){ + if (check_if_url_valid(URL, tok+4)){ + BIO_free_all(bio); + free(buf); + return 1; + } + tok = strtok(NULL, ", "); + + } + + BIO_free_all(bio); + free(buf); + + return 0; +} + + +int check_if_url_valid(char* URL, char* domain){ +if (domain[0] == '*'){ + char* domain_1 = domain+1; + char *sub_url = strstr(URL, domain_1); + + if (sub_url == NULL) + { + return 0; + } + + else{ + return (strcmp(sub_url, domain_1) == 0); + } + +} +else { - int m = check_if_url_valid("www.google.com.au", "google.com"); - printf("%d\n", m); - return 0; + return (strcmp(URL, domain) == 0); + + +} + +return 0; + + +} + + + + + + + + +int check_time(X509* cert){ + ASN1_TIME *after = X509_get_notAfter(cert); + if (after == NULL) + { + return 0; + } + + int day; + int sec; + + ASN1_TIME_diff(&day, &sec, NULL, after); + + if (day < 0 || sec <0) + { + return 0; + } + + ASN1_TIME *before = X509_get_notBefore(cert); + if (before == NULL) + { + return 0; + } + + + ASN1_TIME_diff(&day, &sec, before, NULL); + + if (day < 0 || sec <0) + { + return 0; + } + + return 1; + + +} + + + + + + +int check_public_key(X509 *cert){ + EVP_PKEY *key = X509_get_pubkey(cert); + RSA *rsa = NULL; + + if ((rsa = EVP_PKEY_get1_RSA(key)) == NULL) + { + return 0; + } + if(8*RSA_size(rsa)==2048){ + return 1; + } + + return 0; +} + + +int check_constraint(X509 *cert){ + X509_EXTENSION *ex = X509_get_ext(cert, X509_get_ext_by_NID(cert, NID_basic_constraints, -1)); + if (ex == NULL) + { + return 0; + } + + BUF_MEM *bptr = NULL; + char *buf = NULL; + + BIO *bio = BIO_new(BIO_s_mem()); + if (!X509V3_EXT_print(bio, ex, 0, 0)) + { + fprintf(stderr, "Error in reading extensions"); + } + BIO_flush(bio); + BIO_get_mem_ptr(bio, &bptr); + + //bptr->data is not NULL terminated - add null character + buf = (char *)malloc((bptr->length + 1) * sizeof(char)); + memcpy(buf, bptr->data, bptr->length); + buf[bptr->length] = '\0'; + + int cond = strcmp(buf, "CA:FALSE"); + BIO_free_all(bio); + free(buf); + + return cond == 0; +} + + +int check_ext_key(X509 *cert){ + X509_EXTENSION *ex = X509_get_ext(cert, X509_get_ext_by_NID(cert, NID_ext_key_usage, -1)); + if (ex == NULL) + { + return 0; + } + BUF_MEM *bptr = NULL; + char *buf = NULL; + + BIO *bio = BIO_new(BIO_s_mem()); + if (!X509V3_EXT_print(bio, ex, 0, 0)) + { + fprintf(stderr, "Error in reading extensions"); + } + BIO_flush(bio); + BIO_get_mem_ptr(bio, &bptr); + + //bptr->data is not NULL terminated - add null character + buf = (char *)malloc((bptr->length + 1) * sizeof(char)); + memcpy(buf, bptr->data, bptr->length); + buf[bptr->length] = '\0'; + + int cond = strcmp(buf, "TLS Web Server Authentication"); + + BIO_free_all(bio); + free(buf); + + return cond == 0; } -- GitLab