// Copyright (c) 2011-2016 The Cryptonote developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #pragma once #if !defined(__cplusplus) #include #include #include #include #endif #if !defined(__RUST_RAW_CRYPTO__) #include "../common/static_assert.h" #endif #if !defined(__cplusplus) #include "util.h" static inline void *padd(void *p, size_t i) { return (char *) p + i; } static inline const void *cpadd(const void *p, size_t i) { return (const char *) p + i; } static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8, "size_t must be 4 or 8 bytes long"); static inline void place_length(uint8_t *buffer, size_t bufsize, size_t length) { if (sizeof(size_t) == 4) { *(uint32_t *) padd(buffer, bufsize - 4) = swap32be(length); } else { *(uint64_t *) padd(buffer, bufsize - 8) = swap64be(length); } } #pragma pack(push, 1) union hash_state { uint8_t b[200]; uint64_t w[25]; }; #pragma pack(pop) static_assert(sizeof(union hash_state) == 200, "Invalid structure size"); void hash_permutation(union hash_state *state); void hash_process(union hash_state *state, const uint8_t *buf, size_t count); #endif enum { HASH_SIZE = 32, HASH_DATA_AREA = 136, SLOW_HASH_CONTEXT_SIZE = 2097552 }; void cn_fast_hash(const void *data, size_t length, char *hash); void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int prehashed); void hash_extra_blake(const void *data, size_t length, char *hash); void hash_extra_groestl(const void *data, size_t length, char *hash); void hash_extra_jh(const void *data, size_t length, char *hash); void hash_extra_skein(const void *data, size_t length, char *hash); void tree_hash(const char (*hashes)[HASH_SIZE], size_t count, char *root_hash); size_t tree_depth(size_t count); void tree_branch(const char (*hashes)[HASH_SIZE], size_t count, char (*branch)[HASH_SIZE]); void tree_hash_from_branch(const char (*branch)[HASH_SIZE], size_t depth, const char *leaf, const void *path, char *root_hash);