From f6581402e8212674914f4f6ef494559a6750e79b Mon Sep 17 00:00:00 2001 From: haoxuan40404 <444649358@qq.com> Date: Sun, 30 Dec 2018 13:28:42 +0800 Subject: [PATCH] init release-4.25-gm --- cmake/EthOptions.cmake | 10 ++ cmake/ProjectBoost.cmake | 94 +++++++++++ libdevcore/CMakeLists.txt | 33 +++- libdevcore/GmHash.cpp | 52 +++++++ libdevcore/sm3/sm3.cpp | 284 ++++++++++++++++++++++++++++++++++ libdevcore/sm3/sm3.h | 58 +++++++ solc/CommandLineInterface.cpp | 4 + 7 files changed, 533 insertions(+), 2 deletions(-) create mode 100644 cmake/ProjectBoost.cmake create mode 100644 libdevcore/GmHash.cpp create mode 100644 libdevcore/sm3/sm3.cpp create mode 100644 libdevcore/sm3/sm3.h diff --git a/cmake/EthOptions.cmake b/cmake/EthOptions.cmake index b4efd6c99726..7279fd624404 100644 --- a/cmake/EthOptions.cmake +++ b/cmake/EthOptions.cmake @@ -3,6 +3,12 @@ macro(configure_project) # features eth_default_option(PROFILING OFF) + if (BUILD_GM) + add_definitions(-DFISCO_GM) + endif() + + # guomi + eth_default_option(BUILD_GM OFF) # components eth_default_option(TESTS ON) @@ -29,6 +35,10 @@ macro(print_config NAME) message("--------------------------------------------------------------- features") message("-- PROFILING Profiling support ${PROFILING}") message("------------------------------------------------------------- components") +if (BUILD_GM) + message("-- BUILD_GM BUILD GM ${BUILD_GM}") + message("------------------------------------------------------------------------") +endif() if (SUPPORT_TESTS) message("-- TESTS Build tests ${TESTS}") endif() diff --git a/cmake/ProjectBoost.cmake b/cmake/ProjectBoost.cmake new file mode 100644 index 000000000000..0140a08561f5 --- /dev/null +++ b/cmake/ProjectBoost.cmake @@ -0,0 +1,94 @@ +include(ExternalProject) +include(GNUInstallDirs) + +set(BOOST_CXXFLAGS "") +if (WIN32) + set(BOOST_BOOTSTRAP_COMMAND bootstrap.bat) + set(BOOST_BUILD_TOOL b2.exe) + set(BOOST_LIBRARY_SUFFIX -vc140-mt-1_63.lib) +else() + set(BOOST_BOOTSTRAP_COMMAND ./bootstrap.sh) + set(BOOST_BUILD_TOOL ./b2) + set(BOOST_LIBRARY_SUFFIX .a) + if (${BUILD_SHARED_LIBS}) + set(BOOST_CXXFLAGS "cxxflags=-fPIC") + endif() +endif() + +#set(BOOST_CXXFLAGS "cxxflags=-Wa,-march=generic64") +set(BOOST_CXXFLAGS "cxxflags=-fPIC") + +ExternalProject_Add(boost + PREFIX ${CMAKE_SOURCE_DIR}/deps + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/ethereum/cpp-dependencies/releases/download/cache/boost_1_63_0.tar.gz + URL_HASH SHA256=fe34a4e119798e10b8cc9e565b3b0284e9fd3977ec8a1b19586ad1dec397088b + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND ${BOOST_BOOTSTRAP_COMMAND} + LOG_CONFIGURE 1 + BUILD_COMMAND ${BOOST_BUILD_TOOL} stage + ${BOOST_CXXFLAGS} + threading=multi + link=static + variant=release + address-model=64 + --with-thread + --with-date_time + --with-system + --with-regex + --with-chrono + --with-filesystem + --with-program_options + --with-random + LOG_BUILD 1 + INSTALL_COMMAND "" +) + +ExternalProject_Get_Property(boost SOURCE_DIR) +set(Boost_INCLUDE_DIRS ${SOURCE_DIR}) +set(Boost_LIBRARIES ${SOURCE_DIR}/stage/lib) +unset(BUILD_DIR) + +add_library(Boost::Chrono STATIC IMPORTED) +set_property(TARGET Boost::Chrono PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_chrono${BOOST_LIBRARY_SUFFIX}) +add_dependencies(Boost::Chrono boost) + +add_library(Boost::DataTime STATIC IMPORTED) +set_property(TARGET Boost::DataTime PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_date_time${BOOST_LIBRARY_SUFFIX}) +add_dependencies(Boost::DataTime boost) + +add_library(Boost::Regex STATIC IMPORTED) +set_property(TARGET Boost::Regex PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_regex${BOOST_LIBRARY_SUFFIX}) +add_dependencies(Boost::Regex boost) + +add_library(Boost::System STATIC IMPORTED) +set_property(TARGET Boost::System PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_system${BOOST_LIBRARY_SUFFIX}) +add_dependencies(Boost::System boost) + +add_library(Boost::Filesystem STATIC IMPORTED) +set_property(TARGET Boost::Filesystem PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_filesystem${BOOST_LIBRARY_SUFFIX}) +set_property(TARGET Boost::Filesystem PROPERTY INTERFACE_LINK_LIBRARIES Boost::System) +add_dependencies(Boost::Filesystem boost) + +add_library(Boost::Random STATIC IMPORTED) +set_property(TARGET Boost::Random PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_random${BOOST_LIBRARY_SUFFIX}) +add_dependencies(Boost::Random boost) + +add_library(Boost::ProgramOptions STATIC IMPORTED) +set_property(TARGET Boost::ProgramOptions PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_program_options${BOOST_LIBRARY_SUFFIX}) +add_dependencies(Boost::ProgramOptions boost) + +add_library(Boost::UnitTestFramework STATIC IMPORTED) +set_property(TARGET Boost::UnitTestFramework PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_unit_test_framework${BOOST_LIBRARY_SUFFIX}) +add_dependencies(Boost::UnitTestFramework boost) + +add_library(Boost::Thread STATIC IMPORTED) +set_property(TARGET Boost::Thread PROPERTY IMPORTED_LOCATION ${Boost_LIBRARIES}/libboost_thread${BOOST_LIBRARY_SUFFIX}) +set_property(TARGET Boost::Thread PROPERTY INTERFACE_LINK_LIBRARIES Boost::Chrono Boost::DataTime Boost::Regex) +add_dependencies(Boost::Thread boost) + +set(Boost_FILESYSTEM_LIBRARIES Boost::Filesystem) +set(Boost_REGEX_LIBRARIES Boost::Regex) +set(Boost_SYSTEM_LIBRARIES Boost::System) +set(CMAKE_THREAD_LIBS_INIT Boost::Thread) +set(Boost_PROGRAM_OPTIONS_LIBRARIES Boost::ProgramOptions) \ No newline at end of file diff --git a/libdevcore/CMakeLists.txt b/libdevcore/CMakeLists.txt index fa7e3f4899b2..b9aedcdb7282 100644 --- a/libdevcore/CMakeLists.txt +++ b/libdevcore/CMakeLists.txt @@ -1,6 +1,35 @@ -file(GLOB sources "*.cpp") file(GLOB headers "*.h") - +if(BUILD_GM) +set(sources + CommonData.cpp + CommonIO.cpp + Exceptions.cpp + IndentedWriter.cpp + JSON.cpp + GmHash.cpp + StringUtils.cpp + SwarmHash.cpp + UTF8.cpp + Whiskers.cpp +) +else() +set(sources + CommonData.cpp + CommonIO.cpp + Exceptions.cpp + IndentedWriter.cpp + JSON.cpp + SHA3.cpp + StringUtils.cpp + SwarmHash.cpp + UTF8.cpp + Whiskers.cpp +) +endif() +if(BUILD_GM) + aux_source_directory(./sm3 sources) + include_directories(./sm3) +endif() add_library(devcore ${sources} ${headers}) target_link_libraries(devcore PRIVATE jsoncpp ${Boost_FILESYSTEM_LIBRARIES} ${Boost_REGEX_LIBRARIES} ${Boost_SYSTEM_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) target_include_directories(devcore PUBLIC "${CMAKE_SOURCE_DIR}") diff --git a/libdevcore/GmHash.cpp b/libdevcore/GmHash.cpp new file mode 100644 index 000000000000..3eec61107c63 --- /dev/null +++ b/libdevcore/GmHash.cpp @@ -0,0 +1,52 @@ +/* + This file is part of FISCO-BCOS. + + FISCO-BCOS is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + FISCO-BCOS 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FISCO-BCOS. If not, see . +*/ +/** @file GmHash.cpp + * @author asherli + * @date 2018 + */ + +#include + +#include "sm3/sm3.h" +#include +#include +#include +#include + +using namespace std; +using namespace dev; + +namespace dev { + +// add SM3 +bool sha3(bytesConstRef _input, bytesRef o_output) { + if (o_output.size() != 32) + return false; + + SM3((unsigned char *)_input.data(), _input.size(), + (unsigned char *)o_output.data()); + return true; +} + +bool keccak256(bytesConstRef _input, bytesRef o_output) { + if (o_output.size() != 32) + return false; + SM3((unsigned char *)_input.data(), _input.size(), (unsigned char *)o_output.data()); + return true; +} + +} // namespace dev diff --git a/libdevcore/sm3/sm3.cpp b/libdevcore/sm3/sm3.cpp new file mode 100644 index 000000000000..df378a5e713c --- /dev/null +++ b/libdevcore/sm3/sm3.cpp @@ -0,0 +1,284 @@ +/* + This file is part of fisco-solc. + + fisco-solc is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + fisco-solc 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with fisco-solc. If not, see . +*/ +/** + * @file: sm3.cpp + * @author: websterchen + * + * @date: 2018 + */ +#include +#include +#include +#include "sm3.h" + +/* +* 32-bit integer manipulation macros (big endian) +*/ +#ifndef GET_ULONG_BE +#define GET_ULONG_BE(n,b,i) \ +{ \ + (n) = ( (unsigned int) (b)[(i) ] << 24 ) \ + | ( (unsigned int) (b)[(i) + 1] << 16 ) \ + | ( (unsigned int) (b)[(i) + 2] << 8 ) \ + | ( (unsigned int) (b)[(i) + 3] ); \ +} +#endif + +#ifndef PUT_ULONG_BE +#define PUT_ULONG_BE(n,b,i) \ +{ \ + (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ + (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ + (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ + (b)[(i) + 3] = (unsigned char) ( (n) ); \ +} +#endif + +/* +* SM3 context setup +*/ +void sm3_starts(sm3_context *ctx) +{ + ctx->total[0] = 0; + ctx->total[1] = 0; + + ctx->state[0] = 0x7380166F; + ctx->state[1] = 0x4914B2B9; + ctx->state[2] = 0x172442D7; + ctx->state[3] = 0xDA8A0600; + ctx->state[4] = 0xA96F30BC; + ctx->state[5] = 0x163138AA; + ctx->state[6] = 0xE38DEE4D; + ctx->state[7] = 0xB0FB0E4E; + +} + +static void sm3_process(sm3_context *ctx, unsigned char data[64]) +{ + unsigned int SS1, SS2, TT1, TT2, W[68], W1[64]; + unsigned int A, B, C, D, E, F, G, H; + unsigned int T[64]; + unsigned int Temp1, Temp2, Temp3, Temp4, Temp5; + int j; + + // for(j=0; j < 68; j++) + // W[j] = 0; + // for(j=0; j < 64; j++) + // W1[j] = 0; + + for (j = 0; j < 16; j++) + T[j] = 0x79CC4519; + for (j = 16; j < 64; j++) + T[j] = 0x7A879D8A; + + GET_ULONG_BE(W[0], data, 0); + GET_ULONG_BE(W[1], data, 4); + GET_ULONG_BE(W[2], data, 8); + GET_ULONG_BE(W[3], data, 12); + GET_ULONG_BE(W[4], data, 16); + GET_ULONG_BE(W[5], data, 20); + GET_ULONG_BE(W[6], data, 24); + GET_ULONG_BE(W[7], data, 28); + GET_ULONG_BE(W[8], data, 32); + GET_ULONG_BE(W[9], data, 36); + GET_ULONG_BE(W[10], data, 40); + GET_ULONG_BE(W[11], data, 44); + GET_ULONG_BE(W[12], data, 48); + GET_ULONG_BE(W[13], data, 52); + GET_ULONG_BE(W[14], data, 56); + GET_ULONG_BE(W[15], data, 60); + + +#define FF0(x,y,z) ( (x) ^ (y) ^ (z)) +#define FF1(x,y,z) (((x) & (y)) | ( (x) & (z)) | ( (y) & (z))) + +#define GG0(x,y,z) ( (x) ^ (y) ^ (z)) +#define GG1(x,y,z) (((x) & (y)) | ( (~(x)) & (z)) ) + + +#define SHL(x,n) (((x) & 0xFFFFFFFF) << n%32) +#define ROTL(x,n) (SHL((x),n) | ((x) >> (32 - n%32))) + +#define P0(x) ((x) ^ ROTL((x),9) ^ ROTL((x),17)) +#define P1(x) ((x) ^ ROTL((x),15) ^ ROTL((x),23)) + + for (j = 16; j < 68; j++) + { + //W[j] = P1( W[j-16] ^ W[j-9] ^ ROTL(W[j-3],15)) ^ ROTL(W[j - 13],7 ) ^ W[j-6]; + //Why thd release's result is different with the debug's ? + //Below is okay. Interesting, Perhaps VC6 has a bug of Optimizaiton. + + Temp1 = W[j - 16] ^ W[j - 9]; + Temp2 = ROTL(W[j - 3], 15); + Temp3 = Temp1 ^ Temp2; + Temp4 = P1(Temp3); + Temp5 = ROTL(W[j - 13], 7) ^ W[j - 6]; + W[j] = Temp4 ^ Temp5; + } + + + for (j = 0; j < 64; j++) + { + W1[j] = W[j] ^ W[j + 4]; + } + + + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + E = ctx->state[4]; + F = ctx->state[5]; + G = ctx->state[6]; + H = ctx->state[7]; + + for (j = 0; j < 16; j++) + { + SS1 = ROTL((ROTL(A, 12) + E + ROTL(T[j], j)), 7); + SS2 = SS1 ^ ROTL(A, 12); + TT1 = FF0(A, B, C) + D + SS2 + W1[j]; + TT2 = GG0(E, F, G) + H + SS1 + W[j]; + D = C; + C = ROTL(B, 9); + B = A; + A = TT1; + H = G; + G = ROTL(F, 19); + F = E; + E = P0(TT2); + } + + for (j = 16; j < 64; j++) + { + SS1 = ROTL((ROTL(A, 12) + E + ROTL(T[j], j)), 7); + SS2 = SS1 ^ ROTL(A, 12); + TT1 = FF1(A, B, C) + D + SS2 + W1[j]; + TT2 = GG1(E, F, G) + H + SS1 + W[j]; + D = C; + C = ROTL(B, 9); + B = A; + A = TT1; + H = G; + G = ROTL(F, 19); + F = E; + E = P0(TT2); + } + + ctx->state[0] ^= A; + ctx->state[1] ^= B; + ctx->state[2] ^= C; + ctx->state[3] ^= D; + ctx->state[4] ^= E; + ctx->state[5] ^= F; + ctx->state[6] ^= G; + ctx->state[7] ^= H; +} + +/* +* SM3 process buffer +*/ +void sm3_update(sm3_context *ctx, unsigned char *input, int ilen) +{ + int fill; + unsigned int left; + + if (ilen <= 0) + return; + + left = ctx->total[0] & 0x3F; + fill = 64 - left; + + ctx->total[0] += ilen; + ctx->total[0] &= 0xFFFFFFFF; + + if (ctx->total[0] < (unsigned int)ilen) + ctx->total[1]++; + + if (left && ilen >= fill) + { + memcpy((void *)(ctx->buffer + left), + (void *)input, fill); + sm3_process(ctx, ctx->buffer); + input += fill; + ilen -= fill; + left = 0; + } + + while (ilen >= 64) + { + sm3_process(ctx, input); + input += 64; + ilen -= 64; + } + + if (ilen > 0) + { + memcpy((void *)(ctx->buffer + left), + (void *)input, ilen); + } +} + +static const unsigned char sm3_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* +* SM3 final digest +*/ +void sm3_finish(sm3_context *ctx, unsigned char output[32]) +{ + unsigned int last, padn; + unsigned int high, low; + unsigned char msglen[8]; + + high = (ctx->total[0] >> 29) + | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + + PUT_ULONG_BE(high, msglen, 0); + PUT_ULONG_BE(low, msglen, 4); + + last = ctx->total[0] & 0x3F; + padn = (last < 56) ? (56 - last) : (120 - last); + + sm3_update(ctx, (unsigned char *)sm3_padding, padn); + sm3_update(ctx, msglen, 8); + + PUT_ULONG_BE(ctx->state[0], output, 0); + PUT_ULONG_BE(ctx->state[1], output, 4); + PUT_ULONG_BE(ctx->state[2], output, 8); + PUT_ULONG_BE(ctx->state[3], output, 12); + PUT_ULONG_BE(ctx->state[4], output, 16); + PUT_ULONG_BE(ctx->state[5], output, 20); + PUT_ULONG_BE(ctx->state[6], output, 24); + PUT_ULONG_BE(ctx->state[7], output, 28); +} + + +void SM3(unsigned char *input, int ilen, + unsigned char output[32]) +{ + sm3_context ctx; + + sm3_starts(&ctx); + sm3_update(&ctx, input, ilen); + sm3_finish(&ctx, output); +} \ No newline at end of file diff --git a/libdevcore/sm3/sm3.h b/libdevcore/sm3/sm3.h new file mode 100644 index 000000000000..6894d0f4f77a --- /dev/null +++ b/libdevcore/sm3/sm3.h @@ -0,0 +1,58 @@ +/* + This file is part of fisco-solc. + + fisco-solc is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + fisco-solc 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with fisco-solc. If not, see . +*/ +/** + * @file: sm3.h + * @author: websterchen + * + * @date: 2018 + */ +#ifndef SM3_H +#define SM3_H + + +/** +* \brief SM3 context structure +*/ +typedef struct +{ + unsigned long total[2]; /*!< number of bytes processed */ + unsigned long state[8]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ + + unsigned char ipad[64]; /*!< HMAC: inner padding */ + unsigned char opad[64]; /*!< HMAC: outer padding */ + +} +sm3_context; + +#ifdef __cplusplus +extern "C" { +#endif + + void sm3_starts(sm3_context *ctx); + + void sm3_update(sm3_context *ctx, unsigned char *input, int ilen); + + void sm3_finish(sm3_context *ctx, unsigned char output[32]); + + void SM3(unsigned char *input, int ilen, + unsigned char output[32]); +#ifdef __cplusplus +} +#endif + +#endif /* sm3.h */ \ No newline at end of file diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 1f04c68a1d91..01e20d15894c 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -188,7 +188,11 @@ static void version() cout << "solc, the solidity compiler commandline interface" << endl << +#ifdef FISCO_GM + "Gm version: " << +#else "Version: " << +#endif dev::solidity::VersionString << endl; exit(0);