summaryrefslogtreecommitdiff
path: root/src/lib/sha3.c
diff options
context:
space:
mode:
authorSander Vrijders <[email protected]>2017-02-15 17:45:49 +0100
committerSander Vrijders <[email protected]>2017-02-16 11:42:45 +0100
commit1434ab198b38cbc9096809a6cadfe6759736cc9f (patch)
tree8d4bb82d156046dc910c3bfbcfb13d52a1c36ccc /src/lib/sha3.c
parent2fee864da506c1e6944c7caa2b6dcbe746165ca4 (diff)
downloadouroboros-1434ab198b38cbc9096809a6cadfe6759736cc9f.tar.gz
ouroboros-1434ab198b38cbc9096809a6cadfe6759736cc9f.zip
lib: Revise endian header and SHA3
This revises the endian header to let the build time checks of endianness be performed by the standard libraries. We just check for the OS that is being used and provide the endian functions from OpenBSD to everyone. It also updates the SHA3 sources to use this new header. The byte order header is removed.
Diffstat (limited to 'src/lib/sha3.c')
-rw-r--r--src/lib/sha3.c68
1 files changed, 39 insertions, 29 deletions
diff --git a/src/lib/sha3.c b/src/lib/sha3.c
index 4d9b9b8c..b2f9de57 100644
--- a/src/lib/sha3.c
+++ b/src/lib/sha3.c
@@ -40,11 +40,16 @@
* or FITNESS FOR A PARTICULAR PURPOSE. Use this program at your own risk!
*/
+#include <ouroboros/endian.h>
+
#include <assert.h>
#include <string.h>
#include "sha3.h"
-#include "byte_order.h"
+
+#define IS_ALIGNED_64(p) (0 == (7 & ((const char*) (p) - (const char*) 0)))
+#define I64(x) x##LL
+#define ROTL64(qword, n) ((qword) << (n) ^ ((qword) >> (64 - (n))))
#define NumberOfRounds 24
@@ -207,40 +212,40 @@ static void rhash_sha3_process_block(uint64_t hash[25],
size_t block_size)
{
/* expanded loop */
- hash[ 0] ^= le2me_64(block[ 0]);
- hash[ 1] ^= le2me_64(block[ 1]);
- hash[ 2] ^= le2me_64(block[ 2]);
- hash[ 3] ^= le2me_64(block[ 3]);
- hash[ 4] ^= le2me_64(block[ 4]);
- hash[ 5] ^= le2me_64(block[ 5]);
- hash[ 6] ^= le2me_64(block[ 6]);
- hash[ 7] ^= le2me_64(block[ 7]);
- hash[ 8] ^= le2me_64(block[ 8]);
+ hash[ 0] ^= htole64(block[ 0]);
+ hash[ 1] ^= htole64(block[ 1]);
+ hash[ 2] ^= htole64(block[ 2]);
+ hash[ 3] ^= htole64(block[ 3]);
+ hash[ 4] ^= htole64(block[ 4]);
+ hash[ 5] ^= htole64(block[ 5]);
+ hash[ 6] ^= htole64(block[ 6]);
+ hash[ 7] ^= htole64(block[ 7]);
+ hash[ 8] ^= htole64(block[ 8]);
/* if not sha3-512 */
if (block_size > 72) {
- hash[ 9] ^= le2me_64(block[ 9]);
- hash[10] ^= le2me_64(block[10]);
- hash[11] ^= le2me_64(block[11]);
- hash[12] ^= le2me_64(block[12]);
+ hash[ 9] ^= htole64(block[ 9]);
+ hash[10] ^= htole64(block[10]);
+ hash[11] ^= htole64(block[11]);
+ hash[12] ^= htole64(block[12]);
/* if not sha3-384 */
if (block_size > 104) {
- hash[13] ^= le2me_64(block[13]);
- hash[14] ^= le2me_64(block[14]);
- hash[15] ^= le2me_64(block[15]);
- hash[16] ^= le2me_64(block[16]);
+ hash[13] ^= htole64(block[13]);
+ hash[14] ^= htole64(block[14]);
+ hash[15] ^= htole64(block[15]);
+ hash[16] ^= htole64(block[16]);
/* if not sha3-256 */
if (block_size > 136) {
- hash[17] ^= le2me_64(block[17]);
+ hash[17] ^= htole64(block[17]);
#ifdef FULL_SHA3_FAMILY_SUPPORT
/* if not sha3-224 */
if (block_size > 144) {
- hash[18] ^= le2me_64(block[18]);
- hash[19] ^= le2me_64(block[19]);
- hash[20] ^= le2me_64(block[20]);
- hash[21] ^= le2me_64(block[21]);
- hash[22] ^= le2me_64(block[22]);
- hash[23] ^= le2me_64(block[23]);
- hash[24] ^= le2me_64(block[24]);
+ hash[18] ^= htole64(block[18]);
+ hash[19] ^= htole64(block[19]);
+ hash[20] ^= htole64(block[20]);
+ hash[21] ^= htole64(block[21]);
+ hash[22] ^= htole64(block[22]);
+ hash[23] ^= htole64(block[23]);
+ hash[24] ^= htole64(block[24]);
}
#endif
}
@@ -301,8 +306,9 @@ void rhash_sha3_update(struct sha3_ctx * ctx,
void rhash_sha3_final(struct sha3_ctx * ctx,
uint8_t * res)
{
- size_t digest_length = 100 - ctx->block_size / 2;
+ size_t digest_length = 100 - ctx->block_size / 2;
const size_t block_size = ctx->block_size;
+ unsigned int i = 0;
if (!(ctx->rest & SHA3_FINALIZED)) {
/* clear the rest of the data queue */
@@ -318,6 +324,10 @@ void rhash_sha3_final(struct sha3_ctx * ctx,
assert(block_size > digest_length);
- if (res != NULL)
- me64_to_le_str(res, ctx->hash, digest_length);
+ if (res != NULL) {
+ for (i = 0; i < digest_length; i++)
+ ctx->hash[i] = htole64(ctx->hash[i]);
+
+ memcpy(res, ctx->hash, digest_length);
+ }
}