mirror of https://github.com/GOSTSec/vanitygen
samr7
13 years ago
4 changed files with 171 additions and 5 deletions
@ -0,0 +1,157 @@ |
|||||||
|
#include <stdio.h> |
||||||
|
#include <string.h> |
||||||
|
#include <math.h> |
||||||
|
#include <assert.h> |
||||||
|
|
||||||
|
#include <openssl/evp.h> |
||||||
|
#include <openssl/bn.h> |
||||||
|
#include <openssl/ec.h> |
||||||
|
#include <openssl/obj_mac.h> |
||||||
|
|
||||||
|
#if !defined(_WIN32) |
||||||
|
#include <unistd.h> |
||||||
|
#else |
||||||
|
#include "winglue.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
#include "util.h" |
||||||
|
|
||||||
|
const char *version = "0.17"; |
||||||
|
|
||||||
|
|
||||||
|
static void |
||||||
|
usage(const char *progname) |
||||||
|
{ |
||||||
|
fprintf(stderr, |
||||||
|
"Vanitygen keyconv %s\n" |
||||||
|
"Usage: %s [-8] [-e|-E <password>] [<key>]\n" |
||||||
|
"-8 Output key in PKCS#8 form\n" |
||||||
|
"-e Encrypt output key, prompt for password\n" |
||||||
|
"-E <password> Encrypt output key with <password> (UNSAFE)\n", |
||||||
|
version, progname); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
int |
||||||
|
main(int argc, char **argv) |
||||||
|
{ |
||||||
|
char pwbuf[128]; |
||||||
|
char ecprot[128]; |
||||||
|
char pbuf[1024]; |
||||||
|
const char *key_in; |
||||||
|
const char *pass_in = NULL; |
||||||
|
EC_KEY *pkey; |
||||||
|
int parameter_group = -1; |
||||||
|
int privtype, addrtype; |
||||||
|
int pkcs8 = 0; |
||||||
|
int pass_prompt = 0; |
||||||
|
int opt; |
||||||
|
int res; |
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "8E:e")) != -1) { |
||||||
|
switch (opt) { |
||||||
|
case '8': |
||||||
|
pkcs8 = 1; |
||||||
|
break; |
||||||
|
case 'E': |
||||||
|
if (pass_prompt) { |
||||||
|
usage(argv[0]); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
pass_in = optarg; |
||||||
|
if (!vg_check_password_complexity(pass_in, 1)) |
||||||
|
fprintf(stderr, |
||||||
|
"WARNING: Using weak password\n"); |
||||||
|
break; |
||||||
|
case 'e': |
||||||
|
if (pass_in) { |
||||||
|
usage(argv[0]); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
pass_prompt = 1; |
||||||
|
break; |
||||||
|
default: |
||||||
|
usage(argv[0]); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (optind >= argc) { |
||||||
|
res = fread(pbuf, 1, sizeof(pbuf) - 1, stdin); |
||||||
|
pbuf[res] = '\0'; |
||||||
|
key_in = pbuf; |
||||||
|
} else { |
||||||
|
key_in = argv[optind]; |
||||||
|
} |
||||||
|
|
||||||
|
OpenSSL_add_all_algorithms(); |
||||||
|
|
||||||
|
pkey = EC_KEY_new_by_curve_name(NID_secp256k1); |
||||||
|
|
||||||
|
res = vg_decode_privkey_any(pkey, &privtype, key_in, NULL); |
||||||
|
if (res < 0) { |
||||||
|
if (EVP_read_pw_string(pwbuf, sizeof(pwbuf), |
||||||
|
"Enter import password:", 0) || |
||||||
|
!vg_decode_privkey_any(pkey, &privtype, key_in, pwbuf)) |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
if (!res) { |
||||||
|
fprintf(stderr, "ERROR: Unrecognized key format\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
if (pass_prompt) { |
||||||
|
res = EVP_read_pw_string(pwbuf, sizeof(pwbuf), |
||||||
|
"Enter password:", 1); |
||||||
|
if (res) |
||||||
|
return 1; |
||||||
|
pass_in = pwbuf; |
||||||
|
if (!vg_check_password_complexity(pwbuf, 1)) |
||||||
|
fprintf(stderr, "WARNING: Using weak password\n"); |
||||||
|
} |
||||||
|
|
||||||
|
switch (privtype) { |
||||||
|
case 128: addrtype = 0; break; |
||||||
|
case 239: addrtype = 111; break; |
||||||
|
default: addrtype = 0; break; |
||||||
|
} |
||||||
|
|
||||||
|
if (pkcs8) { |
||||||
|
res = vg_pkcs8_encode_privkey(pbuf, sizeof(pbuf), |
||||||
|
pkey, pass_in); |
||||||
|
if (!res) { |
||||||
|
fprintf(stderr, |
||||||
|
"ERROR: Could not encode private key\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
printf("%s", pbuf); |
||||||
|
} |
||||||
|
|
||||||
|
else if (pass_in) { |
||||||
|
res = vg_protect_encode_privkey(ecprot, pkey, privtype, |
||||||
|
parameter_group, pwbuf); |
||||||
|
|
||||||
|
if (!res) { |
||||||
|
fprintf(stderr, "ERROR: could not password-protect " |
||||||
|
"private key\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
vg_encode_address(pkey, addrtype, pwbuf); |
||||||
|
printf("Address: %s\n", pwbuf); |
||||||
|
printf("Protkey: %s\n", ecprot); |
||||||
|
} |
||||||
|
|
||||||
|
else { |
||||||
|
vg_encode_address(pkey, addrtype, ecprot); |
||||||
|
printf("Address: %s\n", ecprot); |
||||||
|
vg_encode_privkey(pkey, privtype, ecprot); |
||||||
|
printf("Privkey: %s\n", ecprot); |
||||||
|
} |
||||||
|
|
||||||
|
OPENSSL_cleanse(pwbuf, sizeof(pwbuf)); |
||||||
|
|
||||||
|
EC_KEY_free(pkey); |
||||||
|
return 0; |
||||||
|
} |
Loading…
Reference in new issue