11#include <stdio.h>
22#include <string.h>
3+ #include <stdlib.h>
34#include <math.h>
45#include <assert.h>
56
@@ -31,6 +32,8 @@ usage(const char *progname)
3132"-e Encrypt output key, prompt for password\n"
3233"-E <password> Encrypt output key with <password> (UNSAFE)\n"
3334"-c <key> Combine private key parts to make complete private key\n"
35+ "-X <version> Public key version (for altcoins)\n"
36+ "-Y <version> Private key version (-X provides public key)\n"
3437"-v Verbose output\n" ,
3538 version , progname );
3639}
@@ -47,15 +50,19 @@ main(int argc, char **argv)
4750 const char * key2_in = NULL ;
4851 EC_KEY * pkey ;
4952 int parameter_group = -1 ;
50- int privtype , addrtype ;
53+ int addrtype = 0 ;
54+ int privtype = 128 ;
55+ int addrtype_opt = addrtype ;
56+ int privtype_opt = privtype ;
57+ int addrtype_override = 0 ;
5158 int pkcs8 = 0 ;
5259 int pass_prompt = 0 ;
5360 int verbose = 0 ;
5461 int generate = 0 ;
5562 int opt ;
5663 int res ;
5764
58- while ((opt = getopt (argc , argv , "8E:ec:vG " )) != -1 ) {
65+ while ((opt = getopt (argc , argv , "8E:ec:vGX:Y: " )) != -1 ) {
5966 switch (opt ) {
6067 case '8' :
6168 pkcs8 = 1 ;
@@ -86,20 +93,32 @@ main(int argc, char **argv)
8693 case 'G' :
8794 generate = 1 ;
8895 break ;
96+ case 'X' :
97+ addrtype_opt = atoi (optarg );
98+ privtype_opt = addrtype + 128 ;
99+ addrtype_override = 1 ;
100+ break ;
101+ case 'Y' :
102+ privtype_opt = atoi (optarg );
103+ addrtype_override = 1 ;
104+ break ;
89105 default :
90106 usage (argv [0 ]);
91107 return 1 ;
92108 }
93109 }
110+ if (addrtype_override )
111+ {
112+ addrtype = addrtype_opt ;
113+ privtype = privtype_opt ;
114+ }
94115
95116 OpenSSL_add_all_algorithms ();
96117
97118 pkey = EC_KEY_new_by_curve_name (NID_secp256k1 );
98119
99120 if (generate ) {
100121 unsigned char * pend = (unsigned char * ) pbuf ;
101- addrtype = 0 ;
102- privtype = 128 ;
103122 EC_KEY_generate_key (pkey );
104123 res = i2o_ECPublicKey (pkey , & pend );
105124 fprintf (stderr , "Pubkey (hex): " );
@@ -181,10 +200,10 @@ main(int argc, char **argv)
181200 fprintf (stderr , "WARNING: Using weak password\n" );
182201 }
183202
184- switch ( privtype ) {
185- case 128 : addrtype = 0 ; break ;
186- case 239 : addrtype = 111 ; break ;
187- default : addrtype = 0 ; break ;
203+ if ( addrtype_override )
204+ {
205+ addrtype = addrtype_opt ;
206+ privtype = privtype_opt ;
188207 }
189208
190209 if (verbose ) {
0 commit comments