From 1683e5d9f6afd4268766a61fb300ed7a5772d162 Mon Sep 17 00:00:00 2001 From: waterjuice Date: Sun, 7 Jan 2018 18:00:57 +1100 Subject: [PATCH] Version 2.2.0 * Added AES-OFB module. * File names have been changed to have the prefix `WjCryptLib_` rather than `CryptLib_`. * Removed compiled binaries from source tree. --- CMakeLists.txt | 43 +-- Exe/Linux/AesBlock | Bin 34320 -> 0 bytes Exe/Linux/AesCtrOutput | Bin 39016 -> 0 bytes Exe/Linux/Md5String | Bin 26720 -> 0 bytes Exe/Linux/Rc4Output | Bin 6232 -> 0 bytes Exe/Linux/Sha1String | Bin 14424 -> 0 bytes Exe/Linux/Sha256String | Bin 10328 -> 0 bytes Exe/Linux/Sha512String | Bin 14424 -> 0 bytes Exe/MacOS/AesBlock | Bin 34052 -> 0 bytes Exe/MacOS/AesCtrOutput | Bin 38492 -> 0 bytes Exe/MacOS/Md5String | Bin 21588 -> 0 bytes Exe/MacOS/Rc4Output | Bin 9092 -> 0 bytes Exe/MacOS/Sha1String | Bin 13156 -> 0 bytes Exe/MacOS/Sha256String | Bin 8928 -> 0 bytes Exe/MacOS/Sha512String | Bin 13024 -> 0 bytes Exe/Windows/AesBlock.exe | Bin 30208 -> 0 bytes Exe/Windows/AesCtrOutput.exe | Bin 32256 -> 0 bytes Exe/Windows/Md5String.exe | Bin 8192 -> 0 bytes Exe/Windows/Rc4Output.exe | Bin 6144 -> 0 bytes Exe/Windows/Sha1String.exe | Bin 11776 -> 0 bytes Exe/Windows/Sha256String.exe | Bin 7680 -> 0 bytes Exe/Windows/Sha512String.exe | Bin 11264 -> 0 bytes ReadMe.md | 73 ++-- lib/{CryptLib_Aes.c => WjCryptLib_Aes.c} | 4 +- lib/{CryptLib_Aes.h => WjCryptLib_Aes.h} | 2 +- ...{CryptLib_AesCtr.c => WjCryptLib_AesCtr.c} | 6 +- ...{CryptLib_AesCtr.h => WjCryptLib_AesCtr.h} | 4 +- lib/WjCryptLib_AesOfb.c | 226 ++++++++++++ lib/WjCryptLib_AesOfb.h | 126 +++++++ lib/{CryptLib_Md5.c => WjCryptLib_Md5.c} | 4 +- lib/{CryptLib_Md5.h => WjCryptLib_Md5.h} | 2 +- lib/{CryptLib_Rc4.c => WjCryptLib_Rc4.c} | 4 +- lib/{CryptLib_Rc4.h => WjCryptLib_Rc4.h} | 2 +- lib/{CryptLib_Sha1.c => WjCryptLib_Sha1.c} | 4 +- lib/{CryptLib_Sha1.h => WjCryptLib_Sha1.h} | 2 +- ...{CryptLib_Sha256.c => WjCryptLib_Sha256.c} | 4 +- ...{CryptLib_Sha256.h => WjCryptLib_Sha256.h} | 2 +- ...{CryptLib_Sha512.c => WjCryptLib_Sha512.c} | 4 +- ...{CryptLib_Sha512.h => WjCryptLib_Sha512.h} | 2 +- projects/AesBlock/AesBlock.c | 2 +- projects/AesBlock/CMakeLists.txt | 2 +- projects/AesCtrOutput/AesCtrOutput.c | 2 +- projects/AesCtrOutput/CMakeLists.txt | 2 +- projects/AesOfbOutput/AesOfbOutput.c | 155 ++++++++ projects/AesOfbOutput/CMakeLists.txt | 7 + projects/CryptLibTest/CMakeLists.txt | 16 - projects/Md5String/CMakeLists.txt | 2 +- projects/Md5String/Md5String.c | 2 +- projects/Rc4Output/CMakeLists.txt | 2 +- projects/Rc4Output/Rc4Output.c | 2 +- projects/Sha1String/CMakeLists.txt | 2 +- projects/Sha1String/Sha1String.c | 2 +- projects/Sha256String/CMakeLists.txt | 2 +- projects/Sha256String/Sha256String.c | 2 +- projects/Sha512String/CMakeLists.txt | 2 +- projects/Sha512String/Sha512String.c | 2 +- projects/WjCryptLibTest/CMakeLists.txt | 18 + .../WjCryptLibTest.c} | 22 +- .../WjCryptLibTest_Aes.c} | 4 +- .../WjCryptLibTest_Aes.h} | 2 +- .../WjCryptLibTest_AesCtr.c} | 6 +- .../WjCryptLibTest_AesCtr.h} | 2 +- .../WjCryptLibTest/WjCryptLibTest_AesOfb.c | 332 ++++++++++++++++++ .../WjCryptLibTest/WjCryptLibTest_AesOfb.h | 30 ++ .../WjCryptLibTest_Hashes.c} | 20 +- .../WjCryptLibTest_Hashes.h} | 2 +- .../WjCryptLibTest_Rc4.c} | 4 +- .../WjCryptLibTest_Rc4.h} | 2 +- 68 files changed, 1028 insertions(+), 136 deletions(-) delete mode 100644 Exe/Linux/AesBlock delete mode 100644 Exe/Linux/AesCtrOutput delete mode 100644 Exe/Linux/Md5String delete mode 100644 Exe/Linux/Rc4Output delete mode 100644 Exe/Linux/Sha1String delete mode 100644 Exe/Linux/Sha256String delete mode 100644 Exe/Linux/Sha512String delete mode 100644 Exe/MacOS/AesBlock delete mode 100644 Exe/MacOS/AesCtrOutput delete mode 100644 Exe/MacOS/Md5String delete mode 100644 Exe/MacOS/Rc4Output delete mode 100644 Exe/MacOS/Sha1String delete mode 100644 Exe/MacOS/Sha256String delete mode 100644 Exe/MacOS/Sha512String delete mode 100644 Exe/Windows/AesBlock.exe delete mode 100644 Exe/Windows/AesCtrOutput.exe delete mode 100644 Exe/Windows/Md5String.exe delete mode 100644 Exe/Windows/Rc4Output.exe delete mode 100644 Exe/Windows/Sha1String.exe delete mode 100644 Exe/Windows/Sha256String.exe delete mode 100644 Exe/Windows/Sha512String.exe rename lib/{CryptLib_Aes.c => WjCryptLib_Aes.c} (99%) rename lib/{CryptLib_Aes.h => WjCryptLib_Aes.h} (99%) rename lib/{CryptLib_AesCtr.c => WjCryptLib_AesCtr.c} (99%) rename lib/{CryptLib_AesCtr.h => WjCryptLib_AesCtr.h} (99%) create mode 100644 lib/WjCryptLib_AesOfb.c create mode 100644 lib/WjCryptLib_AesOfb.h rename lib/{CryptLib_Md5.c => WjCryptLib_Md5.c} (99%) rename lib/{CryptLib_Md5.h => WjCryptLib_Md5.h} (99%) rename lib/{CryptLib_Rc4.c => WjCryptLib_Rc4.c} (98%) rename lib/{CryptLib_Rc4.h => WjCryptLib_Rc4.h} (99%) rename lib/{CryptLib_Sha1.c => WjCryptLib_Sha1.c} (99%) rename lib/{CryptLib_Sha1.h => WjCryptLib_Sha1.h} (99%) rename lib/{CryptLib_Sha256.c => WjCryptLib_Sha256.c} (99%) rename lib/{CryptLib_Sha256.h => WjCryptLib_Sha256.h} (99%) rename lib/{CryptLib_Sha512.c => WjCryptLib_Sha512.c} (99%) rename lib/{CryptLib_Sha512.h => WjCryptLib_Sha512.h} (99%) create mode 100644 projects/AesOfbOutput/AesOfbOutput.c create mode 100644 projects/AesOfbOutput/CMakeLists.txt delete mode 100644 projects/CryptLibTest/CMakeLists.txt create mode 100644 projects/WjCryptLibTest/CMakeLists.txt rename projects/{CryptLibTest/CryptLibTest.c => WjCryptLibTest/WjCryptLibTest.c} (78%) rename projects/{CryptLibTest/CryptLibTest_Aes.c => WjCryptLibTest/WjCryptLibTest_Aes.c} (99%) rename projects/{CryptLibTest/CryptLibTest_Aes.h => WjCryptLibTest/WjCryptLibTest_Aes.h} (98%) rename projects/{CryptLibTest/CryptLibTest_AesCtr.c => WjCryptLibTest/WjCryptLibTest_AesCtr.c} (99%) rename projects/{CryptLibTest/CryptLibTest_AesCtr.h => WjCryptLibTest/WjCryptLibTest_AesCtr.h} (97%) create mode 100644 projects/WjCryptLibTest/WjCryptLibTest_AesOfb.c create mode 100644 projects/WjCryptLibTest/WjCryptLibTest_AesOfb.h rename projects/{CryptLibTest/CryptLibTest_Hashes.c => WjCryptLibTest/WjCryptLibTest_Hashes.c} (97%) rename projects/{CryptLibTest/CryptLibTest_Hashes.h => WjCryptLibTest/WjCryptLibTest_Hashes.h} (98%) rename projects/{CryptLibTest/CryptLibTest_Rc4.c => WjCryptLibTest/WjCryptLibTest_Rc4.c} (98%) rename projects/{CryptLibTest/CryptLibTest_Rc4.h => WjCryptLibTest/WjCryptLibTest_Rc4.h} (98%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 81e29c1..eeecb17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,29 +1,31 @@ cmake_minimum_required(VERSION 3.6.0) -project( CryptLib ) +project( WjCryptLib ) -# CryptLib Static Library -add_library( CryptLib STATIC - lib/CryptLib_Aes.h - lib/CryptLib_Aes.c - lib/CryptLib_AesCtr.h - lib/CryptLib_AesCtr.c - lib/CryptLib_Md5.h - lib/CryptLib_Md5.c - lib/CryptLib_Rc4.h - lib/CryptLib_Rc4.c - lib/CryptLib_Sha1.h - lib/CryptLib_Sha1.c - lib/CryptLib_Sha256.h - lib/CryptLib_Sha256.c - lib/CryptLib_Sha512.h - lib/CryptLib_Sha512.c ) -target_include_directories( CryptLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lib ) -set_target_properties ( CryptLib PROPERTIES FOLDER lib ) +# WjCryptLib Static Library +add_library( WjCryptLib STATIC + lib/WjCryptLib_Aes.h + lib/WjCryptLib_Aes.c + lib/WjCryptLib_AesCtr.h + lib/WjCryptLib_AesCtr.c + lib/WjCryptLib_AesOfb.h + lib/WjCryptLib_AesOfb.c + lib/WjCryptLib_Md5.h + lib/WjCryptLib_Md5.c + lib/WjCryptLib_Rc4.h + lib/WjCryptLib_Rc4.c + lib/WjCryptLib_Sha1.h + lib/WjCryptLib_Sha1.c + lib/WjCryptLib_Sha256.h + lib/WjCryptLib_Sha256.c + lib/WjCryptLib_Sha512.h + lib/WjCryptLib_Sha512.c ) +target_include_directories( WjCryptLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lib ) +set_target_properties ( WjCryptLib PROPERTIES FOLDER lib ) # Add the demo project directories -add_subdirectory( projects/CryptLibTest ) +add_subdirectory( projects/WjCryptLibTest ) add_subdirectory( projects/Md5String ) add_subdirectory( projects/Rc4Output ) add_subdirectory( projects/Sha1String ) @@ -31,3 +33,4 @@ add_subdirectory( projects/Sha256String ) add_subdirectory( projects/Sha512String ) add_subdirectory( projects/AesBlock ) add_subdirectory( projects/AesCtrOutput ) +add_subdirectory( projects/AesOfbOutput ) diff --git a/Exe/Linux/AesBlock b/Exe/Linux/AesBlock deleted file mode 100644 index 2e7029a229d0a45c3b6dd92c493d3d898582102e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34320 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 L>62|`_Wl1aE88NK diff --git a/Exe/Linux/AesCtrOutput b/Exe/Linux/AesCtrOutput deleted file mode 100644 index 51f0ff93ed4b92a67b3f35b42b394e20d1c841f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39016 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%0AMEo_znQ91pt2ofKmW(7y#@80P_LB zivVC20C*Ard;|cN1Ax~6z`Fq82mm+$04@T6vjAW{04M|izW{*m0l@13;C%p400341 zfNTKZ0RT?}fENJ3Q~;0#0MY=!XaF!60Q3O>-2p%s0MHr$+zkM32LLSrKqvsX5dioD zfSLf{M*y$~0DKDoHUof@0N@+|_#FTg1As*U;8_5W4*+riz?T5vV*v0D09XtFx&eTm z0AK(B7zzMJ0)U4Azyts=830%TKve*669A|S0PX|;w*r6;03ZqgJP!b#0RXuGU^)Q! z1^_Gr080SC8vtMj0N4!xRsw(x0N@M&C6>;nLQ0e~_9a2f!70{}h&0IvgpcL2Z>0ALmX zm`YLfMWpQ4*+lq0Q?OAJ_Z0Q0KnS-;0*vU69D7^fENM4Qvjd_0H_84LIJ={ z0N@?~5CZ@r06;SUFaiLi1Axf@APWEt1ON{JfCKS0stlgfB^ttFaYQU z06GJJ>Hr`R09*$EZUz8%1Ar(1&;$V70RTP%0AB%s_W;0~0AL0H$OQn40Kn4#;Aa4^ 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 diff --git a/Exe/Linux/Rc4Output b/Exe/Linux/Rc4Output deleted file mode 100644 index fb7115eaa3457dc477544bf60216c4ea906ba44e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6232 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 C96i7Q diff --git a/Exe/Linux/Sha1String b/Exe/Linux/Sha1String deleted file mode 100644 index cd16c232f273a089710dd2cde57cbf4bcad17369..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14424 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 BxDNmT diff --git a/Exe/Linux/Sha256String b/Exe/Linux/Sha256String deleted file mode 100644 index c9da0722bc0d3ea012de41916eade345c893e811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10328 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 r+uQ#|`{S^s{JAdEB#Jz4(+=V4z7 diff --git a/Exe/MacOS/AesBlock b/Exe/MacOS/AesBlock deleted file mode 100644 index 49462db194c3ea48116e29f722f3208b60c7c528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34052 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 E0OS=2tpET3 diff --git a/Exe/MacOS/AesCtrOutput b/Exe/MacOS/AesCtrOutput deleted file mode 100644 index fdd777cddb1287d77130196aa5ee94b1219bd1e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38492 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 PN85a~%}3k1S1|oAnA_+c diff --git a/Exe/MacOS/Md5String b/Exe/MacOS/Md5String deleted file mode 100644 index f12c5062a8a636ca939c0d4188fd846f34775989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21588 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 diff --git a/Exe/MacOS/Rc4Output b/Exe/MacOS/Rc4Output deleted file mode 100644 index 1884f1874e74f4bee326d6efac17a6db6c8ac0b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9092 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 diff --git a/Exe/MacOS/Sha256String b/Exe/MacOS/Sha256String deleted file mode 100644 index 605d30944e6acc962fd758060b32e8852d500fea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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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 diff --git a/Exe/Windows/Md5String.exe b/Exe/Windows/Md5String.exe deleted file mode 100644 index 87c0262a8e00ec29d7b2f9d887d8a5f413d4d210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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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 diff --git a/Exe/Windows/Rc4Output.exe b/Exe/Windows/Rc4Output.exe deleted file mode 100644 index f7aebc407e959e5886a118641e426d5e640a452b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 diff --git a/Exe/Windows/Sha1String.exe b/Exe/Windows/Sha1String.exe deleted file mode 100644 index fb4b6cdd9724997de6d98c14f788acf02ea3fd52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 Z(nTrLX0+woBwK~eopkR8+5fBG{{VBD?6m*@ diff --git a/Exe/Windows/Sha256String.exe b/Exe/Windows/Sha256String.exe deleted file mode 100644 index 5a852370a6afe153108fb6b719e720774e02954b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7680 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 diff --git a/ReadMe.md b/ReadMe.md index 4f4baff..3e7a3bf 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,7 +1,7 @@ -CryptLib -======== +WjCryptLib +========== -CryptLib is a collection of cryptographic functions written in C. Each +WjCryptLib is a collection of cryptographic functions written in C. Each module is fully independent and generally requires only a single .c file and a a single .h file. AES-CTR does depend on the AES module, so in this case all four files are needed. @@ -14,7 +14,33 @@ The library and the demo programs can be built using CMake to generate a build setup for any system, including Visual Studio on Windows and Make or Ninja for Linux. Refer to cmake.org to get CMake. -*Placed into Public Domain by WaterJuice 2013 - 2017* +*Placed into Public Domain by WaterJuice 2013 - 2018* + +Library +------- + +To use the library functions, only the following files are required, +depending on what cryptographic functions are wanted. + +* MD5 - (WjCryptLib_Md5.h, and WjCryptLib_Md5.c) +* SHA1 - (WjCryptLib_Sha1.h, and WjCryptLib_Sha1.c) +* SHA256 - (WjCryptLib_Sha256.h, and WjCryptLib_Sha256.c) +* SHA512 - (WjCryptLib_Sha512.h, and WjCryptLib_Sha512.c) +* RC4 - (WjCryptLib_Rc4.h, and WjCryptLib_Rc4.c) +* AES - (WjCryptLib_Aes.h, and WjCryptLib_Aes.c) +* AES-CTR - (WjCryptLib_AesCtr.h, and WjCryptLib_AesCtr.c, WjCryptLib_Aes.h, + and WjCryptLib_Aes.c) +* AES-OFB - (WjCryptLib_AesOfb.h, and WjCryptLib_AesOfb.c, WjCryptLib_Aes.h, + and WjCryptLib_Aes.c) + + +Version 2.2.0 - January 2018 +------------ + +* Added AES-OFB module. +* File names have been changed to have the prefix `WjCryptLib_` rather +than `CryptLib_`. +* Removed compiled binaries from source tree. Version 2.1.0 - December 2017 ----------------------------- @@ -44,35 +70,22 @@ projects. CMake will generate whatever system is required. than `Lib`. * Various formatting changes to the files. -To use the library functions, only the following files are required, -depending on what cryptographic functions are wanted. - -* MD5 - (CryptLib_Md5.h, and CryptLib_Md5.c) -* SHA1 - (CryptLib_Sha1.h, and CryptLib_Sha1.c) -* SHA256 - (CryptLib_Sha256.h, and CryptLib_Sha256.c) -* SHA512 - (CryptLib_Sha512.h, and CryptLib_Sha512.c) -* RC4 - (CryptLib_Rc4.h, and CryptLib_Rc4.c) -* AES - (CryptLib_Aes.h, and CryptLib_Aes.c) -* AES-CTR - (CryptLib_AesCtr.h, and CryptLib_AesCtr.c, CryptLib_Aes.h, - and CryptLib_Aes.c) - Version 1.0.0 - June 2013 ------------------------- -To use the library functions, only the following files are required, -depending on what cryptographic functions are wanted. +Contains following algorithms: -* 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) +* MD5 +* SHA1 +* SHA256 +* SHA512 +* RC4 Test Programs ------------- In the projects directory there are several programs that compile to -command line executables. One is CryptLibTest. This tests the algorithms +command line executables. One is WjCryptLibTest. 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. @@ -88,16 +101,10 @@ output the stream in hex. * Rc4Output * AesBlock * AesCtrOutput +* AesOfbOutput -Executables ------------ - -Included in the Exe directory are executables of the above programs for Windows, -MacOS, and Linux. All of them are compiled for x64 versions of the operating -systems. - -License -======= +Unlicense +========= This is free and unencumbered software released into the public domain. diff --git a/lib/CryptLib_Aes.c b/lib/WjCryptLib_Aes.c similarity index 99% rename from lib/CryptLib_Aes.c rename to lib/WjCryptLib_Aes.c index 12b9929..0668654 100644 --- a/lib/CryptLib_Aes.c +++ b/lib/WjCryptLib_Aes.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Aes +// WjCryptLib_Aes // // Implementation of AES block cipher. This implementation was modified from LibTomCrypt written by Tom St Denis // (https://github.com/libtom). Modified by WaterJuice retaining Public Domain license. @@ -23,7 +23,7 @@ // IMPORTS //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include "CryptLib_Aes.h" +#include "WjCryptLib_Aes.h" #include #include diff --git a/lib/CryptLib_Aes.h b/lib/WjCryptLib_Aes.h similarity index 99% rename from lib/CryptLib_Aes.h rename to lib/WjCryptLib_Aes.h index 3239530..8c8c219 100644 --- a/lib/CryptLib_Aes.h +++ b/lib/WjCryptLib_Aes.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Aes +// WjCryptLib_Aes // // Implementation of AES block cipher. This implementation was modified from LibTomCrypt written by Tom St Denis // (https://github.com/libtom). Modified by WaterJuice retaining Public Domain license. diff --git a/lib/CryptLib_AesCtr.c b/lib/WjCryptLib_AesCtr.c similarity index 99% rename from lib/CryptLib_AesCtr.c rename to lib/WjCryptLib_AesCtr.c index 8e5e08d..a5e67b6 100644 --- a/lib/CryptLib_AesCtr.c +++ b/lib/WjCryptLib_AesCtr.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_AesCtr +// WjCryptLib_AesCtr // // Implementation of AES CTR stream cipher. // @@ -15,8 +15,8 @@ // IMPORTS //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include "CryptLib_AesCtr.h" -#include "CryptLib_Aes.h" +#include "WjCryptLib_AesCtr.h" +#include "WjCryptLib_Aes.h" #include #include diff --git a/lib/CryptLib_AesCtr.h b/lib/WjCryptLib_AesCtr.h similarity index 99% rename from lib/CryptLib_AesCtr.h rename to lib/WjCryptLib_AesCtr.h index efb3601..127f2cb 100644 --- a/lib/CryptLib_AesCtr.h +++ b/lib/WjCryptLib_AesCtr.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_AesCtr +// WjCryptLib_AesCtr // // Implementation of AES CTR stream cipher. // @@ -18,7 +18,7 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include -#include "CryptLib_Aes.h" +#include "WjCryptLib_Aes.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TYPES diff --git a/lib/WjCryptLib_AesOfb.c b/lib/WjCryptLib_AesOfb.c new file mode 100644 index 0000000..719fb47 --- /dev/null +++ b/lib/WjCryptLib_AesOfb.c @@ -0,0 +1,226 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// WjCryptLib_AesOfb +// +// Implementation of AES OFB stream cipher. +// +// Depends on: CryptoLib_Aes +// +// AES OFB is a stream cipher using the AES block cipher in output feedback mode. +// This implementation works on both little and big endian architectures. +// +// This is free and unencumbered software released into the public domain - January 2018 waterjuice.org +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "WjCryptLib_AesOfb.h" +#include "WjCryptLib_Aes.h" +#include +#include + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// MACROS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define MIN( x, y ) ( ((x)<(y))?(x):(y) ) + +#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); } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// INTERNAL FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// XorBuffer +// +// Takes two Source buffers and XORs them together and puts the result in DestinationBuffer +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +void + XorBuffers + ( + uint8_t const* SourceBuffer1, // [in] + uint8_t const* SourceBuffer2, // [in] + uint8_t* DestinationBuffer, // [out] + uint32_t Amount // [in] + ) +{ + uint32_t i; + + for( i=0; iAes = *InitialisedAesContext; + memcpy( Context->CurrentCipherBlock, IV, sizeof(Context->CurrentCipherBlock) ); + Context->IndexWithinCipherBlock = 0; + + // Generate the first cipher block of the stream. + AesEncryptInPlace( &Context->Aes, Context->CurrentCipherBlock ); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbInitialiseWithKey +// +// Initialises an AesOfbContext with an AES Key and an IV. This combines the initialising an AES Context and then +// running AesOfbInitialise. KeySize must be 16, 24, or 32 (for 128, 192, or 256 bit key size) +// Returns 0 if successful, or -1 if invalid KeySize provided +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + AesOfbInitialiseWithKey + ( + AesOfbContext* Context, // [out] + uint8_t const* Key, // [in] + uint32_t KeySize, // [in] + uint8_t const IV [AES_OFB_IV_SIZE] // [in] + ) +{ + AesContext aes; + + // Initialise AES Context + if( 0 != AesInitialise( &aes, Key, KeySize ) ) + { + return -1; + } + + // Now set-up AesOfbContext + AesOfbInitialise( Context, &aes, IV ); + return 0; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbXor +// +// XORs the stream of byte of the AesOfbContext from its current stream position onto the specified buffer. This will +// advance the stream index by that number of bytes. +// Use once over data to encrypt it. Use it a second time over the same data from the same stream position and the +// data will be decrypted. +// InBuffer and OutBuffer can point to the same location for in-place encrypting/decrypting +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + AesOfbXor + ( + AesOfbContext* Context, // [in out] + void const* InBuffer, // [in] + void* OutBuffer, // [out] + uint32_t Size // [in] + ) +{ + uint32_t amountLeft = Size; + uint32_t outputOffset = 0; + uint32_t chunkSize; + uint32_t amountAvailableInBlock; + + // First determine how much is available in the current block. + amountAvailableInBlock = AES_BLOCK_SIZE - Context->IndexWithinCipherBlock; + + // Determine how much of the current block we will take, either all that is available, or less + // if the amount requested is smaller. + chunkSize = MIN( amountAvailableInBlock, amountLeft ); + + // XOR the bytes from the cipher block + XorBuffers( InBuffer, Context->CurrentCipherBlock + (AES_BLOCK_SIZE - amountAvailableInBlock), OutBuffer, chunkSize ); + + amountLeft -= chunkSize; + outputOffset += chunkSize; + Context->IndexWithinCipherBlock += chunkSize; + + // Now start generating new cipher blocks as required. + while( amountLeft > 0 ) + { + // Generate new cipher block + AesEncryptInPlace( &Context->Aes, Context->CurrentCipherBlock ); + + // Determine how much of the current block we need and XOR it out onto the buffer + chunkSize = MIN( amountLeft, AES_BLOCK_SIZE ); + XorBuffers( (uint8_t*)InBuffer + outputOffset, Context->CurrentCipherBlock, (uint8_t*)OutBuffer + outputOffset, chunkSize ); + + amountLeft -= chunkSize; + outputOffset += chunkSize; + Context->IndexWithinCipherBlock = chunkSize; // Note: Not incremented + } + + // If we ended up completely reading the last cipher block we need to generate a new one for next time. + if( AES_BLOCK_SIZE == chunkSize ) + { + AesEncryptInPlace( &Context->Aes, Context->CurrentCipherBlock ); + Context->IndexWithinCipherBlock = 0; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbOutput +// +// Outputs the stream of byte of the AesOfbContext from its current stream position. This will advance the stream +// index by that number of bytes. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + AesOfbOutput + ( + AesOfbContext* Context, // [in out] + void* Buffer, // [out] + uint32_t Size // [in] + ) +{ + memset( Buffer, 0, Size ); + AesOfbXor( Context, Buffer, Buffer, Size ); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbXorWithKey +// +// This function combines AesOfbInitialiseWithKey and AesOfbXor. This is suitable when encrypting/decypting data in +// one go with a key that is not going to be reused. +// This will used the provided Key and IV and generate a stream that is XORed over Buffer. +// InBuffer and OutBuffer can point to the same location for inplace encrypting/decrypting +// Returns 0 if successful, or -1 if invalid KeySize provided +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + AesOfbXorWithKey + ( + uint8_t const* Key, // [in] + uint32_t KeySize, // [in] + uint8_t const IV [AES_OFB_IV_SIZE], // [in] + void const* InBuffer, // [in] + void* OutBuffer, // [out] + uint32_t BufferSize // [in] + ) +{ + int error; + AesOfbContext context; + + error = AesOfbInitialiseWithKey( &context, Key, KeySize, IV ); + if( 0 == error ) + { + AesOfbXor( &context, InBuffer, OutBuffer, BufferSize ); + } + + return error; +} diff --git a/lib/WjCryptLib_AesOfb.h b/lib/WjCryptLib_AesOfb.h new file mode 100644 index 0000000..06d0e8d --- /dev/null +++ b/lib/WjCryptLib_AesOfb.h @@ -0,0 +1,126 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// WjCryptLib_AesOfb +// +// Implementation of AES OFB stream cipher. +// +// Depends on: CryptoLib_Aes +// +// AES OFB is a stream cipher using the AES block cipher in output feedback mode. +// This implementation works on both little and big endian architectures. +// +// This is free and unencumbered software released into the public domain - January 2018 waterjuice.org +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include "WjCryptLib_Aes.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define AES_OFB_IV_SIZE AES_BLOCK_SIZE + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// AesOfbContext +// Do not modify the contents of this structure directly. +typedef struct +{ + AesContext Aes; + uint8_t CurrentCipherBlock [AES_BLOCK_SIZE]; + uint32_t IndexWithinCipherBlock; +} AesOfbContext; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbInitialise +// +// Initialises an AesOfbContext with an already initialised AesContext and a IV. This function can quickly be used +// to change the IV without requiring the more lengthy processes of reinitialising an AES key. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + AesOfbInitialise + ( + AesOfbContext* Context, // [out] + AesContext const* InitialisedAesContext, // [in] + uint8_t const IV [AES_OFB_IV_SIZE] // [in] + ); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbInitialiseWithKey +// +// Initialises an AesOfbContext with an AES Key and an IV. This combines the initialising an AES Context and then +// running AesOfbInitialise. KeySize must be 16, 24, or 32 (for 128, 192, or 256 bit key size) +// Returns 0 if successful, or -1 if invalid KeySize provided +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + AesOfbInitialiseWithKey + ( + AesOfbContext* Context, // [out] + uint8_t const* Key, // [in] + uint32_t KeySize, // [in] + uint8_t const IV [AES_OFB_IV_SIZE] // [in] + ); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbXor +// +// XORs the stream of byte of the AesOfbContext from its current stream position onto the specified buffer. This will +// advance the stream index by that number of bytes. +// Use once over data to encrypt it. Use it a second time over the same data from the same stream position and the +// data will be decrypted. +// InBuffer and OutBuffer can point to the same location for in-place encrypting/decrypting +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + AesOfbXor + ( + AesOfbContext* Context, // [in out] + void const* InBuffer, // [in] + void* OutBuffer, // [out] + uint32_t Size // [in] + ); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbOutput +// +// Outputs the stream of byte of the AesOfbContext from its current stream position. This will advance the stream +// index by that number of bytes. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void + AesOfbOutput + ( + AesOfbContext* Context, // [in out] + void* Buffer, // [out] + uint32_t Size // [in] + ); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbXorWithKey +// +// This function combines AesOfbInitialiseWithKey and AesOfbXor. This is suitable when encrypting/decypting data in +// one go with a key that is not going to be reused. +// This will used the provided Key and IV and generate a stream that is XORed over Buffer. +// InBuffer and OutBuffer can point to the same location for inplace encrypting/decrypting +// Returns 0 if successful, or -1 if invalid KeySize provided +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + AesOfbXorWithKey + ( + uint8_t const* Key, // [in] + uint32_t KeySize, // [in] + uint8_t const IV [AES_OFB_IV_SIZE], // [in] + void const* InBuffer, // [in] + void* OutBuffer, // [out] + uint32_t BufferSize // [in] + ); diff --git a/lib/CryptLib_Md5.c b/lib/WjCryptLib_Md5.c similarity index 99% rename from lib/CryptLib_Md5.c rename to lib/WjCryptLib_Md5.c index 8b299bf..5809b14 100644 --- a/lib/CryptLib_Md5.c +++ b/lib/WjCryptLib_Md5.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Md5 +// WjCryptLib_Md5 // // Implementation of MD5 hash function. Originally written by Alexander Peslyak. Modified by WaterJuice retaining // Public Domain license. @@ -11,7 +11,7 @@ // IMPORTS //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include "CryptLib_Md5.h" +#include "WjCryptLib_Md5.h" #include //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/CryptLib_Md5.h b/lib/WjCryptLib_Md5.h similarity index 99% rename from lib/CryptLib_Md5.h rename to lib/WjCryptLib_Md5.h index f7ca92d..fd860ca 100644 --- a/lib/CryptLib_Md5.h +++ b/lib/WjCryptLib_Md5.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Md5 +// WjCryptLib_Md5 // // Implementation of MD5 hash function. Originally written by Alexander Peslyak. Modified by WaterJuice retaining // Public Domain license. diff --git a/lib/CryptLib_Rc4.c b/lib/WjCryptLib_Rc4.c similarity index 98% rename from lib/CryptLib_Rc4.c rename to lib/WjCryptLib_Rc4.c index 6352f78..5c453cc 100644 --- a/lib/CryptLib_Rc4.c +++ b/lib/WjCryptLib_Rc4.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_RC4 +// WjCryptLib_RC4 // // An implementation of RC4 stream cipher // @@ -10,7 +10,7 @@ // IMPORTS //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include "CryptLib_Rc4.h" +#include "WjCryptLib_Rc4.h" #include //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/CryptLib_Rc4.h b/lib/WjCryptLib_Rc4.h similarity index 99% rename from lib/CryptLib_Rc4.h rename to lib/WjCryptLib_Rc4.h index fed71de..95ebf36 100644 --- a/lib/CryptLib_Rc4.h +++ b/lib/WjCryptLib_Rc4.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_RC4 +// WjCryptLib_RC4 // // An implementation of RC4 stream cipher // diff --git a/lib/CryptLib_Sha1.c b/lib/WjCryptLib_Sha1.c similarity index 99% rename from lib/CryptLib_Sha1.c rename to lib/WjCryptLib_Sha1.c index 3542604..e3f1df3 100644 --- a/lib/CryptLib_Sha1.c +++ b/lib/WjCryptLib_Sha1.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Sha1 +// WjCryptLib_Sha1 // // Implementation of SHA1 hash function. // Original author: Steve Reid @@ -14,7 +14,7 @@ // IMPORTS //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include "CryptLib_Sha1.h" +#include "WjCryptLib_Sha1.h" #include //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/CryptLib_Sha1.h b/lib/WjCryptLib_Sha1.h similarity index 99% rename from lib/CryptLib_Sha1.h rename to lib/WjCryptLib_Sha1.h index 8e15442..2180788 100644 --- a/lib/CryptLib_Sha1.h +++ b/lib/WjCryptLib_Sha1.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Sha1 +// WjCryptLib_Sha1 // // Implementation of SHA1 hash function. // Original author: Steve Reid diff --git a/lib/CryptLib_Sha256.c b/lib/WjCryptLib_Sha256.c similarity index 99% rename from lib/CryptLib_Sha256.c rename to lib/WjCryptLib_Sha256.c index 5e2f679..af466d3 100644 --- a/lib/CryptLib_Sha256.c +++ b/lib/WjCryptLib_Sha256.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Sha256 +// WjCryptLib_Sha256 // // Implementation of SHA256 hash function. // Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org @@ -12,7 +12,7 @@ // IMPORTS //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include "CryptLib_Sha256.h" +#include "WjCryptLib_Sha256.h" #include //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/CryptLib_Sha256.h b/lib/WjCryptLib_Sha256.h similarity index 99% rename from lib/CryptLib_Sha256.h rename to lib/WjCryptLib_Sha256.h index 7e6aadd..06d3761 100644 --- a/lib/CryptLib_Sha256.h +++ b/lib/WjCryptLib_Sha256.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Sha256 +// WjCryptLib_Sha256 // // Implementation of SHA256 hash function. // Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org diff --git a/lib/CryptLib_Sha512.c b/lib/WjCryptLib_Sha512.c similarity index 99% rename from lib/CryptLib_Sha512.c rename to lib/WjCryptLib_Sha512.c index 43fb3b2..3d0aa23 100644 --- a/lib/CryptLib_Sha512.c +++ b/lib/WjCryptLib_Sha512.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Sha512 +// WjCryptLib_Sha512 // // Implementation of SHA512 hash function. // Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org @@ -12,7 +12,7 @@ // IMPORTS //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include "CryptLib_Sha512.h" +#include "WjCryptLib_Sha512.h" #include //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/CryptLib_Sha512.h b/lib/WjCryptLib_Sha512.h similarity index 99% rename from lib/CryptLib_Sha512.h rename to lib/WjCryptLib_Sha512.h index 2d63eef..1c7fb17 100644 --- a/lib/CryptLib_Sha512.h +++ b/lib/WjCryptLib_Sha512.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLib_Sha512 +// WjCryptLib_Sha512 // // Implementation of SHA512 hash function. // Original author: Tom St Denis, tomstdenis@gmail.com, http://libtom.org diff --git a/projects/AesBlock/AesBlock.c b/projects/AesBlock/AesBlock.c index 9648287..b8a6cfb 100644 --- a/projects/AesBlock/AesBlock.c +++ b/projects/AesBlock/AesBlock.c @@ -16,7 +16,7 @@ #include #include #include -#include "CryptLib_Aes.h" +#include "WjCryptLib_Aes.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEFINES diff --git a/projects/AesBlock/CMakeLists.txt b/projects/AesBlock/CMakeLists.txt index fa113b5..7ffe0e0 100644 --- a/projects/AesBlock/CMakeLists.txt +++ b/projects/AesBlock/CMakeLists.txt @@ -1,6 +1,6 @@ add_executable( AesBlock AesBlock.c ) target_link_libraries( AesBlock - CryptLib ) + WjCryptLib ) install(TARGETS AesBlock DESTINATION .) diff --git a/projects/AesCtrOutput/AesCtrOutput.c b/projects/AesCtrOutput/AesCtrOutput.c index 98ea4f6..9013a38 100644 --- a/projects/AesCtrOutput/AesCtrOutput.c +++ b/projects/AesCtrOutput/AesCtrOutput.c @@ -14,7 +14,7 @@ #include #include #include -#include "CryptLib_AesCtr.h" +#include "WjCryptLib_AesCtr.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEFINITIONS diff --git a/projects/AesCtrOutput/CMakeLists.txt b/projects/AesCtrOutput/CMakeLists.txt index d8b9f06..7c45492 100644 --- a/projects/AesCtrOutput/CMakeLists.txt +++ b/projects/AesCtrOutput/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable( AesCtrOutput AesCtrOutput.c ) target_link_libraries( AesCtrOutput - CryptLib ) + WjCryptLib ) install(TARGETS AesCtrOutput DESTINATION .) diff --git a/projects/AesOfbOutput/AesOfbOutput.c b/projects/AesOfbOutput/AesOfbOutput.c new file mode 100644 index 0000000..efdd14d --- /dev/null +++ b/projects/AesOfbOutput/AesOfbOutput.c @@ -0,0 +1,155 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// AesOfbOutput +// +// Outputs bytes from an AES OFB stream. Key and IV are taken from command line. Bytes are output as hex +// +// This is free and unencumbered software released into the public domain - January 2018 waterjuice.org +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include "WjCryptLib_AesOfb.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// DEFINITIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef __min + #define __min( x, y ) (((x) < (y))?(x):(y)) +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// CONSTANTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define BUFFER_SIZE 1024 + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// ReadHexData +// +// Reads a string as hex and places it in Data. *pDataSize on entry specifies maximum number of bytes that can be +// read, and on return is set to how many were read. This will be zero if it failed to read any. +// This function ignores any character that isn't a hex character. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +void + ReadHexData + ( + char const* HexString, // [in] + uint8_t* Data, // [out] + uint32_t* pDataSize // [in out] + ) +{ + uint32_t i; + char holdingBuffer [3] = {0}; + uint32_t holdingBufferIndex = 0; + unsigned hexToNumber; + unsigned outputIndex = 0; + + for( i=0; i= '0' && HexString[i] <= '9' ) + || ( HexString[i] >= 'A' && HexString[i] <= 'F' ) + || ( HexString[i] >= 'a' && HexString[i] <= 'f' ) ) + { + holdingBuffer[holdingBufferIndex] = HexString[i]; + holdingBufferIndex += 1; + + if( 2 == holdingBufferIndex ) + { + // Have two digits now so read it as a byte. + sscanf( holdingBuffer, "%x", &hexToNumber ); + Data[outputIndex] = (uint8_t) hexToNumber; + outputIndex += 1; + if( outputIndex == *pDataSize ) + { + // No more space so stop reading + break; + } + holdingBufferIndex = 0; + } + } + } + + *pDataSize = outputIndex; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// main +// +// Program entry point +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +int + main + ( + int ArgC, + char** ArgV + ) +{ + uint32_t numBytes; + uint32_t i; + uint8_t buffer [BUFFER_SIZE]; + uint32_t amountLeft; + uint32_t chunk; + AesOfbContext aesOfb; + uint8_t key [AES_KEY_SIZE_256]; + uint32_t keySize = sizeof(key); + uint8_t IV [AES_OFB_IV_SIZE]; + uint32_t IVSize = sizeof(IV); + + if( 4 != ArgC ) + { + printf( + "Syntax\n" + " AesOfbOutput \n" + " - 128, 192, or 256 bit written as hex\n" + " - 128 bit written as hex\n" + " - Number of bytes of stream to output\n" ); + return 1; + } + + ReadHexData( ArgV[1], key, &keySize ); + if( AES_KEY_SIZE_128 != keySize && AES_KEY_SIZE_192 != keySize && AES_KEY_SIZE_256 != keySize ) + { + printf( "Invalid key size. Must be 128, 192, or 256 bits\n" ); + return 1; + } + + ReadHexData( ArgV[2], IV, &IVSize ); + if( AES_OFB_IV_SIZE != IVSize ) + { + printf( "Invalid IV size. Must be 128 bits\n" ); + return 1; + } + + numBytes = atoi( ArgV[3] ); + + AesOfbInitialiseWithKey( &aesOfb, key, keySize, IV ); + + amountLeft = numBytes; + while( amountLeft > 0 ) + { + chunk = __min( amountLeft, BUFFER_SIZE ); + AesOfbOutput( &aesOfb, buffer, chunk ); + amountLeft -= chunk; + + for( i=0; i #include #include -#include "CryptLib_Md5.h" +#include "WjCryptLib_Md5.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FUNCTIONS diff --git a/projects/Rc4Output/CMakeLists.txt b/projects/Rc4Output/CMakeLists.txt index db64f48..8e87a70 100644 --- a/projects/Rc4Output/CMakeLists.txt +++ b/projects/Rc4Output/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable( Rc4Output Rc4Output.c ) target_link_libraries( Rc4Output - CryptLib ) + WjCryptLib ) install(TARGETS Rc4Output DESTINATION .) diff --git a/projects/Rc4Output/Rc4Output.c b/projects/Rc4Output/Rc4Output.c index 04884c6..a37831d 100644 --- a/projects/Rc4Output/Rc4Output.c +++ b/projects/Rc4Output/Rc4Output.c @@ -14,7 +14,7 @@ #include #include #include -#include "CryptLib_Rc4.h" +#include "WjCryptLib_Rc4.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEFINITIONS diff --git a/projects/Sha1String/CMakeLists.txt b/projects/Sha1String/CMakeLists.txt index ef8d5ac..63fb63a 100644 --- a/projects/Sha1String/CMakeLists.txt +++ b/projects/Sha1String/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable( Sha1String Sha1String.c ) target_link_libraries( Sha1String - CryptLib ) + WjCryptLib ) install(TARGETS Sha1String DESTINATION .) diff --git a/projects/Sha1String/Sha1String.c b/projects/Sha1String/Sha1String.c index 4c16f2c..fdf0c43 100644 --- a/projects/Sha1String/Sha1String.c +++ b/projects/Sha1String/Sha1String.c @@ -14,7 +14,7 @@ #include #include #include -#include "CryptLib_Sha1.h" +#include "WjCryptLib_Sha1.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FUNCTIONS diff --git a/projects/Sha256String/CMakeLists.txt b/projects/Sha256String/CMakeLists.txt index 6c1af99..da5c5fc 100644 --- a/projects/Sha256String/CMakeLists.txt +++ b/projects/Sha256String/CMakeLists.txt @@ -1,6 +1,6 @@ add_executable( Sha256String Sha256String.c ) target_link_libraries( Sha256String - CryptLib ) + WjCryptLib ) install(TARGETS Sha256String DESTINATION .) diff --git a/projects/Sha256String/Sha256String.c b/projects/Sha256String/Sha256String.c index 984fd2f..88f1976 100644 --- a/projects/Sha256String/Sha256String.c +++ b/projects/Sha256String/Sha256String.c @@ -14,7 +14,7 @@ #include #include #include -#include "CryptLib_Sha256.h" +#include "WjCryptLib_Sha256.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FUNCTIONS diff --git a/projects/Sha512String/CMakeLists.txt b/projects/Sha512String/CMakeLists.txt index e70d881..ccf2213 100644 --- a/projects/Sha512String/CMakeLists.txt +++ b/projects/Sha512String/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable( Sha512String Sha512String.c ) target_link_libraries( Sha512String - CryptLib ) + WjCryptLib ) install(TARGETS Sha512String DESTINATION .) diff --git a/projects/Sha512String/Sha512String.c b/projects/Sha512String/Sha512String.c index ba602ed..6f910a3 100644 --- a/projects/Sha512String/Sha512String.c +++ b/projects/Sha512String/Sha512String.c @@ -14,7 +14,7 @@ #include #include #include -#include "CryptLib_Sha512.h" +#include "WjCryptLib_Sha512.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FUNCTIONS diff --git a/projects/WjCryptLibTest/CMakeLists.txt b/projects/WjCryptLibTest/CMakeLists.txt new file mode 100644 index 0000000..ca0ad70 --- /dev/null +++ b/projects/WjCryptLibTest/CMakeLists.txt @@ -0,0 +1,18 @@ +SET( MODULE_NAME WjCryptLibTest ) + +add_executable( ${MODULE_NAME} + WjCryptLibTest.c + WjCryptLibTest_Hashes.c + WjCryptLibTest_Hashes.h + WjCryptLibTest_Rc4.c + WjCryptLibTest_Rc4.h + WjCryptLibTest_Aes.c + WjCryptLibTest_Aes.h + WjCryptLibTest_AesCtr.c + WjCryptLibTest_AesCtr.h + WjCryptLibTest_AesOfb.c + WjCryptLibTest_AesOfb.h ) +target_link_libraries( ${MODULE_NAME} + WjCryptLib ) + +install(TARGETS ${MODULE_NAME} DESTINATION .) diff --git a/projects/CryptLibTest/CryptLibTest.c b/projects/WjCryptLibTest/WjCryptLibTest.c similarity index 78% rename from projects/CryptLibTest/CryptLibTest.c rename to projects/WjCryptLibTest/WjCryptLibTest.c index b6f5ffe..e2065d1 100644 --- a/projects/CryptLibTest/CryptLibTest.c +++ b/projects/WjCryptLibTest/WjCryptLibTest.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest +// WjCryptLibTest // // Tests the cryptography functions against known test vectors to verify algorithms are correct. // @@ -15,10 +15,11 @@ #include #include #include -#include "CryptLibTest_Aes.h" -#include "CryptLibTest_AesCtr.h" -#include "CryptLibTest_Hashes.h" -#include "CryptLibTest_Rc4.h" +#include "WjCryptLibTest_Aes.h" +#include "WjCryptLibTest_AesCtr.h" +#include "WjCryptLibTest_AesOfb.h" +#include "WjCryptLibTest_Hashes.h" +#include "WjCryptLibTest_Rc4.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FUNCTIONS @@ -39,7 +40,7 @@ int bool allSuccess = true; printf( - "CryptLibTest\n" + "WjCryptLibTest\n" "------------\n" "\n" ); @@ -48,16 +49,19 @@ int success = TestRc4( ); if( !success ) { allSuccess = false; } - printf( "Test RC4 - %s\n", success?"Pass":"Fail" ); + printf( "Test RC4 - %s\n", success?"Pass":"Fail" ); success = TestAes( ); if( !success ) { allSuccess = false; } - printf( "Test AES - %s\n", success?"Pass":"Fail" ); + printf( "Test AES - %s\n", success?"Pass":"Fail" ); success = TestAesCtr( ); if( !success ) { allSuccess = false; } - printf( "Test AES CTR- %s\n", success?"Pass":"Fail" ); + printf( "Test AES CTR - %s\n", success?"Pass":"Fail" ); + success = TestAesOfb( ); + if( !success ) { allSuccess = false; } + printf( "Test AES OFB - %s\n", success?"Pass":"Fail" ); printf( "\n" ); if( allSuccess ) diff --git a/projects/CryptLibTest/CryptLibTest_Aes.c b/projects/WjCryptLibTest/WjCryptLibTest_Aes.c similarity index 99% rename from projects/CryptLibTest/CryptLibTest_Aes.c rename to projects/WjCryptLibTest/WjCryptLibTest_Aes.c index 813404c..e67ed97 100644 --- a/projects/CryptLibTest/CryptLibTest_Aes.c +++ b/projects/WjCryptLibTest/WjCryptLibTest_Aes.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest_Aes +// WjCryptLibTest_Aes // // Tests the cryptography functions against known test vectors to verify algorithms are correct. // Tests the following: @@ -17,7 +17,7 @@ #include #include #include -#include "CryptLib_Aes.h" +#include "WjCryptLib_Aes.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TYPES diff --git a/projects/CryptLibTest/CryptLibTest_Aes.h b/projects/WjCryptLibTest/WjCryptLibTest_Aes.h similarity index 98% rename from projects/CryptLibTest/CryptLibTest_Aes.h rename to projects/WjCryptLibTest/WjCryptLibTest_Aes.h index c839bc2..e5abbba 100644 --- a/projects/CryptLibTest/CryptLibTest_Aes.h +++ b/projects/WjCryptLibTest/WjCryptLibTest_Aes.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest_Aes +// WjCryptLibTest_Aes // // Tests the cryptography functions against known test vectors to verify algorithms are correct. // Tests the following: diff --git a/projects/CryptLibTest/CryptLibTest_AesCtr.c b/projects/WjCryptLibTest/WjCryptLibTest_AesCtr.c similarity index 99% rename from projects/CryptLibTest/CryptLibTest_AesCtr.c rename to projects/WjCryptLibTest/WjCryptLibTest_AesCtr.c index 0e18e73..31089d4 100644 --- a/projects/CryptLibTest/CryptLibTest_AesCtr.c +++ b/projects/WjCryptLibTest/WjCryptLibTest_AesCtr.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest_AesCtr +// WjCryptLibTest_AesCtr // // Tests the cryptography functions against known test vectors to verify algorithms are correct. // Tests the following: @@ -17,8 +17,8 @@ #include #include #include -#include "CryptLib_AesCtr.h" -#include "CryptLib_Sha1.h" +#include "WjCryptLib_AesCtr.h" +#include "WjCryptLib_Sha1.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MACROS diff --git a/projects/CryptLibTest/CryptLibTest_AesCtr.h b/projects/WjCryptLibTest/WjCryptLibTest_AesCtr.h similarity index 97% rename from projects/CryptLibTest/CryptLibTest_AesCtr.h rename to projects/WjCryptLibTest/WjCryptLibTest_AesCtr.h index c994add..fc5bf14 100644 --- a/projects/CryptLibTest/CryptLibTest_AesCtr.h +++ b/projects/WjCryptLibTest/WjCryptLibTest_AesCtr.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest_AesCtr +// WjCryptLibTest_AesCtr // // Tests the cryptography functions against known test vectors to verify algorithms are correct. // Tests the following: diff --git a/projects/WjCryptLibTest/WjCryptLibTest_AesOfb.c b/projects/WjCryptLibTest/WjCryptLibTest_AesOfb.c new file mode 100644 index 0000000..ec9e08f --- /dev/null +++ b/projects/WjCryptLibTest/WjCryptLibTest_AesOfb.c @@ -0,0 +1,332 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// WjCryptLibTest_AesOfb +// +// Tests the cryptography functions against known test vectors to verify algorithms are correct. +// Tests the following: +// AES OFB +// +// This is free and unencumbered software released into the public domain - January 2018 waterjuice.org +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include "WjCryptLib_AesOfb.h" +#include "WjCryptLib_Sha1.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// MACROS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define MIN( x, y ) ( ((x)<(y))?(x):(y) ) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TYPES +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#define MAX_PLAINTEXT_SIZE 100 + +typedef struct +{ + char* KeyHex; + char* IvHex; + char* CipherTextHex; +} TestVector; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// GLOBALS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// These test vectors were created using openssl. Using the following commands: +// > dd if=/dev/zero iflag=count_bytes count=48 status=none | openssl enc -aes-128-ofb -K 00000000000000000000000000000000 -iv 00000000000000000000000000000000 | xxd -p -c 48 +// > dd if=/dev/zero iflag=count_bytes count=48 status=none | openssl enc -aes-128-ofb -K 0102030405060708a1a2a3a4a5a6a7a8 -iv 00000000000000000000000000000000 | xxd -p -c 48 +// > dd if=/dev/zero iflag=count_bytes count=48 status=none | openssl enc -aes-128-ofb -K 00000000000000000000000000000000 -iv b1b2b3b4b5b6b7b8c1c2c3c4c5c6c7c8 | xxd -p -c 48 +// > dd if=/dev/zero iflag=count_bytes count=48 status=none | openssl enc -aes-128-ofb -K 0102030405060708a1a2a3a4a5a6a7a8 -iv b1b2b3b4b5b6b7b8c1c2c3c4c5c6c7c8 | xxd -p -c 48 +// > dd if=/dev/zero iflag=count_bytes count=48 status=none | openssl enc -aes-192-ofb -K 0102030405060708a1a2a3a4a5a6a7a8b1b2b3b4b5b6b7b8 -iv c1c2c3c4c5c6c7c8d1d2d3d4d5d6d7d8 | xxd -p -c 48 +// > dd if=/dev/zero iflag=count_bytes count=48 status=none | openssl enc -aes-256-ofb -K 0102030405060708a1a2a3a4a5a6a7a8b1b2b3b4b5b6b7b8c1c2c3c4c5c6c7c8 -iv d1d2d3d4d5d6d7d8e1e2e3e4e5e6e7e8 | xxd -p -c 48 +static TestVector gTestVectors [] = +{ + { + "00000000000000000000000000000000", + "00000000000000000000000000000000", + "66e94bd4ef8a2c3b884cfa59ca342b2ef795bd4a52e29ed713d313fa20e98dbca10cf66d0fddf3405370b4bf8df5bfb3" + }, + { + "0102030405060708a1a2a3a4a5a6a7a8", + "00000000000000000000000000000000", + "cdb33c236caa155b28d14e6db35053718a906fc0050ae8ad054621e487e5b0a264873309a9471152104a0a51361a91af" + }, + { + "00000000000000000000000000000000", + "b1b2b3b4b5b6b7b8c1c2c3c4c5c6c7c8", + "93fc4d6374dc544d40181d39066e9b0077aa627a84dbd57c9e72a1bbbc8bd1e082faf44d5ce57f6320e9f33d38a3a268" + }, + { + "0102030405060708a1a2a3a4a5a6a7a8", + "b1b2b3b4b5b6b7b8c1c2c3c4c5c6c7c8", + "551eb0c4d89d7e1b537b30f627cc5a0afdebd5a07483107df8555dbae9453189ae13766c9678554971151486cee958af" + }, + { + "0102030405060708a1a2a3a4a5a6a7a8b1b2b3b4b5b6b7b8", + "c1c2c3c4c5c6c7c8d1d2d3d4d5d6d7d8", + "e9128df92fd1da443f826d84fd46be40fffb4ad23477a02efb14cbfd9a28ebcc2e6a5948cd1980e7cd6f5d386f7f6539" + }, + { + "0102030405060708a1a2a3a4a5a6a7a8b1b2b3b4b5b6b7b8c1c2c3c4c5c6c7c8", + "d1d2d3d4d5d6d7d8e1e2e3e4e5e6e7e8", + "06a9a20023d47df78a5ead97715a85921cab7d5114fb74a1b99e66d915a0e125a0fcf198d93364235f9a33c02dc170f6" + }, +}; + +#define NUM_TEST_VECTORS ( sizeof(gTestVectors) / sizeof(gTestVectors[0]) ) +#define TEST_VECTOR_OUTPUT_SIZE 48 + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// INTERNAL FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// HexToBytes +// +// Reads a string as hex and places it in Data. This function will output as many bytes as represented in the input +// string, it will not check the output buffer length. On return *pDataSize will be number of bytes read. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +void + HexToBytes + ( + char const* HexString, // [in] + uint8_t* Data, // [out] + uint32_t* pDataSize // [out optional] + ) +{ + uint32_t i; + char holdingBuffer [3] = {0}; + unsigned hexToNumber; + uint32_t outputIndex = 0; + + for( i=0; i 0 ) + { + memset( buffer, 0, numBytesToGenerate ); + chunkSize = MIN( amountLeft, 10000 ); + AesOfbOutput( &aesOfbContext, buffer, chunkSize ); + Sha1Update( &sha1Context, buffer, chunkSize ); + amountLeft -= chunkSize; + } + + Sha1Finalise( &sha1Context, &calcSha1 ); + + if( 0 != memcmp( &calcSha1, sha1Hash, SHA1_HASH_SIZE ) ) + { + printf( "Large test vector failed\n" ); + return false; + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TestStreamConsistency +// +// Tests that an AES OFB stream is consistent regardless of the chunk sizes of the requests and/or stream +// repositioning. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static +bool + TestStreamConsistency + ( + void + ) +{ + bool success = true; + uint8_t const key[AES_KEY_SIZE_128] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; + uint8_t const iv[AES_OFB_IV_SIZE] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; + #define STREAMSIZE 1000 + uint8_t stream [STREAMSIZE]; + uint8_t newStream [STREAMSIZE]; + uint8_t const zeroStream [STREAMSIZE] = {0}; + AesOfbContext context; + uint32_t chunkSize; + + // First fill in stream with 1000 bytes generated in one go. + memset( stream, 0, STREAMSIZE ); + AesOfbXorWithKey( key, sizeof(key), iv, stream, stream, STREAMSIZE ); + + // Perform sanity check that the key is not all zero! + if( 0 == memcmp( stream, zeroStream, STREAMSIZE ) ) + { + printf( "AES OFB Stream all zero\n" ); + success = false; + return success; + } + + // Now recreate the stream in small bits. Starting at 1 byte at a time and increasing chunk size + for( chunkSize=1; chunkSize<64; chunkSize++ ) + { + uint32_t amountLeft = STREAMSIZE; + uint32_t offset = 0; + memset( newStream, 0, STREAMSIZE ); + + AesOfbInitialiseWithKey( &context, key, sizeof(key), iv ); + + while( amountLeft > 0 ) + { + uint32_t thisChunkSize = MIN( chunkSize, amountLeft ); + + AesOfbOutput( &context, newStream+offset, thisChunkSize ); + + offset += thisChunkSize; + amountLeft -= thisChunkSize; + } + + // Now verify that the stream is consistent with the one generated all at once. + if( 0 != memcmp( stream, newStream, STREAMSIZE ) ) + { + printf( "AES OFB Stream not consistent\n" ); + success = false; + break; + } + } + + #undef STREAMSIZE + + return success; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PUBLIC FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TestAesOfb +// +// Test AES OFB algorithm +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool + TestAesOfb + ( + void + ) +{ + bool totalSuccess = true; + bool success; + + success = TestVectors( ); + if( !success ) { totalSuccess = false; } + + success = TestLargeVector( ); + if( !success ) { totalSuccess = false; } + + success = TestStreamConsistency( ); + if( !success ) { totalSuccess = false; } + + return totalSuccess; +} diff --git a/projects/WjCryptLibTest/WjCryptLibTest_AesOfb.h b/projects/WjCryptLibTest/WjCryptLibTest_AesOfb.h new file mode 100644 index 0000000..298e864 --- /dev/null +++ b/projects/WjCryptLibTest/WjCryptLibTest_AesOfb.h @@ -0,0 +1,30 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// WjCryptLibTest_AesOfb +// +// Tests the cryptography functions against known test vectors to verify algorithms are correct. +// Tests the following: +// AES OFB +// +// This is free and unencumbered software released into the public domain - January 2018 waterjuice.org +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IMPORTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// EXPORTED FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TestAesOfb +// +// Test AES OFB algorithm +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool + TestAesOfb + ( + void + ); \ No newline at end of file diff --git a/projects/CryptLibTest/CryptLibTest_Hashes.c b/projects/WjCryptLibTest/WjCryptLibTest_Hashes.c similarity index 97% rename from projects/CryptLibTest/CryptLibTest_Hashes.c rename to projects/WjCryptLibTest/WjCryptLibTest_Hashes.c index 9184e23..90a4670 100644 --- a/projects/CryptLibTest/CryptLibTest_Hashes.c +++ b/projects/WjCryptLibTest/WjCryptLibTest_Hashes.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest_Hashes +// WjCryptLibTest_Hashes // // Tests the hash functions against known test vectors to verify algorithms are correct. // Tests the following: @@ -20,11 +20,11 @@ #include #include #include -#include "CryptLib_Md5.h" -#include "CryptLib_Sha1.h" -#include "CryptLib_Sha256.h" -#include "CryptLib_Sha512.h" -#include "CryptLibTest_Aes.h" +#include "WjCryptLib_Md5.h" +#include "WjCryptLib_Sha1.h" +#include "WjCryptLib_Sha256.h" +#include "WjCryptLib_Sha512.h" +#include "WjCryptLibTest_Aes.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TYPES @@ -444,19 +444,19 @@ bool success = TestMd5( ); if( !success ) { allSuccess = false; } - printf( "Test MD5 - %s\n", success?"Pass":"Fail" ); + printf( "Test MD5 - %s\n", success?"Pass":"Fail" ); success = TestSha1( ); if( !success ) { allSuccess = false; } - printf( "Test SHA1 - %s\n", success?"Pass":"Fail" ); + printf( "Test SHA1 - %s\n", success?"Pass":"Fail" ); success = TestSha256( ); if( !success ) { allSuccess = false; } - printf( "Test SHA256 - %s\n", success?"Pass":"Fail" ); + printf( "Test SHA256 - %s\n", success?"Pass":"Fail" ); success = TestSha512( ); if( !success ) { allSuccess = false; } - printf( "Test SHA512 - %s\n", success?"Pass":"Fail" ); + printf( "Test SHA512 - %s\n", success?"Pass":"Fail" ); return allSuccess; } diff --git a/projects/CryptLibTest/CryptLibTest_Hashes.h b/projects/WjCryptLibTest/WjCryptLibTest_Hashes.h similarity index 98% rename from projects/CryptLibTest/CryptLibTest_Hashes.h rename to projects/WjCryptLibTest/WjCryptLibTest_Hashes.h index 2f8f105..ebbd436 100644 --- a/projects/CryptLibTest/CryptLibTest_Hashes.h +++ b/projects/WjCryptLibTest/WjCryptLibTest_Hashes.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest_Hashes +// WjCryptLibTest_Hashes // // Tests the hash functions against known test vectors to verify algorithms are correct. // Tests the following: diff --git a/projects/CryptLibTest/CryptLibTest_Rc4.c b/projects/WjCryptLibTest/WjCryptLibTest_Rc4.c similarity index 98% rename from projects/CryptLibTest/CryptLibTest_Rc4.c rename to projects/WjCryptLibTest/WjCryptLibTest_Rc4.c index 0c0b598..c00754c 100644 --- a/projects/CryptLibTest/CryptLibTest_Rc4.c +++ b/projects/WjCryptLibTest/WjCryptLibTest_Rc4.c @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest_Rc4 +// WjCryptLibTest_Rc4 // // Tests the RC4 function against known test vectors to verify algorithms are correct. // @@ -15,7 +15,7 @@ #include #include #include -#include "CryptLib_Rc4.h" +#include "WjCryptLib_Rc4.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PUBLIC FUNCTIONS diff --git a/projects/CryptLibTest/CryptLibTest_Rc4.h b/projects/WjCryptLibTest/WjCryptLibTest_Rc4.h similarity index 98% rename from projects/CryptLibTest/CryptLibTest_Rc4.h rename to projects/WjCryptLibTest/WjCryptLibTest_Rc4.h index f919b77..7e4ccfc 100644 --- a/projects/CryptLibTest/CryptLibTest_Rc4.h +++ b/projects/WjCryptLibTest/WjCryptLibTest_Rc4.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CryptLibTest_Rc4 +// WjCryptLibTest_Rc4 // // Tests the RC4 function against known test vectors to verify algorithms are correct. //