From 8cdf82eb9f420058fd84b71af7a9d95dbe36750c Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Thu, 9 Jan 2014 13:11:57 -0500 Subject: [PATCH] updated --- .../build/lib.linux-x86_64-2.7/ltc_scrypt.so | Bin 68710 -> 0 bytes .../build/temp.linux-x86_64-2.7/scrypt.o | Bin 60912 -> 0 bytes .../temp.linux-x86_64-2.7/scryptmodule.o | Bin 19456 -> 0 bytes python/litecoin_scrypt-master/scrypt.c | 681 ------------------ python/litecoin_scrypt-master/scrypt.h | 16 - python/litecoin_scrypt-master/scryptmodule.c | 57 -- python/litecoin_scrypt-master/setup.py | 11 - python/util.py | 177 ----- 8 files changed, 942 deletions(-) delete mode 100755 python/litecoin_scrypt-master/build/lib.linux-x86_64-2.7/ltc_scrypt.so delete mode 100644 python/litecoin_scrypt-master/build/temp.linux-x86_64-2.7/scrypt.o delete mode 100644 python/litecoin_scrypt-master/build/temp.linux-x86_64-2.7/scryptmodule.o delete mode 100644 python/litecoin_scrypt-master/scrypt.c delete mode 100644 python/litecoin_scrypt-master/scrypt.h delete mode 100644 python/litecoin_scrypt-master/scryptmodule.c delete mode 100644 python/litecoin_scrypt-master/setup.py delete mode 100644 python/util.py diff --git a/python/litecoin_scrypt-master/build/lib.linux-x86_64-2.7/ltc_scrypt.so b/python/litecoin_scrypt-master/build/lib.linux-x86_64-2.7/ltc_scrypt.so deleted file mode 100755 index ed9ef76fd11885f2318f47ccc73f4bda4860aa81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68710 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 diff --git a/python/litecoin_scrypt-master/build/temp.linux-x86_64-2.7/scrypt.o b/python/litecoin_scrypt-master/build/temp.linux-x86_64-2.7/scrypt.o deleted file mode 100644 index cc563bb5ee6f65af6cff8faa418957ee6b7ecb38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60912 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 -#include -#include - -static __inline uint32_t -be32dec(const void *pp) -{ - const uint8_t *p = (uint8_t const *)pp; - - return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) + - ((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24)); -} - -static __inline void -be32enc(void *pp, uint32_t x) -{ - uint8_t * p = (uint8_t *)pp; - - p[3] = x & 0xff; - p[2] = (x >> 8) & 0xff; - p[1] = (x >> 16) & 0xff; - p[0] = (x >> 24) & 0xff; -} - -static __inline uint32_t -le32dec(const void *pp) -{ - const uint8_t *p = (uint8_t const *)pp; - - return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + - ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); -} - -static __inline void -le32enc(void *pp, uint32_t x) -{ - uint8_t * p = (uint8_t *)pp; - - p[0] = x & 0xff; - p[1] = (x >> 8) & 0xff; - p[2] = (x >> 16) & 0xff; - p[3] = (x >> 24) & 0xff; -} - - -typedef struct SHA256Context { - uint32_t state[8]; - uint32_t count[2]; - unsigned char buf[64]; -} SHA256_CTX; - -typedef struct HMAC_SHA256Context { - SHA256_CTX ictx; - SHA256_CTX octx; -} HMAC_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. - */ -static void -be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len) -{ - size_t i; - - for (i = 0; i < len / 4; i++) - be32enc(dst + i * 4, src[i]); -} - -/* - * Decode a big-endian length len vector of (unsigned char) into a length - * len/4 vector of (uint32_t). Assumes len is a multiple of 4. - */ -static void -be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len) -{ - size_t i; - - for (i = 0; i < len / 4; i++) - dst[i] = be32dec(src + i * 4); -} - -/* Elementary functions used by SHA256 */ -#define Ch(x, y, z) ((x & (y ^ z)) ^ z) -#define Maj(x, y, z) ((x & (y | z)) | (y & z)) -#define SHR(x, n) (x >> n) -#define ROTR(x, n) ((x >> n) | (x << (32 - n))) -#define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) -#define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) -#define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) -#define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) - -/* SHA256 round function */ -#define RND(a, b, c, d, e, f, g, h, k) \ - t0 = h + S1(e) + Ch(e, f, g) + k; \ - t1 = S0(a) + Maj(a, b, c); \ - d += t0; \ - h = t0 + t1; - -/* Adjusted round function for rotating state */ -#define RNDr(S, W, i, k) \ - RND(S[(64 - i) % 8], S[(65 - i) % 8], \ - S[(66 - i) % 8], S[(67 - i) % 8], \ - S[(68 - i) % 8], S[(69 - i) % 8], \ - S[(70 - i) % 8], S[(71 - i) % 8], \ - W[i] + k) - -/* - * SHA256 block compression function. The 256-bit state is transformed via - * the 512-bit input block to produce a new state. - */ -static void -SHA256_Transform(uint32_t * state, const unsigned char block[64]) -{ - uint32_t W[64]; - uint32_t S[8]; - uint32_t t0, t1; - int i; - - /* 1. Prepare message schedule W. */ - be32dec_vect(W, block, 64); - for (i = 16; i < 64; i++) - W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16]; - - /* 2. Initialize working variables. */ - memcpy(S, state, 32); - - /* 3. Mix. */ - RNDr(S, W, 0, 0x428a2f98); - RNDr(S, W, 1, 0x71374491); - RNDr(S, W, 2, 0xb5c0fbcf); - RNDr(S, W, 3, 0xe9b5dba5); - RNDr(S, W, 4, 0x3956c25b); - RNDr(S, W, 5, 0x59f111f1); - RNDr(S, W, 6, 0x923f82a4); - RNDr(S, W, 7, 0xab1c5ed5); - RNDr(S, W, 8, 0xd807aa98); - RNDr(S, W, 9, 0x12835b01); - RNDr(S, W, 10, 0x243185be); - RNDr(S, W, 11, 0x550c7dc3); - RNDr(S, W, 12, 0x72be5d74); - RNDr(S, W, 13, 0x80deb1fe); - RNDr(S, W, 14, 0x9bdc06a7); - RNDr(S, W, 15, 0xc19bf174); - RNDr(S, W, 16, 0xe49b69c1); - RNDr(S, W, 17, 0xefbe4786); - RNDr(S, W, 18, 0x0fc19dc6); - RNDr(S, W, 19, 0x240ca1cc); - RNDr(S, W, 20, 0x2de92c6f); - RNDr(S, W, 21, 0x4a7484aa); - RNDr(S, W, 22, 0x5cb0a9dc); - RNDr(S, W, 23, 0x76f988da); - RNDr(S, W, 24, 0x983e5152); - RNDr(S, W, 25, 0xa831c66d); - RNDr(S, W, 26, 0xb00327c8); - RNDr(S, W, 27, 0xbf597fc7); - RNDr(S, W, 28, 0xc6e00bf3); - RNDr(S, W, 29, 0xd5a79147); - RNDr(S, W, 30, 0x06ca6351); - RNDr(S, W, 31, 0x14292967); - RNDr(S, W, 32, 0x27b70a85); - RNDr(S, W, 33, 0x2e1b2138); - RNDr(S, W, 34, 0x4d2c6dfc); - RNDr(S, W, 35, 0x53380d13); - RNDr(S, W, 36, 0x650a7354); - RNDr(S, W, 37, 0x766a0abb); - RNDr(S, W, 38, 0x81c2c92e); - RNDr(S, W, 39, 0x92722c85); - RNDr(S, W, 40, 0xa2bfe8a1); - RNDr(S, W, 41, 0xa81a664b); - RNDr(S, W, 42, 0xc24b8b70); - RNDr(S, W, 43, 0xc76c51a3); - RNDr(S, W, 44, 0xd192e819); - RNDr(S, W, 45, 0xd6990624); - RNDr(S, W, 46, 0xf40e3585); - RNDr(S, W, 47, 0x106aa070); - RNDr(S, W, 48, 0x19a4c116); - RNDr(S, W, 49, 0x1e376c08); - RNDr(S, W, 50, 0x2748774c); - RNDr(S, W, 51, 0x34b0bcb5); - RNDr(S, W, 52, 0x391c0cb3); - RNDr(S, W, 53, 0x4ed8aa4a); - RNDr(S, W, 54, 0x5b9cca4f); - RNDr(S, W, 55, 0x682e6ff3); - RNDr(S, W, 56, 0x748f82ee); - RNDr(S, W, 57, 0x78a5636f); - RNDr(S, W, 58, 0x84c87814); - RNDr(S, W, 59, 0x8cc70208); - RNDr(S, W, 60, 0x90befffa); - RNDr(S, W, 61, 0xa4506ceb); - RNDr(S, W, 62, 0xbef9a3f7); - RNDr(S, W, 63, 0xc67178f2); - - /* 4. Mix local working variables into global state */ - for (i = 0; i < 8; i++) - state[i] += S[i]; - - /* Clean the stack. */ - memset(W, 0, 256); - memset(S, 0, 32); - t0 = t1 = 0; -} - -static unsigned char PAD[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 -}; - -/* SHA-256 initialization. Begins a SHA-256 operation. */ -static void -SHA256_Init(SHA256_CTX * ctx) -{ - - /* Zero bits processed so far */ - ctx->count[0] = ctx->count[1] = 0; - - /* Magic initialization constants */ - ctx->state[0] = 0x6A09E667; - ctx->state[1] = 0xBB67AE85; - ctx->state[2] = 0x3C6EF372; - ctx->state[3] = 0xA54FF53A; - ctx->state[4] = 0x510E527F; - ctx->state[5] = 0x9B05688C; - ctx->state[6] = 0x1F83D9AB; - ctx->state[7] = 0x5BE0CD19; -} - -/* Add bytes into the hash */ -static void -SHA256_Update(SHA256_CTX * ctx, const void *in, size_t len) -{ - uint32_t bitlen[2]; - uint32_t r; - const unsigned char *src = in; - - /* Number of bytes left in the buffer from previous updates */ - r = (ctx->count[1] >> 3) & 0x3f; - - /* Convert the length into a number of bits */ - bitlen[1] = ((uint32_t)len) << 3; - bitlen[0] = (uint32_t)(len >> 29); - - /* Update number of bits */ - if ((ctx->count[1] += bitlen[1]) < bitlen[1]) - ctx->count[0]++; - ctx->count[0] += bitlen[0]; - - /* Handle the case where we don't need to perform any transforms */ - if (len < 64 - r) { - memcpy(&ctx->buf[r], src, len); - return; - } - - /* Finish the current block */ - memcpy(&ctx->buf[r], src, 64 - r); - SHA256_Transform(ctx->state, ctx->buf); - src += 64 - r; - len -= 64 - r; - - /* Perform complete blocks */ - while (len >= 64) { - SHA256_Transform(ctx->state, src); - src += 64; - len -= 64; - } - - /* Copy left over data into buffer */ - memcpy(ctx->buf, src, len); -} - -/* Add padding and terminating bit-count. */ -static void -SHA256_Pad(SHA256_CTX * ctx) -{ - unsigned char len[8]; - uint32_t r, plen; - - /* - * Convert length to a vector of bytes -- we do this now rather - * than later because the length will change after we pad. - */ - be32enc_vect(len, ctx->count, 8); - - /* Add 1--64 bytes so that the resulting length is 56 mod 64 */ - r = (ctx->count[1] >> 3) & 0x3f; - plen = (r < 56) ? (56 - r) : (120 - r); - SHA256_Update(ctx, PAD, (size_t)plen); - - /* Add the terminating bit-count */ - SHA256_Update(ctx, len, 8); -} - -/* - * SHA-256 finalization. Pads the input data, exports the hash value, - * and clears the context state. - */ -static void -SHA256_Final(unsigned char digest[32], SHA256_CTX * ctx) -{ - - /* Add padding */ - SHA256_Pad(ctx); - - /* Write the hash */ - be32enc_vect(digest, ctx->state, 32); - - /* Clear the context state */ - memset((void *)ctx, 0, sizeof(*ctx)); -} - -/* Initialize an HMAC-SHA256 operation with the given key. */ -static void -HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen) -{ - unsigned char pad[64]; - unsigned char khash[32]; - const unsigned char * K = _K; - size_t i; - - /* If Klen > 64, the key is really SHA256(K). */ - if (Klen > 64) { - SHA256_Init(&ctx->ictx); - SHA256_Update(&ctx->ictx, K, Klen); - SHA256_Final(khash, &ctx->ictx); - K = khash; - Klen = 32; - } - - /* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */ - SHA256_Init(&ctx->ictx); - memset(pad, 0x36, 64); - for (i = 0; i < Klen; i++) - pad[i] ^= K[i]; - SHA256_Update(&ctx->ictx, pad, 64); - - /* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */ - SHA256_Init(&ctx->octx); - memset(pad, 0x5c, 64); - for (i = 0; i < Klen; i++) - pad[i] ^= K[i]; - SHA256_Update(&ctx->octx, pad, 64); - - /* Clean the stack. */ - memset(khash, 0, 32); -} - -/* Add bytes to the HMAC-SHA256 operation. */ -static void -HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void *in, size_t len) -{ - - /* Feed data to the inner SHA256 operation. */ - SHA256_Update(&ctx->ictx, in, len); -} - -/* Finish an HMAC-SHA256 operation. */ -static void -HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX * ctx) -{ - unsigned char ihash[32]; - - /* Finish the inner SHA256 operation. */ - SHA256_Final(ihash, &ctx->ictx); - - /* Feed the inner hash to the outer SHA256 operation. */ - SHA256_Update(&ctx->octx, ihash, 32); - - /* Finish the outer SHA256 operation. */ - SHA256_Final(digest, &ctx->octx); - - /* Clean the stack. */ - memset(ihash, 0, 32); -} - -/** - * 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). - */ -static void -PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt, - size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen) -{ - HMAC_SHA256_CTX PShctx, hctx; - size_t i; - uint8_t ivec[4]; - uint8_t U[32]; - uint8_t T[32]; - uint64_t j; - int k; - size_t clen; - - /* Compute HMAC state after processing P and S. */ - HMAC_SHA256_Init(&PShctx, passwd, passwdlen); - HMAC_SHA256_Update(&PShctx, salt, saltlen); - - /* Iterate through the blocks. */ - for (i = 0; i * 32 < dkLen; i++) { - /* Generate INT(i + 1). */ - be32enc(ivec, (uint32_t)(i + 1)); - - /* Compute U_1 = PRF(P, S || INT(i)). */ - memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX)); - HMAC_SHA256_Update(&hctx, ivec, 4); - HMAC_SHA256_Final(U, &hctx); - - /* T_i = U_1 ... */ - memcpy(T, U, 32); - - for (j = 2; j <= c; j++) { - /* Compute U_j. */ - HMAC_SHA256_Init(&hctx, passwd, passwdlen); - HMAC_SHA256_Update(&hctx, U, 32); - HMAC_SHA256_Final(U, &hctx); - - /* ... xor U_j ... */ - for (k = 0; k < 32; k++) - T[k] ^= U[k]; - } - - /* Copy as many bytes as necessary into buf. */ - clen = dkLen - i * 32; - if (clen > 32) - clen = 32; - memcpy(&buf[i * 32], T, clen); - } - - /* Clean PShctx, since we never called _Final on it. */ - memset(&PShctx, 0, sizeof(HMAC_SHA256_CTX)); -} - - -static void blkcpy(void *, void *, size_t); -static void blkxor(void *, void *, size_t); -static void salsa20_8(uint32_t[16]); -static void blockmix_salsa8(uint32_t *, uint32_t *, uint32_t *, size_t); -static uint64_t integerify(void *, size_t); -static void smix(uint8_t *, size_t, uint64_t, uint32_t *, uint32_t *); - -static void -blkcpy(void * dest, void * src, size_t len) -{ - size_t * D = dest; - size_t * S = src; - size_t L = len / sizeof(size_t); - size_t i; - - for (i = 0; i < L; i++) - D[i] = S[i]; -} - -static void -blkxor(void * dest, void * src, size_t len) -{ - size_t * D = dest; - size_t * S = src; - size_t L = len / sizeof(size_t); - size_t i; - - for (i = 0; i < L; i++) - D[i] ^= S[i]; -} - -/** - * salsa20_8(B): - * Apply the salsa20/8 core to the provided block. - */ -static void -salsa20_8(uint32_t B[16]) -{ - uint32_t x[16]; - size_t i; - - blkcpy(x, B, 64); - for (i = 0; i < 8; i += 2) { -#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b)))) - /* Operate on columns. */ - x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9); - x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18); - - x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9); - x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18); - - x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9); - x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18); - - x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9); - x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18); - - /* Operate on rows. */ - x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9); - x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18); - - x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9); - x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18); - - x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9); - x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18); - - x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9); - x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18); -#undef R - } - for (i = 0; i < 16; i++) - B[i] += x[i]; -} - -/** - * blockmix_salsa8(Bin, Bout, X, r): - * Compute Bout = BlockMix_{salsa20/8, r}(Bin). The input Bin must be 128r - * bytes in length; the output Bout must also be the same size. The - * temporary space X must be 64 bytes. - */ -static void -blockmix_salsa8(uint32_t * Bin, uint32_t * Bout, uint32_t * X, size_t r) -{ - size_t i; - - /* 1: X <-- B_{2r - 1} */ - blkcpy(X, &Bin[(2 * r - 1) * 16], 64); - - /* 2: for i = 0 to 2r - 1 do */ - for (i = 0; i < 2 * r; i += 2) { - /* 3: X <-- H(X \xor B_i) */ - blkxor(X, &Bin[i * 16], 64); - salsa20_8(X); - - /* 4: Y_i <-- X */ - /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ - blkcpy(&Bout[i * 8], X, 64); - - /* 3: X <-- H(X \xor B_i) */ - blkxor(X, &Bin[i * 16 + 16], 64); - salsa20_8(X); - - /* 4: Y_i <-- X */ - /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ - blkcpy(&Bout[i * 8 + r * 16], X, 64); - } -} - -/** - * integerify(B, r): - * Return the result of parsing B_{2r-1} as a little-endian integer. - */ -static uint64_t -integerify(void * B, size_t r) -{ - uint32_t * X = (void *)((uintptr_t)(B) + (2 * r - 1) * 64); - - return (((uint64_t)(X[1]) << 32) + X[0]); -} - -/** - * smix(B, r, N, V, XY): - * Compute B = SMix_r(B, N). The input B must be 128r bytes in length; - * the temporary storage V must be 128rN bytes in length; the temporary - * storage XY must be 256r + 64 bytes in length. The value N must be a - * power of 2 greater than 1. The arrays B, V, and XY must be aligned to a - * multiple of 64 bytes. - */ -static void -smix(uint8_t * B, size_t r, uint64_t N, uint32_t * V, uint32_t * XY) -{ - uint32_t * X = XY; - uint32_t * Y = &XY[32 * r]; - uint32_t * Z = &XY[64 * r]; - uint64_t i; - uint64_t j; - size_t k; - - /* 1: X <-- B */ - for (k = 0; k < 32 * r; k++) - X[k] = le32dec(&B[4 * k]); - - /* 2: for i = 0 to N - 1 do */ - for (i = 0; i < N; i += 2) { - /* 3: V_i <-- X */ - blkcpy(&V[i * (32 * r)], X, 128 * r); - - /* 4: X <-- H(X) */ - blockmix_salsa8(X, Y, Z, r); - - /* 3: V_i <-- X */ - blkcpy(&V[(i + 1) * (32 * r)], Y, 128 * r); - - /* 4: X <-- H(X) */ - blockmix_salsa8(Y, X, Z, r); - } - - /* 6: for i = 0 to N - 1 do */ - for (i = 0; i < N; i += 2) { - /* 7: j <-- Integerify(X) mod N */ - j = integerify(X, r) & (N - 1); - - /* 8: X <-- H(X \xor V_j) */ - blkxor(X, &V[j * (32 * r)], 128 * r); - blockmix_salsa8(X, Y, Z, r); - - /* 7: j <-- Integerify(X) mod N */ - j = integerify(Y, r) & (N - 1); - - /* 8: X <-- H(X \xor V_j) */ - blkxor(Y, &V[j * (32 * r)], 128 * r); - blockmix_salsa8(Y, X, Z, r); - } - - /* 10: B' <-- X */ - for (k = 0; k < 32 * r; k++) - le32enc(&B[4 * k], X[k]); -} - -/* 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 - */ -void scrypt_1024_1_1_256_sp(const char* input, char* output, char* scratchpad) -{ - uint8_t * B; - uint32_t * V; - uint32_t * XY; - uint32_t i; - - const uint32_t N = 1024; - const uint32_t r = 1; - const uint32_t p = 1; - - B = (uint8_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); - XY = (uint32_t *)(B + (128 * r * p)); - V = (uint32_t *)(B + (128 * r * p) + (256 * r + 64)); - - /* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */ - PBKDF2_SHA256((const uint8_t*)input, 80, (const uint8_t*)input, 80, 1, B, p * 128 * r); - - /* 2: for i = 0 to p - 1 do */ - for (i = 0; i < p; i++) { - /* 3: B_i <-- MF(B_i, N) */ - smix(&B[i * 128 * r], r, N, V, XY); - } - - /* 5: DK <-- PBKDF2(P, B, 1, dkLen) */ - PBKDF2_SHA256((const uint8_t*)input, 80, B, p * 128 * r, 1, (uint8_t*)output, 32); -} - -void scrypt_1024_1_1_256(const char* input, char* output) -{ - char scratchpad[131583]; - scrypt_1024_1_1_256_sp(input, output, scratchpad); -} - diff --git a/python/litecoin_scrypt-master/scrypt.h b/python/litecoin_scrypt-master/scrypt.h deleted file mode 100644 index 7fe9b5c..0000000 --- a/python/litecoin_scrypt-master/scrypt.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef SCRYPT_H -#define SCRYPT_H - -#ifdef __cplusplus -extern "C" { -#endif - -void scrypt_1024_1_1_256(const char* input, char* output); -void scrypt_1024_1_1_256_sp(const char* input, char* output, char* scratchpad); -#define scrypt_scratchpad_size 131583; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/python/litecoin_scrypt-master/scryptmodule.c b/python/litecoin_scrypt-master/scryptmodule.c deleted file mode 100644 index eb8faab..0000000 --- a/python/litecoin_scrypt-master/scryptmodule.c +++ /dev/null @@ -1,57 +0,0 @@ -#include - -#include "scrypt.h" - -static PyObject *scrypt_getpowhash(PyObject *self, PyObject *args) -{ - char *output; - PyObject *value; -#if PY_MAJOR_VERSION >= 3 - PyBytesObject *input; -#else - PyStringObject *input; -#endif - if (!PyArg_ParseTuple(args, "S", &input)) - return NULL; - Py_INCREF(input); - output = PyMem_Malloc(32); - -#if PY_MAJOR_VERSION >= 3 - scrypt_1024_1_1_256((char *)PyBytes_AsString((PyObject*) input), output); -#else - scrypt_1024_1_1_256((char *)PyString_AsString((PyObject*) input), output); -#endif - Py_DECREF(input); -#if PY_MAJOR_VERSION >= 3 - value = Py_BuildValue("y#", output, 32); -#else - value = Py_BuildValue("s#", output, 32); -#endif - PyMem_Free(output); - return value; -} - -static PyMethodDef ScryptMethods[] = { - { "getPoWHash", scrypt_getpowhash, METH_VARARGS, "Returns the proof of work hash using scrypt" }, - { NULL, NULL, 0, NULL } -}; - -#if PY_MAJOR_VERSION >= 3 -static struct PyModuleDef ScryptModule = { - PyModuleDef_HEAD_INIT, - "ltc_scrypt", - "...", - -1, - ScryptMethods -}; - -PyMODINIT_FUNC PyInit_ltc_scrypt(void) { - return PyModule_Create(&ScryptModule); -} - -#else - -PyMODINIT_FUNC initltc_scrypt(void) { - (void) Py_InitModule("ltc_scrypt", ScryptMethods); -} -#endif diff --git a/python/litecoin_scrypt-master/setup.py b/python/litecoin_scrypt-master/setup.py deleted file mode 100644 index 8304844..0000000 --- a/python/litecoin_scrypt-master/setup.py +++ /dev/null @@ -1,11 +0,0 @@ -from distutils.core import setup, Extension - -ltc_scrypt_module = Extension('ltc_scrypt', - sources = ['scryptmodule.c', - 'scrypt.c'], - include_dirs=['.']) - -setup (name = 'ltc_scrypt', - version = '1.0', - description = 'Bindings for scrypt proof of work used by Litecoin', - ext_modules = [ltc_scrypt_module]) diff --git a/python/util.py b/python/util.py deleted file mode 100644 index dc164b1..0000000 --- a/python/util.py +++ /dev/null @@ -1,177 +0,0 @@ -import binascii -import struct -from hashlib import sha256 -import ltc_scrypt - -def ser_number(n): - # For encoding nHeight into coinbase - s = bytearray(b'\1') - while n > 127: - s[0] += 1 - s.append(n % 256) - n //= 256 - s.append(n) - return bytes(s) - - - -def ser_string(s): - if len(s) < 253: - return chr(len(s)) + s - elif len(s) < 0x10000: - print "here" - return chr(253) + struct.pack("= 256: - div, mod = divmod(long_value, 256) - result = chr(mod) + result - long_value = div - result = chr(long_value) + result - - nPad = 0 - for c in v: - if c == __b58chars[0]: nPad += 1 - else: break - - result = chr(0)*nPad + result - if length is not None and len(result) != length: - return None - - return result - -def address_to_pubkeyhash(addr): - #try: - addr = b58decode(addr, 25) - #except: - # return None - - if addr is None: - return None - - ver = addr[0] - cksumA = addr[-4:] - cksumB = doublesha(addr[:-4])[:4] - - if cksumA != cksumB: - return None - - return (ver, addr[1:-4]) - -def script_to_address(addr): - d = address_to_pubkeyhash(addr) - if not d: - raise ValueError('invalid address') - (ver, pubkeyhash) = d - print "a - " + binascii.hexlify(pubkeyhash) - return b'\x76\xa9\x14' + pubkeyhash + b'\x88\xac' - - -def ser_uint256(u): - rs = "" - for i in xrange(8): - rs += struct.pack(">= 32 - return rs - -def uint256_from_str(s): - r = 0L - t = struct.unpack("I", u & 0xFFFFFFFFL) - u >>= 32 - return rs - -def reverse_hash(h): - # This only revert byte order, nothing more - if len(h) != 64: - raise Exception('hash must have 64 hexa chars') - - return ''.join([ h[56-i:64-i] for i in range(0, 64, 8) ]) - -def serialize_header(merkle_root_int, ntime_bin, nonce_bin, nVersion, nBits, prevhash_bin): - '''Serialize header for calculating block hash''' - r = struct.pack(">i", nVersion) - r += prevhash_bin - r += ser_uint256_be(merkle_root_int) - r += ntime_bin - r += struct.pack(">I", nBits) - r += nonce_bin - return r - - -def diff_to_target(difficulty): - diff1 = 0x0000ffff00000000000000000000000000000000000000000000000000000000 - return diff1 / difficulty - - - -nonce = "cf280000" -nonce_bin = binascii.unhexlify(nonce) - -bits = "1c013403" -nBits = int(bits, 16) - -ntime = "52ce31b9" -ntime_bin = binascii.unhexlify(ntime) - -merkleroot = "38f3e68be0b74813af175b8da506dfa3c3017ff06fed7ae85e3efee655c9f7fd" - -merkle_root_bin = binascii.unhexlify(merkleroot) -merkle_root_int = uint256_from_str(merkle_root_bin) - - -pbh = "fefbf5b855440b6ac8f742e03558a910969a8232cc0436c59c306e1d493ca917" -prevhash_bin = binascii.unhexlify(reverse_hash(pbh)) - -version = 1 - - - -header_bin = serialize_header(merkle_root_int, ntime_bin, nonce_bin, version, nBits, prevhash_bin) -hash_bin = ''.join([ header_bin[i*4:i*4+4][::-1] for i in range(0, 20) ]) -hash_bin = ltc_scrypt.getPoWHash(hash_bin) -hash_int = uint256_from_str(hash_bin) - -target_user = diff_to_target(16) - -print hash_int -print target_user - -if hash_int > target_user: - print 'bad' -else: - print 'good' - - - -for x in range(0, 10): - source = binascii.unhexlify("38f3e68be0b74813af175b8da506dfa3c3017ff06fed7ae85e3efee655c9f7fd"); - print binascii.hexlify(source) - print "hash " + str(x) + " " + binascii.hexlify(ltc_scrypt.getPoWHash(source)) \ No newline at end of file