nothing-unencr
quadrismegistus 4 years ago
parent 0a23c729bc
commit c7721504a8

@ -21,25 +21,29 @@ class Caller(Operator):
# if is_group is None: # if is_group is None:
# is_group = input('\nIs this a group account? [y/N]').strip().lower() == 'y' # is_group = input('\nIs this a group account? [y/N]').strip().lower() == 'y'
# form request
req_json = { req_json = {
'_route':'forge_new_keys', '_route':'forge_new_keys',
'name':name, 'name':name,
'passphrase':hashish(passphrase.encode()) 'passphrase':hashish(passphrase.encode())
} }
# ask operator
phone_res = self.phone.ring_ring(json_phone2phone=req_json) phone_res = self.phone.ring_ring(json_phone2phone=req_json)
name = phone_res.get('name')
# URI id
uri_id = phone_get.get('uri_id')
returned_keys = phone_res.get('_keychain') returned_keys = phone_res.get('_keychain')
self.log('got URI from Op:',uri_id)
self.log('got returnd keys from Op:',returned_keys) self.log('got returnd keys from Op:',returned_keys)
stop
# better have the right keys # better have the right keys
assert set(KEYMAKER_DEFAULT_KEYS_TO_RETURN) == set(returned_keys.keys()) assert set(KEYMAKER_DEFAULT_KEYS_TO_RETURN) == set(returned_keys.keys())
# now save these keys! # now save these keys!
keychain = self.keychain(extra_keys=returned_keys) saved_keys = self.save_keychain(name,returned_keys,uri_id=uri_id)
self.log('extra keychain??',keychain.keys())
saved_keys = self.save_keychain(name,returned_keys)
self.log('saved keys!',saved_keys) self.log('saved keys!',saved_keys)
# better have the right keys # better have the right keys

@ -113,6 +113,10 @@ class Keymaker(Logger):
def gen_keys_from_types(self,key_types=KEYMAKER_DEFAULT_KEY_TYPES,passphrase=None): def gen_keys_from_types(self,key_types=KEYMAKER_DEFAULT_KEY_TYPES,passphrase=None):
"""
Get new asymmetric/symmetric keys, given a dictionary of constants describing their type
"""
asymmetric_pubkey=None asymmetric_pubkey=None
asymmetric_privkey=None asymmetric_privkey=None
keychain = {} keychain = {}
@ -122,7 +126,6 @@ class Keymaker(Logger):
keypair = GenerateKeyPair(KEY_PAIR_TYPE.EC) keypair = GenerateKeyPair(KEY_PAIR_TYPE.EC)
asymmetric_privkey = keypair.export_private_key() asymmetric_privkey = keypair.export_private_key()
asymmetric_pubkey = keypair.export_public_key() asymmetric_pubkey = keypair.export_public_key()
if key_type_desc==KEY_TYPE_ASYMMETRIC_PRIVKEY: if key_type_desc==KEY_TYPE_ASYMMETRIC_PRIVKEY:
keychain[key_name] = KomradeAsymmetricPrivateKey(asymmetric_pubkey,asymmetric_privkey) keychain[key_name] = KomradeAsymmetricPrivateKey(asymmetric_pubkey,asymmetric_privkey)
elif key_type_desc==KEY_TYPE_ASYMMETRIC_PUBKEY: elif key_type_desc==KEY_TYPE_ASYMMETRIC_PUBKEY:
@ -138,6 +141,9 @@ class Keymaker(Logger):
def gen_encr_keys(self,keychain,keys_to_gen,passphrase=None): def gen_encr_keys(self,keychain,keys_to_gen,passphrase=None):
"""
Encrypt other keys with still other keys!
"""
# generate encrypted keys too # generate encrypted keys too
for key_name in keys_to_gen: for key_name in keys_to_gen:
if key_name.endswith('_encr') and key_name not in keychain: if key_name.endswith('_encr') and key_name not in keychain:
@ -154,7 +160,10 @@ class Keymaker(Logger):
keychain[key_name]=_key_encr keychain[key_name]=_key_encr
return keychain return keychain
def make_qr_id(self,qri_id):
import pyqrcode
pyqrcode.create('http://uca.edu')
pass
def forge_new_keys(self, def forge_new_keys(self,
name=None, name=None,
@ -167,8 +176,7 @@ class Keymaker(Logger):
self.log('keys_to_save:',keys_to_save) self.log('keys_to_save:',keys_to_save)
self.log('keys_to_return',keys_to_return) self.log('keys_to_return',keys_to_return)
# name
if not name: name=self.name if not name: name=self.name
keys_to_gen = set(keys_to_gen) | set(keys_to_save) | set(keys_to_return) keys_to_gen = set(keys_to_gen) | set(keys_to_save) | set(keys_to_return)
@ -186,12 +194,14 @@ class Keymaker(Logger):
self.log('keychain 2 =',keychain) self.log('keychain 2 =',keychain)
# save keys! # save keys!
keys_saved = self.save_keychain(name,keychain,keys_to_save) # get URI id to save under (except for pubkeys, accessible by name)
uri_id,keys_saved = self.save_keychain(name,keychain,keys_to_save)
self.log('uri_id =',uri_id)
self.log('keys_saved =',keys_saved) self.log('keys_saved =',keys_saved)
# return keys! # return keys!
keys_returned = self.return_keychain(keychain,keys_to_return) keys_returned = self.return_keychain(keychain,keys_to_return)
return keys_returned return {'uri_id':uri_id,'_keychain':keys_returned)
def return_keychain(self,keychain,keys_to_return=None): def return_keychain(self,keychain,keys_to_return=None):
@ -203,10 +213,10 @@ class Keymaker(Logger):
return keychain_toreturn return keychain_toreturn
def save_keychain(self,name,keychain,keys_to_save=None): def save_keychain(self,name,keychain,keys_to_save=None,uri_id=None):
keys_saved = []
if not keys_to_save: keys_to_save = list(keychain.keys()) if not keys_to_save: keys_to_save = list(keychain.keys())
if not uri_id: uri_id = get_random_id() + get_random_id()
self.uri_id = uri_id
# filter for transfer # filter for transfer
for k,v in keychain.items(): for k,v in keychain.items():
if issubclass(type(v),KomradeKey): if issubclass(type(v),KomradeKey):
@ -219,10 +229,10 @@ class Keymaker(Logger):
if not '_' in keyname: if not '_' in keyname:
raise KomradeException('there is no private property in a socialist network! all keys must be split between komrades') raise KomradeException('there is no private property in a socialist network! all keys must be split between komrades')
if keyname in keychain: if keyname in keychain:
self.crypt_keys.set(name,keychain[keyname],prefix=f'/{keyname}/') self.crypt_keys.set(uri_id,keychain[keyname],prefix=f'/{keyname}/')
keys_saved_d[keyname] = keychain[keyname] keys_saved_d[keyname] = keychain[keyname]
return keys_saved_d return (uri_id,keys_saved_d)
def assemble(self,_keychain): def assemble(self,_keychain):
# last minute assemblies? # last minute assemblies?
@ -292,32 +302,35 @@ class Keymaker(Logger):
return SCellSeal(key=str_or_key_or_cell) return SCellSeal(key=str_or_key_or_cell)
def keychain(self,passphrase=None,force=False,allow_builtin=True,extra_keys={},keys_to_gen=KEYMAKER_DEFAULT_KEYS_TO_GEN,**kwargs): def keychain(self,
# assemble as many keys as we can! passphrase=None,
force=False,
allow_builtin=True,
extra_keys={},
# @TODO TODO TODO keys_to_gen=KEYMAKER_DEFAULT_KEYS_TO_GEN,
uri_id=None,
**kwargs):
# assemble as many keys as we can!
if not uri_id: uri_id = self.uri_id
if not uri_id and not self.uri_id:
raise KomradeException('Need URI id to complete finding of keys!')
# if not force and hasattr(self,'_keychain') and self._keychain: return self._keychain # if not force and hasattr(self,'_keychain') and self._keychain: return self._keychain
if passphrase: self.passphrase=passphrase if passphrase: self.passphrase=passphrase
# start off keychain
_keychain = {**extra_keys, **self._keychain} _keychain = {**extra_keys, **self._keychain}
self.log('_keychain at start of keychain() =',_keychain) self.log('_keychain at start of keychain() =',_keychain)
for keyname in keys_to_gen+keys_to_gen:
# if keyname in _keychain and _keychain[keyname]: continue
# self.log('??',keyname,keyname in self._keychain,'...')
if hasattr(self,keyname):
method=getattr(self,keyname)
res=method(keychain=_keychain, **kwargs)
# self.log('res <--',res)
if res:
_keychain[keyname]=res
# find
for keyname in keys_to_gen:
if keyname in _keychain and _keychain[keyname]: continue
# self.log('??',keyname,keyname in self._keychain,'...')
newkey = self.crypt_keys.get(uri_id,prefix=f'/{keyname}/')
if newkey: _keychain[keyname] = newkey
_keychain = self.assemble(_keychain) # return
_keychain = self.assemble(_keychain) _keychain = self.assemble(_keychain)
self._keychain = _keychain self._keychain = _keychain
return _keychain return _keychain

@ -92,14 +92,10 @@ class TheOperator(Operator):
def forge_new_keys(self,**data): def forge_new_keys(self,**data):
# get keys # get keys
res = super().forge_new_keys(**data) forged_keys_plus_id = super().forge_new_keys(**data)
pkg={}
pkg['name']=data.get('name')
pkg['_keychain']=res
self.log('returned keys from keymaker.forge_new_keys:','\n'.join(res.keys())) # return to Telephone/Caller
return self.ring_ring(json_phone2phone=forged_keys_plus_id)
return self.ring_ring(json_phone2phone=pkg)

@ -90,6 +90,16 @@ def unpackage_from_transmission(data_json_b64):
return data_json return data_json
def get_random_id():
import uuid
return uuid.uuid4().hex
def get_random_binary_id():
import base64
idstr = get_random_id()
return base64.b64encode(idstr.encode())
# Recursive dictionary merge # Recursive dictionary merge
# https://gist.github.com/angstwad/bf22d1822c38a92ec0a9 # https://gist.github.com/angstwad/bf22d1822c38a92ec0a9

Loading…
Cancel
Save