keys-on-cli
quadrismegistus 4 years ago
parent bb09e4a9ac
commit 26a9388a9b

@ -16,9 +16,21 @@ LOG_GET_SET = True
class Crypt(Logger):
def __init__(self,name=None,fn=None,cell=None,init_d=None):
def __init__(self,name=None,fn=None,cell=None,init_d=None,use_secret=CRYPT_USE_SECRET,path_secret=PATH_CRYPT_SECRET):
if not name and fn: name=os.path.basename(fn).replace('.','_')
if use_secret and path_secret:
if not os.path.exists(path_secret):
self.secret = get_random_binary_id()
self.log('shhh! creating secret:',self.secret)
with open(path_secret,'wb') as of:
of.write(self.secret)
else:
with open(path_secret,'rb') as f:
self.secret = f.read()
else:
self.secret = b''
self.name,self.fn,self.cell = name,fn,cell
self.store = FilesystemStore(self.fn)
if init_d:
@ -37,7 +49,7 @@ class Crypt(Logger):
super().log(*x)
def hash(self,binary_data):
return hashlib.sha256(binary_data).hexdigest()
return hashlib.sha256(binary_data + self.secret).hexdigest()
# return zlib.adler32(binary_data)
def force_binary(self,k_b):
@ -47,21 +59,9 @@ class Crypt(Logger):
return k_b
def package_key(self,k,prefix=''):
# self.log('k???',type(k),k)
if not k: return b''
# self.log('prefix???',type(prefix),prefix)
k_b = self.force_binary(k)
# self.log(type(k_b),k_b)
# k_s = k_b.decode()
# self.log(type(k_s),k_s)
# k_s2 = prefix + k_s
# self.log(type(k_s2),k_s2)
# k_b2 = k_s2.encode()
k_b2 = self.force_binary(prefix) + k_b
# self.log('k_b2',type(k_b2),k_b2)
# k_b = self.cell.encrypt(k_b)
# prefix_b = self.force_binary(prefix)
return k_b2
def package_val(self,k):
@ -69,7 +69,6 @@ class Crypt(Logger):
if self.cell is not None: k_b = self.cell.encrypt(k_b)
return k_b
def unpackage_val(self,k_b):
try:
if self.cell is not None: k_b = self.cell.decrypt(k_b)
@ -77,40 +76,41 @@ class Crypt(Logger):
pass
return k_b
def has(self,k,prefix=''):
k_b=self.package_key(k,prefix=prefix)
k_b_hash = self.hash(k_b)
try:
v=self.store.get(k_b_hash)
return True
except KeyError:
return False
def set(self,k,v,prefix=''):
# self.log('set() k -->',prefix,k)
if self.has(k,prefix=prefix):
self.log("I'm afraid I can't let you do that, overwrite someone's data!")
return False
k_b=self.package_key(k,prefix=prefix)
# self.log('set() k_b -->',k_b)
k_b_hash = self.hash(k_b)
# self.log('k_b_hash',type(k_b_hash),k_b_hash)
# self.log('set() v -->',v)
v_b=self.package_val(v)
self.log(f'set(\n\t{prefix}{k},\n\t{k_b}\n\t{k_b_hash}\n\t\n\t{v_b}\n)\n')
# stop
# stop
return self.store.put(k_b_hash,v_b)
# store
self.store.put(k_b_hash,v_b)
return True
def exists(self,k,prefix=''):
return bool(self.get(k,prefix=prefix))
return self.has(k,prefix=prefix)
def get(self,k,prefix=''):
# self.log('k1? -->',prefix,k)
k_b=self.package_key(k,prefix=prefix)
# self.log('k2? -->',k_b)
k_b_hash = self.hash(k_b)
# self.log('k_b_hash',type(k_b_hash),k_b_hash)
try:
v=self.store.get(k_b_hash)
except KeyError:
return None
# self.log('v? -->',v)
v_b=self.unpackage_val(v)
# self.log('v_b?',v_b)
# self.log('get()',k_b,'-->',v_b)
return v_b

@ -303,7 +303,7 @@ class Keymaker(Logger):
# return keys!
keys_returned = self.return_keychain(keychain,keys_to_return)
return {'uri_id':uri_id,'_keychain':keys_returned}
return (uri_id,keys_returned)
def return_keychain(self,keychain,keys_to_return=None):

@ -42,7 +42,6 @@ class Persona(Caller):
# def login(self):
# if keys.get('pubkey') and keys.get('privkey')
def register(self, name = None, passphrase = DEBUG_DEFAULT_PASSPHRASE, is_group=None):
# get needed metadata
if not name: name=self.name
@ -53,33 +52,57 @@ class Persona(Caller):
# if is_group is None:
# is_group = input('\nIs this a group account? [y/N]').strip().lower() == 'y'
# form request
msg_to_op = {
'_route':'forge_new_keys',
'name':name,
'passphrase':hashish(passphrase.encode())
}
# get message back
msg_obj = self.phone.ring_ring(msg_to_op)
phone_res = msg_obj.msg
# URI id
uri_id = phone_res.get('uri_id')
returned_keys = phone_res.get('_keychain')
self.log('got URI from Op:',uri_id)
self.log('got returnd keys from Op:',returned_keys)
# better have the right keys
assert set(KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT) == set(returned_keys.keys())
# now save these keys!
saved_keys = self.save_keychain(name,returned_keys,uri_id=uri_id)
self.log('saved keys!',saved_keys)
# success!
self.log('yay!!!!')
return saved_keys
# make and save keys locally
uri_id,keys_returned = self.forge_new_keys(
name=name,
passphrase=passphrase,
keys_to_save = KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT,
keys_to_return = KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_SERVER
)
self.log(f'my new uri is {uri_id} and I got new keys!: {dict_format(keys_returned)}')
# save the ones we should on server
# def register(self, name = None, passphrase = DEBUG_DEFAULT_PASSPHRASE, is_group=None):
# # get needed metadata
# if not name: name=self.name
# if name is None:
# name = input('\nWhat is the name for this account? ')
# if passphrase is None:
# passphrase = getpass.getpass('\nEnter a memborable password: ')
# # if is_group is None:
# # is_group = input('\nIs this a group account? [y/N]').strip().lower() == 'y'
# # form request
# msg_to_op = {
# '_route':'forge_new_keys',
# 'name':name,
# 'passphrase':hashish(passphrase.encode())
# }
# # get message back
# msg_obj = self.phone.ring_ring(msg_to_op)
# phone_res = msg_obj.msg
# # URI id
# uri_id = phone_res.get('uri_id')
# returned_keys = phone_res.get('_keychain')
# self.log('got URI from Op:',uri_id)
# self.log('got returnd keys from Op:',returned_keys)
# # better have the right keys
# assert set(KEYMAKER_DEFAULT_KEYS_TO_SAVE_ON_CLIENT) == set(returned_keys.keys())
# # now save these keys!
# saved_keys = self.save_keychain(name,returned_keys,uri_id=uri_id)
# self.log('saved keys!',saved_keys)
# # success!
# self.log('yay!!!!')
# return saved_keys
def ring_ring(self,msg):

@ -102,12 +102,16 @@ class TheOperator(Operator):
# return to Telephone/Caller
return forged_keys_plus_id
def does_username_exist(self,**data):
name=data.get('name')
def does_username_exist(self,name,**data):
pubkey=self.crypt_keys.get(name,prefix='/pubkey/')
self.log(f'looking for {name}, found {pubkey} as pubkey')
return bool(pubkey)
def register_new_user(self,name,pubkey,**data):
self.log('setting pubkey under name')
res = self.crypt_keys.set(name,pubkey,prefix='/pubkey/')
self.log('got result from crypt:',res)
return res

@ -25,6 +25,9 @@ for x in [PATH_KOMRADE,PATH_KOMRADE_DATA,PATH_KOMRADE_KEYS,PATH_QRCODES]:
if not os.path.exists(x):
os.makedirs(x)
CRYPT_USE_SECRET = True
PATH_CRYPT_SECRET = os.path.join(PATH_KOMRADE,'.secret')
# etc
BSEP=b'||||||||||'
BSEP2=b'@@@@@@@@@@'

Loading…
Cancel
Save