diff options
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 000000000000..5afa0338aef4 --- /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; + } +} + |