From dcc0dda009d41cf4aefe919f39be3e9e39985710 Mon Sep 17 00:00:00 2001 From: Balthazar Date: Sun, 10 Feb 2013 04:23:57 +0000 Subject: [PATCH] Initial commit of NovaCoin changes --- src/pbkdf2.cpp | 146 +++ src/pbkdf2.h | 25 + src/qt/res/icons/novacoin-128.png | Bin 0 -> 27329 bytes src/qt/res/icons/novacoin-16.png | Bin 0 -> 595 bytes src/qt/res/icons/novacoin-32.png | Bin 0 -> 1492 bytes src/qt/res/icons/novacoin-48.png | Bin 0 -> 4873 bytes src/qt/res/icons/novacoin-80.png | Bin 0 -> 15627 bytes src/qt/res/icons/novacoin.ico | Bin 0 -> 15086 bytes src/qt/res/icons/novacoin.png | Bin 0 -> 4873 bytes src/scrypt-x86.S | 915 ++++++++++++++++++ src/scrypt-x86_64.S | 1879 +++++++++++++++++++++++++++++++++++++ src/scrypt_mine.cpp | 208 ++++ src/scrypt_mine.h | 30 + 13 files changed, 3203 insertions(+), 0 deletions(-) create mode 100644 src/pbkdf2.cpp create mode 100644 src/pbkdf2.h create mode 100644 src/qt/res/icons/novacoin-128.png create mode 100644 src/qt/res/icons/novacoin-16.png create mode 100644 src/qt/res/icons/novacoin-32.png create mode 100644 src/qt/res/icons/novacoin-48.png create mode 100644 src/qt/res/icons/novacoin-80.png create mode 100644 src/qt/res/icons/novacoin.ico create mode 100644 src/qt/res/icons/novacoin.png create mode 100644 src/scrypt-x86.S create mode 100644 src/scrypt-x86_64.S create mode 100644 src/scrypt_mine.cpp create mode 100644 src/scrypt_mine.h diff --git a/src/pbkdf2.cpp b/src/pbkdf2.cpp new file mode 100644 index 0000000..facfee5 --- /dev/null +++ b/src/pbkdf2.cpp @@ -0,0 +1,146 @@ +#include +#include "pbkdf2.h" + +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; +} + + + +/* Initialize an HMAC-SHA256 operation with the given key. */ +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 = (const unsigned char *)_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. */ +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. */ +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). + */ +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)); +} + diff --git a/src/pbkdf2.h b/src/pbkdf2.h new file mode 100644 index 0000000..960d45b --- /dev/null +++ b/src/pbkdf2.h @@ -0,0 +1,25 @@ +#ifndef PBKDF2_H +#define PBKDF2_H + +#include +#include + +typedef struct HMAC_SHA256Context { + SHA256_CTX ictx; + SHA256_CTX octx; +} HMAC_SHA256_CTX; + +void +HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen); + +void +HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void *in, size_t len); + +void +HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX * ctx); + +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); + +#endif // PBKDF2_H diff --git a/src/qt/res/icons/novacoin-128.png b/src/qt/res/icons/novacoin-128.png new file mode 100644 index 0000000000000000000000000000000000000000..46d395d70ee29048f7e392603acb3ef6353d3e5d GIT binary patch literal 27329 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 >m_{P|FakGe!mi}^jef}NW= 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 literal 0 HcmV?d00001 diff --git a/src/qt/res/icons/novacoin-32.png b/src/qt/res/icons/novacoin-32.png new file mode 100644 index 0000000000000000000000000000000000000000..7eae52e87bee63b3d8a651a165a1686f1e4114f8 GIT binary patch literal 1492 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 literal 0 HcmV?d00001 diff --git a/src/qt/res/icons/novacoin.ico b/src/qt/res/icons/novacoin.ico new file mode 100644 index 0000000000000000000000000000000000000000..ee62b47e7e7ec146ecc0fd773c487b6f960e507c GIT binary patch literal 15086 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 p+jZBr7CudB&f!pE+mt8FEO96cDB$+0 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 +#include +#include + +#include "scrypt_mine.h" +#include "pbkdf2.h" + +#include "util.h" +#include "net.h" + +extern bool fShutdown; +extern bool fGenerateBitcoins; + +extern CBlockIndex* pindexBest; +extern uint32_t nTransactionsUpdated; + + +#if defined(__x86_64__) + +#define SCRYPT_3WAY +#define SCRYPT_BUFFER_SIZE (3 * 131072 + 63) + +extern "C" int scrypt_best_throughput(); +extern "C" void scrypt_core(uint32_t *X, uint32_t *V); +extern "C" void scrypt_core_2way(uint32_t *X, uint32_t *Y, uint32_t *V); +extern "C" void scrypt_core_3way(uint32_t *X, uint32_t *Y, uint32_t *Z, uint32_t *V); + +#elif defined(__i386__) + +#define SCRYPT_BUFFER_SIZE (131072 + 63) + +extern "C" void scrypt_core(uint32_t *X, uint32_t *V); + +#endif + +void *scrypt_buffer_alloc() { + return malloc(SCRYPT_BUFFER_SIZE); +} + +void scrypt_buffer_free(void *scratchpad) +{ + free(scratchpad); +} + +/* 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 + r = 1, p = 1, N = 1024 + */ + +static void scrypt(const void* input, size_t inputlen, uint32_t *res, void *scratchpad) +{ + uint32_t *V; + uint32_t X[32]; + V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); + + PBKDF2_SHA256((const uint8_t*)input, inputlen, (const uint8_t*)input, sizeof(block_header), 1, (uint8_t *)X, 128); + + scrypt_core(X, V); + + PBKDF2_SHA256((const uint8_t*)input, inputlen, (uint8_t *)X, 128, 1, (uint8_t*)res, 32); +} + +void scrypt_hash(const void* input, size_t inputlen, uint32_t *res, void *scratchpad) +{ + return scrypt(input, inputlen, res, scratchpad); +} + +#ifdef SCRYPT_3WAY +static void scrypt_2way(const void *input1, const void *input2, size_t input1len, size_t input2len, uint32_t *res1, uint32_t *res2, void *scratchpad) +{ + uint32_t *V; + uint32_t X[32], Y[32]; + V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); + + PBKDF2_SHA256((const uint8_t*)input1, input1len, (const uint8_t*)input1, input1len, 1, (uint8_t *)X, 128); + PBKDF2_SHA256((const uint8_t*)input2, input2len, (const uint8_t*)input2, input2len, 1, (uint8_t *)Y, 128); + + scrypt_core_2way(X, Y, V); + + PBKDF2_SHA256((const uint8_t*)input1, input1len, (uint8_t *)X, 128, 1, (uint8_t*)res1, 32); + PBKDF2_SHA256((const uint8_t*)input2, input2len, (uint8_t *)Y, 128, 1, (uint8_t*)res2, 32); +} + +static void scrypt_3way(const void *input1, const void *input2, const void *input3, + size_t input1len, size_t input2len, size_t input3len, uint32_t *res1, uint32_t *res2, uint32_t *res3, + void *scratchpad) +{ + uint32_t *V; + uint32_t X[32], Y[32], Z[32]; + V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); + + PBKDF2_SHA256((const uint8_t*)input1, input1len, (const uint8_t*)input1, input1len, 1, (uint8_t *)X, 128); + PBKDF2_SHA256((const uint8_t*)input2, input2len, (const uint8_t*)input2, input2len, 1, (uint8_t *)Y, 128); + PBKDF2_SHA256((const uint8_t*)input3, input3len, (const uint8_t*)input3, input3len, 1, (uint8_t *)Z, 128); + + scrypt_core_3way(X, Y, Z, V); + + PBKDF2_SHA256((const uint8_t*)input1, input1len, (uint8_t *)X, 128, 1, (uint8_t*)res1, 32); + PBKDF2_SHA256((const uint8_t*)input2, input2len, (uint8_t *)Y, 128, 1, (uint8_t*)res2, 32); + PBKDF2_SHA256((const uint8_t*)input3, input3len, (uint8_t *)Z, 128, 1, (uint8_t*)res3, 32); +} +#endif + +unsigned int scanhash_scrypt(block_header *pdata, void *scratchbuf, + uint32_t max_nonce, uint32_t &hash_count, + void *result, block_header *res_header) +{ + hash_count = 0; + block_header data = *pdata; + uint32_t hash[8]; + unsigned char *hashc = (unsigned char *) &hash; + +#ifdef SCRYPT_3WAY + block_header data2 = *pdata; + uint32_t hash2[8]; + unsigned char *hashc2 = (unsigned char *) &hash2; + + block_header data3 = *pdata; + uint32_t hash3[8]; + unsigned char *hashc3 = (unsigned char *) &hash3; + + int throughput = scrypt_best_throughput(); +#endif + + uint32_t n = 0; + + while (true) { + + data.nonce = n++; + +#ifdef SCRYPT_3WAY + if (throughput >= 2 && n < max_nonce) { + data2.nonce = n++; + if(throughput >= 3) + { + data3.nonce = n++; + scrypt_3way(&data, &data2, &data3, 80, 80, 80, hash, hash2, hash3, scratchbuf); + hash_count += 3; + + if (hashc3[31] == 0 && hashc3[30] == 0) { + memcpy(result, hash3, 32); + *res_header = data3; + + return data3.nonce; + } + } + else + { + scrypt_2way(&data, &data2, 80, 80, hash, hash2, scratchbuf); + hash_count += 2; + } + + if (hashc2[31] == 0 && hashc2[30] == 0) { + memcpy(result, hash2, 32); + + return data2.nonce; + } + } else { + scrypt(&data, 80, hash, scratchbuf); + hash_count += 1; + } +#else + scrypt(&data, 80, hash, scratchbuf); + hash_count += 1; +#endif + if (hashc[31] == 0 && hashc[30] == 0) { + memcpy(result, hash, 32); + + return data.nonce; + } + + if (n >= max_nonce) { + hash_count = 0xffff + 1; + break; + } + } + + return (unsigned int) -1; +} diff --git a/src/scrypt_mine.h b/src/scrypt_mine.h new file mode 100644 index 0000000..58f25f3 --- /dev/null +++ b/src/scrypt_mine.h @@ -0,0 +1,30 @@ +#ifndef SCRYPT_MINE_H +#define SCRYPT_MINE_H + +#include +#include + +#include "util.h" +#include "net.h" + +typedef struct +{ + unsigned int version; + uint256 prev_block; + uint256 merkle_root; + unsigned int timestamp; + unsigned int bits; + unsigned int nonce; + +} block_header; + +void *scrypt_buffer_alloc(); +void scrypt_buffer_free(void *scratchpad); + +unsigned int scanhash_scrypt(block_header *pdata, void *scratchbuf, + uint32_t max_nonce, uint32_t &hash_count, + void *result, block_header *res_header); + +void scrypt_hash(const void* input, size_t inputlen, uint32_t *res, void *scratchpad); + +#endif // SCRYPT_MINE_H -- 1.7.1