summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/sha3/KeccakNISTInterface.c
diff options
context:
space:
mode:
authorRichard Moore <rich@kde.org>2013-01-26 12:52:44 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-06 21:23:43 +0100
commit7765dff1bb8104ea145d55d32da194acb2de03ce (patch)
tree064e60b6fcf29f37e74365a5d308abbe7d71b44a /src/3rdparty/sha3/KeccakNISTInterface.c
parentfd9013658bab096839154ae6e68adfd1a4e10189 (diff)
Add the pristine SHA3 reference sources.
Add the SHA3 reference implementation (public domain) which will be used in a later commit to add support for SHA3 to QCryptographicHash. Change-Id: Id0e9d47d628cc94f1d3d2a7696836bc43f6ddf61 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/3rdparty/sha3/KeccakNISTInterface.c')
-rwxr-xr-xsrc/3rdparty/sha3/KeccakNISTInterface.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/3rdparty/sha3/KeccakNISTInterface.c b/src/3rdparty/sha3/KeccakNISTInterface.c
new file mode 100755
index 0000000000..5d92c74239
--- /dev/null
+++ b/src/3rdparty/sha3/KeccakNISTInterface.c
@@ -0,0 +1,81 @@
+/*
+The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
+Michaƫl Peeters and Gilles Van Assche. For more information, feedback or
+questions, please refer to our website: http://keccak.noekeon.org/
+
+Implementation by the designers,
+hereby denoted as "the implementer".
+
+To the extent possible under law, the implementer has waived all copyright
+and related or neighboring rights to the source code in this file.
+http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+#include <string.h>
+#include "KeccakNISTInterface.h"
+#include "KeccakF-1600-interface.h"
+
+HashReturn Init(hashState *state, int hashbitlen)
+{
+ switch(hashbitlen) {
+ case 0: // Default parameters, arbitrary length output
+ InitSponge((spongeState*)state, 1024, 576);
+ break;
+ case 224:
+ InitSponge((spongeState*)state, 1152, 448);
+ break;
+ case 256:
+ InitSponge((spongeState*)state, 1088, 512);
+ break;
+ case 384:
+ InitSponge((spongeState*)state, 832, 768);
+ break;
+ case 512:
+ InitSponge((spongeState*)state, 576, 1024);
+ break;
+ default:
+ return BAD_HASHLEN;
+ }
+ state->fixedOutputLength = hashbitlen;
+ return SUCCESS;
+}
+
+HashReturn Update(hashState *state, const BitSequence *data, DataLength databitlen)
+{
+ if ((databitlen % 8) == 0)
+ return Absorb((spongeState*)state, data, databitlen);
+ else {
+ HashReturn ret = Absorb((spongeState*)state, data, databitlen - (databitlen % 8));
+ if (ret == SUCCESS) {
+ unsigned char lastByte;
+ // Align the last partial byte to the least significant bits
+ lastByte = data[databitlen/8] >> (8 - (databitlen % 8));
+ return Absorb((spongeState*)state, &lastByte, databitlen % 8);
+ }
+ else
+ return ret;
+ }
+}
+
+HashReturn Final(hashState *state, BitSequence *hashval)
+{
+ return Squeeze(state, hashval, state->fixedOutputLength);
+}
+
+HashReturn Hash(int hashbitlen, const BitSequence *data, DataLength databitlen, BitSequence *hashval)
+{
+ hashState state;
+ HashReturn result;
+
+ if ((hashbitlen != 224) && (hashbitlen != 256) && (hashbitlen != 384) && (hashbitlen != 512))
+ return BAD_HASHLEN; // Only the four fixed output lengths available through this API
+ result = Init(&state, hashbitlen);
+ if (result != SUCCESS)
+ return result;
+ result = Update(&state, data, databitlen);
+ if (result != SUCCESS)
+ return result;
+ result = Final(&state, hashval);
+ return result;
+}
+