def updateFirstTime(self, fn, privSignKey, pubSignKey): try: v = binstruct.readDecrypt(fs.open(fn), verifysign_rsapubkey=pubSignKey) except IOError: v = None if v is None or time.time() < v: v = time.time() binstruct.writeEncrypt(fs.openW(fn), v, sign_rsaprivkey=privSignKey).close() return v
def writeFileDstToSrc(self, fn, v): global localDev assert self.dstDev == localDev try: fs.mkdir(fs.dirname(fn)) except: pass # already existing. or so. we would fail anyway later srcPubKey = self.srcDev.publicKeys.crypt dstPrivKey = localDev.privateKeys.sign binstruct.writeEncrypt(fs.openW(fn), v, srcPubKey, dstPrivKey).close()
def storeData(self, srcDev, fn, data): datad = self.devId + "/data-from-" + srcDev.devId try: fs.mkdir(datad) except: pass binstruct.writeEncrypt( fs.openW(datad + "/" + fn), data, encrypt_rsapubkey = self.publicKeys.crypt, sign_rsaprivkey = srcDev.privateKeys.sign).close()
def connectFrom(self, srcDev, connData): assert "intent" in connData connd = self.devId + "/messages-from-" + srcDev.devId try: fs.mkdir(connd) except: pass # might exist connIdNum = LRndSeq() for i in itertools.count(4): connId = "channel-" + connIdNum[:i] channelfn = connd + "/" + connId + "-init" if fs.exists(channelfn): continue binstruct.writeEncrypt( fs.openW(channelfn), connData, encrypt_rsapubkey = self.publicKeys.crypt, sign_rsaprivkey = srcDev.privateKeys.sign).close() return Conn(self, srcDev, connId, isClient=True)
def registerDev(dev): """returns existing matching Dev, if there is any otherwise, it creates a new Dev""" assert "privateKeys" in dev assert "publicKeys" in dev assert "appInfo" in dev assert "type" in dev global localDev from sha import sha longDevId = LList("dev-" + sha(dev["publicKeys"]["sign"]).hexdigest()) + "-" + LRndSeq() longestCommonDevId = 9 takenDevIds = set() for d in devices(): if d.publicKeys == dev["publicKeys"]: # update if needed for key,value in dev.items(): if isinstance(value, dict): value = binstruct.Dict(value) setattr(d, key, value) if localDev.publicKeys["sign"] == d.publicKeys["sign"]: localDev = d return d takenDevIds.add(d.devId) longestCommonDevId = max(longestCommonDevId, commonStrLen(longDevId, d.devId)) devId = longDevId[:longestCommonDevId+1] # create new devdir = devId fs.makedirs(devdir) binstruct.write(fs.openW(devdir + "/publicKeys"), dev["publicKeys"]).close() for key in ("appInfo","type"): binstruct.writeEncrypt( fs.openW(devdir + "/" + key), dev[key], sign_rsaprivkey = dev["privateKeys"]["sign"]) newdev = Dev(devId, binstruct.Dict(dev["publicKeys"])) for key,value in dev.items(): if isinstance(value, dict): value = binstruct.Dict(value) setattr(newdev, key, value) binstruct.writeEncrypt( fs.openW(devdir + "/name"), localDevName(), sign_rsaprivkey = dev["privateKeys"]["sign"]) if localDev.publicKeys["sign"] == newdev.publicKeys["sign"]: localDev = newdev return newdev
def writeFileSrcToDst(self, fn, v): global localDev assert self.srcDev == localDev dstPubKey = self.dstDev.publicKeys.crypt srcPrivKey = localDev.privateKeys.sign binstruct.writeEncrypt(fs.openW(fn), v, dstPubKey, srcPrivKey).close()