100 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| import argparse
 | |
| from datetime import datetime
 | |
| import os
 | |
| import sys
 | |
| from typing import Tuple
 | |
| import zmq.auth
 | |
| 
 | |
| # @brief Creates a new keypair for ZMQ encryption
 | |
| # @param[in] directory The location where to store the keys
 | |
| # @return The public and private key tuple
 | |
| def KeyPairCreator(directory: str, server: bool) -> Tuple[str, str]:
 | |
|     if not server:
 | |
|         target = 'client'
 | |
|     else:
 | |
|         target = 'server'
 | |
| 
 | |
|     public, private = zmq.auth.create_certificates(directory, target)
 | |
|     return public, private
 | |
| 
 | |
| def str2bool(value):
 | |
|     if isinstance(value, bool):
 | |
|         return value
 | |
|     elif value.lower() in ('yes', 'true', 't', 'y', '1'):
 | |
|         return True
 | |
|     elif value.lower() in ('no', 'false', 'f', 'n', '0'):
 | |
|         return False
 | |
|     else:
 | |
|         raise argparse.ArgumentTypeError('Boolean value expected')
 | |
| 
 | |
| def findIdentificationKey(path, publicKey : bool):
 | |
|     if True == publicKey:
 | |
|         identifier = 'public-key = '
 | |
|     else:
 | |
|         identifier = 'secret-key = '
 | |
| 
 | |
|     with open(path) as file:
 | |
|         key = ''
 | |
| 
 | |
|         for line in file:
 | |
|             if identifier in line:
 | |
|                 elements = line.split('=')
 | |
|                 for idx in range(1, len(elements)):
 | |
|                     if 0 == len(key):
 | |
|                         key = elements[idx][2:-1]
 | |
|                         key = key + elements[idx][-1]
 | |
|                     else:
 | |
|                         key = key + '=' + elements[idx]
 | |
| 
 | |
|                 return key[0:-2]
 | |
| 
 | |
|     return None
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     # create the commandline parser
 | |
|     parser = argparse.ArgumentParser(description='Create a new key-value pair')
 | |
|     parser.add_argument('--directory', type=str, help='Directory where to store the key pair')
 | |
|     parser.add_argument('--publickey', nargs='?', type=str, default=os.getcwd(), help='Full path to the public key of the server')
 | |
|     parser.add_argument('--server', default=False, action='store_true', help="Creates server key pair")
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     # validate the arguments
 | |
|     if False == args.server and not os.path.exists(args.publickey):
 | |
|         sys.stderr.write('The public key of the server cannot be found')
 | |
|         sys.exit(-1)
 | |
| 
 | |
|     # create the directory if it does not exist
 | |
|     if not os.path.exists(args.directory):
 | |
|         os.makedirs(args.directory)
 | |
| 
 | |
|     # create the keys
 | |
|     _, private = KeyPairCreator(args.directory, args.server)
 | |
| 
 | |
|     if False == args.server:
 | |
|         publicServer  = findIdentificationKey(args.publickey, True)
 | |
|         publicClient  = findIdentificationKey(private, True)
 | |
|         privateClient = findIdentificationKey(private, False)
 | |
| 
 | |
|         if None == publicServer:
 | |
|             sys.stderr.write('The public key of the server cannot be found in the defined file')
 | |
|             sys.exit(-1)
 | |
|         if None == publicClient:
 | |
|             sys.stderr.write('Unable to extract the created public key')
 | |
|             sys.exit(-1)
 | |
|         if None == privateClient:
 | |
|             sys.stderr.write('Unable to extract the created private key')
 | |
|             sys.exit(-1)
 | |
| 
 | |
|         # rename keys
 | |
|         timestamp = str(datetime.now(tz=None))
 | |
|         timestamp = timestamp.replace(' ', '_')
 | |
|         timestamp = timestamp.replace(':', '-')
 | |
|         os.rename(os.path.join(args.directory, 'client.key'), os.path.join(args.directory, timestamp + '.key'))
 | |
|         os.rename(os.path.join(args.directory, 'client.key_secret'), os.path.join(args.directory, timestamp + '.key_secret'))
 | |
| 
 | |
|         print(publicServer)
 | |
|         print(publicClient)
 | |
|         print(privateClient)
 |