From ce4330a4dbab92d6f65ee56b9a63b47de78efd54 Mon Sep 17 00:00:00 2001 From: WaterJuice Date: Sun, 23 Jun 2013 14:52:37 +1000 Subject: [PATCH] Initial commit. Version 1.0.0. Contains - MD5 - SHA1 - SHA256 - SHA512 - RC4 --- .gitignore | 18 + Exe/Linux/Md5String | Bin 0 -> 26720 bytes Exe/Linux/Rc4Output | Bin 0 -> 6232 bytes Exe/Linux/Sha1String | Bin 0 -> 14424 bytes Exe/Linux/Sha256String | Bin 0 -> 10328 bytes Exe/Linux/Sha512String | Bin 0 -> 14424 bytes Exe/OSX/Md5String | Bin 0 -> 21588 bytes Exe/OSX/Rc4Output | Bin 0 -> 9092 bytes Exe/OSX/Sha1String | Bin 0 -> 13156 bytes Exe/OSX/Sha256String | Bin 0 -> 8928 bytes Exe/OSX/Sha512String | Bin 0 -> 13024 bytes Exe/Windows/Md5String.exe | Bin 0 -> 8192 bytes Exe/Windows/Rc4Output.exe | Bin 0 -> 6144 bytes Exe/Windows/Sha1String.exe | Bin 0 -> 11776 bytes Exe/Windows/Sha256String.exe | Bin 0 -> 7680 bytes Exe/Windows/Sha512String.exe | Bin 0 -> 11264 bytes Projects.sln | 85 +++ README.md | 88 +++- UNLICENSE | 24 + VSProjectFiles/CryptLibTest.vcxproj | 76 +++ VSProjectFiles/CryptLibTest.vcxproj.filters | 49 ++ VSProjectFiles/Md5String.vcxproj | 68 +++ VSProjectFiles/Md5String.vcxproj.filters | 25 + VSProjectFiles/ProofOfWork.vcxproj | 78 +++ VSProjectFiles/ProofOfWork.vcxproj.filters | 55 ++ VSProjectFiles/Rc4Output.vcxproj | 68 +++ VSProjectFiles/Rc4Output.vcxproj.filters | 25 + VSProjectFiles/Sha1String.vcxproj | 68 +++ VSProjectFiles/Sha1String.vcxproj.filters | 29 ++ VSProjectFiles/Sha256String.vcxproj | 68 +++ VSProjectFiles/Sha256String.vcxproj.filters | 29 ++ VSProjectFiles/Sha512String.vcxproj | 68 +++ VSProjectFiles/Sha512String.vcxproj.filters | 29 ++ VSProjectFiles/props/All.props | 42 ++ VSProjectFiles/props/Debug.props | 21 + VSProjectFiles/props/Win32.props | 3 + VSProjectFiles/props/Win32Debug.props | 8 + VSProjectFiles/props/Win32Release.props | 7 + VSProjectFiles/props/x64.props | 8 + VSProjectFiles/props/x64Debug.props | 8 + VSProjectFiles/props/x64Release.props | 7 + lib/LibMd5.c | 315 +++++++++++ lib/LibMd5.h | 89 ++++ lib/LibRc4.c | 129 +++++ lib/LibRc4.h | 78 +++ lib/LibSha1.c | 212 ++++++++ lib/LibSha1.h | 86 +++ lib/LibSha256.c | 273 ++++++++++ lib/LibSha256.h | 78 +++ lib/LibSha512.c | 277 ++++++++++ lib/LibSha512.h | 78 +++ makefile | 70 +++ projects/CryptLibTest/CryptLibTest.c | 550 ++++++++++++++++++++ projects/Md5String/Md5String.c | 62 +++ projects/Rc4Output/Rc4Output.c | 93 ++++ projects/Sha1String/Sha1String.c | 62 +++ projects/Sha256String/Sha256String.c | 62 +++ projects/Sha512String/Sha512String.c | 62 +++ stdbool/stdbool.h | 27 + 59 files changed, 3656 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 Exe/Linux/Md5String create mode 100644 Exe/Linux/Rc4Output create mode 100644 Exe/Linux/Sha1String create mode 100644 Exe/Linux/Sha256String create mode 100644 Exe/Linux/Sha512String create mode 100644 Exe/OSX/Md5String create mode 100644 Exe/OSX/Rc4Output create mode 100644 Exe/OSX/Sha1String create mode 100644 Exe/OSX/Sha256String create mode 100644 Exe/OSX/Sha512String create mode 100644 Exe/Windows/Md5String.exe create mode 100644 Exe/Windows/Rc4Output.exe create mode 100644 Exe/Windows/Sha1String.exe create mode 100644 Exe/Windows/Sha256String.exe create mode 100644 Exe/Windows/Sha512String.exe create mode 100644 Projects.sln create mode 100644 UNLICENSE create mode 100644 VSProjectFiles/CryptLibTest.vcxproj create mode 100644 VSProjectFiles/CryptLibTest.vcxproj.filters create mode 100644 VSProjectFiles/Md5String.vcxproj create mode 100644 VSProjectFiles/Md5String.vcxproj.filters create mode 100644 VSProjectFiles/ProofOfWork.vcxproj create mode 100644 VSProjectFiles/ProofOfWork.vcxproj.filters create mode 100644 VSProjectFiles/Rc4Output.vcxproj create mode 100644 VSProjectFiles/Rc4Output.vcxproj.filters create mode 100644 VSProjectFiles/Sha1String.vcxproj create mode 100644 VSProjectFiles/Sha1String.vcxproj.filters create mode 100644 VSProjectFiles/Sha256String.vcxproj create mode 100644 VSProjectFiles/Sha256String.vcxproj.filters create mode 100644 VSProjectFiles/Sha512String.vcxproj create mode 100644 VSProjectFiles/Sha512String.vcxproj.filters create mode 100644 VSProjectFiles/props/All.props create mode 100644 VSProjectFiles/props/Debug.props create mode 100644 VSProjectFiles/props/Win32.props create mode 100644 VSProjectFiles/props/Win32Debug.props create mode 100644 VSProjectFiles/props/Win32Release.props create mode 100644 VSProjectFiles/props/x64.props create mode 100644 VSProjectFiles/props/x64Debug.props create mode 100644 VSProjectFiles/props/x64Release.props create mode 100644 lib/LibMd5.c create mode 100644 lib/LibMd5.h create mode 100644 lib/LibRc4.c create mode 100644 lib/LibRc4.h create mode 100644 lib/LibSha1.c create mode 100644 lib/LibSha1.h create mode 100644 lib/LibSha256.c create mode 100644 lib/LibSha256.h create mode 100644 lib/LibSha512.c create mode 100644 lib/LibSha512.h create mode 100644 makefile create mode 100644 projects/CryptLibTest/CryptLibTest.c create mode 100644 projects/Md5String/Md5String.c create mode 100644 projects/Rc4Output/Rc4Output.c create mode 100644 projects/Sha1String/Sha1String.c create mode 100644 projects/Sha256String/Sha256String.c create mode 100644 projects/Sha512String/Sha512String.c create mode 100644 stdbool/stdbool.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ccd18f --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# top level build directories # +/Bin*/ +/Build*/ +/Out*/ +Intermediates/ +Products/ + +# visual studio files # +*.user +*.ncb +*.suo +*.pdb +*.aps +*.ipch + +# Xcode files # +xcuserdata/ +.DS_Store diff --git a/Exe/Linux/Md5String b/Exe/Linux/Md5String new file mode 100644 index 0000000000000000000000000000000000000000..2bd55c1483546ba52693b38f35f5e1e14f099895 GIT binary patch literal 26720 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 literal 0 HcmV?d00001 diff --git a/Exe/Linux/Rc4Output b/Exe/Linux/Rc4Output new file mode 100644 index 0000000000000000000000000000000000000000..fb7115eaa3457dc477544bf60216c4ea906ba44e GIT binary patch literal 6232 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 C96i7Q literal 0 HcmV?d00001 diff --git a/Exe/Linux/Sha1String b/Exe/Linux/Sha1String new file mode 100644 index 0000000000000000000000000000000000000000..cd16c232f273a089710dd2cde57cbf4bcad17369 GIT binary patch literal 14424 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 BxDNmT literal 0 HcmV?d00001 diff --git a/Exe/Linux/Sha256String b/Exe/Linux/Sha256String new file mode 100644 index 0000000000000000000000000000000000000000..c9da0722bc0d3ea012de41916eade345c893e811 GIT binary patch literal 10328 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 r+uQ#|`{S^s{JAdEB#Jz4(+=V4z7 literal 0 HcmV?d00001 diff --git a/Exe/OSX/Md5String b/Exe/OSX/Md5String new file mode 100644 index 0000000000000000000000000000000000000000..f12c5062a8a636ca939c0d4188fd846f34775989 GIT binary patch literal 21588 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 literal 0 HcmV?d00001 diff --git a/Exe/OSX/Rc4Output b/Exe/OSX/Rc4Output new file mode 100644 index 0000000000000000000000000000000000000000..1884f1874e74f4bee326d6efac17a6db6c8ac0b4 GIT binary patch literal 9092 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 literal 0 HcmV?d00001 diff --git a/Exe/OSX/Sha256String b/Exe/OSX/Sha256String new file mode 100644 index 0000000000000000000000000000000000000000..605d30944e6acc962fd758060b32e8852d500fea GIT binary patch literal 8928 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 a7d_Of_OjLXXS1_&W*DaDOrM4^6!Igs#OY zR`y!w?z10f?|t^!=Op)WqWA0mVI0S6IIhr-<2XGuE|BAjIRo~%aA*XYBrP;2B|e?F zcmZ1T9XY*-uB`nl>B9=29W+akfgM9X^kZ%GfmO*wzp5U7pE2- z(nII#Z5!*Z1au`S!MwygL~2mtQVJgUK+7O+0Hxm0uBUb+DaVq%7UGgNq*$O_e#%~? zY6k87TwIcrl_BMB%v_b7A>~*tKd=`G<00&U@Q@yA59`fSbI^tH87V(!FAm0|y=kZn zfb>v%xWBY0Pyy>CGc!ADkiIj2=?29fpaB?a4}A>N|I5?+d6}Vu$TEJm|JzxNOIS>Va_W?$;DBok^I6M+^VxR#IhPDtI0^0X9 z)c2eG<{vshCh$pLb9MA|;pdlaW9Ax;wmjPb}d>Qa%z?T7E27DRtWx$sKUk3i) zWZ-#@urG-1au>00(vs3VJ?phq^N!CoguhN$Q-?pXIkdz!gUkC4doH~1U{2SUaPRf) z4uGXF-27xRDY~kMTPT~`&pL*bJ~kU}wOkiKrvmS*NKq{cSD2q&Swrm4YH4Y?!R>Za zcFVOA#jMp;4!W!wIE1yhDΠ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 z zW%@p5Yc{lfx3;A{FMg}n^7=iUmEASt)cPC07B8*ek}>A?nW463z`YN&ea+)M4P zr<+zb-!48^aQDr)l@AXVzM$Wcea~fE`LWNAuFQ1((!INeUmh`Jc(l*Z5Vxhn*RACH zK78Yv|3+zp@=rTYD5`6Yd%4zp5+3U=+Hxd&#EkvZr=G02cr-R(m8NIQ%WtOMdEE5M z&cc)FFQi1zEE^V?hulNnA?J{9$Tj2{at!%}+(KRFBDLEa!|kT1v; zOuZo}D-V7)d5@&0XKM`k894(CEp#e8=b|UV2VJjsaBpgvU$I$S=xvOeYrsu}EVu7Qs-4L95a0 z3HcUuy7ctS!hHNM4T0Zjxc(AH@4RD0dWKGyZdk5^@kt~Ck-;Z}MyX7lmXb1`q@q8W z8l53sn^BOJr_l#H@CwLS@VT(SpfAi@q9bI4)2jur82&f#x+Y6ioC&kDHDo%a&eLdg zWO)D48HM?}487*rBr=mq>@yp$FU-^w6%i7~i`E!s81;HhfuT>ifSOm}@B%G>PdSAJ zy#XQzsm+sr`IO)ao@ES+8cnCuKivuZN(vqE@}U$e_tj%*oeGD*^{K*dnu3bLXgHX@!FU zclr66d`K94x?(F+xBTz1_kXU#A9ubUb~qA_5%=I3T@9jMUSP;5c9lpZv$I0f2H<42 zB-~L?h5wWhS+SoYNKqUJO@jS@J^!Q;fJ^B;aNS83B6~%ql&NGhWpT1Z*?ie+vRqk- z>>b$`vTtPdvPRh@S+lH1#*@3sJ>@>~@p4-JihPbdQ9fV3Se`F0lCO|&mRHJm$@j<) z%IoD<I7!@lOCdD?zF2x>2m7+#*L~&AaUU5~?s`y!P zSMgBsyTX}vr-#v_>9O>9dJ?UqXVIzjB07sMq?ghAXe(V$H`3X`#^Ce8SAu^CejFSf z5*xB4q$s30L_BfQ#K?*96H_KGo|rdr)kJ3E#)+RyJU#X2slQCsL>MDX5!)hmMc{j1 o3j19r+aTK{`&717mKCfGE(_ieyeoKj@TuU&;D6FQ{)2A+CuwGIHvj+t literal 0 HcmV?d00001 diff --git a/Exe/Windows/Rc4Output.exe b/Exe/Windows/Rc4Output.exe new file mode 100644 index 0000000000000000000000000000000000000000..f7aebc407e959e5886a118641e426d5e640a452b GIT binary patch literal 6144 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 literal 0 HcmV?d00001 diff --git a/Exe/Windows/Sha1String.exe b/Exe/Windows/Sha1String.exe new file mode 100644 index 0000000000000000000000000000000000000000..fb4b6cdd9724997de6d98c14f788acf02ea3fd52 GIT binary patch literal 11776 zcmeHNdr(wYnm=$M=?G{i)9kjJcGC&h8WPaC-4_T3(AG4jCqZqcMNkkCS{sJfHn$zE zVzy*ktL(Y<#@#VfPK~t{i){AgAG@>e#5mbVrxnEb!aP>F40rZ@yf`^z_FLO=kxl zI{Em)l!}v&dwk7Z)=q!NMt?(_wXvbSy+g6C_gejdc58FH)w!(F+SbwJotu?4P1Hp{ z@(*u3Sk-^llPE6@zUc9wU;k#6XBDrX)9dA)a!&V-=ZAcJp=TxPC2P7l{gO4yINgfo zMjy$#pXKgy#wt?M*zpBNmnUd0vecA}lxd7vF_Ni`?s^2Z5k;cDLu;opmd;XWV4`O0 z&;fW)t!Kc|(ZdOekC=HqQPCjt*cdD2t@~WujOA)7?n9srzbt)ajnMD@29CLkce8@| z>F2=zxf&VUPr-u$25i_pc^j}$97u~nxSqJmgf-hdU4b5I^`YPz+ri+VavRfqw z3m!4`R-+efG5W^Qk2NE#SUfuyQzIW>aNoif1(4-NbYd3TtWx(n(e-DCgB(3K%M3UOr~$ z&H6_SD>Hpm#U3Y8h@V#3l3E$hrm=V-ArUVmDB^{LMeK(b1}HLn*P%0SmIv3s)9!e7 zEyStiS5$-gP-w|T_wra-Dk+Yt-k4f`kyFbb>huqSzKN?Rs{;?jvwi64PVFPXu@$f- zdT_~V#x~4LXADNBVG)Dg6b8XT0Vz_uR@zVN7`xbt=Z*3m)7CSEp|} zArH>mF^=ZQ^x$S?`ldIiA47k}OA$5FlG01&$9@W3u*eA;f?0dW>tNPis%mQD*)H-c zYZtm9Lp-~J_jdAL>1 zuWun_Wi`ig;%rOyh^X&)od59<~UL9eKCDADz%*T zw(>fyw-a@^+|b)i{p}a;#Nz|$2Vr9h{_Ug5UIo2@bRVt{rLn$&^j1F0*go1lq3!3u zvM-G{KSHwwUYX#PZx1f~de-TWJW`?~n#k2JlYAXRkx+MAA>wvBaRq zMGD14T~u9IDn#^X7?aPwPNA@2p36LA_gm^)b z!cK#E`|mbAs{SZbb!C>^@;{_j8-(*ExBb%=1^aSK-uK7kzWTLm>Y^X+;zT zy?5A~6pK}{2HKn0J7s_%uisr2+m+a?d8$K<#2&kOCU`ML5AhKz?G&amd9Vz@-8W-5 zqLFrrJ}>vhRzQ3-KD!zS#AkbO^%Ww%n&O2RXR1>)hFV2q7$xr_k_}%uTlpRNs5|71 z#RKDN`5j$WsC+zJezmEW_@e5Pt4*OSYSz@l8}+~ImTLZ1bzE-6@_QdonHjU{Ty^c52p>)@;0r!FxdyE=on;>v=@%kLc0Ht)lM zJau{L_Osn$&lk{Z?6QQ@riIEcX$z)IA9+yjbCBDg$=WeT~>S`_zO*$W7{OY)J>HgOMnmFnuul~w8i zaX&h0i$VT))$4R53U`aX>wm9Sh(7fh)t{DgL0+AyMk2=yvss+QBN0Q-r>I#*L_Hme zqzlg*Lr&2roCiZ|c(3rYEq}FI?T;KwRj)-(8G1gS%5zPQ<&4QKhL9pk>f6MAN>#*8 zVOV`WGra#v&U{+E8yQTEoHq3QhBNm=3Rid+k!y||O;@kV*K)4QSA{X*hB~VH4UxA~ z!~5qFbEsA{skNe_UY}GRHS~PO`LBcD66zLkS^RQ;@o$ zhj>(n1WrL3V5fC-a*+3HYkxp|nUL#8SWZAa8I*iGT<39Q;=zDj5)*D9UdTGgG=}%f zJQxp%uaKPc>Z!;eGQ!lIN}HN%m#<@=!CZ3Ag5V?(CSe%+79kbhtBF!XC#Ld&k$e*k zpV|%DFLSzKJnb{|hWZJZ3&L&kD!jLZLqS0a2MOA75ap7Es6FI0YH4Tyd))zHRxZp$ z(TZ^jaG_RoaA6i*7=-W`r4_pcqFO{A2`fe1k+5R2e`tVMKY>&iNu_oE9><~^LC`H0 zKmj*^9J$N2SAfpMwbQP&f{5?TTCoD!%%Hb$D~t)3fG;?jKqrzA=m(tzwS$XuW6~^t ziN5ZH8zQV+gb5<{jht@>g%k7D8he2bpbKKGTtqPl04_*)^w)~T6QJts#>nYZxM<{{ z=Ifw}V5r~%BnW^@B!B?bz?3GyBq7kvLCocl!Wc?!U~m(d5CSL@K#Gv20jX=R1zo-l zWN`vWKnIHoNHgK4=`7$zSf+re3!&A>)ew-NjTX>BKyn94A!Z7QrS}4n)}U4sA$|?S zT!@$gV(xuG)RtqN4r2kNYB1)LGhc-<|7$RggP}=>kz(;)FbX38#{+rTP~YPS5Jo&L zTL~_i(kunF6D0X2Z6Xxt^<-DWzpn_?9xEb`VTM{S<33ltMTZVEq*{j(h5u`w$FcmI9+9Z(40G5K0{16jBawo(I?K+5}4&eR-2D#uV zK=hE(V%(Q>01HTwdOPDT?gad7lyf2DwtzeU@kZ1p+*;r|g8rj79(_@zfT5)*RmX6Z zDC$s8f=TBxV+KD`6|?ubY^vo+hBxHlWqqkSqu0{B)3K9#W@!TRqjqH z$a!oM#9SDiTrFHwLX1aqhr&UjEy$qNqWdZBUEfdyhXV+QehN5USOP#FnC=B2ZRPs{sKrBt4j{#Y1|TJbsQ@~X z0py4!MT47zMzNrQM!8`sXs#sC;BsOS?_yZXfqJUof-1PTgg)hosc~7M*)b(9r39`> z6R^Puc5(%Y4k9Q|OvI%glr)wIO1jGuyu}cV%JmgkDL>o`R(|NgYD~l>56Gm*mNZug zT5g8~K~o{6Tw;X?%3nM#b=3qFLCI0pR!D?pZZ3v0##CrU4G|L;fmxn0CJ`y-cK9Gr zTUyE-Qz7LCAqvri9iZUJVp0g1N?VL>gxYqejFAK@fynnejq_YVkqQp7j$lQY>f*Q? zlosvA&Q?HAb?KJx$>#W zQv-z4Q6cFVL^pDrBaoSKM1PF)!yHKCR#61%53x>Q(0=LtII@;eqz4E%7jwJ5)odsC}*+9=Hlg|cIp_4Q*Uxkj4C)4SqKu<+(ZUv>O zDbR`cg)SFNWCM9ojG{rupAaSw)!;7B^e01y=L;~91!Q;vM65kX2}wZ4pZf523C7`0 zij|&(PW&o#^eiwHy4-s}r!4_J*pN~^Z24)Cdrqf@q-PSCNVvj&dT7P5p2sW}3(sU^ z4<#UyqLjyYIzg_0WLX%ZO)yb8wu@o&>Cs4>)vQ*0uG{f;)Yrh~vN93?XOG~MVyY^4+s-X`b_W-tsz)bYqb zx^SA1LP8sn>Cj{h?|hOIJw-47(u8B`qD&zQO9j6nv?x{B&{Lu3)9@OF zUR%_ykxzsc8DmQ>#p69k=oN|nl3rbEs#MS66-!JAXPyt6KE@OaUR|Bba~^emWMr(Wku}uRJ?6lY;mja$Bti)$HN^9 zf=7%cBVDsVYz%vzjI6-SzhWkM)Db+A794PtjQBspr-YGIIiB|k7A&)pB&}KzYlkR& z?5bbGElj*m#>-bH)KU;tsn=9kbu2P$-T_n8Gm*KS%8#Tn{i(+-cAg^B6v8H`>w zM~00UF=FIl8UfLF;A}8rh+H2^>BUmIGXikeYh$)zTM9{*g-T|%#9C_Sg)Q>X&xx{+#-^|$6=3{x#FOK zNalb9Gx%=zK=|hvVCtFRuZ7nIwDOJ%gM?M8YWk@#C=9-H*|Ecu8xM|~{2ySIOl#}p z6R|nJCVu1O7o6Y~CGqmxDRu_C#m%XBDb}q#;WNYZcy=e=utOm?5K=lJWB5~&p+r?z zT4j~|p&D5=fOnPrr8{1y^0)4I8_8e0W25o+?$~4e#d|H!O~v8Plph-%&%6`3mDj&K zjB`S4B|hkd@wU>fo{A0A$GusaVgqI~51Zg#_!W`-o$<@*%YDUU+B?A`hQ-SQqxk4X zJ#2)nn1`+S3L~Gu_nw8io%rgdz>9Bxe+UAf%Z!~t=|g!Hu~#qpU!2qLiZ8QJz4_L=g)#8FVc$Iwm@29(J(9 z_?}5W`qWCFU|qcT2VTH`Rie+hlfS}jtxbOmK&>-+P5rIVzZ->qiTQI$^Z#seus2bX z=ig15|0O;*9zr>Wzwt@@{sjIOON{MG9wYxTcCX+6<$7FC>-0CbD;pSV>)O=lSLQag z;*;&)u=@IqUZt&}xxK-^v5T2f>KnbAn-#{^r_}RC3#+eg>{J#vw<=ygdofL$eJ`cH zxxHDzP#a50sc&fO+NhDUcOkLMs|30*)u8yiem`TcW302jzOkc?{z8o58!_*1(0XSz zj{1hq&U$4_C+44K3rI3-QoIgF&BE&H)vSi>Y4mm~^}dGordF@NK$F+bz6+Z>+7*9C z>xNFoW~F|=9nAQZNlD$fS|es8;y7+fQ)Y}c$H4X~-Xqg@Ax6$zDI<-XIKNZOK)ra-IL#obuQ z*zVNj0k40H+w0%Z0nFMPz0Y<8$OrZ=QG1#jf4~PAo1bKh$LIGpG=0AbJ1}Wfw-Cd9 zG+Mc(OYydOn%le!yI`P~TI_}L6-&!2WV;ptm($w3ZH=8=wQmL;n&1BZm=Q2Cb_w>U zN`=xhl0zz&o|l$M9%;3-UTTrHOMfl>ll1RWzjQ`=Px?T*Bc<4;*=E=*wmCN0_Ka<* z&0||_TW4#tb=kUYKezST_S=48J7nv(owI#r8@Ac)^X*Ri3wDovwSB$aXAjtaWDnY3 zwePq8!hX>Hru~ThZTngKdHY5CZ|tM?8}={l>2j7lQ+`7Jt~^J6T6V}U$Tjj>xk>Jj zH_87Y_sRY88F^ztpx|u5xq^=iz9@LEu%d87VOQY?g{GpXi=0L7qUxe`MXg1DS)>;I zr0DO8ep3YJto%P~Djg}!EL%{vzU)%j7iDbzmiaHu@15U2pYFwU_}nV(ly*sbq`lHd Z(nTrLX0+woBwK~eopkR8+5fBG{{VBD?6m*@ literal 0 HcmV?d00001 diff --git a/Exe/Windows/Sha256String.exe b/Exe/Windows/Sha256String.exe new file mode 100644 index 0000000000000000000000000000000000000000..5a852370a6afe153108fb6b719e720774e02954b GIT binary patch literal 7680 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 literal 0 HcmV?d00001 diff --git a/Projects.sln b/Projects.sln new file mode 100644 index 0000000..63bbcef --- /dev/null +++ b/Projects.sln @@ -0,0 +1,85 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ProofOfWork", "VSProjectFiles\ProofOfWork.vcxproj", "{78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Md5String", "VSProjectFiles\Md5String.vcxproj", "{2F5CA1B6-92CC-4142-86AC-62FADFF0B834}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Rc4Output", "VSProjectFiles\Rc4Output.vcxproj", "{E5A739D1-4246-4FB1-8AA4-673068EDE33A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Sha1String", "VSProjectFiles\Sha1String.vcxproj", "{B01EA8DA-3ABB-410A-B28E-8336467F94F8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Sha256String", "VSProjectFiles\Sha256String.vcxproj", "{43164E66-9EA5-48E5-9708-6AF8C3642F6E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Sha512String", "VSProjectFiles\Sha512String.vcxproj", "{FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CryptLibTest", "VSProjectFiles\CryptLibTest.vcxproj", "{543C3780-F2F4-47BA-8263-278B911A73AC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}.Debug|Win32.ActiveCfg = Debug|Win32 + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}.Debug|Win32.Build.0 = Debug|Win32 + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}.Debug|x64.ActiveCfg = Debug|x64 + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}.Debug|x64.Build.0 = Debug|x64 + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}.Release|Win32.ActiveCfg = Release|Win32 + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}.Release|Win32.Build.0 = Release|Win32 + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}.Release|x64.ActiveCfg = Release|x64 + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C}.Release|x64.Build.0 = Release|x64 + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834}.Debug|Win32.ActiveCfg = Debug|Win32 + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834}.Debug|Win32.Build.0 = Debug|Win32 + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834}.Debug|x64.ActiveCfg = Debug|x64 + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834}.Debug|x64.Build.0 = Debug|x64 + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834}.Release|Win32.ActiveCfg = Release|Win32 + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834}.Release|Win32.Build.0 = Release|Win32 + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834}.Release|x64.ActiveCfg = Release|x64 + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834}.Release|x64.Build.0 = Release|x64 + {E5A739D1-4246-4FB1-8AA4-673068EDE33A}.Debug|Win32.ActiveCfg = Debug|Win32 + {E5A739D1-4246-4FB1-8AA4-673068EDE33A}.Debug|Win32.Build.0 = Debug|Win32 + {E5A739D1-4246-4FB1-8AA4-673068EDE33A}.Debug|x64.ActiveCfg = Debug|x64 + {E5A739D1-4246-4FB1-8AA4-673068EDE33A}.Debug|x64.Build.0 = Debug|x64 + {E5A739D1-4246-4FB1-8AA4-673068EDE33A}.Release|Win32.ActiveCfg = Release|Win32 + {E5A739D1-4246-4FB1-8AA4-673068EDE33A}.Release|Win32.Build.0 = Release|Win32 + {E5A739D1-4246-4FB1-8AA4-673068EDE33A}.Release|x64.ActiveCfg = Release|x64 + {E5A739D1-4246-4FB1-8AA4-673068EDE33A}.Release|x64.Build.0 = Release|x64 + {B01EA8DA-3ABB-410A-B28E-8336467F94F8}.Debug|Win32.ActiveCfg = Debug|Win32 + {B01EA8DA-3ABB-410A-B28E-8336467F94F8}.Debug|Win32.Build.0 = Debug|Win32 + {B01EA8DA-3ABB-410A-B28E-8336467F94F8}.Debug|x64.ActiveCfg = Debug|x64 + {B01EA8DA-3ABB-410A-B28E-8336467F94F8}.Debug|x64.Build.0 = Debug|x64 + {B01EA8DA-3ABB-410A-B28E-8336467F94F8}.Release|Win32.ActiveCfg = Release|Win32 + {B01EA8DA-3ABB-410A-B28E-8336467F94F8}.Release|Win32.Build.0 = Release|Win32 + {B01EA8DA-3ABB-410A-B28E-8336467F94F8}.Release|x64.ActiveCfg = Release|x64 + {B01EA8DA-3ABB-410A-B28E-8336467F94F8}.Release|x64.Build.0 = Release|x64 + {43164E66-9EA5-48E5-9708-6AF8C3642F6E}.Debug|Win32.ActiveCfg = Debug|Win32 + {43164E66-9EA5-48E5-9708-6AF8C3642F6E}.Debug|Win32.Build.0 = Debug|Win32 + {43164E66-9EA5-48E5-9708-6AF8C3642F6E}.Debug|x64.ActiveCfg = Debug|x64 + {43164E66-9EA5-48E5-9708-6AF8C3642F6E}.Debug|x64.Build.0 = Debug|x64 + {43164E66-9EA5-48E5-9708-6AF8C3642F6E}.Release|Win32.ActiveCfg = Release|Win32 + {43164E66-9EA5-48E5-9708-6AF8C3642F6E}.Release|Win32.Build.0 = Release|Win32 + {43164E66-9EA5-48E5-9708-6AF8C3642F6E}.Release|x64.ActiveCfg = Release|x64 + {43164E66-9EA5-48E5-9708-6AF8C3642F6E}.Release|x64.Build.0 = Release|x64 + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}.Debug|Win32.ActiveCfg = Debug|Win32 + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}.Debug|Win32.Build.0 = Debug|Win32 + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}.Debug|x64.ActiveCfg = Debug|x64 + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}.Debug|x64.Build.0 = Debug|x64 + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}.Release|Win32.ActiveCfg = Release|Win32 + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}.Release|Win32.Build.0 = Release|Win32 + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}.Release|x64.ActiveCfg = Release|x64 + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6}.Release|x64.Build.0 = Release|x64 + {543C3780-F2F4-47BA-8263-278B911A73AC}.Debug|Win32.ActiveCfg = Debug|Win32 + {543C3780-F2F4-47BA-8263-278B911A73AC}.Debug|Win32.Build.0 = Debug|Win32 + {543C3780-F2F4-47BA-8263-278B911A73AC}.Debug|x64.ActiveCfg = Debug|x64 + {543C3780-F2F4-47BA-8263-278B911A73AC}.Debug|x64.Build.0 = Debug|x64 + {543C3780-F2F4-47BA-8263-278B911A73AC}.Release|Win32.ActiveCfg = Release|Win32 + {543C3780-F2F4-47BA-8263-278B911A73AC}.Release|Win32.Build.0 = Release|Win32 + {543C3780-F2F4-47BA-8263-278B911A73AC}.Release|x64.ActiveCfg = Release|x64 + {543C3780-F2F4-47BA-8263-278B911A73AC}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md index 2649496..cc258b3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,90 @@ CryptLib ======== -Public Domain C Library of Cryptographic functions +CryptLib is a collection of cryptographic functions written in C. Each +module is fully independent and requires only a single .c file and a +a single .h file. The functions are designed to be portable, however +they do require a Little-Endian processor. + +The makefile is for gnu make and works on Linux, OSX, Cygwin. +It also works on Windows with VSS if cygwin (or some other gnu make) is +setup and the environment has been setup correctly. + +A Visual Studio 2010 solution file also exists, which has project files. +This can be used instead of the makefile for VS2010. + +*Created June 2013* + +Version 1.0.0 - June 2013 +------------------------- + +To use the library functions, only the following files are required, +depending one what cryptographic functions are wanted. + +* MD5 - (LibMd5.h, and LibMd5.c) +* SHA1 - (LibSha1.h, and LibSha1.c) +* SHA256 - (LibSha256.h, and LibSha256.c) +* SHA512 - (LibSha512.h, and LibSha512.c) +* RC4 - (LibRc4.h, and LibRc4.c) + +Test Programs +------------- + +In the projects directory there are several programs that compile to +command line executables. One is CryptLibTest. This tests the algorithms +against known test vectors. If compiling on a different system this +is useful to verify that the results are still valid. For example if you +compile on a Big-Endian system then some of the functions will undoubtable +fail. The test program can be used to verify that the correct modifications +have been made if you wish to adapt the fiules to Big-Endian. + +Additionally there are sample programs that demonstrate the functions. For +each of the hash functions there is a program that creates a hash from a +string given on command line. For RC4 there is a program that outputs +the stream in hex. + +* Md5String +* Sha1String +* Sha256String +* Sha512String +* Rc4Output + +Executables +----------- + +Included in the Exe directory are executables of the above programs for Windows, +OSX, and Linux. All of them are compiled for x64 versions of the operating +systems. The Windows one is compiled for Vista and greater. The Linux binaries +are comiled on Ubuntu 12.04. The binaries are built with a dependncy on GLICC2.14 +which means it will only load on fairly new versions of Linux. However linux +is the easiest system to build form source as almost every linux platform will +have make and gcc already installed. + +License +======= + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + diff --git a/UNLICENSE b/UNLICENSE new file mode 100644 index 0000000..f94e89d --- /dev/null +++ b/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/VSProjectFiles/CryptLibTest.vcxproj b/VSProjectFiles/CryptLibTest.vcxproj new file mode 100644 index 0000000..d785bc7 --- /dev/null +++ b/VSProjectFiles/CryptLibTest.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + x64 + + + Debug + Win32 + + + Release + x64 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + {543C3780-F2F4-47BA-8263-278B911A73AC} + CryptLibTest + Win32Proj + + + + Application + + + Application + + + Application + + + Application + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + + + + + \ No newline at end of file diff --git a/VSProjectFiles/CryptLibTest.vcxproj.filters b/VSProjectFiles/CryptLibTest.vcxproj.filters new file mode 100644 index 0000000..44f6cea --- /dev/null +++ b/VSProjectFiles/CryptLibTest.vcxproj.filters @@ -0,0 +1,49 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {aabf3f27-af59-42e0-94ef-f81adde8e682} + + + + + lib + + + lib + + + lib + + + lib + + + lib + + + Source Files + + + + + lib + + + lib + + + lib + + + lib + + + lib + + + \ No newline at end of file diff --git a/VSProjectFiles/Md5String.vcxproj b/VSProjectFiles/Md5String.vcxproj new file mode 100644 index 0000000..0386dfe --- /dev/null +++ b/VSProjectFiles/Md5String.vcxproj @@ -0,0 +1,68 @@ + + + + + Debug + x64 + + + Debug + Win32 + + + Release + x64 + + + Release + Win32 + + + + + + + + + + + {2F5CA1B6-92CC-4142-86AC-62FADFF0B834} + Md5String + Win32Proj + + + + Application + + + Application + + + Application + + + Application + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + + + + + \ No newline at end of file diff --git a/VSProjectFiles/Md5String.vcxproj.filters b/VSProjectFiles/Md5String.vcxproj.filters new file mode 100644 index 0000000..b787e0a --- /dev/null +++ b/VSProjectFiles/Md5String.vcxproj.filters @@ -0,0 +1,25 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {aabf3f27-af59-42e0-94ef-f81adde8e682} + + + + + lib + + + Source Files + + + + + lib + + + \ No newline at end of file diff --git a/VSProjectFiles/ProofOfWork.vcxproj b/VSProjectFiles/ProofOfWork.vcxproj new file mode 100644 index 0000000..c01d815 --- /dev/null +++ b/VSProjectFiles/ProofOfWork.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + x64 + + + Debug + Win32 + + + Release + x64 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + {78DE2AA5-4DEB-4601-AAB8-A3452BAC810C} + ProofOfWork + Win32Proj + + + + Application + + + Application + + + Application + + + Application + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + + + + + \ No newline at end of file diff --git a/VSProjectFiles/ProofOfWork.vcxproj.filters b/VSProjectFiles/ProofOfWork.vcxproj.filters new file mode 100644 index 0000000..7dbdb5c --- /dev/null +++ b/VSProjectFiles/ProofOfWork.vcxproj.filters @@ -0,0 +1,55 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {6ec1a200-d167-4831-b36c-9ddd0b2ba00a} + + + + + lib + + + lib + + + lib + + + lib + + + lib + + + lib + + + Source Files + + + + + lib + + + lib + + + lib + + + lib + + + lib + + + Source Files + + + \ No newline at end of file diff --git a/VSProjectFiles/Rc4Output.vcxproj b/VSProjectFiles/Rc4Output.vcxproj new file mode 100644 index 0000000..8df7e1d --- /dev/null +++ b/VSProjectFiles/Rc4Output.vcxproj @@ -0,0 +1,68 @@ + + + + + Debug + x64 + + + Debug + Win32 + + + Release + x64 + + + Release + Win32 + + + + + + + + + + + {E5A739D1-4246-4FB1-8AA4-673068EDE33A} + Rc4Output + Win32Proj + + + + Application + + + Application + + + Application + + + Application + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + + + + + \ No newline at end of file diff --git a/VSProjectFiles/Rc4Output.vcxproj.filters b/VSProjectFiles/Rc4Output.vcxproj.filters new file mode 100644 index 0000000..dfbb720 --- /dev/null +++ b/VSProjectFiles/Rc4Output.vcxproj.filters @@ -0,0 +1,25 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {aabf3f27-af59-42e0-94ef-f81adde8e682} + + + + + lib + + + Source Files + + + + + lib + + + \ No newline at end of file diff --git a/VSProjectFiles/Sha1String.vcxproj b/VSProjectFiles/Sha1String.vcxproj new file mode 100644 index 0000000..ab08ebc --- /dev/null +++ b/VSProjectFiles/Sha1String.vcxproj @@ -0,0 +1,68 @@ + + + + + Debug + x64 + + + Debug + Win32 + + + Release + x64 + + + Release + Win32 + + + + + + + + + + + {B01EA8DA-3ABB-410A-B28E-8336467F94F8} + Sha1String + Win32Proj + + + + Application + + + Application + + + Application + + + Application + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + + + + + \ No newline at end of file diff --git a/VSProjectFiles/Sha1String.vcxproj.filters b/VSProjectFiles/Sha1String.vcxproj.filters new file mode 100644 index 0000000..35f513a --- /dev/null +++ b/VSProjectFiles/Sha1String.vcxproj.filters @@ -0,0 +1,29 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {aabf3f27-af59-42e0-94ef-f81adde8e682} + + + + + Source Files + + + lib + + + + + lib + + + \ No newline at end of file diff --git a/VSProjectFiles/Sha256String.vcxproj b/VSProjectFiles/Sha256String.vcxproj new file mode 100644 index 0000000..d75ba0e --- /dev/null +++ b/VSProjectFiles/Sha256String.vcxproj @@ -0,0 +1,68 @@ + + + + + Debug + x64 + + + Debug + Win32 + + + Release + x64 + + + Release + Win32 + + + + + + + + + + + {43164E66-9EA5-48E5-9708-6AF8C3642F6E} + Sha256String + Win32Proj + + + + Application + + + Application + + + Application + + + Application + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + + + + + \ No newline at end of file diff --git a/VSProjectFiles/Sha256String.vcxproj.filters b/VSProjectFiles/Sha256String.vcxproj.filters new file mode 100644 index 0000000..e210814 --- /dev/null +++ b/VSProjectFiles/Sha256String.vcxproj.filters @@ -0,0 +1,29 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {aabf3f27-af59-42e0-94ef-f81adde8e682} + + + + + Source Files + + + lib + + + + + lib + + + \ No newline at end of file diff --git a/VSProjectFiles/Sha512String.vcxproj b/VSProjectFiles/Sha512String.vcxproj new file mode 100644 index 0000000..c516774 --- /dev/null +++ b/VSProjectFiles/Sha512String.vcxproj @@ -0,0 +1,68 @@ + + + + + Debug + x64 + + + Debug + Win32 + + + Release + x64 + + + Release + Win32 + + + + + + + + + + + {FC8B119A-DF2A-48A6-B834-F1CDF80AECB6} + Sha512String + Win32Proj + + + + Application + + + Application + + + Application + + + Application + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + + + + + \ No newline at end of file diff --git a/VSProjectFiles/Sha512String.vcxproj.filters b/VSProjectFiles/Sha512String.vcxproj.filters new file mode 100644 index 0000000..f2f7ac4 --- /dev/null +++ b/VSProjectFiles/Sha512String.vcxproj.filters @@ -0,0 +1,29 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {aabf3f27-af59-42e0-94ef-f81adde8e682} + + + + + Source Files + + + lib + + + + + lib + + + \ No newline at end of file diff --git a/VSProjectFiles/props/All.props b/VSProjectFiles/props/All.props new file mode 100644 index 0000000..f9e64b9 --- /dev/null +++ b/VSProjectFiles/props/All.props @@ -0,0 +1,42 @@ + + + + + + $(SolutionDir)Binaries\$(Platform)$(Configuration)\ + + + $(SolutionDir)Build\$(Platform)$(Configuration)\$(ProjectName)\ + + + + Level4 + + + + + true + true + MultiThreaded + Full + AnySuitable + Speed + true + _WIN32_WINNT=0x0600;_CRT_SECURE_NO_WARNINGS + true + $(SolutionDir)\lib;$(SolutionDir)\stdbool + + + $(IntDir)$(TargetName)$(TargetExt) + + + 6.0 + + + false + true + true + + + + \ No newline at end of file diff --git a/VSProjectFiles/props/Debug.props b/VSProjectFiles/props/Debug.props new file mode 100644 index 0000000..b1327ef --- /dev/null +++ b/VSProjectFiles/props/Debug.props @@ -0,0 +1,21 @@ + + + + + false + + + + true + + + false + + + MultiThreadedDebug + Disabled + Disabled + + + + \ No newline at end of file diff --git a/VSProjectFiles/props/Win32.props b/VSProjectFiles/props/Win32.props new file mode 100644 index 0000000..7135522 --- /dev/null +++ b/VSProjectFiles/props/Win32.props @@ -0,0 +1,3 @@ + + + diff --git a/VSProjectFiles/props/Win32Debug.props b/VSProjectFiles/props/Win32Debug.props new file mode 100644 index 0000000..14cf868 --- /dev/null +++ b/VSProjectFiles/props/Win32Debug.props @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/VSProjectFiles/props/Win32Release.props b/VSProjectFiles/props/Win32Release.props new file mode 100644 index 0000000..1626439 --- /dev/null +++ b/VSProjectFiles/props/Win32Release.props @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/VSProjectFiles/props/x64.props b/VSProjectFiles/props/x64.props new file mode 100644 index 0000000..dead7f9 --- /dev/null +++ b/VSProjectFiles/props/x64.props @@ -0,0 +1,8 @@ + + + + + false + + + \ No newline at end of file diff --git a/VSProjectFiles/props/x64Debug.props b/VSProjectFiles/props/x64Debug.props new file mode 100644 index 0000000..50aab89 --- /dev/null +++ b/VSProjectFiles/props/x64Debug.props @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/VSProjectFiles/props/x64Release.props b/VSProjectFiles/props/x64Release.props new file mode 100644 index 0000000..92468f8 --- /dev/null +++ b/VSProjectFiles/props/x64Release.props @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/lib/LibMd5.c b/lib/LibMd5.c new file mode 100644 index 0000000..24f712d --- /dev/null +++ b/lib/LibMd5.c @@ -0,0 +1,315 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibMd5 +// +// Implementation of MD5 hash function. Originally written by Alexander Peslyak. Modified by WaterJuice retaining +// Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "LibMd5.h" +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// INTERNAL FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// F, G, H, I +// +// The basic MD5 functions. F and G are optimized compared to their RFC 1321 definitions for architectures that lack +// an AND-NOT instruction, just like in Colin Plumb's implementation. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define F( x, y, z ) ( (z) ^ ((x) & ((y) ^ (z))) ) +#define G( x, y, z ) ( (y) ^ ((z) & ((x) ^ (y))) ) +#define H( x, y, z ) ( (x) ^ (y) ^ (z) ) +#define I( x, y, z ) ( (y) ^ ((x) | ~(z)) ) + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// STEP +// +// The MD5 transformation for all four rounds. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define STEP( f, a, b, c, d, x, t, s ) \ + (a) += f((b), (c), (d)) + (x) + (t); \ + (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ + (a) += (b); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// SET, GET +// +// SET reads 4 input bytes in little-endian byte order and stores them in a properly aligned word in host byte order. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#define SET(n) (*(uint32_t *)&ptr[(n) * 4]) +#define GET(n) SET(n) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TransformFunction +// +// This processes one or more 64-byte data blocks, but does NOT update the bit counters. There are no alignment +// requirements. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +void* + TransformFunction + ( + Md5Context* ctx, + void* data, + uintmax_t size + ) +{ + uint8_t* ptr; + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; + uint32_t saved_a; + uint32_t saved_b; + uint32_t saved_c; + uint32_t saved_d; + + ptr = (uint8_t*)data; + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + + do + { + saved_a = a; + saved_b = b; + saved_c = c; + saved_d = d; + + // Round 1 + STEP( F, a, b, c, d, SET(0), 0xd76aa478, 7 ) + STEP( F, d, a, b, c, SET(1), 0xe8c7b756, 12 ) + STEP( F, c, d, a, b, SET(2), 0x242070db, 17 ) + STEP( F, b, c, d, a, SET(3), 0xc1bdceee, 22 ) + STEP( F, a, b, c, d, SET(4), 0xf57c0faf, 7 ) + STEP( F, d, a, b, c, SET(5), 0x4787c62a, 12 ) + STEP( F, c, d, a, b, SET(6), 0xa8304613, 17 ) + STEP( F, b, c, d, a, SET(7), 0xfd469501, 22 ) + STEP( F, a, b, c, d, SET(8 ), 0x698098d8, 7 ) + STEP( F, d, a, b, c, SET(9 ), 0x8b44f7af, 12 ) + STEP( F, c, d, a, b, SET(10 ), 0xffff5bb1, 17 ) + STEP( F, b, c, d, a, SET(11 ), 0x895cd7be, 22 ) + STEP( F, a, b, c, d, SET(12 ), 0x6b901122, 7 ) + STEP( F, d, a, b, c, SET(13 ), 0xfd987193, 12 ) + STEP( F, c, d, a, b, SET(14 ), 0xa679438e, 17 ) + STEP( F, b, c, d, a, SET(15 ), 0x49b40821, 22 ) + + // Round 2 + STEP( G, a, b, c, d, GET(1), 0xf61e2562, 5 ) + STEP( G, d, a, b, c, GET(6), 0xc040b340, 9 ) + STEP( G, c, d, a, b, GET(11), 0x265e5a51, 14 ) + STEP( G, b, c, d, a, GET(0), 0xe9b6c7aa, 20 ) + STEP( G, a, b, c, d, GET(5), 0xd62f105d, 5 ) + STEP( G, d, a, b, c, GET(10), 0x02441453, 9 ) + STEP( G, c, d, a, b, GET(15), 0xd8a1e681, 14 ) + STEP( G, b, c, d, a, GET(4), 0xe7d3fbc8, 20 ) + STEP( G, a, b, c, d, GET(9), 0x21e1cde6, 5 ) + STEP( G, d, a, b, c, GET(14), 0xc33707d6, 9 ) + STEP( G, c, d, a, b, GET(3), 0xf4d50d87, 14 ) + STEP( G, b, c, d, a, GET(8), 0x455a14ed, 20 ) + STEP( G, a, b, c, d, GET(13), 0xa9e3e905, 5 ) + STEP( G, d, a, b, c, GET(2), 0xfcefa3f8, 9 ) + STEP( G, c, d, a, b, GET(7), 0x676f02d9, 14 ) + STEP( G, b, c, d, a, GET(12), 0x8d2a4c8a, 20 ) + + // Round 3 + STEP( H, a, b, c, d, GET(5), 0xfffa3942, 4 ) + STEP( H, d, a, b, c, GET(8), 0x8771f681, 11 ) + STEP( H, c, d, a, b, GET(11), 0x6d9d6122, 16 ) + STEP( H, b, c, d, a, GET(14), 0xfde5380c, 23 ) + STEP( H, a, b, c, d, GET(1), 0xa4beea44, 4 ) + STEP( H, d, a, b, c, GET(4), 0x4bdecfa9, 11 ) + STEP( H, c, d, a, b, GET(7), 0xf6bb4b60, 16 ) + STEP( H, b, c, d, a, GET(10), 0xbebfbc70, 23 ) + STEP( H, a, b, c, d, GET(13), 0x289b7ec6, 4 ) + STEP( H, d, a, b, c, GET(0), 0xeaa127fa, 11 ) + STEP( H, c, d, a, b, GET(3), 0xd4ef3085, 16 ) + STEP( H, b, c, d, a, GET(6), 0x04881d05, 23 ) + STEP( H, a, b, c, d, GET(9), 0xd9d4d039, 4 ) + STEP( H, d, a, b, c, GET(12), 0xe6db99e5, 11 ) + STEP( H, c, d, a, b, GET(15), 0x1fa27cf8, 16 ) + STEP( H, b, c, d, a, GET(2), 0xc4ac5665, 23 ) + + // Round 4 + STEP( I, a, b, c, d, GET(0), 0xf4292244, 6 ) + STEP( I, d, a, b, c, GET(7), 0x432aff97, 10 ) + STEP( I, c, d, a, b, GET(14), 0xab9423a7, 15 ) + STEP( I, b, c, d, a, GET(5), 0xfc93a039, 21 ) + STEP( I, a, b, c, d, GET(12), 0x655b59c3, 6 ) + STEP( I, d, a, b, c, GET(3), 0x8f0ccc92, 10 ) + STEP( I, c, d, a, b, GET(10), 0xffeff47d, 15 ) + STEP( I, b, c, d, a, GET(1), 0x85845dd1, 21 ) + STEP( I, a, b, c, d, GET(8), 0x6fa87e4f, 6 ) + STEP( I, d, a, b, c, GET(15), 0xfe2ce6e0, 10 ) + STEP( I, c, d, a, b, GET(6), 0xa3014314, 15 ) + STEP( I, b, c, d, a, GET(13), 0x4e0811a1, 21 ) + STEP( I, a, b, c, d, GET(4), 0xf7537e82, 6 ) + STEP( I, d, a, b, c, GET(11), 0xbd3af235, 10 ) + STEP( I, c, d, a, b, GET(2), 0x2ad7d2bb, 15 ) + STEP( I, b, c, d, a, GET(9), 0xeb86d391, 21 ) + + a += saved_a; + b += saved_b; + c += saved_c; + d += saved_d; + + ptr += 64; + } while( size -= 64 ); + + ctx->a = a; + ctx->b = b; + ctx->c = c; + ctx->d = d; + + return ptr; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// EXPORTED FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Initialise +// +// Initialises an MD5 Context. Use this to initialise/reset a context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Md5Initialise + ( + Md5Context* Context + ) +{ + Context->a = 0x67452301; + Context->b = 0xefcdab89; + Context->c = 0x98badcfe; + Context->d = 0x10325476; + + Context->lo = 0; + Context->hi = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Update +// +// Adds data to the MD5 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Md5Finalise to calculate the hash. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Md5Update + ( + Md5Context* Context, + void* Buffer, + uint32_t BufferSize + ) +{ + uint32_t saved_lo; + uint32_t used; + uint32_t free; + + saved_lo = Context->lo; + if( (Context->lo = (saved_lo + BufferSize) & 0x1fffffff) < saved_lo ) + { + Context->hi++; + } + Context->hi += (uint32_t)( BufferSize >> 29 ); + + used = saved_lo & 0x3f; + + if( used ) + { + free = 64 - used; + + if( BufferSize < free ) + { + memcpy( &Context->buffer[used], Buffer, BufferSize ); + return; + } + + memcpy( &Context->buffer[used], Buffer, free ); + Buffer = (uint8_t*)Buffer + free; + BufferSize -= free; + TransformFunction(Context, Context->buffer, 64); + } + + if( BufferSize >= 64 ) + { + Buffer = TransformFunction( Context, Buffer, BufferSize & ~(unsigned long)0x3f ); + BufferSize &= 0x3f; + } + + memcpy( Context->buffer, Buffer, BufferSize ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Finalise +// +// Performs the final calculation of the hash and returns the digest (16 byte buffer containing 128bit hash). After +// calling this, Md5Initialised must be used to reuse the context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Md5Finalise + ( + Md5Context* Context, + MD5_HASH* Digest + ) +{ + uint32_t used; + uint32_t free; + + used = Context->lo & 0x3f; + + Context->buffer[used++] = 0x80; + + free = 64 - used; + + if(free < 8) + { + memset( &Context->buffer[used], 0, free ); + TransformFunction( Context, Context->buffer, 64 ); + used = 0; + free = 64; + } + + memset( &Context->buffer[used], 0, free - 8 ); + + Context->lo <<= 3; + Context->buffer[56] = (uint8_t)( Context->lo ); + Context->buffer[57] = (uint8_t)( Context->lo >> 8 ); + Context->buffer[58] = (uint8_t)( Context->lo >> 16 ); + Context->buffer[59] = (uint8_t)( Context->lo >> 24 ); + Context->buffer[60] = (uint8_t)( Context->hi ); + Context->buffer[61] = (uint8_t)( Context->hi >> 8 ); + Context->buffer[62] = (uint8_t)( Context->hi >> 16 ); + Context->buffer[63] = (uint8_t)( Context->hi >> 24 ); + + TransformFunction( Context, Context->buffer, 64 ); + + Digest->bytes[0] = (uint8_t)( Context->a ); + Digest->bytes[1] = (uint8_t)( Context->a >> 8 ); + Digest->bytes[2] = (uint8_t)( Context->a >> 16 ); + Digest->bytes[3] = (uint8_t)( Context->a >> 24 ); + Digest->bytes[4] = (uint8_t)( Context->b ); + Digest->bytes[5] = (uint8_t)( Context->b >> 8 ); + Digest->bytes[6] = (uint8_t)( Context->b >> 16 ); + Digest->bytes[7] = (uint8_t)( Context->b >> 24 ); + Digest->bytes[8] = (uint8_t)( Context->c ); + Digest->bytes[9] = (uint8_t)( Context->c >> 8 ); + Digest->bytes[10] = (uint8_t)( Context->c >> 16 ); + Digest->bytes[11] = (uint8_t)( Context->c >> 24 ); + Digest->bytes[12] = (uint8_t)( Context->d ); + Digest->bytes[13] = (uint8_t)( Context->d >> 8 ); + Digest->bytes[14] = (uint8_t)( Context->d >> 16 ); + Digest->bytes[15] = (uint8_t)( Context->d >> 24 ); +} + diff --git a/lib/LibMd5.h b/lib/LibMd5.h new file mode 100644 index 0000000..9091432 --- /dev/null +++ b/lib/LibMd5.h @@ -0,0 +1,89 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibMd5 +// +// Implementation of MD5 hash function. Originally written by Alexander Peslyak. Modified by WaterJuice retaining +// Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _LibMd5_h_ +#define _LibMd5_h_ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Md5Context - This must be initialised using Md5Initialised. Do not modify the contents of this structure directly. +typedef struct +{ + uint32_t lo; + uint32_t hi; + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; + uint8_t buffer[64]; + uint32_t block[16]; +} Md5Context; + +#define MD5_HASH_SIZE ( 128 / 8 ) + +typedef struct +{ + uint8_t bytes [MD5_HASH_SIZE]; +} MD5_HASH; + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Initialise +// +// Initialises an MD5 Context. Use this to initialise/reset a context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Md5Initialise + ( + Md5Context* Context + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Update +// +// Adds data to the MD5 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Md5Finalise to calculate the hash. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Md5Update + ( + Md5Context* Context, + void* Buffer, + uint32_t BufferSize + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Md5Finalise +// +// Performs the final calculation of the hash and returns the digest (16 byte buffer containing 128bit hash). After +// calling this, Md5Initialised must be used to reuse the context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Md5Finalise + ( + Md5Context* Context, + MD5_HASH* Digest + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#endif //_LibMd5_h_ + diff --git a/lib/LibRc4.c b/lib/LibRc4.c new file mode 100644 index 0000000..6e3c1f5 --- /dev/null +++ b/lib/LibRc4.c @@ -0,0 +1,129 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibRC4 +// +// An implementation of RC4 stream cipher +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "LibRc4.h" +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// INTERNAL FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define SwapBytes( Value1, Value2 ) \ +{ \ + uint8_t temp = Value1; \ + Value1 = Value2; \ + Value2 = temp; \ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Rc4Initialise +// +// Initialises an RC4 cipher and discards the specified number of first bytes. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Rc4Initialise + ( + Rc4Context* Context, + void* Key, + uint32_t KeySize, + uint32_t DropN + ) +{ + uint32_t i; + uint32_t j; + uint32_t n; + + // Setup key schedule + for( i=0; i<256; i++ ) + { + Context->S[i] = (uint8_t)i; + } + + j = 0; + for( i=0; i<256; i++ ) + { + j = ( j + Context->S[i] + ((uint8_t*)Key)[i % KeySize] ) % 256; + SwapBytes( Context->S[i], Context->S[j] ); + } + + i = 0; + j = 0; + + // Drop first bytes (if requested) + for( n=0; nS[i] ) % 256; + SwapBytes( Context->S[i], Context->S[j] ); + } + + Context->i = i; + Context->j = j; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Rc4Output +// +// Outputs the requested number of bytes from the RC4 stream +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Rc4Output + ( + Rc4Context* Context, + void* Buffer, + uint32_t Size + ) +{ + uint32_t n; + + for( n=0; ni = ( Context->i + 1 ) % 256; + Context->j = ( Context->j + Context->S[Context->i] ) % 256; + SwapBytes( Context->S[Context->i], Context->S[Context->j] ); + + ((uint8_t*)Buffer)[n] = Context->S[ (Context->S[Context->i] + Context->S[Context->j]) % 256 ]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Rc4Xor +// +// XORs the RC4 stream with an input buffer and puts the results in an output buffer. This is used for encrypting +// and decrypting data. InBuffer and OutBuffer can point to the same location for inplace encrypting/decrypting +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Rc4Xor + ( + Rc4Context* Context, + void* InBuffer, + void* OutBuffer, + uint32_t Size + ) +{ + uint32_t n; + + for( n=0; ni = ( Context->i + 1 ) % 256; + Context->j = ( Context->j + Context->S[Context->i] ) % 256; + SwapBytes( Context->S[Context->i], Context->S[Context->j] ); + + ((uint8_t*)OutBuffer)[n] = ((uint8_t*)InBuffer)[n] + ^ ( Context->S[ (Context->S[Context->i] + Context->S[Context->j]) % 256 ] ); + } +} + diff --git a/lib/LibRc4.h b/lib/LibRc4.h new file mode 100644 index 0000000..578d44b --- /dev/null +++ b/lib/LibRc4.h @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibRC4 +// +// An implementation of RC4 stream cipher +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _LibRc4_h_ +#define _LibRc4_h_ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Rc4Context - This must be initialised using Rc4Initialised. Do not modify the contents of this structure directly. +typedef struct +{ + uint32_t i; + uint32_t j; + uint8_t S[256]; +} Rc4Context; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Rc4Initialise +// +// Initialises an RC4 cipher and discards the specified number of first bytes. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Rc4Initialise + ( + Rc4Context* Context, + void* Key, + uint32_t KeySize, + uint32_t DropN + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Rc4Output +// +// Outputs the requested number of bytes from the RC4 stream +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Rc4Output + ( + Rc4Context* Context, + void* Buffer, + uint32_t Size + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Rc4Xor +// +// XORs the RC4 stream with an input buffer and puts the results in an output buffer. This is used for encrypting +// and decrypting data. InBuffer and OutBuffer can point to the same location for inplace encrypting/decrypting +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Rc4Xor + ( + Rc4Context* Context, + void* InBuffer, + void* OutBuffer, + uint32_t Size + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#endif //_LibRc4_h_ + diff --git a/lib/LibSha1.c b/lib/LibSha1.c new file mode 100644 index 0000000..3d14b42 --- /dev/null +++ b/lib/LibSha1.c @@ -0,0 +1,212 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibSha1 +// +// Implementation of SHA1 hash function. +// Original author: Steve Reid +// Contributions by: James H. Brown , Saul Kravitz , +// and Ralph Giles +// Modified by WaterJuice retaining Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "LibSha1.h" +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +typedef union +{ + uint8_t c [64]; + uint32_t l [16]; +} CHAR64LONG16; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// INTERNAL FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +// blk0() and blk() perform the initial expand. +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) + +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +// (R0+R1), R2, R3, R4 are the different operations used in SHA1 +#define R0(v,w,x,y,z,i) z += ((w&(x^y))^y) + blk0(i)+ 0x5A827999 + rol(v,5); w=rol(w,30); +#define R1(v,w,x,y,z,i) z += ((w&(x^y))^y) + blk(i) + 0x5A827999 + rol(v,5); w=rol(w,30); +#define R2(v,w,x,y,z,i) z += (w^x^y) + blk(i) + 0x6ED9EBA1 + rol(v,5); w=rol(w,30); +#define R3(v,w,x,y,z,i) z += (((w|x)&y)|(w&x)) + blk(i) + 0x8F1BBCDC + rol(v,5); w=rol(w,30); +#define R4(v,w,x,y,z,i) z += (w^x^y) + blk(i) + 0xCA62C1D6 + rol(v,5); w=rol(w,30); + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TransformFunction +// +// Hash a single 512-bit block. This is the core of the algorithm +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +void + TransformFunction + ( + uint32_t state[5], + const uint8_t buffer[64] + ) +{ + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; + uint32_t e; + uint8_t workspace[64]; + CHAR64LONG16* block = (CHAR64LONG16*) workspace; + + memcpy( block, buffer, 64 ); + + // Copy context->state[] to working vars + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + + // 4 rounds of 20 operations each. Loop unrolled. + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); + + // Add the working vars back into context.state[] + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha1Initialise +// +// Initialises an SHA1 Context. Use this to initialise/reset a context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha1Initialise + ( + Sha1Context* Context + ) +{ + // SHA1 initialization constants + Context->State[0] = 0x67452301; + Context->State[1] = 0xEFCDAB89; + Context->State[2] = 0x98BADCFE; + Context->State[3] = 0x10325476; + Context->State[4] = 0xC3D2E1F0; + Context->Count[0] = 0; + Context->Count[1] = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha1Update +// +// Adds data to the SHA1 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Sha1Finalise to calculate the hash. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha1Update + ( + Sha1Context* Context, + void* Buffer, + uint32_t BufferSize + ) +{ + uint32_t i; + uint32_t j; + + j = (Context->Count[0] >> 3) & 63; + if( (Context->Count[0] += BufferSize << 3) < (BufferSize << 3) ) + { + Context->Count[1]++; + } + + Context->Count[1] += (BufferSize >> 29); + if( (j + BufferSize) > 63 ) + { + i = 64 - j; + memcpy( &Context->Buffer[j], Buffer, i ); + TransformFunction(Context->State, Context->Buffer); + for( ; i + 63 < BufferSize; i += 64 ) + { + TransformFunction(Context->State, (uint8_t*)Buffer + i); + } + j = 0; + } + else + { + i = 0; + } + + memcpy( &Context->Buffer[j], &((uint8_t*)Buffer)[i], BufferSize - i ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha1Finalise +// +// Performs the final calculation of the hash and returns the digest (20 byte buffer containing 160bit hash). After +// calling this, Sha1Initialised must be used to reuse the context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha1Finalise + ( + Sha1Context* Context, + SHA1_HASH* Digest + ) +{ + uint32_t i; + uint8_t finalcount[8]; + + for( i=0; i<8; i++ ) + { + finalcount[i] = (unsigned char)((Context->Count[(i >= 4 ? 0 : 1)] + >> ((3-(i & 3)) * 8) ) & 255); // Endian independent + } + Sha1Update( Context, (uint8_t*)"\x80", 1 ); + while( (Context->Count[0] & 504) != 448 ) + { + Sha1Update( Context, (uint8_t*)"\0", 1 ); + } + + Sha1Update( Context, finalcount, 8 ); // Should cause a Sha1TransformFunction() + for( i=0; ibytes[i] = (uint8_t)((Context->State[i>>2] >> ((3-(i & 3)) * 8) ) & 255); + } +} + diff --git a/lib/LibSha1.h b/lib/LibSha1.h new file mode 100644 index 0000000..042859d --- /dev/null +++ b/lib/LibSha1.h @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibSha1 +// +// Implementation of SHA1 hash function. +// Original author: Steve Reid +// Contributions by: James H. Brown , Saul Kravitz , +// and Ralph Giles +// Modified by WaterJuice retaining Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _LibSha1_h_ +#define _LibSha1_h_ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Sha1Context - This must be initialised using Sha1Initialised. Do not modify the contents of this structure directly. +typedef struct +{ + uint32_t State[5]; + uint32_t Count[2]; + uint8_t Buffer[64]; +} Sha1Context; + +#define SHA1_HASH_SIZE ( 160 / 8 ) + +typedef struct +{ + uint8_t bytes [SHA1_HASH_SIZE]; +} SHA1_HASH; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha1Initialise +// +// Initialises an SHA1 Context. Use this to initialise/reset a context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha1Initialise + ( + Sha1Context* Context + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha1Update +// +// Adds data to the SHA1 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Sha1Finalise to calculate the hash. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha1Update + ( + Sha1Context* Context, + void* Buffer, + uint32_t BufferSize + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha1Finalise +// +// Performs the final calculation of the hash and returns the digest (20 byte buffer containing 160bit hash). After +// calling this, Sha1Initialised must be used to reuse the context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha1Finalise + ( + Sha1Context* Context, + SHA1_HASH* Digest + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#endif //_LibSha1_h_ + diff --git a/lib/LibSha256.c b/lib/LibSha256.c new file mode 100644 index 0000000..4e7ba05 --- /dev/null +++ b/lib/LibSha256.c @@ -0,0 +1,273 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibSha256 +// +// Implementation of SHA256 hash function. +// Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org +// Modified by WaterJuice retaining Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "LibSha256.h" +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// MACROS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define ror(value, bits) (((value) >> (bits)) | ((value) << (32 - (bits)))) + +#define MIN(x, y) ( ((x)<(y))?(x):(y) ) + +#define STORE32H(x, y) \ + { (y)[0] = (uint8_t)(((x)>>24)&255); (y)[1] = (uint8_t)(((x)>>16)&255); \ + (y)[2] = (uint8_t)(((x)>>8)&255); (y)[3] = (uint8_t)((x)&255); } + +#define LOAD32H(x, y) \ + { x = ((uint32_t)((y)[0] & 255)<<24) | \ + ((uint32_t)((y)[1] & 255)<<16) | \ + ((uint32_t)((y)[2] & 255)<<8) | \ + ((uint32_t)((y)[3] & 255)); } + +#define STORE64H(x, y) \ + { (y)[0] = (uint8_t)(((x)>>56)&255); (y)[1] = (uint8_t)(((x)>>48)&255); \ + (y)[2] = (uint8_t)(((x)>>40)&255); (y)[3] = (uint8_t)(((x)>>32)&255); \ + (y)[4] = (uint8_t)(((x)>>24)&255); (y)[5] = (uint8_t)(((x)>>16)&255); \ + (y)[6] = (uint8_t)(((x)>>8)&255); (y)[7] = (uint8_t)((x)&255); } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +// The K array +static const uint32_t K[64] = { + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, + 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, + 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, + 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, + 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, + 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, + 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, + 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, + 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, + 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL +}; + +#define BLOCK_SIZE 64 + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// INTERNAL FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Various logical functions +#define Ch( x, y, z ) (z ^ (x & (y ^ z))) +#define Maj( x, y, z ) (((x | y) & z) | (x & y)) +#define S( x, n ) ror((x),(n)) +#define R( x, n ) (((x)&0xFFFFFFFFUL)>>(n)) +#define Sigma0( x ) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1( x ) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0( x ) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1( x ) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) + +#define Sha256Round( a, b, c, d, e, f, g, h, i ) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TransformFunction +// +// Compress 512-bits +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +void + TransformFunction + ( + Sha256Context* Context, + uint8_t* Buffer + ) +{ + uint32_t S[8]; + uint32_t W[64]; + uint32_t t0; + uint32_t t1; + uint32_t t; + int i; + + // Copy state into S + for( i=0; i<8; i++ ) + { + S[i] = Context->state[i]; + } + + // Copy the state into 512-bits into W[0..15] + for( i=0; i<16; i++ ) + { + LOAD32H( W[i], Buffer + (4*i) ); + } + + // Fill W[16..63] + for( i=16; i<64; i++ ) + { + W[i] = Gamma1( W[i-2]) + W[i-7] + Gamma0( W[i-15] ) + W[i-16]; + } + + // Compress + for( i=0; i<64; i++ ) + { + Sha256Round( S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i ); + t = S[7]; + S[7] = S[6]; + S[6] = S[5]; + S[5] = S[4]; + S[4] = S[3]; + S[3] = S[2]; + S[2] = S[1]; + S[1] = S[0]; + S[0] = t; + } + + // Feedback + for( i=0; i<8; i++ ) + { + Context->state[i] = Context->state[i] + S[i]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha256Initialise +// +// Initialises a SHA256 Context. Use this to initialise/reset a context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Sha256Initialise + ( + Sha256Context* Context + ) +{ + Context->curlen = 0; + Context->length = 0; + Context->state[0] = 0x6A09E667UL; + Context->state[1] = 0xBB67AE85UL; + Context->state[2] = 0x3C6EF372UL; + Context->state[3] = 0xA54FF53AUL; + Context->state[4] = 0x510E527FUL; + Context->state[5] = 0x9B05688CUL; + Context->state[6] = 0x1F83D9ABUL; + Context->state[7] = 0x5BE0CD19UL; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha256Update +// +// Adds data to the SHA256 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Sha256Finalise to calculate the hash. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Sha256Update + ( + Sha256Context* Context, + void* Buffer, + uint32_t BufferSize + ) +{ + uint32_t n + ; + if( Context->curlen > sizeof(Context->buf) ) + { + return; + } + + while( BufferSize > 0 ) + { + if( Context->curlen == 0 && BufferSize >= BLOCK_SIZE ) + { + TransformFunction( Context, (uint8_t*)Buffer ); + Context->length += BLOCK_SIZE * 8; + Buffer = (uint8_t*)Buffer + BLOCK_SIZE; + BufferSize -= BLOCK_SIZE; + } + else + { + n = MIN( BufferSize, (BLOCK_SIZE - Context->curlen) ); + memcpy( Context->buf + Context->curlen, Buffer, (size_t)n ); + Context->curlen += n; + Buffer = (uint8_t*)Buffer + n; + BufferSize -= n; + if( Context->curlen == BLOCK_SIZE ) + { + TransformFunction( Context, Context->buf ); + Context->length += 8*BLOCK_SIZE; + Context->curlen = 0; + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha256Finalise +// +// Performs the final calculation of the hash and returns the digest (32 byte buffer containing 256bit hash). After +// calling this, Sha256Initialised must be used to reuse the context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha256Finalise + ( + Sha256Context* Context, + SHA256_HASH* Digest + ) +{ + int i; + + if( Context->curlen >= sizeof(Context->buf) ) + { + return; + } + + // Increase the length of the message + Context->length += Context->curlen * 8; + + // Append the '1' bit + Context->buf[Context->curlen++] = (uint8_t)0x80; + + // if the length is currently above 56 bytes we append zeros + // then compress. Then we can fall back to padding zeros and length + // encoding like normal. + if( Context->curlen > 56 ) + { + while( Context->curlen < 64 ) + { + Context->buf[Context->curlen++] = (uint8_t)0; + } + TransformFunction(Context, Context->buf); + Context->curlen = 0; + } + + // Pad up to 56 bytes of zeroes + while( Context->curlen < 56 ) + { + Context->buf[Context->curlen++] = (uint8_t)0; + } + + // Store length + STORE64H( Context->length, Context->buf+56 ); + TransformFunction( Context, Context->buf ); + + // Copy output + for( i=0; i<8; i++ ) + { + STORE32H( Context->state[i], Digest->bytes+(4*i) ); + } +} + diff --git a/lib/LibSha256.h b/lib/LibSha256.h new file mode 100644 index 0000000..84fdc0c --- /dev/null +++ b/lib/LibSha256.h @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibSha256 +// +// Implementation of SHA256 hash function. +// Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org +// Modified by WaterJuice retaining Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _LibSha256_h_ +#define _LibSha256_h_ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +typedef struct +{ + uint64_t length; + uint32_t state[8]; + uint32_t curlen; + uint8_t buf[64]; +} Sha256Context; + +#define SHA256_HASH_SIZE ( 256 / 8 ) + +typedef struct +{ + uint8_t bytes [SHA256_HASH_SIZE]; +} SHA256_HASH; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha256Initialise +// +// Initialises a SHA256 Context. Use this to initialise/reset a context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Sha256Initialise + ( + Sha256Context* Context + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha256Update +// +// Adds data to the SHA256 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Sha256Finalise to calculate the hash. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Sha256Update + ( + Sha256Context* Context, + void* Buffer, + uint32_t BufferSize + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha256Finalise +// +// Performs the final calculation of the hash and returns the digest (32 byte buffer containing 256bit hash). After +// calling this, Sha256Initialised must be used to reuse the context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha256Finalise + ( + Sha256Context* Context, + SHA256_HASH* Digest + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#endif //_LibSha256_h_ + diff --git a/lib/LibSha512.c b/lib/LibSha512.c new file mode 100644 index 0000000..f16f3bf --- /dev/null +++ b/lib/LibSha512.c @@ -0,0 +1,277 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibSha512 +// +// Implementation of SHA512 hash function. +// Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org +// Modified by WaterJuice retaining Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "LibSha512.h" +#include + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// MACROS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define ROR64( value, bits ) (((value) >> (bits)) | ((value) << (64 - (bits)))) + +#define MIN( x, y ) ( ((x)<(y))?(x):(y) ) + +#define LOAD64H( x, y ) \ + { x = (((uint64_t)((y)[0] & 255))<<56)|(((uint64_t)((y)[1] & 255))<<48) | \ + (((uint64_t)((y)[2] & 255))<<40)|(((uint64_t)((y)[3] & 255))<<32) | \ + (((uint64_t)((y)[4] & 255))<<24)|(((uint64_t)((y)[5] & 255))<<16) | \ + (((uint64_t)((y)[6] & 255))<<8)|(((uint64_t)((y)[7] & 255))); } + +#define STORE64H( x, y ) \ + { (y)[0] = (uint8_t)(((x)>>56)&255); (y)[1] = (uint8_t)(((x)>>48)&255); \ + (y)[2] = (uint8_t)(((x)>>40)&255); (y)[3] = (uint8_t)(((x)>>32)&255); \ + (y)[4] = (uint8_t)(((x)>>24)&255); (y)[5] = (uint8_t)(((x)>>16)&255); \ + (y)[6] = (uint8_t)(((x)>>8)&255); (y)[7] = (uint8_t)((x)&255); } + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// The K array +static const uint64_t K[80] = { + 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL +}; + +#define BLOCK_SIZE 128 + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// INTERNAL FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Various logical functions +#define Ch( x, y, z ) (z ^ (x & (y ^ z))) +#define Maj(x, y, z ) (((x | y) & z) | (x & y)) +#define S( x, n ) ROR64( x, n ) +#define R( x, n ) (((x)&0xFFFFFFFFFFFFFFFFULL)>>((uint64_t)n)) +#define Sigma0( x ) (S(x, 28) ^ S(x, 34) ^ S(x, 39)) +#define Sigma1( x ) (S(x, 14) ^ S(x, 18) ^ S(x, 41)) +#define Gamma0( x ) (S(x, 1) ^ S(x, 8) ^ R(x, 7)) +#define Gamma1( x ) (S(x, 19) ^ S(x, 61) ^ R(x, 6)) + +#define Sha512Round( a, b, c, d, e, f, g, h, i ) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TransformFunction +// +// Compress 1024-bits +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +void + TransformFunction + ( + Sha512Context* Context, + uint8_t* Buffer + ) +{ + uint64_t S[8]; + uint64_t W[80]; + uint64_t t0; + uint64_t t1; + int i; + + // Copy state into S + for( i=0; i<8; i++ ) + { + S[i] = Context->state[i]; + } + + // Copy the state into 1024-bits into W[0..15] + for( i=0; i<16; i++ ) + { + LOAD64H(W[i], Buffer + (8*i)); + } + + // Fill W[16..79] + for( i=16; i<80; i++ ) + { + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; + } + + // Compress + for( i=0; i<80; i+=8 ) + { + Sha512Round(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0); + Sha512Round(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1); + Sha512Round(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2); + Sha512Round(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3); + Sha512Round(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4); + Sha512Round(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5); + Sha512Round(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6); + Sha512Round(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7); + } + + // Feedback + for( i=0; i<8; i++ ) + { + Context->state[i] = Context->state[i] + S[i]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha512Initialise +// +// Initialises a SHA512 Context. Use this to initialise/reset a context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha512Initialise + ( + Sha512Context* Context + ) +{ + Context->curlen = 0; + Context->length = 0; + Context->state[0] = 0x6a09e667f3bcc908ULL; + Context->state[1] = 0xbb67ae8584caa73bULL; + Context->state[2] = 0x3c6ef372fe94f82bULL; + Context->state[3] = 0xa54ff53a5f1d36f1ULL; + Context->state[4] = 0x510e527fade682d1ULL; + Context->state[5] = 0x9b05688c2b3e6c1fULL; + Context->state[6] = 0x1f83d9abfb41bd6bULL; + Context->state[7] = 0x5be0cd19137e2179ULL; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha512Update +// +// Adds data to the SHA512 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Sha512Finalise to calculate the hash. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha512Update + ( + Sha512Context* Context, + void* Buffer, + uint32_t BufferSize + ) +{ + uint32_t n; + + if( Context->curlen > sizeof(Context->buf) ) + { + return; + } + + while( BufferSize > 0 ) + { + if( Context->curlen == 0 && BufferSize >= BLOCK_SIZE ) + { + TransformFunction( Context, (uint8_t *)Buffer ); + Context->length += BLOCK_SIZE * 8; + Buffer = (uint8_t*)Buffer + BLOCK_SIZE; + BufferSize -= BLOCK_SIZE; + } + else + { + n = MIN( BufferSize, (BLOCK_SIZE - Context->curlen) ); + memcpy( Context->buf + Context->curlen, Buffer, (size_t)n ); + Context->curlen += n; + Buffer = (uint8_t*)Buffer + n; + BufferSize -= n; + if( Context->curlen == BLOCK_SIZE ) + { + TransformFunction( Context, Context->buf ); + Context->length += 8*BLOCK_SIZE; + Context->curlen = 0; + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha512Finalise +// +// Performs the final calculation of the hash and returns the digest (64 byte buffer containing 512bit hash). After +// calling this, Sha512Initialised must be used to reuse the context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha512Finalise + ( + Sha512Context* Context, + SHA512_HASH* Digest + ) +{ + int i; + + if( Context->curlen >= sizeof(Context->buf) ) + { + return; + } + + // Increase the length of the message + Context->length += Context->curlen * 8ULL; + + // Append the '1' bit + Context->buf[Context->curlen++] = (uint8_t)0x80; + + // If the length is currently above 112 bytes we append zeros + // then compress. Then we can fall back to padding zeros and length + // encoding like normal. + if( Context->curlen > 112 ) + { + while( Context->curlen < 128 ) + { + Context->buf[Context->curlen++] = (uint8_t)0; + } + TransformFunction( Context, Context->buf ); + Context->curlen = 0; + } + + // Pad up to 120 bytes of zeroes + // note: that from 112 to 120 is the 64 MSB of the length. We assume that you won't hash + // > 2^64 bits of data... :-) + while( Context->curlen < 120 ) + { + Context->buf[Context->curlen++] = (uint8_t)0; + } + + // Store length + STORE64H( Context->length, Context->buf+120 ); + TransformFunction( Context, Context->buf ); + + // Copy output + for( i=0; i<8; i++ ) + { + STORE64H( Context->state[i], Digest->bytes+(8*i) ); + } +} + diff --git a/lib/LibSha512.h b/lib/LibSha512.h new file mode 100644 index 0000000..b379582 --- /dev/null +++ b/lib/LibSha512.h @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// LibSha512 +// +// Implementation of SHA512 hash function. +// Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org +// Modified by WaterJuice retaining Public Domain license. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _LibSha512_h_ +#define _LibSha512_h_ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +typedef struct +{ + uint64_t length; + uint64_t state[8]; + uint32_t curlen; + uint8_t buf[128]; +} Sha512Context; + +#define SHA512_HASH_SIZE ( 512 / 8 ) + +typedef struct +{ + uint8_t bytes [SHA512_HASH_SIZE]; +} SHA512_HASH; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha512Initialise +// +// Initialises a SHA512 Context. Use this to initialise/reset a context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Sha512Initialise + ( + Sha512Context* Context + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha512Update +// +// Adds data to the SHA512 context. This will process the data and update the internal state of the context. Keep on +// calling this function until all the data has been added. Then call Sha512Finalise to calculate the hash. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Sha512Update + ( + Sha512Context* Context, + void* Buffer, + uint32_t BufferSize + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Sha512Finalise +// +// Performs the final calculation of the hash and returns the digest (64 byte buffer containing 512bit hash). After +// calling this, Sha512Initialised must be used to reuse the context. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + Sha512Finalise + ( + Sha512Context* Context, + SHA512_HASH* Digest + ); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#endif //_LibSha512_h_ + diff --git a/makefile b/makefile new file mode 100644 index 0000000..5ea8d89 --- /dev/null +++ b/makefile @@ -0,0 +1,70 @@ +OUTDIR = Bin/$(PLATFORM) +INCLUDES = -I ./lib + +all: CryptLibTest Md5String Sha1String Sha256String Sha512String Rc4Output + +CryptLibTest: dir + $(COMPILE) projects/CryptLibTest/CryptLibTest.c lib/LibRc4.c lib/LibMd5.c lib/LibSha1.c lib/LibSha256.c lib/LibSha512.c $(TAIL) + $(STRIP) + +Md5String: dir + $(COMPILE) projects/Md5String/Md5String.c lib/LibMd5.c lib/LibSha1.c lib/LibSha256.c lib/LibSha512.c $(TAIL) + $(STRIP) + +Sha1String: dir + $(COMPILE) projects/Sha1String/Sha1String.c lib/LibSha1.c $(TAIL) + $(STRIP) + +Sha256String: dir + $(COMPILE) projects/Sha256String/Sha256String.c lib/LibSha256.c $(TAIL) + $(STRIP) + +Sha512String: dir + $(COMPILE) projects/Sha512String/Sha512String.c lib/LibSha512.c $(TAIL) + $(STRIP) + +Rc4Output: dir + $(COMPILE) projects/Rc4Output/Rc4Output.c lib/LibRc4.c $(TAIL) + $(STRIP) + +dir: + @mkdir -p $(OUTDIR) + + +###### Setup build parameters ##### +ifeq ($(OS),Windows_NT) + ifdef VSINSTALLDIR + ifeq ($(Platform),X64) + PLATFORM = Windows + else + PLATFORM = WindowsX86 + endif + INTDIR = Build/$(PLATFORM)/$@ + INCLUDES := $(INCLUDES) /I ./stdbool + COMPILE = @echo & echo ::::: Building $(PLATFORM) $@ & mkdir -p $(INTDIR) & cl $(INCLUDES) /nologo /Ox /Oi /Ot /GL /MD /W4 /WX /Fe$(OUTDIR)/$@ /D_CRT_SECURE_NO_WARNINGS /Fo$(INTDIR)/ + TAIL=/link /RELEASE + else ifneq (,$findstring /cygwin/,$(PATH)) + PLATFORM = Cygwin + COMPILE = @echo ::::: Building $(PLATFORM) $@ & gcc $(INCLUDES) -O3 -Wall -Werror -o $(OUTDIR)/$@ + STRIP = @strip $(OUTDIR)/$@ + else + PLATFORM = None + COMPILE = echo + STRIP = + $(error Windows requires VS environment, or Cygwin) + endif +else + PLATFORM = $(shell uname) + ifeq ($(PLATFORM),Darwin) + PLATFORM=OSX + else ifeq ($(PLATFORM),Linux) + PLATFORM=Linux + else + $(error Unsupported platform. Non Windows platform support: OSX and Linux) + endif + COMPILE = @echo ::::: Building $(PLATFORM) $@ & gcc $(INCLUDES) -O3 -Wall -Werror -pthread -o $(OUTDIR)/$@ + STRIP = @strip $(OUTDIR)/$@ + TAIL = -lm +endif + + diff --git a/projects/CryptLibTest/CryptLibTest.c b/projects/CryptLibTest/CryptLibTest.c new file mode 100644 index 0000000..126cf9b --- /dev/null +++ b/projects/CryptLibTest/CryptLibTest.c @@ -0,0 +1,550 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CryptLibTest +// +// Tests the cryptography functions against known test vectors to verify algorithyms are correct. +// Tests the following: +// RC4 +// MD5 +// SHA1 +// SHA256 +// SHA512 +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include "LibRc4.h" +#include "LibMd5.h" +#include "LibSha1.h" +#include "LibSha256.h" +#include "LibSha512.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define MAX_PLAINTEXT_SIZE 100 + +typedef struct +{ + char PlainText [MAX_PLAINTEXT_SIZE]; + int PlainTextSize; // 0 to use (int)strlen + MD5_HASH Md5Hash; + SHA1_HASH Sha1Hash; + SHA256_HASH Sha256Hash; + SHA512_HASH Sha512Hash; +} TestVector; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// GLOBALS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static TestVector gTestVectors [] = +{ + { + "", 0, + {{0xd4,0x1d,0x8c,0xd9,0x8f,0x00,0xb2,0x04,0xe9,0x80,0x09,0x98,0xec,0xf8,0x42,0x7e}}, // md5 + {{0xda,0x39,0xa3,0xee,0x5e,0x6b,0x4b,0x0d,0x32,0x55,0xbf,0xef,0x95,0x60,0x18,0x90,0xaf,0xd8,0x07,0x09}}, // sha1 + {{0xe3,0xb0,0xc4,0x42,0x98,0xfc,0x1c,0x14,0x9a,0xfb,0xf4,0xc8,0x99,0x6f,0xb9,0x24, + 0x27,0xae,0x41,0xe4,0x64,0x9b,0x93,0x4c,0xa4,0x95,0x99,0x1b,0x78,0x52,0xb8,0x55}}, // sha256 + {{0xcf,0x83,0xe1,0x35,0x7e,0xef,0xb8,0xbd,0xf1,0x54,0x28,0x50,0xd6,0x6d,0x80,0x07, + 0xd6,0x20,0xe4,0x05,0x0b,0x57,0x15,0xdc,0x83,0xf4,0xa9,0x21,0xd3,0x6c,0xe9,0xce, + 0x47,0xd0,0xd1,0x3c,0x5d,0x85,0xf2,0xb0,0xff,0x83,0x18,0xd2,0x87,0x7e,0xec,0x2f, + 0x63,0xb9,0x31,0xbd,0x47,0x41,0x7a,0x81,0xa5,0x38,0x32,0x7a,0xf9,0x27,0xda,0x3e}}, // sha512 + }, + { + "a", 0, + {{0x0c,0xc1,0x75,0xb9,0xc0,0xf1,0xb6,0xa8,0x31,0xc3,0x99,0xe2,0x69,0x77,0x26,0x61}}, // md5 + {{0x86,0xf7,0xe4,0x37,0xfa,0xa5,0xa7,0xfc,0xe1,0x5d,0x1d,0xdc,0xb9,0xea,0xea,0xea,0x37,0x76,0x67,0xb8}}, // sha1 + {{0xca,0x97,0x81,0x12,0xca,0x1b,0xbd,0xca,0xfa,0xc2,0x31,0xb3,0x9a,0x23,0xdc,0x4d, + 0xa7,0x86,0xef,0xf8,0x14,0x7c,0x4e,0x72,0xb9,0x80,0x77,0x85,0xaf,0xee,0x48,0xbb}}, // sha256 + {{0x1f,0x40,0xfc,0x92,0xda,0x24,0x16,0x94,0x75,0x09,0x79,0xee,0x6c,0xf5,0x82,0xf2, + 0xd5,0xd7,0xd2,0x8e,0x18,0x33,0x5d,0xe0,0x5a,0xbc,0x54,0xd0,0x56,0x0e,0x0f,0x53, + 0x02,0x86,0x0c,0x65,0x2b,0xf0,0x8d,0x56,0x02,0x52,0xaa,0x5e,0x74,0x21,0x05,0x46, + 0xf3,0x69,0xfb,0xbb,0xce,0x8c,0x12,0xcf,0xc7,0x95,0x7b,0x26,0x52,0xfe,0x9a,0x75}}, // sha512 + }, + { + "aaa", 0, + {{0x47,0xbc,0xe5,0xc7,0x4f,0x58,0x9f,0x48,0x67,0xdb,0xd5,0x7e,0x9c,0xa9,0xf8,0x08}}, // md5 + {{0x7e,0x24,0x0d,0xe7,0x4f,0xb1,0xed,0x08,0xfa,0x08,0xd3,0x80,0x63,0xf6,0xa6,0xa9,0x14,0x62,0xa8,0x15}}, // sha1 + {{0x98,0x34,0x87,0x6d,0xcf,0xb0,0x5c,0xb1,0x67,0xa5,0xc2,0x49,0x53,0xeb,0xa5,0x8c, + 0x4a,0xc8,0x9b,0x1a,0xdf,0x57,0xf2,0x8f,0x2f,0x9d,0x09,0xaf,0x10,0x7e,0xe8,0xf0}}, // sha256 + {{0xd6,0xf6,0x44,0xb1,0x98,0x12,0xe9,0x7b,0x5d,0x87,0x16,0x58,0xd6,0xd3,0x40,0x0e, + 0xcd,0x47,0x87,0xfa,0xeb,0x9b,0x89,0x90,0xc1,0xe7,0x60,0x82,0x88,0x66,0x4b,0xe7, + 0x72,0x57,0x10,0x4a,0x58,0xd0,0x33,0xbc,0xf1,0xa0,0xe0,0x94,0x5f,0xf0,0x64,0x68, + 0xeb,0xe5,0x3e,0x2d,0xff,0x36,0xe2,0x48,0x42,0x4c,0x72,0x73,0x11,0x7d,0xac,0x09}}, // sha512 + }, + { + "abc", 0, + {{0x90,0x01,0x50,0x98,0x3c,0xd2,0x4f,0xb0,0xd6,0x96,0x3f,0x7d,0x28,0xe1,0x7f,0x72}}, // md5 + {{0xa9,0x99,0x3e,0x36,0x47,0x06,0x81,0x6a,0xba,0x3e,0x25,0x71,0x78,0x50,0xc2,0x6c,0x9c,0xd0,0xd8,0x9d}}, // sha1 + {{0xba,0x78,0x16,0xbf,0x8f,0x01,0xcf,0xea,0x41,0x41,0x40,0xde,0x5d,0xae,0x22,0x23, + 0xb0,0x03,0x61,0xa3,0x96,0x17,0x7a,0x9c,0xb4,0x10,0xff,0x61,0xf2,0x00,0x15,0xad}}, // sha256 + {{0xdd,0xaf,0x35,0xa1,0x93,0x61,0x7a,0xba,0xcc,0x41,0x73,0x49,0xae,0x20,0x41,0x31, + 0x12,0xe6,0xfa,0x4e,0x89,0xa9,0x7e,0xa2,0x0a,0x9e,0xee,0xe6,0x4b,0x55,0xd3,0x9a, + 0x21,0x92,0x99,0x2a,0x27,0x4f,0xc1,0xa8,0x36,0xba,0x3c,0x23,0xa3,0xfe,0xeb,0xbd, + 0x45,0x4d,0x44,0x23,0x64,0x3c,0xe8,0x0e,0x2a,0x9a,0xc9,0x4f,0xa5,0x4c,0xa4,0x9f}}, // sha512 + }, + { + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 0, + {{0x82,0x15,0xef,0x07,0x96,0xa2,0x0b,0xca,0xaa,0xe1,0x16,0xd3,0x87,0x6c,0x66,0x4a}}, // md5 + {{0x84,0x98,0x3e,0x44,0x1c,0x3b,0xd2,0x6e,0xba,0xae,0x4a,0xa1,0xf9,0x51,0x29,0xe5,0xe5,0x46,0x70,0xf1}}, // sha1 + {{0x24,0x8d,0x6a,0x61,0xd2,0x06,0x38,0xb8,0xe5,0xc0,0x26,0x93,0x0c,0x3e,0x60,0x39, + 0xa3,0x3c,0xe4,0x59,0x64,0xff,0x21,0x67,0xf6,0xec,0xed,0xd4,0x19,0xdb,0x06,0xc1}}, // sha256 + {{0x20,0x4a,0x8f,0xc6,0xdd,0xa8,0x2f,0x0a,0x0c,0xed,0x7b,0xeb,0x8e,0x08,0xa4,0x16, + 0x57,0xc1,0x6e,0xf4,0x68,0xb2,0x28,0xa8,0x27,0x9b,0xe3,0x31,0xa7,0x03,0xc3,0x35, + 0x96,0xfd,0x15,0xc1,0x3b,0x1b,0x07,0xf9,0xaa,0x1d,0x3b,0xea,0x57,0x78,0x9c,0xa0, + 0x31,0xad,0x85,0xc7,0xa7,0x1d,0xd7,0x03,0x54,0xec,0x63,0x12,0x38,0xca,0x34,0x45}}, // sha512 + }, + { + "The quick brown fox jumps over the lazy dog", 0, + {{0x9e,0x10,0x7d,0x9d,0x37,0x2b,0xb6,0x82,0x6b,0xd8,0x1d,0x35,0x42,0xa4,0x19,0xd6}}, // md5 + {{0x2f,0xd4,0xe1,0xc6,0x7a,0x2d,0x28,0xfc,0xed,0x84,0x9e,0xe1,0xbb,0x76,0xe7,0x39,0x1b,0x93,0xeb,0x12}}, // sha1 + {{0xd7,0xa8,0xfb,0xb3,0x07,0xd7,0x80,0x94,0x69,0xca,0x9a,0xbc,0xb0,0x08,0x2e,0x4f, + 0x8d,0x56,0x51,0xe4,0x6d,0x3c,0xdb,0x76,0x2d,0x02,0xd0,0xbf,0x37,0xc9,0xe5,0x92}}, // sha256 + {{0x07,0xe5,0x47,0xd9,0x58,0x6f,0x6a,0x73,0xf7,0x3f,0xba,0xc0,0x43,0x5e,0xd7,0x69, + 0x51,0x21,0x8f,0xb7,0xd0,0xc8,0xd7,0x88,0xa3,0x09,0xd7,0x85,0x43,0x6b,0xbb,0x64, + 0x2e,0x93,0xa2,0x52,0xa9,0x54,0xf2,0x39,0x12,0x54,0x7d,0x1e,0x8a,0x3b,0x5e,0xd6, + 0xe1,0xbf,0xd7,0x09,0x78,0x21,0x23,0x3f,0xa0,0x53,0x8f,0x3d,0xb8,0x54,0xfe,0xe6}}, // sha512 + }, + { + "The quick brown fox jumps over the lazy dog.", 0, + {{0xe4,0xd9,0x09,0xc2,0x90,0xd0,0xfb,0x1c,0xa0,0x68,0xff,0xad,0xdf,0x22,0xcb,0xd0}}, // md5 + {{0x40,0x8d,0x94,0x38,0x42,0x16,0xf8,0x90,0xff,0x7a,0x0c,0x35,0x28,0xe8,0xbe,0xd1,0xe0,0xb0,0x16,0x21}}, // sha1 + {{0xef,0x53,0x7f,0x25,0xc8,0x95,0xbf,0xa7,0x82,0x52,0x65,0x29,0xa9,0xb6,0x3d,0x97, + 0xaa,0x63,0x15,0x64,0xd5,0xd7,0x89,0xc2,0xb7,0x65,0x44,0x8c,0x86,0x35,0xfb,0x6c}}, // sha256 + {{0x91,0xea,0x12,0x45,0xf2,0x0d,0x46,0xae,0x9a,0x03,0x7a,0x98,0x9f,0x54,0xf1,0xf7, + 0x90,0xf0,0xa4,0x76,0x07,0xee,0xb8,0xa1,0x4d,0x12,0x89,0x0c,0xea,0x77,0xa1,0xbb, + 0xc6,0xc7,0xed,0x9c,0xf2,0x05,0xe6,0x7b,0x7f,0x2b,0x8f,0xd4,0xc7,0xdf,0xd3,0xa7, + 0xa8,0x61,0x7e,0x45,0xf3,0xc4,0x63,0xd4,0x81,0xc7,0xe5,0x86,0xc3,0x9a,0xc1,0xed}}, // sha512 + }, + { + "message digest", 0, + {{0xf9,0x6b,0x69,0x7d,0x7c,0xb7,0x93,0x8d,0x52,0x5a,0x2f,0x31,0xaa,0xf1,0x61,0xd0}}, // md5 + {{0xc1,0x22,0x52,0xce,0xda,0x8b,0xe8,0x99,0x4d,0x5f,0xa0,0x29,0x0a,0x47,0x23,0x1c,0x1d,0x16,0xaa,0xe3}}, // sha1 + {{0xf7,0x84,0x6f,0x55,0xcf,0x23,0xe1,0x4e,0xeb,0xea,0xb5,0xb4,0xe1,0x55,0x0c,0xad, + 0x5b,0x50,0x9e,0x33,0x48,0xfb,0xc4,0xef,0xa3,0xa1,0x41,0x3d,0x39,0x3c,0xb6,0x50}}, // sha256 + {{0x10,0x7d,0xbf,0x38,0x9d,0x9e,0x9f,0x71,0xa3,0xa9,0x5f,0x6c,0x05,0x5b,0x92,0x51, + 0xbc,0x52,0x68,0xc2,0xbe,0x16,0xd6,0xc1,0x34,0x92,0xea,0x45,0xb0,0x19,0x9f,0x33, + 0x09,0xe1,0x64,0x55,0xab,0x1e,0x96,0x11,0x8e,0x8a,0x90,0x5d,0x55,0x97,0xb7,0x20, + 0x38,0xdd,0xb3,0x72,0xa8,0x98,0x26,0x04,0x6d,0xe6,0x66,0x87,0xbb,0x42,0x0e,0x7c}}, // sha512 + }, + { + "abcdefghijklmnopqrstuvwxyz", 0, + {{0xc3,0xfc,0xd3,0xd7,0x61,0x92,0xe4,0x00,0x7d,0xfb,0x49,0x6c,0xca,0x67,0xe1,0x3b}}, // md5 + {{0x32,0xd1,0x0c,0x7b,0x8c,0xf9,0x65,0x70,0xca,0x04,0xce,0x37,0xf2,0xa1,0x9d,0x84,0x24,0x0d,0x3a,0x89}}, // sha1 + {{0x71,0xc4,0x80,0xdf,0x93,0xd6,0xae,0x2f,0x1e,0xfa,0xd1,0x44,0x7c,0x66,0xc9,0x52, + 0x5e,0x31,0x62,0x18,0xcf,0x51,0xfc,0x8d,0x9e,0xd8,0x32,0xf2,0xda,0xf1,0x8b,0x73}}, // sha256 + {{0x4d,0xbf,0xf8,0x6c,0xc2,0xca,0x1b,0xae,0x1e,0x16,0x46,0x8a,0x05,0xcb,0x98,0x81, + 0xc9,0x7f,0x17,0x53,0xbc,0xe3,0x61,0x90,0x34,0x89,0x8f,0xaa,0x1a,0xab,0xe4,0x29, + 0x95,0x5a,0x1b,0xf8,0xec,0x48,0x3d,0x74,0x21,0xfe,0x3c,0x16,0x46,0x61,0x3a,0x59, + 0xed,0x54,0x41,0xfb,0x0f,0x32,0x13,0x89,0xf7,0x7f,0x48,0xa8,0x79,0xc7,0xb1,0xf1}}, // sha512 + }, + { + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 0, + {{0xd1,0x74,0xab,0x98,0xd2,0x77,0xd9,0xf5,0xa5,0x61,0x1c,0x2c,0x9f,0x41,0x9d,0x9f}}, // md5 + {{0x76,0x1c,0x45,0x7b,0xf7,0x3b,0x14,0xd2,0x7e,0x9e,0x92,0x65,0xc4,0x6f,0x4b,0x4d,0xda,0x11,0xf9,0x40}}, // sha1 + {{0xdb,0x4b,0xfc,0xbd,0x4d,0xa0,0xcd,0x85,0xa6,0x0c,0x3c,0x37,0xd3,0xfb,0xd8,0x80, + 0x5c,0x77,0xf1,0x5f,0xc6,0xb1,0xfd,0xfe,0x61,0x4e,0xe0,0xa7,0xc8,0xfd,0xb4,0xc0}}, // sha256 + {{0x1e,0x07,0xbe,0x23,0xc2,0x6a,0x86,0xea,0x37,0xea,0x81,0x0c,0x8e,0xc7,0x80,0x93, + 0x52,0x51,0x5a,0x97,0x0e,0x92,0x53,0xc2,0x6f,0x53,0x6c,0xfc,0x7a,0x99,0x96,0xc4, + 0x5c,0x83,0x70,0x58,0x3e,0x0a,0x78,0xfa,0x4a,0x90,0x04,0x1d,0x71,0xa4,0xce,0xab, + 0x74,0x23,0xf1,0x9c,0x71,0xb9,0xd5,0xa3,0xe0,0x12,0x49,0xf0,0xbe,0xbd,0x58,0x94}}, // sha512 + }, + { "12345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, + {{0x57,0xed,0xf4,0xa2,0x2b,0xe3,0xc9,0x55,0xac,0x49,0xda,0x2e,0x21,0x07,0xb6,0x7a}}, // md5 + {{0x50,0xab,0xf5,0x70,0x6a,0x15,0x09,0x90,0xa0,0x8b,0x2c,0x5e,0xa4,0x0f,0xa0,0xe5,0x85,0x55,0x47,0x32}}, // sha1 + {{0xf3,0x71,0xbc,0x4a,0x31,0x1f,0x2b,0x00,0x9e,0xef,0x95,0x2d,0xd8,0x3c,0xa8,0x0e, + 0x2b,0x60,0x02,0x6c,0x8e,0x93,0x55,0x92,0xd0,0xf9,0xc3,0x08,0x45,0x3c,0x81,0x3e}}, // sha256 + {{0x72,0xec,0x1e,0xf1,0x12,0x4a,0x45,0xb0,0x47,0xe8,0xb7,0xc7,0x5a,0x93,0x21,0x95, + 0x13,0x5b,0xb6,0x1d,0xe2,0x4e,0xc0,0xd1,0x91,0x40,0x42,0x24,0x6e,0x0a,0xec,0x3a, + 0x23,0x54,0xe0,0x93,0xd7,0x6f,0x30,0x48,0xb4,0x56,0x76,0x43,0x46,0x90,0x0c,0xb1, + 0x30,0xd2,0xa4,0xfd,0x5d,0xd1,0x6a,0xbb,0x5e,0x30,0xbc,0xb8,0x50,0xde,0xe8,0x43}}, // sha512 + }, + +}; +#define NUM_TEST_VECTORS ( sizeof(gTestVectors) / sizeof(gTestVectors[0]) ) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PRIVATE FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TestMd5 +// +// Test MD5 algorithm against test vectors +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +bool + TestMd5 + ( + void + ) +{ + int i; + int k; + int len; + Md5Context context; + MD5_HASH hash; + bool success = true; + + for( i=0; i +#include +#include +#include +#include "LibMd5.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main +// +// Program entry point +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + main + ( + int ArgC, + char** ArgV + ) +{ + char* string; + Md5Context md5Context; + MD5_HASH md5Hash; + uint16_t i; + + if( 2 != ArgC ) + { + printf( + "Syntax\n" + " Md5String \n" ); + return 1; + } + + string = ArgV[1]; + + Md5Initialise( &md5Context ); + Md5Update( &md5Context, string, (uint32_t)strlen(string) ); + Md5Finalise( &md5Context, &md5Hash ); + + for( i=0; i +#include +#include +#include +#include "LibRc4.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// DEFINITIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef __min + #define __min( x, y ) (((x) < (y))?(x):(y)) +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define BUFFER_SIZE 1024 + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main +// +// Program entry point +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + main + ( + int ArgC, + char** ArgV + ) +{ + char* string; + uint32_t numBytes; + uint32_t i; + uint8_t buffer [BUFFER_SIZE]; + uint32_t amountLeft; + uint32_t chunk; + Rc4Context rc4 = {0}; + uint32_t dropN = 0; + + if( 3 != ArgC && 4 != ArgC ) + { + printf( + "Syntax\n" + " Rc4Output [DropN]\n" ); + return 1; + } + + string = ArgV[1]; + numBytes = atoi( ArgV[2] ); + if( 4 == ArgC ) + { + dropN = atoi( ArgV[3] ); + } + + Rc4Initialise( &rc4, string, (uint32_t)strlen(string), dropN ); + + + amountLeft = numBytes; + while( amountLeft > 0 ) + { + chunk = __min( amountLeft, BUFFER_SIZE ); + Rc4Output( &rc4, buffer, chunk ); + amountLeft -= chunk; + + for( i=0; i +#include +#include +#include +#include "LibSha1.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main +// +// Program entry point +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + main + ( + int ArgC, + char** ArgV + ) +{ + char* string; + Sha1Context sha1Context; + SHA1_HASH sha1Hash; + uint16_t i; + + if( 2 != ArgC ) + { + printf( + "Syntax\n" + " Sha1String \n" ); + return 1; + } + + string = ArgV[1]; + + Sha1Initialise( &sha1Context ); + Sha1Update( &sha1Context, string, (uint32_t)strlen(string) ); + Sha1Finalise( &sha1Context, &sha1Hash ); + + for( i=0; i +#include +#include +#include +#include "LibSha256.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main +// +// Program entry point +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + main + ( + int ArgC, + char** ArgV + ) +{ + char* string; + Sha256Context sha256Context; + SHA256_HASH sha256Hash; + uint16_t i; + + if( 2 != ArgC ) + { + printf( + "Syntax\n" + " Sha256String \n" ); + return 1; + } + + string = ArgV[1]; + + Sha256Initialise( &sha256Context ); + Sha256Update( &sha256Context, (unsigned char*)string, (uint32_t)strlen(string) ); + Sha256Finalise( &sha256Context, &sha256Hash ); + + for( i=0; i +#include +#include +#include +#include "LibSha512.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// FUNCTIONS +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main +// +// Program entry point +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + main + ( + int ArgC, + char** ArgV + ) +{ + char* string; + Sha512Context sha512Context; + SHA512_HASH sha512Hash; + uint16_t i; + + if( 2 != ArgC ) + { + printf( + "Syntax\n" + " Sha512String \n" ); + return 1; + } + + string = ArgV[1]; + + Sha512Initialise( &sha512Context ); + Sha512Update( &sha512Context, string, (uint32_t)strlen(string) ); + Sha512Finalise( &sha512Context, &sha512Hash ); + + for( i=0; i +// +// stdbool.h is part of the C99 standard. Unforunately MSVC compiler does not support C99. Although it has several +// types such as stdint.h, it does not include stdbool.h. This file defines the type bool and values true and false +// according to the C99 standard. This only needs to be included on systems such as MSVC that do not have stdbool.h +// gcc has its own version of stdbool.h that should be used in preference. +// +// This is free and unencumbered software released into the public domain - June 2013 waterjuice.org +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _STDBOOL_H_ +#define _STDBOOL_H_ + +#ifndef __cplusplus +#ifndef __bool_true_false_are_defined + +typedef int bool; +#define true 1 +#define false 0 + +#define __bool_true_false_are_defined + +#endif //__bool_true_false_are_defined +#endif //__cplusplus + +#endif //_STDBOOL_H_