diff --git a/blake.c b/blake.c index 3771144..1a9d219 100644 --- a/blake.c +++ b/blake.c @@ -7,7 +7,7 @@ #include "sha3/sph_blake.h" -void blake_hash(const char* input, char* output, unsigned int len) +void blake_hash(const char* input, char* output, uint32_t len) { sph_blake256_context ctx_blake; sph_blake256_init(&ctx_blake); diff --git a/blake.h b/blake.h index d71de08..897a039 100644 --- a/blake.h +++ b/blake.h @@ -5,7 +5,9 @@ extern "C" { #endif -void blake_hash(const char* input, char* output, unsigned int len); +#include + +void blake_hash(const char* input, char* output, uint32_t len); #ifdef __cplusplus } diff --git a/groestl.c b/groestl.c index e1583bf..e827278 100644 --- a/groestl.c +++ b/groestl.c @@ -7,7 +7,7 @@ #include "sha3/sph_groestl.h" #include "sha256.h" -void groestl_hash(const char* input, char* output, unsigned int len) +void groestl_hash(const char* input, char* output, uint32_t len) { char* hash1 = (char*) malloc(64); char* hash2 = (char*) malloc(64); @@ -27,7 +27,7 @@ void groestl_hash(const char* input, char* output, unsigned int len) free(hash2); } -void groestl_myriad_hash(const char* input, char* output, unsigned int len) +void groestl_myriad_hash(const char* input, char* output, uint32_t len) { char* temp = (char*) malloc(64); diff --git a/groestl.h b/groestl.h index a2ff9d9..9f95b80 100644 --- a/groestl.h +++ b/groestl.h @@ -5,8 +5,10 @@ extern "C" { #endif -void groestl_hash(const char* input, char* output, unsigned int len); -void groestl_myriad_hash(const char* input, char* output, unsigned int len); +#include + +void groestl_hash(const char* input, char* output, uint32_t len); +void groestl_myriad_hash(const char* input, char* output, uint32_t len); #ifdef __cplusplus } diff --git a/multihashing.cc b/multihashing.cc index 2da6679..9979b24 100644 --- a/multihashing.cc +++ b/multihashing.cc @@ -1,6 +1,7 @@ #include #include #include +#include extern "C" { #include "bcrypt.h" @@ -13,48 +14,6 @@ extern "C" { #include "x11.h" #include "groestl.h" #include "blake.h" - - - #define max(a,b) (((a) > (b)) ? (a) : (b)) - #define min(a,b) (((a) < (b)) ? (a) : (b)) - unsigned char GetNfactorJane(int nTimestamp, int nChainStartTime, int nMin, int nMax) { - - const unsigned char minNfactor = nMin;//4; - const unsigned char maxNfactor = nMax;//30; - - int l = 0, s, n; - unsigned char N; - - if (nTimestamp <= nChainStartTime) - return 4; - - s = nTimestamp - nChainStartTime; - while ((s >> 1) > 3) { - l += 1; - s >>= 1; - } - - s &= 3; - - n = (l * 170 + s * 25 - 2320) / 100; - - if (n < 0) n = 0; - - if (n > 255) - printf("GetNfactor(%d) - something wrong(n == %d)\n", nTimestamp, n); - - N = (unsigned char)n; - //printf("GetNfactor: %d -> %d %d : %d / %d\n", nTimestamp - nChainStartTime, l, s, n, min(max(N, minNfactor), maxNfactor)); - - return min(max(N, minNfactor), maxNfactor); - } - - void scryptjane_hash(const void* input, size_t inputlen, uint32_t *res, unsigned char Nfactor) - { - return scrypt((const unsigned char*)input, inputlen, - (const unsigned char*)input, inputlen, - Nfactor, 0, 0, (unsigned char*)res, 32); - } } using namespace node; @@ -78,7 +37,7 @@ Handle quark(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; - unsigned int input_len = Buffer::Length(target); + uint32_t input_len = Buffer::Length(target); quark_hash(input, output, input_len); @@ -100,7 +59,7 @@ Handle x11(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; - unsigned int input_len = Buffer::Length(target); + uint32_t input_len = Buffer::Length(target); x11_hash(input, output, input_len); @@ -122,7 +81,9 @@ Handle scrypt(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; - scrypt_1024_1_1_256(input, output); + uint32_t input_len = Buffer::Length(target); + + scrypt_1024_1_1_256(input, output, input_len); Buffer* buff = Buffer::New(output, 32); return scope.Close(buff->handle_); @@ -147,10 +108,12 @@ Handle scryptn(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; + uint32_t input_len = Buffer::Length(target); + //unsigned int N = 1 << (getNfactor(input) + 1); unsigned int N = 1 << nFactor; - scrypt_N_1_1_256(input, output, N); + scrypt_N_1_1_256(input, output, N, input_len); Buffer* buff = Buffer::New(output, 32); @@ -183,7 +146,9 @@ Handle scryptjane(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; - scryptjane_hash(input, 80, (uint32_t *)output, GetNfactorJane(timestamp, nChainStartTime, nMin, nMax)); + uint32_t input_len = Buffer::Length(target); + + scryptjane_hash(input, input_len, (uint32_t *)output, GetNfactorJane(timestamp, nChainStartTime, nMin, nMax)); Buffer* buff = Buffer::New(output, 32); return scope.Close(buff->handle_); @@ -246,7 +211,7 @@ Handle skein(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; - unsigned int input_len = Buffer::Length(target); + uint32_t input_len = Buffer::Length(target); skein_hash(input, output, input_len); @@ -269,7 +234,7 @@ Handle groestl(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; - unsigned int input_len = Buffer::Length(target); + uint32_t input_len = Buffer::Length(target); groestl_hash(input, output, input_len); @@ -292,7 +257,7 @@ Handle groestl_myriad(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; - unsigned int input_len = Buffer::Length(target); + uint32_t input_len = Buffer::Length(target); groestl_myriad_hash(input, output, input_len); @@ -315,7 +280,7 @@ Handle blake(const Arguments& args) { char * input = Buffer::Data(target); char * output = new char[32]; - unsigned int input_len = Buffer::Length(target); + uint32_t input_len = Buffer::Length(target); blake_hash(input, output, input_len); diff --git a/quark.c b/quark.c index 35f6795..498e08f 100644 --- a/quark.c +++ b/quark.c @@ -85,7 +85,7 @@ le32enc(void *pp, uint32_t x) * (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) +be32enc_vect(unsigned char *dst, const uint32_t *src, uint32_t len) { size_t i; @@ -98,7 +98,7 @@ be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len) * 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) +be32dec_vect(uint32_t *dst, const unsigned char *src, uint32_t len) { size_t i; @@ -106,7 +106,7 @@ be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len) dst[i] = be32dec(src + i * 4); } -void quark_hash(const char* input, char* output, unsigned int len) +void quark_hash(const char* input, char* output, uint32_t len) { sph_blake512_context ctx_blake; sph_bmw512_context ctx_bmw; diff --git a/quark.h b/quark.h index 6f9f762..a32af12 100644 --- a/quark.h +++ b/quark.h @@ -1,6 +1,16 @@ #ifndef QUARK_H #define QUARK_H -void quark_hash(const char* input, char* output, unsigned int len); +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void quark_hash(const char* input, char* output, uint32_t len); + +#ifdef __cplusplus +} +#endif #endif diff --git a/scrypt.c b/scrypt.c index 096a2f5..32139ff 100644 --- a/scrypt.c +++ b/scrypt.c @@ -223,7 +223,7 @@ smix(uint8_t * B, size_t r, uint64_t N, uint32_t * V, uint32_t * XY) /* 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) +void scrypt_1024_1_1_256_sp(const char* input, char* output, char* scratchpad, size_t len) { uint8_t * B; uint32_t * V; @@ -239,7 +239,7 @@ void scrypt_1024_1_1_256_sp(const char* input, char* output, char* scratchpad) 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); + PBKDF2_SHA256((const uint8_t*)input, len, (const uint8_t*)input, len, 1, B, p * 128 * r); /* 2: for i = 0 to p - 1 do */ for (i = 0; i < p; i++) { @@ -251,8 +251,8 @@ void scrypt_1024_1_1_256_sp(const char* input, char* output, char* scratchpad) 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) +void scrypt_1024_1_1_256(const char* input, char* output, size_t len) { char scratchpad[131583]; - scrypt_1024_1_1_256_sp(input, output, scratchpad); + scrypt_1024_1_1_256_sp(input, output, scratchpad, len); } diff --git a/scrypt.h b/scrypt.h index ece0134..1a4ed05 100644 --- a/scrypt.h +++ b/scrypt.h @@ -1,8 +1,10 @@ #ifndef SCRYPT_H #define SCRYPT_H -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); +#include + +void scrypt_1024_1_1_256(const char* input, char* output, size_t len); +void scrypt_1024_1_1_256_sp(const char* input, char* output, char* scratchpad, size_t len); #define scrypt_scratchpad_size 131583; #endif \ No newline at end of file diff --git a/scryptjane.c b/scryptjane.c index ca4f1aa..f2f688f 100644 --- a/scryptjane.c +++ b/scryptjane.c @@ -180,3 +180,44 @@ scrypt(const uint8_t *password, size_t password_len, const uint8_t *salt, size_t scrypt_free(&V); scrypt_free(&YX); } + +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#define min(a,b) (((a) < (b)) ? (a) : (b)) +unsigned char GetNfactorJane(int nTimestamp, int nChainStartTime, int nMin, int nMax) { + + const unsigned char minNfactor = nMin;//4; + const unsigned char maxNfactor = nMax;//30; + + int l = 0, s, n; + unsigned char N; + + if (nTimestamp <= nChainStartTime) + return 4; + + s = nTimestamp - nChainStartTime; + while ((s >> 1) > 3) { + l += 1; + s >>= 1; + } + + s &= 3; + + n = (l * 170 + s * 25 - 2320) / 100; + + if (n < 0) n = 0; + + if (n > 255) + printf("GetNfactor(%d) - something wrong(n == %d)\n", nTimestamp, n); + + N = (unsigned char)n; + //printf("GetNfactor: %d -> %d %d : %d / %d\n", nTimestamp - nChainStartTime, l, s, n, min(max(N, minNfactor), maxNfactor)); + + return min(max(N, minNfactor), maxNfactor); +} + +void scryptjane_hash(const void* input, size_t inputlen, uint32_t *res, unsigned char Nfactor) +{ + return scrypt((const unsigned char*)input, inputlen, + (const unsigned char*)input, inputlen, + Nfactor, 0, 0, (unsigned char*)res, 32); +} diff --git a/scryptjane.h b/scryptjane.h index 00a28dd..cd415e4 100644 --- a/scryptjane.h +++ b/scryptjane.h @@ -1,6 +1,7 @@ #ifndef SCRYPT_JANE_H #define SCRYPT_JANE_H +#include #define SCRYPT_KECCAK512 #define SCRYPT_CHACHA @@ -29,4 +30,7 @@ void scrypt_set_fatal_error(scrypt_fatal_errorfn fn); void scrypt(const unsigned char *password, size_t password_len, const unsigned char *salt, size_t salt_len, unsigned char Nfactor, unsigned char rfactor, unsigned char pfactor, unsigned char *out, size_t bytes); +unsigned char GetNfactorJane(int nTimestamp, int nChainStartTime, int nMin, int nMax); +void scryptjane_hash(const void* input, size_t inputlen, uint32_t *res, unsigned char Nfactor); + #endif /* SCRYPT_JANE_H */ diff --git a/scryptn.c b/scryptn.c index 11623dc..9c89d1c 100644 --- a/scryptn.c +++ b/scryptn.c @@ -32,436 +32,7 @@ #include #include "scryptn.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; -} - -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)); -} - +#include "sha256.h" static void blkcpy(void *, void *, size_t); static void blkxor(void *, void *, size_t); @@ -646,7 +217,7 @@ smix(uint8_t * B, size_t r, uint64_t N, uint32_t * V, uint32_t * XY) /* 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_N_1_1_256_sp(const char* input, char* output, char* scratchpad, uint32_t N) +void scrypt_N_1_1_256_sp(const char* input, char* output, char* scratchpad, uint32_t N, size_t len) { uint8_t * B; uint32_t * V; @@ -662,7 +233,7 @@ void scrypt_N_1_1_256_sp(const char* input, char* output, char* scratchpad, uint 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); + PBKDF2_SHA256((const uint8_t*)input, len, (const uint8_t*)input, len, 1, B, p * 128 * r); /* 2: for i = 0 to p - 1 do */ for (i = 0; i < p; i++) { @@ -674,14 +245,14 @@ void scrypt_N_1_1_256_sp(const char* input, char* output, char* scratchpad, uint PBKDF2_SHA256((const uint8_t*)input, 80, B, p * 128 * r, 1, (uint8_t*)output, 32); } -void scrypt_N_1_1_256(const char* input, char* output, uint32_t N) +void scrypt_N_1_1_256(const char* input, char* output, uint32_t N, size_t len) { //char scratchpad[131583]; char *scratchpad; // align on 4 byte boundary scratchpad = (char*)malloc(128*N + 512); - scrypt_N_1_1_256_sp(input, output, scratchpad, N); + scrypt_N_1_1_256_sp(input, output, scratchpad, N, len); free(scratchpad); } diff --git a/scryptn.h b/scryptn.h index 079f55e..3e754fa 100644 --- a/scryptn.h +++ b/scryptn.h @@ -5,8 +5,8 @@ extern "C" { #endif -void scrypt_N_1_1_256(const char* input, char* output, uint32_t N); -void scrypt_N_1_1_256_sp(const char* input, char* output, char* scratchpad, uint32_t N); +void scrypt_N_1_1_256(const char* input, char* output, uint32_t N, size_t len); +void scrypt_N_1_1_256_sp(const char* input, char* output, char* scratchpad, uint32_t N, size_t len); //const int scrypt_scratchpad_size = 131583; #ifdef __cplusplus diff --git a/skein.c b/skein.c index db323b2..38fba74 100644 --- a/skein.c +++ b/skein.c @@ -9,7 +9,7 @@ #include -void skein_hash(const char* input, char* output, unsigned int len) +void skein_hash(const char* input, char* output, uint32_t len) { char* temp = (char*) malloc(64); diff --git a/skein.h b/skein.h index f07fe72..47ea56c 100644 --- a/skein.h +++ b/skein.h @@ -5,7 +5,9 @@ extern "C" { #endif -void skein_hash(const char* input, char* output, unsigned int len); +#include + +void skein_hash(const char* input, char* output, uint32_t len); #ifdef __cplusplus } diff --git a/x11.c b/x11.c index badf8d9..113e4d5 100644 --- a/x11.c +++ b/x11.c @@ -17,7 +17,7 @@ #include "sha3/sph_echo.h" -void x11_hash(const char* input, char* output, unsigned int len) +void x11_hash(const char* input, char* output, uint32_t len) { sph_blake512_context ctx_blake; sph_bmw512_context ctx_bmw; diff --git a/x11.h b/x11.h index f2845bb..1622f13 100644 --- a/x11.h +++ b/x11.h @@ -5,7 +5,7 @@ extern "C" { #endif -void x11_hash(const char* input, char* output, unsigned int len); +void x11_hash(const char* input, char* output, uint32_t len); #ifdef __cplusplus }