Module pyvgenkey
Small ECC keys have the equivalent strength of larger RSA keys because of the algorithm used to generate them. For example, a 256-bit ECC key is equivalent to a 3072-bit RSA key and a 384-bit ECC key is equivalent to a 7680-bit RSA key.
Expand source code
#!/usr/bin/env python
#from __future__ import print_function
'''
Small ECC keys have the equivalent strength of larger RSA keys because of
the algorithm used to generate them. For example, a 256-bit ECC key is
equivalent to a 3072-bit RSA key and a 384-bit ECC key is equivalent to a
7680-bit RSA key.
'''
import os, sys, getopt, signal, select, string, time
import struct, stat, base64, random, threading
if sys.version_info[0] < 3:
print("needs py 3")
sys.exit(0)
base = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(base, 'pyvecc'))
from pyvecc.Key import Key
from Crypto import Random
# This repairs the path from local run to pip run.
# Remove pip version for local tests
try:
from pyvcommon import support
# Get Parent of module root
sf = os.path.dirname(support.__file__)
sf = os.path.dirname(sf)
#print("sf", sf)
sys.path.append(os.path.join(sf, "pyvcommon"))
sys.path.append(os.path.join(sf, "pyvserver"))
except:
base = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(base, '..'))
sys.path.append(os.path.join(base, '..', "pyvcommon"))
sys.path.append(os.path.join(base, '..', "pyvserver"))
from pyvcommon import support
#print("Load:", sys.path[-1])
from pyvcommon import pyservsup
import argparse
parser = argparse.ArgumentParser(description='Genetrate ECC keypair for pyvserv')
parser.add_argument("-v", '--verbose', dest='verbose',
default=0, action='count',
help='verbocity on (default: off)')
#parser.add_argument("-b:", '--bits', dest='bits',
# default=4096, action='store', type=int,
# help='Key to generate (default: 4096)')
#
#parser.add_argument("-r:", '--rsa', dest='use_rsa',
# default=False, action='store_true',
# help='Key to generate (default: 4096)')
parser.add_argument("-m:", '--homedir', dest='homedir',
default="pyvserver", action='store',
help='pyvserv home directory (default: ~/pyvserver)')
parser.add_argument("-q:", '--quiet', dest='quiet',
default=0, action='store_true',
help='Display less information. Default: off')
# Deprecated, pad it
time.clock = time.process_time
# ------------------------------------------------------------------------
def is_power_of_two(n):
return (n != 0) and (n & (n-1) == 0)
def genfname():
rsize = 2; sss = ""
rrr = Random.new().read(rsize)
for aa in rrr:
sss += "%x" % ord(str(aa)[0])
sss += "%x" % int(time.time()) # % 1000000)
rrr = Random.new().read(rsize)
for aa in rrr:
sss += "%x" % ord(str(aa)[0])
#print("fname", sss)
return sss
stopthread = 0
gl_keylen = 8
gl_key = None
def genkey_thread():
global stopthread, gl_keylen, gl_key
gl_key = Key.generate(256)
stopthread = True
time.sleep(.1)
def genkey():
''' Generate key, give optional feedback '''
global stopthread, gl_keylen, gl_key
fff = genfname()
#gl_keylen = keylen
genkey_thread()
#print ("Generated:", key, key.size())
# Private key
privname = privdir + fff + '.pem'
f2 = open(privname,'w')
f2.write(gl_key.export_priv())
f2.close()
# Public Key
pubname = keydir + fff + '.pub'
f3 = open(pubname,'w')
f3.write(gl_key.export_pub())
f3.close()
return privname, pubname
keydir = './keys/'
privdir = './private/'
def position(args):
global_vars = pyservsup.Global_Vars(__file__, args.homedir)
global_vars._softmkdir(global_vars.myhome)
if args.verbose:
print("dir", global_vars.myhome)
os.chdir(global_vars.myhome)
if not os.path.isdir(global_vars.keydir):
os.mkdir(global_vars.keydir)
if not os.path.isdir(global_vars.privdir):
os.mkdir(global_vars.privdir)
#rstr = Random.new().read(random.randint(14, 24))
def mainfunct():
#global args
args = parser.parse_args()
#if not is_power_of_two(args.bits):
# print("Bitness must be a power of 2")
# sys.exit(1)
position(args)
#print("Current dir: ", os.getcwd())
if not args.quiet:
print ("Started pyvserv keygen, ECC 384"); sys.stdout.flush()
fnames = genkey()
if not args.quiet:
print("Generated files:")
print("'" + fnames[0] + "'", "'" + fnames[1] + "'")
sys.exit(0)
if __name__ == '__main__':
mainfunct()
# EOF
Functions
def genfname()
-
Expand source code
def genfname(): rsize = 2; sss = "" rrr = Random.new().read(rsize) for aa in rrr: sss += "%x" % ord(str(aa)[0]) sss += "%x" % int(time.time()) # % 1000000) rrr = Random.new().read(rsize) for aa in rrr: sss += "%x" % ord(str(aa)[0]) #print("fname", sss) return sss
def genkey()
-
Generate key, give optional feedback
Expand source code
def genkey(): ''' Generate key, give optional feedback ''' global stopthread, gl_keylen, gl_key fff = genfname() #gl_keylen = keylen genkey_thread() #print ("Generated:", key, key.size()) # Private key privname = privdir + fff + '.pem' f2 = open(privname,'w') f2.write(gl_key.export_priv()) f2.close() # Public Key pubname = keydir + fff + '.pub' f3 = open(pubname,'w') f3.write(gl_key.export_pub()) f3.close() return privname, pubname
def genkey_thread()
-
Expand source code
def genkey_thread(): global stopthread, gl_keylen, gl_key gl_key = Key.generate(256) stopthread = True time.sleep(.1)
def is_power_of_two(n)
-
Expand source code
def is_power_of_two(n): return (n != 0) and (n & (n-1) == 0)
def mainfunct()
-
Expand source code
def mainfunct(): #global args args = parser.parse_args() #if not is_power_of_two(args.bits): # print("Bitness must be a power of 2") # sys.exit(1) position(args) #print("Current dir: ", os.getcwd()) if not args.quiet: print ("Started pyvserv keygen, ECC 384"); sys.stdout.flush() fnames = genkey() if not args.quiet: print("Generated files:") print("'" + fnames[0] + "'", "'" + fnames[1] + "'") sys.exit(0)
def position(args)
-
Expand source code
def position(args): global_vars = pyservsup.Global_Vars(__file__, args.homedir) global_vars._softmkdir(global_vars.myhome) if args.verbose: print("dir", global_vars.myhome) os.chdir(global_vars.myhome) if not os.path.isdir(global_vars.keydir): os.mkdir(global_vars.keydir) if not os.path.isdir(global_vars.privdir): os.mkdir(global_vars.privdir)