diff --git a/komrade/backend/keymaker.py b/komrade/backend/keymaker.py index 9da10fb..9996936 100644 --- a/komrade/backend/keymaker.py +++ b/komrade/backend/keymaker.py @@ -70,16 +70,26 @@ from getpass import getpass class KomradeSymmetricKeyWithPassphrase(KomradeSymmetricKey): def hash(self,x): return self.crypt_keys.hash(x) - def __init__(self,passphrase=DEBUG_DEFAULT_PASSPHRASE, why=WHY_MSG): - if not passphrase: - # raise KomradeException - self.passhash=hasher(getpass(why)) + @property + def passhash(self): + if not self._passhash: + self._passhash = getpass(WHY_MSG) + return self._passhash + + def __init__(self,passphrase=None,passhash=None): + if passhash: + self._passhash = passhash + elif passphrase: + self._passhash = hasher(passphrase) else: - self.passhash=hasher(passphrase) + self._passhash = None + @property def data(self): return KEY_TYPE_SYMMETRIC_WITH_PASSPHRASE.encode('utf-8') + def __repr__(self): return f'[Symmetric Key] (generated by password)' + @property def cell(self): if not hasattr(self,'_cell'): @@ -220,7 +230,14 @@ KEYMAKER_DEFAULT_KEY_TYPES = { -def get_key_obj(keyname,data,passphrase=None,key_types=KEYMAKER_DEFAULT_KEY_TYPES): +def get_key_obj(keyname,data,key_types=KEYMAKER_DEFAULT_KEY_TYPES): + try: + data_s = data.decode() + if data_s == KomradeSymmetricKeyWithPassphrase.__name__: + return KomradeSymmetricKeyWithPassphrase() + except UnicodeDecodeError: + pass + return key_types[keyname](data) @@ -234,7 +251,6 @@ def get_key_obj(keyname,data,passphrase=None,key_types=KEYMAKER_DEFAULT_KEY_TYPE class Keymaker(Logger): def __init__(self, name=None, - passphrase=DEBUG_DEFAULT_PASSPHRASE, uri_id=None, keychain={}, path_crypt_keys=PATH_CRYPT_CA_KEYS, @@ -249,7 +265,7 @@ class Keymaker(Logger): self.path_crypt_data=path_crypt_data # boot keychain - self._keychain = self.keychain(passphrase=passphrase) + self._keychain = self.keychain() def find_pubkey(self,name=None): @@ -320,7 +336,7 @@ class Keymaker(Logger): return (name,pubkey) - def keychain(self,look_for=KEYMAKER_DEFAULT_ALL_KEY_NAMES,passphrase=None): + def keychain(self,look_for=KEYMAKER_DEFAULT_ALL_KEY_NAMES): # load existing keychain keys = self._keychain @@ -328,8 +344,10 @@ class Keymaker(Logger): # name,pubkey = self.find_pubkey_and_name() # get uri - keys['pubkey'] = pubkey = self.find_pubkey() + pubkey = self.find_pubkey() if pubkey: + keys['pubkey'] = pubkey + uri = pubkey.data_b64 #uri = b64encode(pubkey) if type(pubkey)==bytes else b64encode(pubkey.encode()) # get from cache @@ -341,7 +359,7 @@ class Keymaker(Logger): if key: keys[keyname]=get_key_obj(keyname,key) # try to assemble - keys = self.assemble(self.assemble(keys,passphrase=passphrase),passphrase=passphrase) + keys = self.assemble(self.assemble(keys)) #store to existing set self._keychain = {**keys} @@ -615,9 +633,8 @@ Keymaker ({self}) is forging new keys for {name} # self.log(encr_key_name,decr_key_name,unencr_key_name) if decrypt and unencr_key_name in keychain: continue if not decr_key_name in keychain: - # self.log('looking for decr key name:',decr_key_name,keychain) - keychain[decr_key_name] = KomradeSymmetricKeyWithPassphrase(passphrase=passphrase) - else: + self.log('! not in keychain: decr key name:',decr_key_name,keychain) + #keychain[decr_key_name] = KomradeSymmetricKeyWithPassphrase(passphrase=passphrase) continue decr_key = keychain.get(decr_key_name) # self.log('?',decr_key,decr_key_name,encr_key_name,keychain[encr_key_name]) diff --git a/komrade/backend/komrades.py b/komrade/backend/komrades.py index ea2b39d..715b9d6 100644 --- a/komrade/backend/komrades.py +++ b/komrade/backend/komrades.py @@ -12,8 +12,8 @@ from komrade.backend.keymaker import * class KomradeX(Caller): - def __init__(self, name=None, pubkey=None, passphrase=DEBUG_DEFAULT_PASSPHRASE): - super().__init__(name=name,passphrase=passphrase) + def __init__(self, name=None, pubkey=None): + super().__init__(name=name) # self.log(f'booted komrade with {name} and {passphrase} and\n\n{dict_format(self.keychain())}') # if SHOW_STATUS: # from komrade.cli import CLI @@ -184,9 +184,14 @@ class KomradeX(Caller): self.log(f'''Now saving name and public key on local device:''') self.crypt_keys.set(name, pubkey_b, prefix='/pubkey/') self.crypt_keys.set(uri_id, name, prefix='/name/') - self.crypt_keys.set(uri_id, privkey_encr_obj.data, prefix='/privkey_encr/') self.crypt_keys.set(uri_id,sec_login,prefix='/secret_login/') + # store privkey pieces + self.crypt_keys.set(uri_id, privkey_encr_obj.data, prefix='/privkey_encr/') + # just to show we used a passphrase --> + self.crypt_keys.set(uri_id, KomradeSymmetricKeyWithPassphrase.__name__, prefix='/privkey_decr/') + + # save qr too: self.save_uri_as_qrcode(uri_id) # self.log(f'saved public key as QR code to:\n {fnfn}\n\n{qr_str}') @@ -331,8 +336,9 @@ def test_msg(): def test_loading(): - # z1 = Komrade('zuck') - # print(z1.keychain()) + z1 = Komrade('zuck') + print(z1.keychain()) + exit() z2 = Komrade(b'VUVDMgAAAC08BCMVA+0dMJXc66/W7hty669+3/3S61Q1yjmgJW8I0k3lqfDi') print(z2) diff --git a/komrade/backend/messages.py b/komrade/backend/messages.py index 5b09220..ca2935d 100644 --- a/komrade/backend/messages.py +++ b/komrade/backend/messages.py @@ -103,7 +103,7 @@ class Message(Logger): self.log(f'Attempting to decrypt:\n{self}') # decrypt msg - self.log('attempting to decrypt',self.msg,'from',self.from_pubkey,'to',self.to_pubkey, self.to_whom,dict_format(self.to_whom.keychain()),self.to_whom.assemble(self.to_whom.keychain())) + # self.log('attempting to decrypt',self.msg,'from',self.from_pubkey,'to',self.to_pubkey, self.to_whom,dict_format(self.to_whom.keychain()),self.to_whom.assemble(self.to_whom.keychain())) if not self.to_whom.privkey: self.log(f'{self.to_whom} cannot decrypt this message! {dict_format(self.to_whom.keychain())}!\n\n{self.to_whom.name} {self.to_whom.pubkey} {self.to_name} {self.to_pubkey} {self.to_whom.keychain()}') return diff --git a/komrade/backend/the_operator.py b/komrade/backend/the_operator.py index 9f9acdb..9eb28ce 100644 --- a/komrade/backend/the_operator.py +++ b/komrade/backend/the_operator.py @@ -293,9 +293,6 @@ class TheOperator(Operator): - - - def test_op(): from komrade.backend.the_telephone import TheTelephone