diff --git a/scrypt-x64.S b/scrypt-x64.S index a3267c1..559f048 100644 --- a/scrypt-x64.S +++ b/scrypt-x64.S @@ -22,6 +22,10 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. +#if defined(__linux__) && defined(__ELF__) + .section .note.GNU-stack,"",%progbits +#endif + #if defined(__x86_64__) .macro gen_salsa8_core_doubleround @@ -430,73 +434,78 @@ gen_scrypt_core_loop2: .macro xmm_salsa8_core_doubleround + movdqa %xmm1, %xmm4 paddd %xmm0, %xmm4 - movdqa %xmm0, %xmm5 - movdqa %xmm4, %xmm6 + movdqa %xmm4, %xmm5 pslld $7, %xmm4 - psrld $25, %xmm6 + psrld $25, %xmm5 pxor %xmm4, %xmm3 - pxor %xmm6, %xmm3 - paddd %xmm3, %xmm5 + pxor %xmm5, %xmm3 + movdqa %xmm0, %xmm4 + + paddd %xmm3, %xmm4 + movdqa %xmm4, %xmm5 + pslld $9, %xmm4 + psrld $23, %xmm5 + pxor %xmm4, %xmm2 movdqa %xmm3, %xmm4 - movdqa %xmm5, %xmm6 - pslld $9, %xmm5 - psrld $23, %xmm6 - pxor %xmm5, %xmm2 pshufd $0x93, %xmm3, %xmm3 - pxor %xmm6, %xmm2 + pxor %xmm5, %xmm2 + paddd %xmm2, %xmm4 - movdqa %xmm2, %xmm5 - movdqa %xmm4, %xmm6 + movdqa %xmm4, %xmm5 pslld $13, %xmm4 - psrld $19, %xmm6 + psrld $19, %xmm5 pxor %xmm4, %xmm1 + movdqa %xmm2, %xmm4 pshufd $0x4e, %xmm2, %xmm2 - pxor %xmm6, %xmm1 - paddd %xmm1, %xmm5 - movdqa %xmm3, %xmm4 - movdqa %xmm5, %xmm6 - pslld $18, %xmm5 - psrld $14, %xmm6 - pxor %xmm5, %xmm0 + pxor %xmm5, %xmm1 + + paddd %xmm1, %xmm4 + movdqa %xmm4, %xmm5 + pslld $18, %xmm4 + psrld $14, %xmm5 + pxor %xmm4, %xmm0 pshufd $0x39, %xmm1, %xmm1 - pxor %xmm6, %xmm0 + pxor %xmm5, %xmm0 + movdqa %xmm3, %xmm4 paddd %xmm0, %xmm4 - movdqa %xmm0, %xmm5 - movdqa %xmm4, %xmm6 + movdqa %xmm4, %xmm5 pslld $7, %xmm4 - psrld $25, %xmm6 + psrld $25, %xmm5 pxor %xmm4, %xmm1 - pxor %xmm6, %xmm1 - paddd %xmm1, %xmm5 + pxor %xmm5, %xmm1 + movdqa %xmm0, %xmm4 + + paddd %xmm1, %xmm4 + movdqa %xmm4, %xmm5 + pslld $9, %xmm4 + psrld $23, %xmm5 + pxor %xmm4, %xmm2 movdqa %xmm1, %xmm4 - movdqa %xmm5, %xmm6 - pslld $9, %xmm5 - psrld $23, %xmm6 - pxor %xmm5, %xmm2 pshufd $0x93, %xmm1, %xmm1 - pxor %xmm6, %xmm2 + pxor %xmm5, %xmm2 + paddd %xmm2, %xmm4 - movdqa %xmm2, %xmm5 - movdqa %xmm4, %xmm6 + movdqa %xmm4, %xmm5 pslld $13, %xmm4 - psrld $19, %xmm6 + psrld $19, %xmm5 pxor %xmm4, %xmm3 + movdqa %xmm2, %xmm4 pshufd $0x4e, %xmm2, %xmm2 - pxor %xmm6, %xmm3 - paddd %xmm3, %xmm5 - movdqa %xmm1, %xmm4 - movdqa %xmm5, %xmm6 - pslld $18, %xmm5 - psrld $14, %xmm6 - pxor %xmm5, %xmm0 + pxor %xmm5, %xmm3 + + paddd %xmm3, %xmm4 + movdqa %xmm4, %xmm5 + pslld $18, %xmm4 + psrld $14, %xmm5 + pxor %xmm4, %xmm0 pshufd $0x39, %xmm3, %xmm3 - pxor %xmm6, %xmm0 + pxor %xmm5, %xmm0 .endm .macro xmm_salsa8_core - movdqa %xmm1, %xmm4 xmm_salsa8_core_doubleround xmm_salsa8_core_doubleround xmm_salsa8_core_doubleround @@ -837,136 +846,140 @@ prefer_dual_scrypt_false: .macro xmm_dual_salsa8_core_doubleround + movdqa %xmm1, %xmm4 + movdqa %xmm9, %xmm6 paddd %xmm0, %xmm4 - paddd %xmm8, %xmm12 - movdqa %xmm0, %xmm5 - movdqa %xmm8, %xmm13 - movdqa %xmm4, %xmm6 - movdqa %xmm12, %xmm14 + paddd %xmm8, %xmm6 + movdqa %xmm4, %xmm5 + movdqa %xmm6, %xmm7 pslld $7, %xmm4 - pslld $7, %xmm12 - psrld $25, %xmm6 - psrld $25, %xmm14 + pslld $7, %xmm6 + psrld $25, %xmm5 + psrld $25, %xmm7 pxor %xmm4, %xmm3 - pxor %xmm12, %xmm11 - pxor %xmm6, %xmm3 - pxor %xmm14, %xmm11 - paddd %xmm3, %xmm5 - paddd %xmm11, %xmm13 + pxor %xmm6, %xmm11 + pxor %xmm5, %xmm3 + pxor %xmm7, %xmm11 + movdqa %xmm0, %xmm4 + movdqa %xmm8, %xmm6 + + paddd %xmm3, %xmm4 + paddd %xmm11, %xmm6 + movdqa %xmm4, %xmm5 + movdqa %xmm6, %xmm7 + pslld $9, %xmm4 + pslld $9, %xmm6 + psrld $23, %xmm5 + psrld $23, %xmm7 + pxor %xmm4, %xmm2 + pxor %xmm6, %xmm10 movdqa %xmm3, %xmm4 - movdqa %xmm11, %xmm12 - movdqa %xmm5, %xmm6 - movdqa %xmm13, %xmm14 - pslld $9, %xmm5 - pslld $9, %xmm13 - psrld $23, %xmm6 - psrld $23, %xmm14 - pxor %xmm5, %xmm2 - pxor %xmm13, %xmm10 + movdqa %xmm11, %xmm6 pshufd $0x93, %xmm3, %xmm3 pshufd $0x93, %xmm11, %xmm11 - pxor %xmm6, %xmm2 - pxor %xmm14, %xmm10 + pxor %xmm5, %xmm2 + pxor %xmm7, %xmm10 + paddd %xmm2, %xmm4 - paddd %xmm10, %xmm12 - movdqa %xmm2, %xmm5 - movdqa %xmm10, %xmm13 - movdqa %xmm4, %xmm6 - movdqa %xmm12, %xmm14 + paddd %xmm10, %xmm6 + movdqa %xmm4, %xmm5 + movdqa %xmm6, %xmm7 pslld $13, %xmm4 - pslld $13, %xmm12 - psrld $19, %xmm6 - psrld $19, %xmm14 + pslld $13, %xmm6 + psrld $19, %xmm5 + psrld $19, %xmm7 pxor %xmm4, %xmm1 - pxor %xmm12, %xmm9 + pxor %xmm6, %xmm9 + movdqa %xmm2, %xmm4 + movdqa %xmm10, %xmm6 pshufd $0x4e, %xmm2, %xmm2 pshufd $0x4e, %xmm10, %xmm10 - pxor %xmm6, %xmm1 - pxor %xmm14, %xmm9 - paddd %xmm1, %xmm5 - paddd %xmm9, %xmm13 - movdqa %xmm3, %xmm4 - movdqa %xmm11, %xmm12 - movdqa %xmm5, %xmm6 - movdqa %xmm13, %xmm14 - pslld $18, %xmm5 - pslld $18, %xmm13 - psrld $14, %xmm6 - psrld $14, %xmm14 - pxor %xmm5, %xmm0 - pxor %xmm13, %xmm8 + pxor %xmm5, %xmm1 + pxor %xmm7, %xmm9 + + paddd %xmm1, %xmm4 + paddd %xmm9, %xmm6 + movdqa %xmm4, %xmm5 + movdqa %xmm6, %xmm7 + pslld $18, %xmm4 + pslld $18, %xmm6 + psrld $14, %xmm5 + psrld $14, %xmm7 + pxor %xmm4, %xmm0 + pxor %xmm6, %xmm8 pshufd $0x39, %xmm1, %xmm1 pshufd $0x39, %xmm9, %xmm9 - pxor %xmm6, %xmm0 - pxor %xmm14, %xmm8 + pxor %xmm5, %xmm0 + pxor %xmm7, %xmm8 + movdqa %xmm3, %xmm4 + movdqa %xmm11, %xmm6 paddd %xmm0, %xmm4 - paddd %xmm8, %xmm12 - movdqa %xmm0, %xmm5 - movdqa %xmm8, %xmm13 - movdqa %xmm4, %xmm6 - movdqa %xmm12, %xmm14 + paddd %xmm8, %xmm6 + movdqa %xmm4, %xmm5 + movdqa %xmm6, %xmm7 pslld $7, %xmm4 - pslld $7, %xmm12 - psrld $25, %xmm6 - psrld $25, %xmm14 + pslld $7, %xmm6 + psrld $25, %xmm5 + psrld $25, %xmm7 pxor %xmm4, %xmm1 - pxor %xmm12, %xmm9 - pxor %xmm6, %xmm1 - pxor %xmm14, %xmm9 - paddd %xmm1, %xmm5 - paddd %xmm9, %xmm13 + pxor %xmm6, %xmm9 + pxor %xmm5, %xmm1 + pxor %xmm7, %xmm9 + movdqa %xmm0, %xmm4 + movdqa %xmm8, %xmm6 + + paddd %xmm1, %xmm4 + paddd %xmm9, %xmm6 + movdqa %xmm4, %xmm5 + movdqa %xmm6, %xmm7 + pslld $9, %xmm4 + pslld $9, %xmm6 + psrld $23, %xmm5 + psrld $23, %xmm7 + pxor %xmm4, %xmm2 + pxor %xmm6, %xmm10 movdqa %xmm1, %xmm4 - movdqa %xmm9, %xmm12 - movdqa %xmm5, %xmm6 - movdqa %xmm13, %xmm14 - pslld $9, %xmm5 - pslld $9, %xmm13 - psrld $23, %xmm6 - psrld $23, %xmm14 - pxor %xmm5, %xmm2 - pxor %xmm13, %xmm10 + movdqa %xmm9, %xmm6 pshufd $0x93, %xmm1, %xmm1 pshufd $0x93, %xmm9, %xmm9 - pxor %xmm6, %xmm2 - pxor %xmm14, %xmm10 + pxor %xmm5, %xmm2 + pxor %xmm7, %xmm10 + paddd %xmm2, %xmm4 - paddd %xmm10, %xmm12 - movdqa %xmm2, %xmm5 - movdqa %xmm10, %xmm13 - movdqa %xmm4, %xmm6 - movdqa %xmm12, %xmm14 + paddd %xmm10, %xmm6 + movdqa %xmm4, %xmm5 + movdqa %xmm6, %xmm7 pslld $13, %xmm4 - pslld $13, %xmm12 - psrld $19, %xmm6 - psrld $19, %xmm14 + pslld $13, %xmm6 + psrld $19, %xmm5 + psrld $19, %xmm7 pxor %xmm4, %xmm3 - pxor %xmm12, %xmm11 + pxor %xmm6, %xmm11 + movdqa %xmm2, %xmm4 + movdqa %xmm10, %xmm6 pshufd $0x4e, %xmm2, %xmm2 pshufd $0x4e, %xmm10, %xmm10 - pxor %xmm6, %xmm3 - pxor %xmm14, %xmm11 - paddd %xmm3, %xmm5 - paddd %xmm11, %xmm13 - movdqa %xmm1, %xmm4 - movdqa %xmm9, %xmm12 - movdqa %xmm5, %xmm6 - movdqa %xmm13, %xmm14 - pslld $18, %xmm5 - pslld $18, %xmm13 - psrld $14, %xmm6 - psrld $14, %xmm14 - pxor %xmm5, %xmm0 - pxor %xmm13, %xmm8 + pxor %xmm5, %xmm3 + pxor %xmm7, %xmm11 + + paddd %xmm3, %xmm4 + paddd %xmm11, %xmm6 + movdqa %xmm4, %xmm5 + movdqa %xmm6, %xmm7 + pslld $18, %xmm4 + pslld $18, %xmm6 + psrld $14, %xmm5 + psrld $14, %xmm7 + pxor %xmm4, %xmm0 + pxor %xmm6, %xmm8 pshufd $0x39, %xmm3, %xmm3 pshufd $0x39, %xmm11, %xmm11 - pxor %xmm6, %xmm0 - pxor %xmm14, %xmm8 + pxor %xmm5, %xmm0 + pxor %xmm7, %xmm8 .endm .macro xmm_dual_salsa8_core - movdqa %xmm1, %xmm4 - movdqa %xmm9, %xmm12 xmm_dual_salsa8_core_doubleround xmm_dual_salsa8_core_doubleround xmm_dual_salsa8_core_doubleround diff --git a/scrypt-x86.S b/scrypt-x86.S index c3113a7..4c3c152 100644 --- a/scrypt-x86.S +++ b/scrypt-x86.S @@ -558,74 +558,78 @@ gen_scrypt_core_loop2: .macro xmm_salsa8_core_doubleround + movdqa %xmm1, %xmm4 paddd %xmm0, %xmm4 - movdqa %xmm0, %xmm5 - movdqa %xmm4, %xmm6 + movdqa %xmm4, %xmm5 pslld $7, %xmm4 - psrld $25, %xmm6 + psrld $25, %xmm5 pxor %xmm4, %xmm3 - pxor %xmm6, %xmm3 - paddd %xmm3, %xmm5 + pxor %xmm5, %xmm3 + movdqa %xmm0, %xmm4 + + paddd %xmm3, %xmm4 + movdqa %xmm4, %xmm5 + pslld $9, %xmm4 + psrld $23, %xmm5 + pxor %xmm4, %xmm2 movdqa %xmm3, %xmm4 - movdqa %xmm5, %xmm6 - pslld $9, %xmm5 - psrld $23, %xmm6 - pxor %xmm5, %xmm2 pshufd $0x93, %xmm3, %xmm3 - pxor %xmm6, %xmm2 + pxor %xmm5, %xmm2 + paddd %xmm2, %xmm4 - movdqa %xmm2, %xmm5 - movdqa %xmm4, %xmm6 + movdqa %xmm4, %xmm5 pslld $13, %xmm4 - psrld $19, %xmm6 + psrld $19, %xmm5 pxor %xmm4, %xmm1 + movdqa %xmm2, %xmm4 pshufd $0x4e, %xmm2, %xmm2 - pxor %xmm6, %xmm1 - paddd %xmm1, %xmm5 - movdqa %xmm3, %xmm4 - movdqa %xmm5, %xmm6 - pslld $18, %xmm5 - psrld $14, %xmm6 - pxor %xmm5, %xmm0 + pxor %xmm5, %xmm1 + + paddd %xmm1, %xmm4 + movdqa %xmm4, %xmm5 + pslld $18, %xmm4 + psrld $14, %xmm5 + pxor %xmm4, %xmm0 pshufd $0x39, %xmm1, %xmm1 - pxor %xmm6, %xmm0 + pxor %xmm5, %xmm0 + movdqa %xmm3, %xmm4 paddd %xmm0, %xmm4 - movdqa %xmm0, %xmm5 - movdqa %xmm4, %xmm6 + movdqa %xmm4, %xmm5 pslld $7, %xmm4 - psrld $25, %xmm6 + psrld $25, %xmm5 pxor %xmm4, %xmm1 - pxor %xmm6, %xmm1 - paddd %xmm1, %xmm5 + pxor %xmm5, %xmm1 + movdqa %xmm0, %xmm4 + + paddd %xmm1, %xmm4 + movdqa %xmm4, %xmm5 + pslld $9, %xmm4 + psrld $23, %xmm5 + pxor %xmm4, %xmm2 movdqa %xmm1, %xmm4 - movdqa %xmm5, %xmm6 - pslld $9, %xmm5 - psrld $23, %xmm6 - pxor %xmm5, %xmm2 pshufd $0x93, %xmm1, %xmm1 - pxor %xmm6, %xmm2 + pxor %xmm5, %xmm2 + paddd %xmm2, %xmm4 - movdqa %xmm2, %xmm5 - movdqa %xmm4, %xmm6 + movdqa %xmm4, %xmm5 pslld $13, %xmm4 - psrld $19, %xmm6 + psrld $19, %xmm5 pxor %xmm4, %xmm3 + movdqa %xmm2, %xmm4 pshufd $0x4e, %xmm2, %xmm2 - pxor %xmm6, %xmm3 - subl $2, %eax - paddd %xmm3, %xmm5 - movdqa %xmm1, %xmm4 - movdqa %xmm5, %xmm6 - pslld $18, %xmm5 - psrld $14, %xmm6 - pxor %xmm5, %xmm0 + pxor %xmm5, %xmm3 + + paddd %xmm3, %xmm4 + movdqa %xmm4, %xmm5 + pslld $18, %xmm4 + psrld $14, %xmm5 + pxor %xmm4, %xmm0 pshufd $0x39, %xmm3, %xmm3 - pxor %xmm6, %xmm0 + pxor %xmm5, %xmm0 .endm .macro xmm_salsa8_core - movdqa %xmm1, %xmm4 xmm_salsa8_core_doubleround xmm_salsa8_core_doubleround xmm_salsa8_core_doubleround diff --git a/scrypt.c b/scrypt.c index 8cbdf6e..78f5473 100644 --- a/scrypt.c +++ b/scrypt.c @@ -42,8 +42,8 @@ typedef struct SHA256Context { } SHA256_CTX; /* - * Encode a length len/4 vector of (uint32_t) into a length len vector of - * (unsigned char) in big-endian form. Assumes len is a multiple of 4. + * Encode a length len vector of (uint32_t) into a length len vector of + * (unsigned char) in big-endian form. */ static inline void be32enc_vect(uint32_t *dst, const uint32_t *src, uint32_t len) @@ -225,7 +225,7 @@ PBKDF2_SHA256_80_128_init(const uint32_t *passwd, uint32_t tstate[8], uint32_t o /** * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen): * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and - * write the output to buf. The value dkLen must be at most 32 * (2^32 - 1). + * write the output to buf. */ static inline void PBKDF2_SHA256_80_128(const uint32_t *tstate, const uint32_t *ostate, const uint32_t *passwd, uint32_t *buf) @@ -406,7 +406,7 @@ unsigned char *scrypt_buffer_alloc() { scratchpad size needs to be at least 63 + (128 * r * p) + (256 * r + 64) + (128 * r * N) bytes r = 1, p = 1, N = 1024 */ -static void scrypt_1024_1_1_256_sp(const uint32_t* input, unsigned char *scratchpad, uint32_t *res) +static void scrypt_1024_1_1_256_sp(const uint32_t* input, uint32_t *res, unsigned char *scratchpad) { uint32_t tstate[8], ostate[8]; uint32_t *V; @@ -422,7 +422,7 @@ static void scrypt_1024_1_1_256_sp(const uint32_t* input, unsigned char *scratch } #ifdef DUAL_SCRYPT -static void dual_scrypt_1024_1_1_256_sp(const uint32_t *input1, const uint32_t *input2, unsigned char *scratchpad, uint32_t *res1, uint32_t *res2) +static void dual_scrypt_1024_1_1_256_sp(const uint32_t *input1, const uint32_t *input2, uint32_t *res1, uint32_t *res2, unsigned char *scratchpad) { uint32_t tstate1[8], tstate2[8], ostate1[8], ostate2[8]; uint32_t *V; @@ -466,17 +466,17 @@ int scanhash_scrypt(int thr_id, unsigned char *pdata, unsigned char *scratchbuf, #ifdef DUAL_SCRYPT if (use_dual) { data2[19] = n++; - dual_scrypt_1024_1_1_256_sp(data, data2, scratchbuf, hash, hash2); + dual_scrypt_1024_1_1_256_sp(data, data2, hash, hash2, scratchbuf); if (hash2[7] <= Htarg) { ((uint32_t *)pdata)[19] = byteswap(data2[19]); *hashes_done = n; return true; } } else { - scrypt_1024_1_1_256_sp(data, scratchbuf, hash); + scrypt_1024_1_1_256_sp(data, hash, scratchbuf); } #else - scrypt_1024_1_1_256_sp(data, scratchbuf, hash); + scrypt_1024_1_1_256_sp(data, hash, scratchbuf); #endif if (hash[7] <= Htarg) {