Permalink
Browse files

Add skein support

  • Loading branch information...
1 parent a7c444d commit e68cb6e432df16b8f04b0d2e3df5dee5378417b9 @lucasjones lucasjones committed Apr 23, 2014
Showing with 95 additions and 2 deletions.
  1. +2 −0 .gitattributes
  2. +1 −1 Makefile.am
  3. +10 −1 cpu-miner.c
  4. +3 −0 miner.h
  5. +79 −0 skein.c
View
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
View
@@ -18,7 +18,7 @@ dist_man_MANS = minerd.1
minerd_SOURCES = elist.h miner.h compat.h \
cpu-miner.c util.c \
sha2.c scrypt.c keccak.c \
- heavy.c quark.c \
+ heavy.c quark.c skein.c \
sha3/sph_keccak.c \
sha3/sph_hefty1.c \
sha3/sph_groestl.c \
View
@@ -106,14 +106,16 @@ enum sha256_algos {
ALGO_KECCAK, /* Keccak */
ALGO_HEAVY, /* Heavy */
ALGO_QUARK, /* Quark */
+ ALGO_SKEIN, /* Skein */
};
static const char *algo_names[] = {
[ALGO_SCRYPT] = "scrypt",
[ALGO_SHA256D] = "sha256d",
[ALGO_KECCAK] = "keccak",
[ALGO_HEAVY] = "heavy",
- [ALGO_QUARK] = "quark"
+ [ALGO_QUARK] = "quark",
+ [ALGO_SKEIN] = "skein",
};
bool opt_debug = false;
@@ -175,7 +177,9 @@ Options:\n\
scrypt scrypt(1024, 1, 1) (default)\n\
sha256d SHA-256d\n\
keccak Keccak\n\
+ quark Quark\n\
heavy Heavy\n\
+ skein Skein\n\
-o, --url=URL URL of mining server\n\
-O, --userpass=U:P username:password pair for mining server\n\
-u, --user=USERNAME username for mining server\n\
@@ -806,6 +810,11 @@ static void *miner_thread(void *userdata)
rc = scanhash_quark(thr_id, work.data, work.target,
max_nonce, &hashes_done);
break;
+
+ case ALGO_SKEIN:
+ rc = scanhash_skein(thr_id, work.data, work.target,
+ max_nonce, &hashes_done);
+ break;
default:
/* should never happen */
View
@@ -165,6 +165,9 @@ extern int scanhash_heavy(int thr_id, uint32_t *pdata, const uint32_t *ptarget,
extern int scanhash_quark(int thr_id, uint32_t *pdata, const uint32_t *ptarget,
uint32_t max_nonce, unsigned long *hashes_done);
+extern int scanhash_skein(int thr_id, uint32_t *pdata, const uint32_t *ptarget,
+ uint32_t max_nonce, unsigned long *hashes_done);
+
struct thr_info {
int id;
pthread_t pth;
View
@@ -0,0 +1,79 @@
+#include "cpuminer-config.h"
+#include "miner.h"
+
+#include <string.h>
+#include <stdint.h>
+
+#include <openssl/sha.h>
+
+#include "sha3/sph_skein.h"
+
+static void skeinhash(void *state, const void *input)
+{
+ sph_skein512_context ctx_skein;
+ static unsigned char pblank[1];
+
+ uint32_t mask = 8;
+ uint32_t zero = 0;
+
+ //these uint512 in the c++ source of the client are backed by an array of uint32
+ uint32_t hashA[16], hashB[16];
+
+ sph_skein512_init(&ctx_skein);
+ sph_skein512 (&ctx_skein, input, 80); //6
+ sph_skein512_close(&ctx_skein, hashA); //7
+
+ SHA256_CTX sha256;
+ SHA256_Init(&sha256);
+ SHA256_Update(&sha256, hashA, 64);
+ SHA256_Final(hashB, &sha256);
+
+ memcpy(state, hashB, 32);
+
+
+/* int ii;
+ printf("result: ");
+ for (ii=0; ii < 32; ii++)
+ {
+ printf ("%.2x",((uint8_t*)state)[ii]);
+ };
+ printf ("\n");
+*/
+}
+
+int scanhash_skein(int thr_id, uint32_t *pdata, const uint32_t *ptarget,
+ uint32_t max_nonce, unsigned long *hashes_done)
+{
+ uint32_t n = pdata[19] - 1;
+ const uint32_t first_nonce = pdata[19];
+ const uint32_t Htarg = ptarget[7];
+
+ uint32_t hash64[8] __attribute__((aligned(32)));
+ uint32_t endiandata[32];
+
+ //char testdata[] = {"\x70\x00\x00\x00\x5d\x38\x5b\xa1\x14\xd0\x79\x97\x0b\x29\xa9\x41\x8f\xd0\x54\x9e\x7d\x68\xa9\x5c\x7f\x16\x86\x21\xa3\x14\x20\x10\x00\x00\x00\x00\x57\x85\x86\xd1\x49\xfd\x07\xb2\x2f\x3a\x8a\x34\x7c\x51\x6d\xe7\x05\x2f\x03\x4d\x2b\x76\xff\x68\xe0\xd6\xec\xff\x9b\x77\xa4\x54\x89\xe3\xfd\x51\x17\x32\x01\x1d\xf0\x73\x10\x00"};
+
+ //we need bigendian data...
+ //lessons learned: do NOT endianchange directly in pdata, this will all proof-of-works be considered as stale from minerd....
+ int kk=0;
+ for (; kk < 32; kk++)
+ {
+ be32enc(&endiandata[kk], ((uint32_t*)pdata)[kk]);
+ };
+
+ do {
+
+ pdata[19] = ++n;
+ be32enc(&endiandata[19], n);
+ skeinhash(hash64, &endiandata);
+ if (((hash64[7]&0xFFFFFF00)==0) &&
+ fulltest(hash64, ptarget)) {
+ *hashes_done = n - first_nonce + 1;
+ return true;
+ }
+ } while (n < max_nonce && !work_restart[thr_id].restart);
+
+ *hashes_done = n - first_nonce + 1;
+ pdata[19] = n;
+ return 0;
+}

0 comments on commit e68cb6e

Please sign in to comment.