diff options
author | Jason Cooper <jason@lakedaemon.net> | 2014-03-24 01:48:58 +0000 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-04-18 15:46:48 -0700 |
commit | 449bb8125e3fd260f6b605a61f3df8b186bd5e55 (patch) | |
tree | fc60cbcba706b9328e10d3027b472cdc9fd2390b /drivers/staging/skein/threefishApi.c | |
parent | 5565c59e9b1b329f58e7b4a3e307a2bc7c12605c (diff) | |
download | op-kernel-dev-449bb8125e3fd260f6b605a61f3df8b186bd5e55.zip op-kernel-dev-449bb8125e3fd260f6b605a61f3df8b186bd5e55.tar.gz |
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>
Diffstat (limited to 'drivers/staging/skein/threefishApi.c')
-rw-r--r-- | drivers/staging/skein/threefishApi.c | 79 |
1 files changed, 79 insertions, 0 deletions
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; + } +} + |