Skip to content

Commit 8f59251

Browse files
committed
Merge pull request #4100
a0495bb Add <Hasher>::OUTPUT_SIZE (Pieter Wuille) 4791b99 crypto: create a separate lib for crypto functions (Cory Fields) f2647cc crypto: explicitly check for byte read/write functions (Cory Fields) 5437248 build: move bitcoin-config.h to its own directory (Cory Fields) 3820e01 Extend and move all crypto tests to crypto_tests.cpp (Pieter Wuille) 7ecd973 Move {Read,Write}{LE,BE}{32,64} to common.h and use builtins if possible (Pieter Wuille) a5bc9c0 Add built-in RIPEMD-160 implementation (Pieter Wuille) 13b5dfe Move crypto implementations to src/crypto/ (Pieter Wuille) 1cc344c Add built-in SHA-1 implementation. (Pieter Wuille) 85aab2a Switch miner.cpp to use sha2 instead of OpenSSL. (Pieter Wuille) cf0c47b Remove getwork() RPC call (Pieter Wuille) 7b4737c Switch script.cpp and hash.cpp to use sha2.cpp instead of OpenSSL. (Pieter Wuille) 977cdad Add a built-in SHA256/SHA512 implementation. (Pieter Wuille)
2 parents b4ccf0a + a0495bb commit 8f59251

26 files changed

+1387
-610
lines changed

configure.ac

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[spec
111111

112112

113113
AC_CONFIG_SRCDIR([src])
114-
AC_CONFIG_HEADERS([src/bitcoin-config.h])
114+
AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
115115

116116
dnl Checks for programs.
117117
AC_PROG_CXX
@@ -368,7 +368,12 @@ if test x$TARGET_OS = xdarwin; then
368368
AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"])
369369
fi
370370

371-
AC_CHECK_HEADERS([stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h])
371+
AC_CHECK_HEADERS([endian.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h])
372+
373+
AC_CHECK_DECLS([le32toh, le64toh, htole32, htole64, be32toh, be64toh, htobe32, htobe64],,,
374+
[#if HAVE_ENDIAN_H
375+
#include <endian.h>
376+
#endif])
372377

373378
dnl Check for MSG_NOSIGNAL
374379
AC_MSG_CHECKING(for MSG_NOSIGNAL)

src/Makefile.am

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ $(LIBLEVELDB) $(LIBMEMENV):
1717
OPT="$(CXXFLAGS) $(CPPFLAGS)"
1818
endif
1919

20-
BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS)
20+
BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config
21+
BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BITCOIN_CONFIG_INCLUDES) $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS)
2122

2223
noinst_LIBRARIES = \
2324
libbitcoin_server.a \
2425
libbitcoin_common.a \
25-
libbitcoin_cli.a
26+
libbitcoin_cli.a \
27+
crypto/libbitcoin_crypto.a
2628
if ENABLE_WALLET
2729
BITCOIN_INCLUDES += $(BDB_CPPFLAGS)
2830
noinst_LIBRARIES += libbitcoin_wallet.a
@@ -140,6 +142,16 @@ libbitcoin_wallet_a_SOURCES = \
140142
walletdb.cpp \
141143
$(BITCOIN_CORE_H)
142144

145+
crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES)
146+
crypto_libbitcoin_crypto_a_SOURCES = \
147+
crypto/sha1.cpp \
148+
crypto/sha2.cpp \
149+
crypto/ripemd160.cpp \
150+
crypto/common.h \
151+
crypto/sha2.h \
152+
crypto/sha1.h \
153+
crypto/ripemd160.h
154+
143155
libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES)
144156
libbitcoin_common_a_SOURCES = \
145157
base58.cpp \
@@ -175,6 +187,7 @@ nodist_libbitcoin_common_a_SOURCES = $(srcdir)/obj/build.h
175187
bitcoind_LDADD = \
176188
libbitcoin_server.a \
177189
libbitcoin_common.a \
190+
crypto/libbitcoin_crypto.a \
178191
$(LIBLEVELDB) \
179192
$(LIBMEMENV)
180193
if ENABLE_WALLET
@@ -194,6 +207,7 @@ bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES)
194207
bitcoin_cli_LDADD = \
195208
libbitcoin_cli.a \
196209
libbitcoin_common.a \
210+
crypto/libbitcoin_crypto.a \
197211
$(BOOST_LIBS)
198212
bitcoin_cli_SOURCES = bitcoin-cli.cpp
199213
bitcoin_cli_CPPFLAGS = $(BITCOIN_INCLUDES)
@@ -212,6 +226,7 @@ EXTRA_DIST = leveldb
212226
clean-local:
213227
-$(MAKE) -C leveldb clean
214228
rm -f leveldb/*/*.gcno leveldb/helpers/memenv/*.gcno
229+
-rm -f config.h
215230

216231
.rc.o:
217232
@test -f $(WINDRES)
@@ -229,6 +244,7 @@ LIBBITCOIN_SERVER=libbitcoin_server.a
229244
LIBBITCOIN_WALLET=libbitcoin_wallet.a
230245
LIBBITCOIN_COMMON=libbitcoin_common.a
231246
LIBBITCOIN_CLI=libbitcoin_cli.a
247+
LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a
232248
LIBBITCOINQT=qt/libbitcoinqt.a
233249

234250
if ENABLE_TESTS

src/Makefile.qt.include

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ qt_bitcoin_qt_LDADD = qt/libbitcoinqt.a $(LIBBITCOIN_SERVER)
355355
if ENABLE_WALLET
356356
qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET)
357357
endif
358-
qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) $(LIBMEMENV) \
358+
qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_CRYPTO) $(LIBLEVELDB) $(LIBMEMENV) \
359359
$(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS)
360360
qt_bitcoin_qt_LDFLAGS = $(QT_LDFLAGS)
361361

src/Makefile.qttest.include

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ qt_test_test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_SERVER)
3030
if ENABLE_WALLET
3131
qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET)
3232
endif
33-
qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) \
33+
qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_CRYPTO) $(LIBLEVELDB) \
3434
$(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \
3535
$(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS)
3636
qt_test_test_bitcoin_qt_LDFLAGS = $(QT_LDFLAGS)

src/Makefile.test.include

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ BITCOIN_TESTS =\
3131
test/checkblock_tests.cpp \
3232
test/Checkpoints_tests.cpp \
3333
test/compress_tests.cpp \
34+
test/crypto_tests.cpp \
3435
test/DoS_tests.cpp \
3536
test/getarg_tests.cpp \
37+
test/hash_tests.cpp \
3638
test/key_tests.cpp \
3739
test/main_tests.cpp \
3840
test/miner_tests.cpp \
@@ -61,7 +63,7 @@ endif
6163

6264
test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
6365
test_test_bitcoin_CPPFLAGS = $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS)
64-
test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) $(LIBMEMENV) \
66+
test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_CRYPTO) $(LIBLEVELDB) $(LIBMEMENV) \
6567
$(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB)
6668
if ENABLE_WALLET
6769
test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET)

src/config/.empty

Whitespace-only changes.

src/crypto/common.h

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright (c) 2014 The Bitcoin developers
2+
// Distributed under the MIT/X11 software license, see the accompanying
3+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
#ifndef BITCOIN_CRYPTO_COMMON_H
6+
#define BITCOIN_CRYPTO_COMMON_H
7+
8+
#if defined(HAVE_CONFIG_H)
9+
#include "bitcoin-config.h"
10+
#endif
11+
#include <stdint.h>
12+
#if defined(HAVE_ENDIAN_H)
13+
#include <endian.h>
14+
#endif
15+
16+
uint32_t static inline ReadLE32(const unsigned char *ptr) {
17+
#if HAVE_DECL_LE32TOH == 1
18+
return le32toh(*((uint32_t*)ptr));
19+
#elif !defined(WORDS_BIGENDIAN)
20+
return *((uint32_t*)ptr);
21+
#else
22+
return ((uint32_t)ptr[3] << 24 | (uint32_t)ptr[2] << 16 | (uint32_t)ptr[1] << 8 | (uint32_t)ptr[0]);
23+
#endif
24+
}
25+
26+
uint64_t static inline ReadLE64(const unsigned char *ptr) {
27+
28+
#if HAVE_DECL_LE64TOH == 1
29+
return le64toh(*((uint64_t*)ptr));
30+
#elif !defined(WORDS_BIGENDIAN)
31+
return *((uint64_t*)ptr);
32+
#else
33+
return ((uint64_t)ptr[7] << 56 | (uint64_t)ptr[6] << 48 | (uint64_t)ptr[5] << 40 | (uint64_t)ptr[4] << 32 |
34+
(uint64_t)ptr[3] << 24 | (uint64_t)ptr[2] << 16 | (uint64_t)ptr[1] << 8 | (uint64_t)ptr[0]);
35+
#endif
36+
}
37+
38+
void static inline WriteLE32(unsigned char *ptr, uint32_t x) {
39+
#if HAVE_DECL_HTOLE32 == 1
40+
*((uint32_t*)ptr) = htole32(x);
41+
#elif !defined(WORDS_BIGENDIAN)
42+
*((uint32_t*)ptr) = x;
43+
#else
44+
ptr[3] = x >> 24; ptr[2] = x >> 16; ptr[1] = x >> 8; ptr[0] = x;
45+
#endif
46+
}
47+
48+
void static inline WriteLE64(unsigned char *ptr, uint64_t x) {
49+
#if HAVE_DECL_HTOLE64 == 1
50+
*((uint64_t*)ptr) = htole64(x);
51+
#elif !defined(WORDS_BIGENDIAN)
52+
*((uint64_t*)ptr) = x;
53+
#else
54+
ptr[7] = x >> 56; ptr[6] = x >> 48; ptr[5] = x >> 40; ptr[4] = x >> 32;
55+
ptr[3] = x >> 24; ptr[2] = x >> 16; ptr[1] = x >> 8; ptr[0] = x;
56+
#endif
57+
}
58+
59+
uint32_t static inline ReadBE32(const unsigned char *ptr) {
60+
#if HAVE_DECL_BE32TOH == 1
61+
return be32toh(*((uint32_t*)ptr));
62+
#else
63+
return ((uint32_t)ptr[0] << 24 | (uint32_t)ptr[1] << 16 | (uint32_t)ptr[2] << 8 | (uint32_t)ptr[3]);
64+
#endif
65+
}
66+
67+
uint64_t static inline ReadBE64(const unsigned char *ptr) {
68+
#if HAVE_DECL_BE64TOH == 1
69+
return be64toh(*((uint64_t*)ptr));
70+
#else
71+
return ((uint64_t)ptr[0] << 56 | (uint64_t)ptr[1] << 48 | (uint64_t)ptr[2] << 40 | (uint64_t)ptr[3] << 32 |
72+
(uint64_t)ptr[4] << 24 | (uint64_t)ptr[5] << 16 | (uint64_t)ptr[6] << 8 | (uint64_t)ptr[7]);
73+
#endif
74+
}
75+
76+
void static inline WriteBE32(unsigned char *ptr, uint32_t x) {
77+
#if HAVE_DECL_HTOBE32 == 1
78+
*((uint32_t*)ptr) = htobe32(x);
79+
#else
80+
ptr[0] = x >> 24; ptr[1] = x >> 16; ptr[2] = x >> 8; ptr[3] = x;
81+
#endif
82+
}
83+
84+
void static inline WriteBE64(unsigned char *ptr, uint64_t x) {
85+
#if HAVE_DECL_HTOBE64 == 1
86+
*((uint64_t*)ptr) = htobe64(x);
87+
#else
88+
ptr[0] = x >> 56; ptr[1] = x >> 48; ptr[2] = x >> 40; ptr[3] = x >> 32;
89+
ptr[4] = x >> 24; ptr[5] = x >> 16; ptr[6] = x >> 8; ptr[7] = x;
90+
#endif
91+
}
92+
93+
#endif

0 commit comments

Comments
 (0)