mirror of
https://github.com/GOSTSec/vanitygen
synced 2025-02-07 12:24:20 +00:00
Merge luke-jr's script address search code.
This commit is contained in:
parent
4f85df71d9
commit
910e9f94e1
19
pattern.c
19
pattern.c
@ -304,13 +304,16 @@ void
|
|||||||
vg_output_match(vg_context_t *vcp, EC_KEY *pkey, const char *pattern)
|
vg_output_match(vg_context_t *vcp, EC_KEY *pkey, const char *pattern)
|
||||||
{
|
{
|
||||||
unsigned char key_buf[512], *pend;
|
unsigned char key_buf[512], *pend;
|
||||||
char addr_buf[64];
|
char addr_buf[64], addr2_buf[64];
|
||||||
char privkey_buf[VG_PROTKEY_MAX_B58];
|
char privkey_buf[VG_PROTKEY_MAX_B58];
|
||||||
const char *keytype = "Privkey";
|
const char *keytype = "Privkey";
|
||||||
int len;
|
int len;
|
||||||
|
int isscript = (vcp->vc_format == VCF_SCRIPT);
|
||||||
|
|
||||||
assert(EC_KEY_check_key(pkey));
|
assert(EC_KEY_check_key(pkey));
|
||||||
vg_encode_address(pkey, vcp->vc_addrtype, addr_buf);
|
vg_encode_address(pkey, vcp->vc_pubkeytype, addr_buf);
|
||||||
|
if (isscript)
|
||||||
|
vg_encode_script_address(pkey, vcp->vc_addrtype, addr2_buf);
|
||||||
|
|
||||||
if (vcp->vc_key_protect_pass) {
|
if (vcp->vc_key_protect_pass) {
|
||||||
len = vg_protect_encode_privkey(privkey_buf,
|
len = vg_protect_encode_privkey(privkey_buf,
|
||||||
@ -350,6 +353,8 @@ vg_output_match(vg_context_t *vcp, EC_KEY *pkey, const char *pattern)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!vcp->vc_result_file || (vcp->vc_verbose > 0)) {
|
if (!vcp->vc_result_file || (vcp->vc_verbose > 0)) {
|
||||||
|
if (isscript)
|
||||||
|
printf("P2SHAddress: %s\n", addr2_buf);
|
||||||
printf("Address: %s\n"
|
printf("Address: %s\n"
|
||||||
"%s: %s\n",
|
"%s: %s\n",
|
||||||
addr_buf, keytype, privkey_buf);
|
addr_buf, keytype, privkey_buf);
|
||||||
@ -364,9 +369,13 @@ vg_output_match(vg_context_t *vcp, EC_KEY *pkey, const char *pattern)
|
|||||||
} else {
|
} else {
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
"Pattern: %s\n"
|
"Pattern: %s\n"
|
||||||
|
, pattern);
|
||||||
|
if (isscript)
|
||||||
|
fprintf(fp, "P2SHAddress: %s\n", addr2_buf);
|
||||||
|
fprintf(fp,
|
||||||
"Address: %s\n"
|
"Address: %s\n"
|
||||||
"%s: %s\n",
|
"%s: %s\n",
|
||||||
pattern, addr_buf, keytype, privkey_buf);
|
addr_buf, keytype, privkey_buf);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1478,6 +1487,10 @@ vg_prefix_context_add_patterns(vg_context_t *vcp,
|
|||||||
if (!npfx && impossible) {
|
if (!npfx && impossible) {
|
||||||
const char *ats = "bitcoin", *bw = "\"1\"";
|
const char *ats = "bitcoin", *bw = "\"1\"";
|
||||||
switch (vcpp->base.vc_addrtype) {
|
switch (vcpp->base.vc_addrtype) {
|
||||||
|
case 5:
|
||||||
|
ats = "bitcoin script";
|
||||||
|
bw = "\"3\"";
|
||||||
|
break;
|
||||||
case 111:
|
case 111:
|
||||||
ats = "testnet";
|
ats = "testnet";
|
||||||
bw = "\"m\" or \"n\"";
|
bw = "\"m\" or \"n\"";
|
||||||
|
@ -66,6 +66,11 @@ typedef int (*vg_add_pattern_func_t)(vg_context_t *,
|
|||||||
typedef int (*vg_test_func_t)(vg_exec_context_t *);
|
typedef int (*vg_test_func_t)(vg_exec_context_t *);
|
||||||
typedef int (*vg_hash160_sort_func_t)(vg_context_t *vcp, void *buf);
|
typedef int (*vg_hash160_sort_func_t)(vg_context_t *vcp, void *buf);
|
||||||
|
|
||||||
|
enum vg_format {
|
||||||
|
VCF_PUBKEY,
|
||||||
|
VCF_SCRIPT,
|
||||||
|
};
|
||||||
|
|
||||||
/* Application-level context, incl. parameters and global pattern store */
|
/* Application-level context, incl. parameters and global pattern store */
|
||||||
struct _vg_context_s {
|
struct _vg_context_s {
|
||||||
int vc_addrtype;
|
int vc_addrtype;
|
||||||
@ -82,6 +87,8 @@ struct _vg_context_s {
|
|||||||
vg_add_pattern_func_t vc_add_patterns;
|
vg_add_pattern_func_t vc_add_patterns;
|
||||||
vg_test_func_t vc_test;
|
vg_test_func_t vc_test;
|
||||||
vg_hash160_sort_func_t vc_hash160_sort;
|
vg_hash160_sort_func_t vc_hash160_sort;
|
||||||
|
enum vg_format vc_format;
|
||||||
|
int vc_pubkeytype;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
24
util.c
24
util.c
@ -253,6 +253,30 @@ vg_encode_address(const EC_KEY *pkey, int addrtype, char *result)
|
|||||||
vg_b58_encode_check(binres, sizeof(binres), result);
|
vg_b58_encode_check(binres, sizeof(binres), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vg_encode_script_address(const EC_KEY *pkey, int addrtype, char *result)
|
||||||
|
{
|
||||||
|
unsigned char script_buf[69];
|
||||||
|
unsigned char *eckey_buf = script_buf + 2;
|
||||||
|
unsigned char binres[21] = {0,};
|
||||||
|
unsigned char hash1[32];
|
||||||
|
|
||||||
|
script_buf[ 0] = 0x51; // OP_1
|
||||||
|
script_buf[ 1] = 0x41; // pubkey length
|
||||||
|
// gap for pubkey
|
||||||
|
script_buf[67] = 0x51; // OP_1
|
||||||
|
script_buf[68] = 0xae; // OP_CHECKMULTISIG
|
||||||
|
|
||||||
|
i2o_ECPublicKey((EC_KEY*)pkey, &eckey_buf);
|
||||||
|
assert(eckey_buf - script_buf == 67);
|
||||||
|
|
||||||
|
binres[0] = addrtype;
|
||||||
|
SHA256(script_buf, 69, hash1);
|
||||||
|
RIPEMD160(hash1, sizeof(hash1), &binres[1]);
|
||||||
|
|
||||||
|
vg_b58_encode_check(binres, sizeof(binres), result);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
vg_encode_privkey(const EC_KEY *pkey, int addrtype, char *result)
|
vg_encode_privkey(const EC_KEY *pkey, int addrtype, char *result)
|
||||||
{
|
{
|
||||||
|
1
util.h
1
util.h
@ -37,6 +37,7 @@ extern void vg_b58_encode_check(void *buf, size_t len, char *result);
|
|||||||
extern int vg_b58_decode_check(const char *input, void *buf, size_t len);
|
extern int vg_b58_decode_check(const char *input, void *buf, size_t len);
|
||||||
|
|
||||||
extern void vg_encode_address(const EC_KEY *pkey, int addrtype, char *result);
|
extern void vg_encode_address(const EC_KEY *pkey, int addrtype, char *result);
|
||||||
|
extern void vg_encode_script_address(const EC_KEY *pkey, int addrtype, char *result);
|
||||||
extern void vg_encode_privkey(const EC_KEY *pkey, int addrtype, char *result);
|
extern void vg_encode_privkey(const EC_KEY *pkey, int addrtype, char *result);
|
||||||
extern int vg_set_privkey(const BIGNUM *bnpriv, EC_KEY *pkey);
|
extern int vg_set_privkey(const BIGNUM *bnpriv, EC_KEY *pkey);
|
||||||
extern int vg_decode_privkey(const char *b58encoded,
|
extern int vg_decode_privkey(const char *b58encoded,
|
||||||
|
57
vanitygen.c
57
vanitygen.c
@ -205,10 +205,12 @@ vg_exec_upgrade_lock(vg_exec_context_t *vxcp)
|
|||||||
void *
|
void *
|
||||||
vg_thread_loop(void *arg)
|
vg_thread_loop(void *arg)
|
||||||
{
|
{
|
||||||
unsigned char eckey_buf[128];
|
unsigned char hash_buf[128];
|
||||||
|
unsigned char *eckey_buf;
|
||||||
unsigned char hash1[32];
|
unsigned char hash1[32];
|
||||||
|
|
||||||
int i, c, len, output_interval;
|
int i, c, len, output_interval;
|
||||||
|
int hash_len;
|
||||||
|
|
||||||
const BN_ULONG rekey_max = 10000000;
|
const BN_ULONG rekey_max = 10000000;
|
||||||
BN_ULONG npoints, rekey_at, nbatch;
|
BN_ULONG npoints, rekey_at, nbatch;
|
||||||
@ -264,6 +266,20 @@ vg_thread_loop(void *arg)
|
|||||||
output_interval = 1000;
|
output_interval = 1000;
|
||||||
gettimeofday(&tvstart, NULL);
|
gettimeofday(&tvstart, NULL);
|
||||||
|
|
||||||
|
if (vcp->vc_format == VCF_SCRIPT) {
|
||||||
|
hash_buf[ 0] = 0x51; // OP_1
|
||||||
|
hash_buf[ 1] = 0x41; // pubkey length
|
||||||
|
// gap for pubkey
|
||||||
|
hash_buf[67] = 0x51; // OP_1
|
||||||
|
hash_buf[68] = 0xae; // OP_CHECKMULTISIG
|
||||||
|
eckey_buf = hash_buf + 2;
|
||||||
|
hash_len = 69;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
eckey_buf = hash_buf;
|
||||||
|
hash_len = 65;
|
||||||
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (++npoints >= rekey_at) {
|
if (++npoints >= rekey_at) {
|
||||||
pthread_mutex_lock(&vg_thread_lock);
|
pthread_mutex_lock(&vg_thread_lock);
|
||||||
@ -336,10 +352,11 @@ vg_thread_loop(void *arg)
|
|||||||
len = EC_POINT_point2oct(pgroup, ppnt[i],
|
len = EC_POINT_point2oct(pgroup, ppnt[i],
|
||||||
POINT_CONVERSION_UNCOMPRESSED,
|
POINT_CONVERSION_UNCOMPRESSED,
|
||||||
eckey_buf,
|
eckey_buf,
|
||||||
sizeof(eckey_buf),
|
65,
|
||||||
vxcp->vxc_bnctx);
|
vxcp->vxc_bnctx);
|
||||||
|
assert(len == 65);
|
||||||
|
|
||||||
SHA256(eckey_buf, len, hash1);
|
SHA256(hash_buf, hash_len, hash1);
|
||||||
RIPEMD160(hash1, sizeof(hash1), &vxcp->vxc_binres[1]);
|
RIPEMD160(hash1, sizeof(hash1), &vxcp->vxc_binres[1]);
|
||||||
|
|
||||||
switch (test_func(vxcp)) {
|
switch (test_func(vxcp)) {
|
||||||
@ -450,6 +467,7 @@ usage(const char *name)
|
|||||||
"-N Generate namecoin address\n"
|
"-N Generate namecoin address\n"
|
||||||
"-T Generate bitcoin testnet address\n"
|
"-T Generate bitcoin testnet address\n"
|
||||||
"-X <version> Generate address with the given version\n"
|
"-X <version> Generate address with the given version\n"
|
||||||
|
"-F <format> Generate address with the given format (pubkey or script)\n"
|
||||||
"-e Encrypt private keys, prompt for password\n"
|
"-e Encrypt private keys, prompt for password\n"
|
||||||
"-E <password> Encrypt private keys with <password> (UNSAFE)\n"
|
"-E <password> Encrypt private keys with <password> (UNSAFE)\n"
|
||||||
"-t <threads> Set number of worker threads (Default: number of CPUs)\n"
|
"-t <threads> Set number of worker threads (Default: number of CPUs)\n"
|
||||||
@ -464,7 +482,10 @@ int
|
|||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int addrtype = 0;
|
int addrtype = 0;
|
||||||
|
int scriptaddrtype = 5;
|
||||||
int privtype = 128;
|
int privtype = 128;
|
||||||
|
int pubkeytype;
|
||||||
|
enum vg_format format = VCF_PUBKEY;
|
||||||
int regex = 0;
|
int regex = 0;
|
||||||
int caseinsensitive = 0;
|
int caseinsensitive = 0;
|
||||||
int verbose = 1;
|
int verbose = 1;
|
||||||
@ -481,7 +502,7 @@ main(int argc, char **argv)
|
|||||||
int nthreads = 0;
|
int nthreads = 0;
|
||||||
vg_context_t *vcp = NULL;
|
vg_context_t *vcp = NULL;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "vqrikeE:NTX:t:h?f:o:s:")) != -1) {
|
while ((opt = getopt(argc, argv, "vqrikeE:NTXF:t:h?f:o:s:")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose = 2;
|
verbose = 2;
|
||||||
@ -501,14 +522,28 @@ main(int argc, char **argv)
|
|||||||
case 'N':
|
case 'N':
|
||||||
addrtype = 52;
|
addrtype = 52;
|
||||||
privtype = 180;
|
privtype = 180;
|
||||||
|
scriptaddrtype = -1;
|
||||||
break;
|
break;
|
||||||
case 'T':
|
case 'T':
|
||||||
addrtype = 111;
|
addrtype = 111;
|
||||||
privtype = 239;
|
privtype = 239;
|
||||||
|
scriptaddrtype = 196;
|
||||||
break;
|
break;
|
||||||
case 'X':
|
case 'X':
|
||||||
addrtype = atoi(optarg);
|
addrtype = atoi(optarg);
|
||||||
privtype = 128 + addrtype;
|
privtype = 128 + addrtype;
|
||||||
|
scriptaddrtype = addrtype;
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
if (!strcmp(optarg, "script"))
|
||||||
|
format = VCF_SCRIPT;
|
||||||
|
else
|
||||||
|
if (strcmp(optarg, "pubkey"))
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"Invalid format '%s'\n", optarg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
prompt_password = 1;
|
prompt_password = 1;
|
||||||
@ -578,6 +613,18 @@ main(int argc, char **argv)
|
|||||||
"WARNING: case insensitive mode incompatible with "
|
"WARNING: case insensitive mode incompatible with "
|
||||||
"regular expressions\n");
|
"regular expressions\n");
|
||||||
|
|
||||||
|
pubkeytype = addrtype;
|
||||||
|
if (format == VCF_SCRIPT)
|
||||||
|
{
|
||||||
|
if (scriptaddrtype == -1)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"Address type incompatible with script format\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
addrtype = scriptaddrtype;
|
||||||
|
}
|
||||||
|
|
||||||
if (seedfile) {
|
if (seedfile) {
|
||||||
opt = -1;
|
opt = -1;
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
@ -626,6 +673,8 @@ main(int argc, char **argv)
|
|||||||
vcp->vc_verbose = verbose;
|
vcp->vc_verbose = verbose;
|
||||||
vcp->vc_result_file = result_file;
|
vcp->vc_result_file = result_file;
|
||||||
vcp->vc_remove_on_match = remove_on_match;
|
vcp->vc_remove_on_match = remove_on_match;
|
||||||
|
vcp->vc_format = format;
|
||||||
|
vcp->vc_pubkeytype = pubkeytype;
|
||||||
|
|
||||||
if (!vg_context_add_patterns(vcp, patterns, npatterns))
|
if (!vg_context_add_patterns(vcp, patterns, npatterns))
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user