From f33f1bcdfb992637d0805b5c3cf3dda7a1bd9e7a Mon Sep 17 00:00:00 2001 From: MASM fan Date: Fri, 7 Nov 2014 22:04:12 +0400 Subject: [PATCH] Makefiles refactoring * move generic implementation of scrypt_core to scrypt-generic.c * add USE_ASM option --- novacoin-qt.pro | 34 ++++++++----- src/makefile.bsd | 27 +++++++---- src/makefile.linux-mingw | 24 ++++++--- src/makefile.mingw | 21 +++++--- src/makefile.osx | 27 +++++++--- src/makefile.unix | 28 +++++++---- src/scrypt-arm.S | 2 +- src/scrypt-generic.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++ src/scrypt-x86.S | 2 +- src/scrypt-x86_64.S | 2 +- src/scrypt.cpp | 120 ---------------------------------------------- 11 files changed, 227 insertions(+), 180 deletions(-) create mode 100644 src/scrypt-generic.c diff --git a/novacoin-qt.pro b/novacoin-qt.pro index 592c556..739a69d 100644 --- a/novacoin-qt.pro +++ b/novacoin-qt.pro @@ -18,17 +18,18 @@ CONFIG += static # Dependency library locations can be customized with: # BOOST_INCLUDE_PATH, BOOST_LIB_PATH, BDB_INCLUDE_PATH, # BDB_LIB_PATH, OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively -BOOST_LIB_SUFFIX=-mgw49-mt-s-1_55 -BOOST_INCLUDE_PATH=C:/deps/boost_1_55_0 -BOOST_LIB_PATH=C:/deps/boost_1_55_0/stage/lib -BDB_INCLUDE_PATH=C:/deps/db-6.0.20/build_unix -BDB_LIB_PATH=C:/deps/db-6.0.20/build_unix -OPENSSL_INCLUDE_PATH=C:/deps/openssl-1.0.1j/include -OPENSSL_LIB_PATH=C:/deps/openssl-1.0.1j -MINIUPNPC_INCLUDE_PATH=C:/deps/ -MINIUPNPC_LIB_PATH=C:/deps/miniupnpc -QRENCODE_INCLUDE_PATH=C:/deps/qrencode-3.4.4 -QRENCODE_LIB_PATH=C:/deps/qrencode-3.4.4/.libs + +#BOOST_LIB_SUFFIX=-mgw49-mt-s-1_55 +#BOOST_INCLUDE_PATH=C:/deps/boost_1_55_0 +#BOOST_LIB_PATH=C:/deps/boost_1_55_0/stage/lib +#BDB_INCLUDE_PATH=C:/deps/db-6.0.20/build_unix +#BDB_LIB_PATH=C:/deps/db-6.0.20/build_unix +#OPENSSL_INCLUDE_PATH=C:/deps/openssl-1.0.1j/include +#OPENSSL_LIB_PATH=C:/deps/openssl-1.0.1j +#MINIUPNPC_INCLUDE_PATH=C:/deps/ +#MINIUPNPC_LIB_PATH=C:/deps/miniupnpc +#QRENCODE_INCLUDE_PATH=C:/deps/qrencode-3.4.4 +#QRENCODE_LIB_PATH=C:/deps/qrencode-3.4.4/.libs OBJECTS_DIR = build MOC_DIR = build @@ -134,6 +135,14 @@ contains(USE_LEVELDB, 1) { SOURCES += src/txdb-bdb.cpp } +contains(USE_ASM, 1) { + message(Using optimized scrypt core implementation) + SOURCES += src/scrypt-arm.S src/scrypt-x86.S src/scrypt-x86_64.S +} else { + message(Using generic scrypt core implementation) + SOURCES += src/scrypt-generic.c +} + # regenerate src/build.h !windows|contains(USE_BUILD_INFO, 1) { genbuild.depends = FORCE @@ -319,9 +328,6 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ src/qt/rpcconsole.cpp \ src/noui.cpp \ src/kernel.cpp \ - src/scrypt-arm.S \ - src/scrypt-x86.S \ - src/scrypt-x86_64.S \ src/scrypt.cpp \ src/pbkdf2.cpp \ src/zerocoin/Accumulator.cpp \ diff --git a/src/makefile.bsd b/src/makefile.bsd index 1170153..472f111 100644 --- a/src/makefile.bsd +++ b/src/makefile.bsd @@ -129,9 +129,6 @@ OBJS= \ obj/kernel.o \ obj/pbkdf2.o \ obj/scrypt.o \ - obj/scrypt-arm.o \ - obj/scrypt-x86.o \ - obj/scrypt-x86_64.o \ obj/zerocoin/Accumulator.o \ obj/zerocoin/AccumulatorProofOfKnowledge.o \ obj/zerocoin/Coin.o \ @@ -161,13 +158,8 @@ ifneq (${USE_LEVELDB}, 1) OBJS += obj/txdb-bdb.o endif -# auto-generated dependencies: --include obj/*.P - -obj/build.h: FORCE - /bin/sh ../share/genbuild.sh obj/build.h -version.cpp: obj/build.h -DEFS += -DHAVE_BUILD_INFO +ifeq (${USE_ASM}, 1) +OBJS += obj/scrypt-arm.o obj/scrypt-x86.o obj/scrypt-x86_64.o obj/scrypt-x86.o: scrypt-x86.S $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< @@ -177,6 +169,21 @@ obj/scrypt-x86_64.o: scrypt-x86_64.S obj/scrypt-arm.o: scrypt-arm.S $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< +endif +ifneq (${USE_ASM}, 1) +OBJS += obj/scrypt-generic.o + +obj/scrypt-generic.o: scrypt-generic.c + $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< +endif + +# auto-generated dependencies: +-include obj/*.P + +obj/build.h: FORCE + /bin/sh ../share/genbuild.sh obj/build.h +version.cpp: obj/build.h +DEFS += -DHAVE_BUILD_INFO obj/%.o: %.cpp $(CXX) -c $(xCXXFLAGS) -MMD -MF $(@:%.o=%.d) -o $@ $< diff --git a/src/makefile.linux-mingw b/src/makefile.linux-mingw index a194bf5..385bab0 100644 --- a/src/makefile.linux-mingw +++ b/src/makefile.linux-mingw @@ -92,8 +92,6 @@ OBJS= \ obj/kernel.o \ obj/pbkdf2.o \ obj/scrypt.o \ - obj/scrypt-x86.o \ - obj/scrypt-x86_64.o \ obj/zerocoin/Accumulator.o \ obj/zerocoin/AccumulatorProofOfKnowledge.o \ obj/zerocoin/Coin.o \ @@ -122,6 +120,22 @@ else OBJS += obj/txdb-bdb.o endif +ifeq (${USE_ASM}, 1) +OBJS += obj/scrypt-arm.o obj/scrypt-x86.o obj/scrypt-x86_64.o + +obj/scrypt-x86.o: scrypt-x86.S + $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< + +obj/scrypt-x86_64.o: scrypt-x86_64.S + $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< +endif +ifneq (${USE_ASM}, 1) +OBJS += obj/scrypt-generic.o + +obj/scrypt-generic.o: scrypt-generic.c + $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< +endif + obj/build.h: FORCE /bin/sh ../share/genbuild.sh obj/build.h version.cpp: obj/build.h @@ -137,12 +151,6 @@ novacoind.exe: $(OBJS:obj/%=obj/%) $(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) -lshlwapi $(STRIP) novacoind.exe -obj/scrypt-x86.o: scrypt-x86.S - $(CXX) -c $(CFLAGS) -MMD -o $@ $< - -obj/scrypt-x86_64.o: scrypt-x86_64.S - $(CXX) -c $(CFLAGS) -MMD -o $@ $< - clean: -rm -f obj/*.o -rm -f obj/zerocoin/*.o diff --git a/src/makefile.mingw b/src/makefile.mingw index 3615141..4c9944b 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -83,8 +83,6 @@ OBJS= \ obj/kernel.o \ obj/pbkdf2.o \ obj/scrypt.o \ - obj/scrypt-x86.o \ - obj/scrypt-x86_64.o \ obj/zerocoin/Accumulator.o \ obj/zerocoin/AccumulatorProofOfKnowledge.o \ obj/zerocoin/Coin.o \ @@ -113,17 +111,26 @@ else OBJS += obj/txdb-bdb.o endif -obj/%.o: %.cpp $(HEADERS) - g++ -c $(CFLAGS) -o $@ $< - -obj/zerocoin/%.o: zerocoin/%.cpp - g++ -c $(CFLAGS) -o $@ $< +ifdef USE_ASM +OBJS += obj/scrypt-arm.o obj/scrypt-x86.o obj/scrypt-x86_64.o obj/scrypt-x86.o: scrypt-x86.S $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< obj/scrypt-x86_64.o: scrypt-x86_64.S $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< +else +OBJS += obj/scrypt-generic.o + +obj/scrypt-generic.o: scrypt-generic.c + $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< +endif + +obj/%.o: %.cpp $(HEADERS) + g++ -c $(CFLAGS) -o $@ $< + +obj/zerocoin/%.o: zerocoin/%.cpp + g++ -c $(CFLAGS) -o $@ $< novacoind.exe: $(OBJS:obj/%=obj/%) g++ $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) diff --git a/src/makefile.osx b/src/makefile.osx index 3cd0962..2988d81 100644 --- a/src/makefile.osx +++ b/src/makefile.osx @@ -94,8 +94,6 @@ OBJS= \ obj/pbkdf2.o \ obj/kernel.o \ obj/scrypt.o \ - obj/scrypt-x86.o \ - obj/scrypt-x86_64.o \ obj/zerocoin/Accumulator.o \ obj/zerocoin/AccumulatorProofOfKnowledge.o \ obj/zerocoin/Coin.o \ @@ -140,6 +138,25 @@ else OBJS += obj/txdb-bdb.o endif +ifeq (${USE_ASM}, 1) +OBJS += obj/scrypt-arm.o obj/scrypt-x86.o obj/scrypt-x86_64.o + +obj/scrypt-x86.o: scrypt-x86.S + $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< + +obj/scrypt-x86_64.o: scrypt-x86_64.S + $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< + +obj/scrypt-arm.o: scrypt-arm.S + $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< +endif +ifneq (${USE_ASM}, 1) +OBJS += obj/scrypt-generic.o + +obj/scrypt-generic.o: scrypt-generic.c + $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< +endif + # auto-generated dependencies: -include obj/*.P @@ -162,12 +179,6 @@ obj/zerocoin/%.o: zerocoin/%.cpp -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ rm -f $(@:%.o=%.d) -obj/scrypt-x86.o: scrypt-x86.S - $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< - -obj/scrypt-x86_64.o: scrypt-x86_64.S - $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< - novacoind: $(OBJS:obj/%=obj/%) $(CXX) $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) diff --git a/src/makefile.unix b/src/makefile.unix index 6511849..9097e93 100644 --- a/src/makefile.unix +++ b/src/makefile.unix @@ -135,9 +135,6 @@ OBJS= \ obj/kernel.o \ obj/pbkdf2.o \ obj/scrypt.o \ - obj/scrypt-arm.o \ - obj/scrypt-x86.o \ - obj/scrypt-x86_64.o \ obj/zerocoin/Accumulator.o \ obj/zerocoin/AccumulatorProofOfKnowledge.o \ obj/zerocoin/Coin.o \ @@ -167,13 +164,8 @@ ifneq (${USE_LEVELDB}, 1) OBJS += obj/txdb-bdb.o endif -# auto-generated dependencies: --include obj/*.P - -obj/build.h: FORCE - /bin/sh ../share/genbuild.sh obj/build.h -version.cpp: obj/build.h -DEFS += -DHAVE_BUILD_INFO +ifeq (${USE_ASM}, 1) +OBJS += obj/scrypt-arm.o obj/scrypt-x86.o obj/scrypt-x86_64.o obj/scrypt-x86.o: scrypt-x86.S $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< @@ -183,6 +175,22 @@ obj/scrypt-x86_64.o: scrypt-x86_64.S obj/scrypt-arm.o: scrypt-arm.S $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< +endif +ifneq (${USE_ASM}, 1) +OBJS += obj/scrypt-generic.o + +obj/scrypt-generic.o: scrypt-generic.c + $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< +endif + +# auto-generated dependencies: +-include obj/*.P + +obj/build.h: FORCE + /bin/sh ../share/genbuild.sh obj/build.h +version.cpp: obj/build.h +DEFS += -DHAVE_BUILD_INFO + obj/%.o: %.cpp $(CXX) -c $(xCXXFLAGS) -MMD -MF $(@:%.o=%.d) -o $@ $< diff --git a/src/scrypt-arm.S b/src/scrypt-arm.S index 143eb3a..12d94b0 100644 --- a/src/scrypt-arm.S +++ b/src/scrypt-arm.S @@ -8,7 +8,7 @@ */ -#if defined(OPTIMIZED_SALSA) && defined(__arm__) && defined(__APCS_32__) +#if defined(__arm__) && defined(__APCS_32__) #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits diff --git a/src/scrypt-generic.c b/src/scrypt-generic.c new file mode 100644 index 0000000..2da117e --- /dev/null +++ b/src/scrypt-generic.c @@ -0,0 +1,120 @@ +/*- + * Copyright 2009 Colin Percival, 2011 ArtForz, 2011 pooler, 2013 Balthazar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file was originally written by Colin Percival as part of the Tarsnap + * online backup system. + */ + +#include +#include +#include + +// Generic scrypt_core implementation + +static inline void xor_salsa8(unsigned int B[16], const unsigned int Bx[16]) +{ + unsigned int x00,x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15; + int i; + + x00 = (B[0] ^= Bx[0]); + x01 = (B[1] ^= Bx[1]); + x02 = (B[2] ^= Bx[2]); + x03 = (B[3] ^= Bx[3]); + x04 = (B[4] ^= Bx[4]); + x05 = (B[5] ^= Bx[5]); + x06 = (B[6] ^= Bx[6]); + x07 = (B[7] ^= Bx[7]); + x08 = (B[8] ^= Bx[8]); + x09 = (B[9] ^= Bx[9]); + x10 = (B[10] ^= Bx[10]); + x11 = (B[11] ^= Bx[11]); + x12 = (B[12] ^= Bx[12]); + x13 = (B[13] ^= Bx[13]); + x14 = (B[14] ^= Bx[14]); + x15 = (B[15] ^= Bx[15]); + for (i = 0; i < 8; i += 2) { +#define R(a, b) (((a) << (b)) | ((a) >> (32 - (b)))) + /* Operate on columns. */ + x04 ^= R(x00+x12, 7); x09 ^= R(x05+x01, 7); + x14 ^= R(x10+x06, 7); x03 ^= R(x15+x11, 7); + + x08 ^= R(x04+x00, 9); x13 ^= R(x09+x05, 9); + x02 ^= R(x14+x10, 9); x07 ^= R(x03+x15, 9); + + x12 ^= R(x08+x04,13); x01 ^= R(x13+x09,13); + x06 ^= R(x02+x14,13); x11 ^= R(x07+x03,13); + + x00 ^= R(x12+x08,18); x05 ^= R(x01+x13,18); + x10 ^= R(x06+x02,18); x15 ^= R(x11+x07,18); + + /* Operate on rows. */ + x01 ^= R(x00+x03, 7); x06 ^= R(x05+x04, 7); + x11 ^= R(x10+x09, 7); x12 ^= R(x15+x14, 7); + + x02 ^= R(x01+x00, 9); x07 ^= R(x06+x05, 9); + x08 ^= R(x11+x10, 9); x13 ^= R(x12+x15, 9); + + x03 ^= R(x02+x01,13); x04 ^= R(x07+x06,13); + x09 ^= R(x08+x11,13); x14 ^= R(x13+x12,13); + + x00 ^= R(x03+x02,18); x05 ^= R(x04+x07,18); + x10 ^= R(x09+x08,18); x15 ^= R(x14+x13,18); +#undef R + } + B[0] += x00; + B[1] += x01; + B[2] += x02; + B[3] += x03; + B[4] += x04; + B[5] += x05; + B[6] += x06; + B[7] += x07; + B[8] += x08; + B[9] += x09; + B[10] += x10; + B[11] += x11; + B[12] += x12; + B[13] += x13; + B[14] += x14; + B[15] += x15; +} + +void scrypt_core(unsigned int *X, unsigned int *V) +{ + unsigned int i, j, k; + + for (i = 0; i < 1024; i++) { + memcpy(&V[i * 32], X, 128); + xor_salsa8(&X[0], &X[16]); + xor_salsa8(&X[16], &X[0]); + } + for (i = 0; i < 1024; i++) { + j = 32 * (X[16] & 1023); + for (k = 0; k < 32; k++) + X[k] ^= V[j + k]; + xor_salsa8(&X[0], &X[16]); + xor_salsa8(&X[16], &X[0]); + } +} diff --git a/src/scrypt-x86.S b/src/scrypt-x86.S index c1d2cef..0e97e36 100644 --- a/src/scrypt-x86.S +++ b/src/scrypt-x86.S @@ -22,7 +22,7 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. -#if defined(OPTIMIZED_SALSA) && defined(__i386__) +#if defined(__i386__) #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits diff --git a/src/scrypt-x86_64.S b/src/scrypt-x86_64.S index 3036d03..9d894f2 100644 --- a/src/scrypt-x86_64.S +++ b/src/scrypt-x86_64.S @@ -23,7 +23,7 @@ # SUCH DAMAGE. -#if defined(OPTIMIZED_SALSA) && defined(__x86_64__) +#if defined(__x86_64__) #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits diff --git a/src/scrypt.cpp b/src/scrypt.cpp index 06ef53c..624d8b1 100644 --- a/src/scrypt.cpp +++ b/src/scrypt.cpp @@ -1,32 +1,3 @@ -/*- - * Copyright 2009 Colin Percival, 2011 ArtForz, 2011 pooler, 2013 Balthazar - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file was originally written by Colin Percival as part of the Tarsnap - * online backup system. - */ - #include #include @@ -38,98 +9,7 @@ #define SCRYPT_BUFFER_SIZE (131072 + 63) -#if defined (OPTIMIZED_SALSA) && ( defined (__x86_64__) || defined (__i386__) || defined(__arm__) ) extern "C" void scrypt_core(unsigned int *X, unsigned int *V); -#else -// Generic scrypt_core implementation - -static inline void xor_salsa8(unsigned int B[16], const unsigned int Bx[16]) -{ - unsigned int x00,x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15; - int i; - - x00 = (B[0] ^= Bx[0]); - x01 = (B[1] ^= Bx[1]); - x02 = (B[2] ^= Bx[2]); - x03 = (B[3] ^= Bx[3]); - x04 = (B[4] ^= Bx[4]); - x05 = (B[5] ^= Bx[5]); - x06 = (B[6] ^= Bx[6]); - x07 = (B[7] ^= Bx[7]); - x08 = (B[8] ^= Bx[8]); - x09 = (B[9] ^= Bx[9]); - x10 = (B[10] ^= Bx[10]); - x11 = (B[11] ^= Bx[11]); - x12 = (B[12] ^= Bx[12]); - x13 = (B[13] ^= Bx[13]); - x14 = (B[14] ^= Bx[14]); - x15 = (B[15] ^= Bx[15]); - for (i = 0; i < 8; i += 2) { -#define R(a, b) (((a) << (b)) | ((a) >> (32 - (b)))) - /* Operate on columns. */ - x04 ^= R(x00+x12, 7); x09 ^= R(x05+x01, 7); - x14 ^= R(x10+x06, 7); x03 ^= R(x15+x11, 7); - - x08 ^= R(x04+x00, 9); x13 ^= R(x09+x05, 9); - x02 ^= R(x14+x10, 9); x07 ^= R(x03+x15, 9); - - x12 ^= R(x08+x04,13); x01 ^= R(x13+x09,13); - x06 ^= R(x02+x14,13); x11 ^= R(x07+x03,13); - - x00 ^= R(x12+x08,18); x05 ^= R(x01+x13,18); - x10 ^= R(x06+x02,18); x15 ^= R(x11+x07,18); - - /* Operate on rows. */ - x01 ^= R(x00+x03, 7); x06 ^= R(x05+x04, 7); - x11 ^= R(x10+x09, 7); x12 ^= R(x15+x14, 7); - - x02 ^= R(x01+x00, 9); x07 ^= R(x06+x05, 9); - x08 ^= R(x11+x10, 9); x13 ^= R(x12+x15, 9); - - x03 ^= R(x02+x01,13); x04 ^= R(x07+x06,13); - x09 ^= R(x08+x11,13); x14 ^= R(x13+x12,13); - - x00 ^= R(x03+x02,18); x05 ^= R(x04+x07,18); - x10 ^= R(x09+x08,18); x15 ^= R(x14+x13,18); -#undef R - } - B[0] += x00; - B[1] += x01; - B[2] += x02; - B[3] += x03; - B[4] += x04; - B[5] += x05; - B[6] += x06; - B[7] += x07; - B[8] += x08; - B[9] += x09; - B[10] += x10; - B[11] += x11; - B[12] += x12; - B[13] += x13; - B[14] += x14; - B[15] += x15; -} - -static inline void scrypt_core(unsigned int *X, unsigned int *V) -{ - unsigned int i, j, k; - - for (i = 0; i < 1024; i++) { - memcpy(&V[i * 32], X, 128); - xor_salsa8(&X[0], &X[16]); - xor_salsa8(&X[16], &X[0]); - } - for (i = 0; i < 1024; i++) { - j = 32 * (X[16] & 1023); - for (k = 0; k < 32; k++) - X[k] ^= V[j + k]; - xor_salsa8(&X[0], &X[16]); - xor_salsa8(&X[16], &X[0]); - } -} - -#endif /* cpu and memory intensive function to transform a 80 byte buffer into a 32 byte output scratchpad size needs to be at least 63 + (128 * r * p) + (256 * r + 64) + (128 * r * N) bytes -- 1.7.1