From 06c095e064b6fcf6fa609dc7b769bd0e60ac8336 Mon Sep 17 00:00:00 2001 From: Scott Alfter Date: Tue, 4 Jun 2013 12:35:55 -0700 Subject: [PATCH] incorporated compressed OpenCL generation from https://github.com/scintill/vanitygen/branches/compressed_opencl --- calc_addrs.cl | 81 +++++++++++++++++++++++++++++++++----------------- oclengine.c | 3 ++ oclvanitygen.c | 15 +++++++++- pattern.c | 2 +- 4 files changed, 72 insertions(+), 29 deletions(-) diff --git a/calc_addrs.cl b/calc_addrs.cl index 39f087f..82ff04b 100644 --- a/calc_addrs.cl +++ b/calc_addrs.cl @@ -67,7 +67,7 @@ * Steps: * - Compute Px = Pxj * (1/Pz)^2 * - Compute Py = Pyj * (1/Pz)^3 - * - Compute H = RIPEMD160(SHA256(0x04 | Px | Py)) + * - Compute H = RIPEMD160(SHA256({0x02|0x03|0x04} | Px | Py?)) * * Output: * - Array of 20-byte address hash values @@ -94,6 +94,13 @@ #define load_be32(v) bswap32(v) #endif +/* Configuration -- maybe I shouldn't be passing this in preproc */ +#ifdef COMPRESSED_ADDRESS + __constant bool compressed_address = 1; +#else + __constant bool compressed_address = 0; +#endif + /* * Loop unrolling macros * @@ -1234,7 +1241,7 @@ hash_ec_point(uint *hash_out, __global bn_word *xy, __global bn_word *zip) bn_mul_mont(&c, &c, &zzi); /* X / Z^2 */ bn_from_mont(&c, &c); - wh = 0x00000004; /* POINT_CONVERSION_UNCOMPRESSED */ + wh = compressed_address ? 0x00000002 : 0x00000004; /* POINT_CONVERSION_[UN]COMPRESSED */ #define hash_ec_point_inner_3(i) \ wl = wh; \ @@ -1253,12 +1260,30 @@ hash_ec_point(uint *hash_out, __global bn_word *xy, __global bn_word *zip) bn_mul_mont(&c, &c, &zzi); /* Y / Z^3 */ bn_from_mont(&c, &c); -#define hash_ec_point_inner_5(i) \ - wl = wh; \ - wh = c.d[(BN_NWORDS - 1) - i]; \ - hash1[BN_NWORDS + i] = (wl << 24) | (wh >> 8); + if (!compressed_address) { + #define hash_ec_point_inner_5(i) \ + wl = wh; \ + wh = c.d[(BN_NWORDS - 1) - i]; \ + hash1[BN_NWORDS + i] = (wl << 24) | (wh >> 8); - bn_unroll(hash_ec_point_inner_5); + bn_unroll(hash_ec_point_inner_5); + } else { + if (bn_is_odd(c)) { + hash1[0] |= 0x01000000; /* 0x03 for odd y */ + } + + /* + * Put in the last byte + SHA-2 padding. + */ + hash1[8] = wh << 24 | 0x800000; + hash1[9] = 0; + hash1[10] = 0; + hash1[11] = 0; + hash1[12] = 0; + hash1[13] = 0; + hash1[14] = 0; + hash1[15] = 33 * 8; + } /* * Hash the first 64 bytes of the buffer @@ -1266,26 +1291,28 @@ hash_ec_point(uint *hash_out, __global bn_word *xy, __global bn_word *zip) sha2_256_init(hash2); sha2_256_block(hash2, hash1); - /* - * Hash the last byte of the buffer + SHA-2 padding - */ - hash1[0] = wh << 24 | 0x800000; - hash1[1] = 0; - hash1[2] = 0; - hash1[3] = 0; - hash1[4] = 0; - hash1[5] = 0; - hash1[6] = 0; - hash1[7] = 0; - hash1[8] = 0; - hash1[9] = 0; - hash1[10] = 0; - hash1[11] = 0; - hash1[12] = 0; - hash1[13] = 0; - hash1[14] = 0; - hash1[15] = 65 * 8; - sha2_256_block(hash2, hash1); + if (!compressed_address) { + /* + * Hash the last byte of the buffer + SHA-2 padding + */ + hash1[0] = wh << 24 | 0x800000; + hash1[1] = 0; + hash1[2] = 0; + hash1[3] = 0; + hash1[4] = 0; + hash1[5] = 0; + hash1[6] = 0; + hash1[7] = 0; + hash1[8] = 0; + hash1[9] = 0; + hash1[10] = 0; + hash1[11] = 0; + hash1[12] = 0; + hash1[13] = 0; + hash1[14] = 0; + hash1[15] = 65 * 8; + sha2_256_block(hash2, hash1); + } /* * Hash the SHA-2 result with RIPEMD160 diff --git a/oclengine.c b/oclengine.c index 4a6a232..d93329e 100644 --- a/oclengine.c +++ b/oclengine.c @@ -933,6 +933,9 @@ vg_ocl_init(vg_context_t *vcp, vg_ocl_context_t *vocp, cl_device_id did, if (vocp->voc_quirks & VG_OCL_AMD_BFI_INT) end += snprintf(optbuf + end, sizeof(optbuf) - end, "-DAMD_BFI_INT "); + if (vcp->vc_compressed) + end += snprintf(optbuf + end, sizeof(optbuf) - end, + "-DCOMPRESSED_ADDRESS"); if (vocp->voc_quirks & VG_OCL_NV_VERBOSE) end += snprintf(optbuf + end, sizeof(optbuf) - end, "-cl-nv-verbose "); diff --git a/oclvanitygen.c b/oclvanitygen.c index 9755ef6..aa8c24d 100644 --- a/oclvanitygen.c +++ b/oclvanitygen.c @@ -60,6 +60,7 @@ usage(const char *name) "-N Generate namecoin address\n" "-T Generate bitcoin testnet address\n" "-X Generate address with the given version\n" +"-F Generate address with the given format (pubkey, compressed)\n" "-e Encrypt private keys, prompt for password\n" "-E Encrypt private keys with (UNSAFE)\n" "-p Select OpenCL platform\n" @@ -119,11 +120,12 @@ main(int argc, char **argv) int pattfpi[MAX_FILE]; int npattfp = 0; int pattstdin = 0; + int compressed = 0; int i; while ((opt = getopt(argc, argv, - "vqik1NTX:eE:p:P:d:w:t:g:b:VSh?f:o:s:D:")) != -1) { + "vqik1NTX:F:eE:p:P:d:w:t:g:b:VSh?f:o:s:D:")) != -1) { switch (opt) { case 'v': verbose = 2; @@ -152,6 +154,16 @@ main(int argc, char **argv) addrtype = atoi(optarg); privtype = 128 + addrtype; break; + case 'F': + if (!strcmp(optarg, "compressed")) + compressed = 1; + else + if (strcmp(optarg, "pubkey")) { + fprintf(stderr, + "Invalid format '%s'\n", optarg); + return 1; + } + break; case 'e': prompt_password = 1; break; @@ -330,6 +342,7 @@ main(int argc, char **argv) caseinsensitive); } + vcp->vc_compressed = compressed; vcp->vc_verbose = verbose; vcp->vc_result_file = result_file; vcp->vc_remove_on_match = remove_on_match; diff --git a/pattern.c b/pattern.c index b925a47..8c499b4 100644 --- a/pattern.c +++ b/pattern.c @@ -256,7 +256,7 @@ vg_exec_context_calc_address(vg_exec_context_t *vxcp) } len = EC_POINT_point2oct(pgroup, pubkey, - POINT_CONVERSION_UNCOMPRESSED, + vxcp->vxc_vc->vc_compressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED, eckey_buf, sizeof(eckey_buf), vxcp->vxc_bnctx);