Esempio n. 1
0
	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
Esempio n. 2
0
	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()
Esempio n. 3
0
	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()
Esempio n. 4
0
	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)
Esempio n. 5
0
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
Esempio n. 6
0
	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()