// Copyright (c) 2012-2014, The CryptoNote developers, The Bytecoin developers // // This file is part of Bytecoin. // // Bytecoin is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Bytecoin is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with Bytecoin. If not, see . #pragma once #if !defined(__cplusplus) #include #include #include #include #include "common/int-util.h" #include "warnings.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; } PUSH_WARNINGS DISABLE_VS_WARNINGS(4267) 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); } } POP_WARNINGS #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_f(void *, const void *, size_t, void *); 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);