work on metadata, forward secrecy, and starting on sockets

This commit is contained in:
Kevin Froman 2018-09-13 12:26:22 -05:00
parent 1c2a8a2f40
commit ee2a74380b
No known key found for this signature in database
GPG Key ID: 0D414D0FE405B63B
5 changed files with 61 additions and 6 deletions

View File

@ -48,6 +48,7 @@ class Core:
self.torPort = torPort
self.dataNonceFile = 'data/block-nonces.dat'
self.dbCreate = dbcreator.DBCreator(self)
self.forwardKeysFile = 'data/forward-keys.db'
self.usageFile = 'data/disk-usage.txt'
self.config = config

View File

@ -71,7 +71,9 @@ class DBCreator:
c.execute('''CREATE TABLE forwardKeys(
peerKey text not null,
forwardKey text not null,
date int not null);''')
date int not null,
expire int not null
);''')
conn.commit()
conn.close()
return
@ -108,4 +110,24 @@ class DBCreator:
''')
conn.commit()
conn.close()
return
def createForwardKeyDB(self):
'''
Create the forward secrecy key db (*for *OUR* keys*)
'''
if os.path.exists(self.core.forwardKeysFile):
raise Exception("Block database already exists")
conn = sqlite3.connect(self.core.forwardKeysFile)
c = conn.cursor()
c.execute('''CREATE TABLE myForwardKeys(
peer text not null,
public key text not null,
private key text not null,
date int not null,
expire int not null
);
''')
conn.commit()
conn.close()
return

View File

@ -93,6 +93,26 @@ class OnionrUser:
return list(keyList)
def generateForwardKey(self, expire=432000):
# Generate a forward secrecy key for the peer
conn = sqlite3.connect(self._core.forwardKeysFile)
c = conn.cursor()
# Prepare the insert
time = self._core._utils.getEpoch()
newKeys = self._core._crypto.generatePubKey()
newPub = newKeys[0]
newPriv = newKeys[1]
time = self._core._utils.getEpoch()
command = (self.publicKey, newPub, newPriv, time, expire)
c.execute("INSERT INTO myForwardKeys VALUES(?, ?, ?, ?);", command)
conn.commit()
conn.close()
def addForwardKey(self, newKey):
if not self._core._utils.validatePubKey(newKey):
raise onionrexceptions.InvalidPubkey

View File

@ -265,11 +265,12 @@ class OnionrUtils:
myBlock.decrypt()
blockType = myBlock.getMetadata('type') # we would use myBlock.getType() here, but it is bugged with encrypted blocks
signer = self.bytesToStr(myBlock.signer)
valid = myBlock.verifySig()
try:
if len(blockType) <= 10:
self._core.updateBlockInfo(blockHash, 'dataType', blockType)
onionrevents.event('processBlocks', data = {'block': myBlock, 'type': blockType}, onionr = None)
onionrevents.event('processBlocks', data = {'block': myBlock, 'type': blockType, 'signer': signer, 'validSig': valid}, onionr = None)
except TypeError:
pass

View File

@ -22,7 +22,7 @@
import logger, config
import os, sys, json, time, random, shutil, base64, getpass, datetime, re
from onionrblockapi import Block
import onionrusers
import onionrusers, onionrexceptions
plugin_name = 'metadataprocessor'
@ -50,6 +50,13 @@ def _processForwardKey(api, myBlock):
Get the forward secrecy key specified by the user for us to use
'''
peer = onionrusers.OnionrUser(self.api.get_core(), myBlock.signer)
key = myBlock.getMetadata('newFSKey')
# We don't need to validate here probably, but it helps
if api.get_utils().validatePubKey(key):
peer.addForwardKey(key)
else:
raise onionrexceptions.InvalidPubkey("%s is nota valid pubkey key" % (key,))
def on_processBlocks(api):
myBlock = api.data['block']
@ -60,12 +67,16 @@ def on_processBlocks(api):
# userInfo blocks, such as for setting username
if blockType == 'userInfo':
if myBlock.verifySig():
if api.data['validSig']:
_processUserInfo(api, myBlock)
# forwardKey blocks
# forwardKey blocks, add a new forward secrecy key for a peer
elif blockType == 'forwardKey':
if myBlock.verifySig():
if api.data['validSig']:
_processForwardKey(api, myBlock)
# socket blocks
elif blockType == 'openSocket':
if api.data['validSig']:
pass
def on_init(api, data = None):