Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove exact match requirement #91

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,13 @@ Pattern: 1Love
Address: 1LoveRg5t2NCDLUZh6Q8ixv74M5YGVxXaN
Privkey: 5JLUmjZiirgziDmWmNprPsNx8DYwfecUNk1FQXmDPaoKB36fX1o

example for a peercoin address generation is:
$ ./vanitygen -G PFuzzy
Difficulty: 264104224
Pattern: PFuzzy
Address: PFuzzyiHvUuwh6VbUTy2PXGqDtFA3kUcZQ
Privkey: 78yCPnuXLe8cD2PUjjy1iq23WbSPhw3cp1aLiGHZz9Df9uZGKgg

Currently, it is difficult to import the private key into bitcoin.
Sipa's showwallet branch has a new command called "importprivkey" that
accepts the base-58 encoded private key. Vanitygen has been tested to
Expand Down
7 changes: 6 additions & 1 deletion oclvanitygen.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ usage(const char *name)
"-k Keep pattern and continue search after finding a match\n"
"-1 Stop after first match\n"
"-N Generate namecoin address\n"
"-G Generate Peercoin address\n"
"-T Generate bitcoin testnet address\n"
"-X <version> Generate address with the given version\n"
"-e Encrypt private keys, prompt for password\n"
Expand Down Expand Up @@ -123,7 +124,7 @@ main(int argc, char **argv)
int i;

while ((opt = getopt(argc, argv,
"vqik1NTX:eE:p:P:d:w:t:g:b:VSh?f:o:s:D:")) != -1) {
"vqik1NGTX:eE:p:P:d:w:t:g:b:VSh?f:o:s:D:")) != -1) {
switch (opt) {
case 'v':
verbose = 2;
Expand All @@ -144,6 +145,10 @@ main(int argc, char **argv)
addrtype = 52;
privtype = 180;
break;
case 'G':
addrtype = 55;
privtype = 183;
break;
case 'T':
addrtype = 111;
privtype = 239;
Expand Down
20 changes: 16 additions & 4 deletions pattern.c
Original file line number Diff line number Diff line change
Expand Up @@ -528,9 +528,14 @@ vg_output_match_console(vg_context_t *vcp, EC_KEY *pkey, const char *pattern)
}

assert(EC_KEY_check_key(pkey));
vg_encode_address(ppnt,
EC_KEY_get0_group(pkey),
vcp->vc_pubkeytype, addr_buf);
if (vcp->vc_compressed)
vg_encode_address_compressed(ppnt,
EC_KEY_get0_group(pkey),
vcp->vc_pubkeytype, addr_buf);
else
vg_encode_address(ppnt,
EC_KEY_get0_group(pkey),
vcp->vc_pubkeytype, addr_buf);
if (isscript)
vg_encode_script_address(ppnt,
EC_KEY_get0_group(pkey),
Expand All @@ -550,7 +555,10 @@ vg_output_match_console(vg_context_t *vcp, EC_KEY *pkey, const char *pattern)
}
}
if (!vcp->vc_key_protect_pass) {
vg_encode_privkey(pkey, vcp->vc_privtype, privkey_buf);
if (vcp->vc_compressed)
vg_encode_privkey_compressed(pkey, vcp->vc_privtype, privkey_buf);
else
vg_encode_privkey(pkey, vcp->vc_privtype, privkey_buf);
}

if (!vcp->vc_result_file || (vcp->vc_verbose > 0)) {
Expand Down Expand Up @@ -1401,6 +1409,10 @@ vg_prefix_context_add_patterns(vg_context_t *vcp,
ats = "namecoin";
bw = "\"M\" or \"N\"";
break;
case 55:
ats = "peercoin";
bw = "\"P\"";
break;
default:
break;
}
Expand Down
1 change: 1 addition & 0 deletions pattern.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ enum vg_format {

/* Application-level context, incl. parameters and global pattern store */
struct _vg_context_s {
int vc_compressed;
int vc_addrtype;
int vc_privtype;
unsigned long vc_npatterns;
Expand Down
44 changes: 44 additions & 0 deletions util.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,30 @@ vg_encode_address(const EC_POINT *ppoint, const EC_GROUP *pgroup,
vg_b58_encode_check(binres, sizeof(binres), result);
}

void
vg_encode_address_compressed(const EC_POINT *ppoint, const EC_GROUP *pgroup,
int addrtype, char *result)
{
unsigned char eckey_buf[128], *pend;
unsigned char binres[21] = {0,};
unsigned char hash1[32];

pend = eckey_buf;

EC_POINT_point2oct(pgroup,
ppoint,
POINT_CONVERSION_COMPRESSED,
eckey_buf,
sizeof(eckey_buf),
NULL);
pend = eckey_buf + 0x21;
binres[0] = addrtype;
SHA256(eckey_buf, pend - eckey_buf, hash1);
RIPEMD160(hash1, sizeof(hash1), &binres[1]);

vg_b58_encode_check(binres, sizeof(binres), result);
}

void
vg_encode_script_address(const EC_POINT *ppoint, const EC_GROUP *pgroup,
int addrtype, char *result)
Expand Down Expand Up @@ -306,6 +330,26 @@ vg_encode_privkey(const EC_KEY *pkey, int addrtype, char *result)
vg_b58_encode_check(eckey_buf, 33, result);
}

void
vg_encode_privkey_compressed(const EC_KEY *pkey, int addrtype, char *result)
{
unsigned char eckey_buf[128];
const BIGNUM *bn;
int nbytes;

bn = EC_KEY_get0_private_key(pkey);

eckey_buf[0] = addrtype;
nbytes = BN_num_bytes(bn);
assert(nbytes <= 32);
if (nbytes < 32)
memset(eckey_buf + 1, 0, 32 - nbytes);
BN_bn2bin(bn, &eckey_buf[33 - nbytes]);
eckey_buf[nbytes+1] = 1;

vg_b58_encode_check(eckey_buf, 34, result);
}

int
vg_set_privkey(const BIGNUM *bnpriv, EC_KEY *pkey)
{
Expand Down
3 changes: 3 additions & 0 deletions util.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,13 @@ extern int vg_b58_decode_check(const char *input, void *buf, size_t len);

extern void vg_encode_address(const EC_POINT *ppoint, const EC_GROUP *pgroup,
int addrtype, char *result);
extern void vg_encode_address_compressed(const EC_POINT *ppoint, const EC_GROUP *pgroup,
int addrtype, char *result);
extern void vg_encode_script_address(const EC_POINT *ppoint,
const EC_GROUP *pgroup,
int addrtype, char *result);
extern void vg_encode_privkey(const EC_KEY *pkey, int addrtype, char *result);
extern void vg_encode_privkey_compressed(const EC_KEY *pkey, int addrtype, char *result);
extern int vg_set_privkey(const BIGNUM *bnpriv, EC_KEY *pkey);
extern int vg_decode_privkey(const char *b58encoded,
EC_KEY *pkey, int *addrtype);
Expand Down
35 changes: 28 additions & 7 deletions vanitygen.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ vg_thread_loop(void *arg)

} else {
eckey_buf = hash_buf;
hash_len = 65;
hash_len = (vcp->vc_compressed)?33:65;
}

while (!vcp->vc_halt) {
Expand Down Expand Up @@ -194,11 +194,11 @@ vg_thread_loop(void *arg)
for (i = 0; i < nbatch; i++, vxcp->vxc_delta++) {
/* Hash the public key */
len = EC_POINT_point2oct(pgroup, ppnt[i],
POINT_CONVERSION_UNCOMPRESSED,
(vcp->vc_compressed)?POINT_CONVERSION_COMPRESSED:POINT_CONVERSION_UNCOMPRESSED,
eckey_buf,
65,
(vcp->vc_compressed)?33:65,
vxcp->vxc_bnctx);
assert(len == 65);
assert(len == 65 || len == 33);

SHA256(hash_buf, hash_len, hash1);
RIPEMD160(hash1, sizeof(hash1), &vxcp->vxc_binres[1]);
Expand Down Expand Up @@ -308,13 +308,16 @@ usage(const char *name)
"-n Simulate\n"
"-r Use regular expression match instead of prefix\n"
" (Feasibility of expression is not checked)\n"
"-c Use compressed address\n"
"-i Case-insensitive prefix search\n"
"-k Keep pattern and continue search after finding a match\n"
"-1 Stop after first match\n"
"-L Generate litecoin address\n"
"-N Generate namecoin address\n"
"-G Generate Peercoin address\n"
"-T Generate bitcoin testnet address\n"
"-X <version> Generate address with the given version\n"
"-F <format> Generate address with the given format (pubkey or script)\n"
"-F <format> Generate address with the given format (pubkey, compressed, script)\n"
"-P <pubkey> Specify base public key for piecewise key generation\n"
"-e Encrypt private keys, prompt for password\n"
"-E <password> Encrypt private keys with <password> (UNSAFE)\n"
Expand Down Expand Up @@ -358,11 +361,15 @@ 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, "vqnrik1eE:P:NTX:F:t:h?f:o:s:")) != -1) {
while ((opt = getopt(argc, argv, "Lvqnrcik1eE:P:NGTX:F:t:h?f:o:s:")) != -1) {
switch (opt) {
case 'c':
compressed = 1;
break;
case 'v':
verbose = 2;
break;
Expand All @@ -389,6 +396,16 @@ main(int argc, char **argv)
privtype = 180;
scriptaddrtype = -1;
break;
case 'L':
addrtype = 48;
privtype = 176;
scriptaddrtype = -1;
break;
case 'G':
addrtype = 55;
privtype = 183;
scriptaddrtype = -1;
break;
case 'T':
addrtype = 111;
privtype = 239;
Expand All @@ -402,7 +419,10 @@ main(int argc, char **argv)
case 'F':
if (!strcmp(optarg, "script"))
format = VCF_SCRIPT;
else
else
if (!strcmp(optarg, "compressed"))
compressed = 1;
else
if (strcmp(optarg, "pubkey")) {
fprintf(stderr,
"Invalid format '%s'\n", optarg);
Expand Down Expand Up @@ -544,6 +564,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;
Expand Down