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;
+    }
+}
+