staging: crypto: skein: import code from Skein3Fish.git
This is a byte-for-byte copy of the skein implementation found at:
https://github.com/wernerd/Skein3Fish.git
Specifically, from the master branch at commit:
00e925444c2c Merge pull request #4 from csm/master
The next commit will do the minimum necessary to build this code as a
module.
I've generated the sha256 sums of the files by:
$ (cd drivers/staging/skein; find . -type f | sort | xargs sha256sum)
bcd73168e5805b1b157dbf08863e6a8c217a7b270b6be1a361540591b00624e3 ./CMakeLists.txt
e1adb97dd9e87bc7c05892ed7863a66d1d9fde6728a97a8b7b092709da664d29 ./include/brg_endian.h
240329b4ca4d829ac4d1490e96e83118e161e719e448c7e8dbf15735ab8a8e87 ./include/brg_types.h
0d8f16438f641fa365844a5991220eb04969f0a19c60dff08e10f521e74db5c3 ./include/skein.h
8f7362796e9e43f7619d51020d6faeedce786492b65bebd2ff6a833b621051cb ./include/skeinApi.h
90510d8a9f686c3bfbf6cf7737237e3fa263c1ed5046b0f19727ba55b9bffeb9 ./include/skein_iv.h
42c6c8eff8f364ee2f0de3177d468dbceba9c6a73222fea473fe6d603213806a ./include/skein_port.h
0154a4b8d54f5aa424b39a7ee668b31f2522b907bf3a8536fe46440b584531a1 ./include/threefishApi.h
ac0fc0f95a48a716d30cf02e5adad77af17725a938f939cf94f6dfba42badeca ./skein.c
7af70b177bc63690f68eebceca2dbfef8a4473dcc847ae3525508c65c7d7bcc1 ./skeinApi.c
d7ef7330be8253f7f061de3c36880dbc83b0f5d90c8f2b72d3478766f54fbff0 ./skeinBlockNo3F.c
8bb3d7864afc9eab5569949fb2799cb6f14e583ba00641313cf877a5aea1c763 ./skein_block.c
438e6cb59a0090166e8f1e39418c0a2d0036737a32c5e2822c2ed8b803e2132f ./threefish1024Block.c
e812ec6f2881300e90c803cfd9d044e954f1ca64faa2fc17a709f56a2f122ff8 ./threefish256Block.c
926f680057e128cdd1feba4a8544c177a74420137af480267b949ae79f3d02b8 ./threefish512Block.c
19357f5d47e7183bc8558a8d0949a3f5a80a931848917d26f36eebb7d205f003 ./threefishApi.c
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
diff --git a/drivers/staging/skein/threefishApi.c b/drivers/staging/skein/threefishApi.c
new file mode 100644
index 0000000..5afa033
--- /dev/null
+++ b/drivers/staging/skein/threefishApi.c
@@ -0,0 +1,79 @@
+
+
+#include <threefishApi.h>
+#include <stdlib.h>
+#include <string.h>
+
+void threefishSetKey(ThreefishKey_t* keyCtx, ThreefishSize_t stateSize,
+ uint64_t* keyData, uint64_t* tweak)
+{
+ int keyWords = stateSize / 64;
+ int i;
+ uint64_t parity = KeyScheduleConst;
+
+ keyCtx->tweak[0] = tweak[0];
+ keyCtx->tweak[1] = tweak[1];
+ keyCtx->tweak[2] = tweak[0] ^ tweak[1];
+
+ for (i = 0; i < keyWords; i++) {
+ keyCtx->key[i] = keyData[i];
+ parity ^= keyData[i];
+ }
+ keyCtx->key[i] = parity;
+ keyCtx->stateSize = stateSize;
+}
+
+void threefishEncryptBlockBytes(ThreefishKey_t* keyCtx, uint8_t* in,
+ uint8_t* out)
+{
+ u64b_t plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/
+ u64b_t cipher[SKEIN_MAX_STATE_WORDS];
+
+ Skein_Get64_LSB_First(plain, in, keyCtx->stateSize / 64); /* bytes to words */
+ threefishEncryptBlockWords(keyCtx, plain, cipher);
+ Skein_Put64_LSB_First(out, cipher, keyCtx->stateSize / 8); /* words to bytes */
+}
+
+void threefishEncryptBlockWords(ThreefishKey_t* keyCtx, uint64_t* in,
+ uint64_t* out)
+{
+ switch (keyCtx->stateSize) {
+ case Threefish256:
+ threefishEncrypt256(keyCtx, in, out);
+ break;
+ case Threefish512:
+ threefishEncrypt512(keyCtx, in, out);
+ break;
+ case Threefish1024:
+ threefishEncrypt1024(keyCtx, in, out);
+ break;
+ }
+}
+
+void threefishDecryptBlockBytes(ThreefishKey_t* keyCtx, uint8_t* in,
+ uint8_t* out)
+{
+ u64b_t plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/
+ u64b_t cipher[SKEIN_MAX_STATE_WORDS];
+
+ Skein_Get64_LSB_First(cipher, in, keyCtx->stateSize / 64); /* bytes to words */
+ threefishDecryptBlockWords(keyCtx, cipher, plain);
+ Skein_Put64_LSB_First(out, plain, keyCtx->stateSize / 8); /* words to bytes */
+}
+
+void threefishDecryptBlockWords(ThreefishKey_t* keyCtx, uint64_t* in,
+ uint64_t* out)
+{
+ switch (keyCtx->stateSize) {
+ case Threefish256:
+ threefishDecrypt256(keyCtx, in, out);
+ break;
+ case Threefish512:
+ threefishDecrypt512(keyCtx, in, out);
+ break;
+ case Threefish1024:
+ threefishDecrypt1024(keyCtx, in, out);
+ break;
+ }
+}
+