mirror of
https://github.com/valitydev/salt.git
synced 2024-11-08 09:23:56 +00:00
MOstly debugged endow transaction
Need to fix sizes too big for 1 udp packet
This commit is contained in:
parent
bbb4f27994
commit
dae79a14b0
@ -65,7 +65,7 @@ class Verifier(object):
|
|||||||
return False
|
return False
|
||||||
try:
|
try:
|
||||||
self.key.verify(signature + msg)
|
self.key.verify(signature + msg)
|
||||||
except nacl.signing.BadSignatureError:
|
except nacl.exceptions.BadSignatureError:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ class Privateer(object):
|
|||||||
now)
|
now)
|
||||||
return nonce
|
return nonce
|
||||||
|
|
||||||
def encrypt(self, msg, pubkey):
|
def encrypt(self, msg, pubkey, enhex=False):
|
||||||
'''
|
'''
|
||||||
Return duple of (cyphertext, nonce) resulting from encrypting the message
|
Return duple of (cyphertext, nonce) resulting from encrypting the message
|
||||||
using shared key generated from the .key and the pubkey
|
using shared key generated from the .key and the pubkey
|
||||||
@ -128,10 +128,11 @@ class Privateer(object):
|
|||||||
pubkey = nacl.public.PublicKey(pubkey, nacl.encoding.HexEncoder)
|
pubkey = nacl.public.PublicKey(pubkey, nacl.encoding.HexEncoder)
|
||||||
box = nacl.public.Box(self.key, pubkey)
|
box = nacl.public.Box(self.key, pubkey)
|
||||||
nonce = self.nonce()
|
nonce = self.nonce()
|
||||||
encrypted = box.encrypt(msg, nonce)
|
encoder = nacl.encoding.HexEncoder if enhex else nacl.encoding.RawEncoder
|
||||||
|
encrypted = box.encrypt(msg, nonce, encoder)
|
||||||
return (encrypted.ciphertext, encrypted.nonce)
|
return (encrypted.ciphertext, encrypted.nonce)
|
||||||
|
|
||||||
def decrypt(self, cipher, nonce, pubkey):
|
def decrypt(self, cipher, nonce, pubkey, dehex=False):
|
||||||
'''
|
'''
|
||||||
Return decripted msg contained in cypher using nonce and shared key
|
Return decripted msg contained in cypher using nonce and shared key
|
||||||
generated from .key and pubkey.
|
generated from .key and pubkey.
|
||||||
@ -146,4 +147,5 @@ class Privateer(object):
|
|||||||
if not isinstance(pubkey, nacl.public.PublicKey):
|
if not isinstance(pubkey, nacl.public.PublicKey):
|
||||||
pubkey = nacl.public.PublicKey(pubkey, nacl.encoding.HexEncoder)
|
pubkey = nacl.public.PublicKey(pubkey, nacl.encoding.HexEncoder)
|
||||||
box = nacl.public.Box(self.key, pubkey)
|
box = nacl.public.Box(self.key, pubkey)
|
||||||
return box.decrypt(cipher, nonce)
|
decoder = nacl.encoding.HexEncoder if dehex else nacl.encoding.RawEncoder
|
||||||
|
return box.decrypt(cipher, nonce, decoder)
|
||||||
|
@ -236,7 +236,7 @@ class TxCoat(Coat):
|
|||||||
|
|
||||||
if self.kind == raeting.coatKinds.nacl:
|
if self.kind == raeting.coatKinds.nacl:
|
||||||
msg = self.packet.body.packed
|
msg = self.packet.body.packed
|
||||||
cipher, nonce = self.packet.transaction.encrypt(msg)
|
cipher, nonce = self.packet.encrypt(msg)
|
||||||
self.packed = "".join([cipher, nonce])
|
self.packed = "".join([cipher, nonce])
|
||||||
|
|
||||||
if self.kind == raeting.coatKinds.nada:
|
if self.kind == raeting.coatKinds.nada:
|
||||||
@ -262,7 +262,7 @@ class RxCoat(Coat):
|
|||||||
|
|
||||||
cipher = self.packed[:-tl]
|
cipher = self.packed[:-tl]
|
||||||
nonce = self.packed[-tl:]
|
nonce = self.packed[-tl:]
|
||||||
msg = self.packet.transaction.decrypt(cipher, nonce)
|
msg = self.packet.decrypt(cipher, nonce)
|
||||||
self.packet.body.packed = msg
|
self.packet.body.packed = msg
|
||||||
|
|
||||||
if self.kind == raeting.coatKinds.nada:
|
if self.kind == raeting.coatKinds.nada:
|
||||||
@ -298,9 +298,24 @@ class TxFoot(Foot):
|
|||||||
raise raeting.PacketError(emsg)
|
raise raeting.PacketError(emsg)
|
||||||
|
|
||||||
if self.kind == raeting.footKinds.nacl:
|
if self.kind == raeting.footKinds.nacl:
|
||||||
blank = "".rjust(raeting.footSizes.nacl, '\x00')
|
self.packed = "".rjust(raeting.footSizes.nacl, '\x00')
|
||||||
msg = "".join([self.packet.head.packed, self.packet.coat.packed, blank])
|
|
||||||
self.packed = self.packet.transaction.signature(msg)
|
elif self.kind == raeting.footKinds.nada:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def sign(self):
|
||||||
|
'''
|
||||||
|
Compute signature on packet.packed and update packet.packet with signature
|
||||||
|
'''
|
||||||
|
if self.kind not in raeting.FOOT_KIND_NAMES:
|
||||||
|
self.kind = raeting.footKinds.unknown
|
||||||
|
emsg = "Unrecognizible packet foot."
|
||||||
|
raise raeting.PacketError(emsg)
|
||||||
|
|
||||||
|
if self.kind == raeting.footKinds.nacl:
|
||||||
|
#blank = "".rjust(raeting.footSizes.nacl, '\x00')
|
||||||
|
#msg = "".join([self.packet.head.packed, self.packet.coat.packed, blank])
|
||||||
|
self.packed = self.packet.signature(self.packet.packed)
|
||||||
|
|
||||||
elif self.kind == raeting.footKinds.nada:
|
elif self.kind == raeting.footKinds.nada:
|
||||||
pass
|
pass
|
||||||
@ -329,21 +344,20 @@ class RxFoot(Foot):
|
|||||||
signature = self.packed
|
signature = self.packed
|
||||||
blank = "".rjust(raeting.footSizes.nacl, '\x00')
|
blank = "".rjust(raeting.footSizes.nacl, '\x00')
|
||||||
msg = "".join([self.packet.head.packed, self.packet.coat.packed, blank])
|
msg = "".join([self.packet.head.packed, self.packet.coat.packed, blank])
|
||||||
if not self.packet.transaction.verify(signature, msg):
|
if not self.packet.verify(signature, msg):
|
||||||
emsg = "Failed verification"
|
emsg = "Failed verification"
|
||||||
raise raeting.PacketError(emsg)
|
raise raeting.PacketError(emsg)
|
||||||
|
|
||||||
if self.kind == raeting.footKinds.nada:
|
if self.kind == raeting.footKinds.nada:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Packet(object):
|
class Packet(object):
|
||||||
'''
|
'''
|
||||||
RAET protocol packet object
|
RAET protocol packet object
|
||||||
'''
|
'''
|
||||||
def __init__(self, transaction=None, kind=None):
|
def __init__(self, stack=None, kind=None):
|
||||||
''' Setup Packet instance. Meta data for a packet. '''
|
''' Setup Packet instance. Meta data for a packet. '''
|
||||||
self.transaction = transaction
|
self.stack = stack
|
||||||
self.kind = kind or raeting.PACKET_DEFAULTS['pk']
|
self.kind = kind or raeting.PACKET_DEFAULTS['pk']
|
||||||
self.packed = '' # packed string
|
self.packed = '' # packed string
|
||||||
self.segments = [] # subpackets when segmented
|
self.segments = [] # subpackets when segmented
|
||||||
@ -365,7 +379,6 @@ class Packet(object):
|
|||||||
self.data.update(data)
|
self.data.update(data)
|
||||||
return self # so can method chain
|
return self # so can method chain
|
||||||
|
|
||||||
|
|
||||||
class TxPacket(Packet):
|
class TxPacket(Packet):
|
||||||
'''
|
'''
|
||||||
RAET Protocol Transmit Packet object
|
RAET Protocol Transmit Packet object
|
||||||
@ -390,6 +403,27 @@ class TxPacket(Packet):
|
|||||||
data = self.data
|
data = self.data
|
||||||
return ((data['cf'], data['sd'], data['dd'], data['si'], data['ti'], data['bf']))
|
return ((data['cf'], data['sd'], data['dd'], data['si'], data['ti'], data['bf']))
|
||||||
|
|
||||||
|
def signature(self, msg):
|
||||||
|
'''
|
||||||
|
Return signature resulting from signing msg
|
||||||
|
'''
|
||||||
|
return (self.stack.device.signer.signature(msg))
|
||||||
|
|
||||||
|
def sign(self):
|
||||||
|
'''
|
||||||
|
Sign packet with foot
|
||||||
|
'''
|
||||||
|
self.foot.sign()
|
||||||
|
self.packed = ''.join([self.head.packed, self.coat.packed, self.foot.packed])
|
||||||
|
|
||||||
|
def encrypt(self, msg):
|
||||||
|
'''
|
||||||
|
Return (cipher, nonce) duple resulting from encrypting message
|
||||||
|
with short term keys
|
||||||
|
'''
|
||||||
|
remote = self.stack.devices[self.data['dd']]
|
||||||
|
return (remote.privee.encrypt(msg, remote.publee.key))
|
||||||
|
|
||||||
def pack(self):
|
def pack(self):
|
||||||
'''
|
'''
|
||||||
Pack the parts of the packet and then the full packet into .packed
|
Pack the parts of the packet and then the full packet into .packed
|
||||||
@ -401,12 +435,6 @@ class TxPacket(Packet):
|
|||||||
self.packed = ''.join([self.head.packed, self.coat.packed, self.foot.packed])
|
self.packed = ''.join([self.head.packed, self.coat.packed, self.foot.packed])
|
||||||
self.sign()
|
self.sign()
|
||||||
|
|
||||||
def sign(self):
|
|
||||||
'''
|
|
||||||
Sign .packed using foot
|
|
||||||
'''
|
|
||||||
return True
|
|
||||||
|
|
||||||
class RxPacket(Packet):
|
class RxPacket(Packet):
|
||||||
'''
|
'''
|
||||||
RAET Protocol Receive Packet object
|
RAET Protocol Receive Packet object
|
||||||
@ -430,6 +458,20 @@ class RxPacket(Packet):
|
|||||||
data = self.data
|
data = self.data
|
||||||
return ((not data['cf'], data['dd'], data['sd'], data['si'], data['ti'], data['bf']))
|
return ((not data['cf'], data['dd'], data['sd'], data['si'], data['ti'], data['bf']))
|
||||||
|
|
||||||
|
def verify(self, signature, msg):
|
||||||
|
'''
|
||||||
|
Return result of verifying msg with signature
|
||||||
|
'''
|
||||||
|
return (self.stack.devices[self.data['sd']].verfer.verify(signature, msg))
|
||||||
|
|
||||||
|
def decrypt(self, cipher, nonce):
|
||||||
|
'''
|
||||||
|
Return msg resulting from decrypting cipher and nonce
|
||||||
|
with short term keys
|
||||||
|
'''
|
||||||
|
remote = self.stack.devices[self.data['sd']]
|
||||||
|
return (self.stack.device.privee.decrypt(cipher, nonce, remote.publee, key))
|
||||||
|
|
||||||
def unpack(self, packed=None):
|
def unpack(self, packed=None):
|
||||||
'''
|
'''
|
||||||
Unpacks the foot, body, and coat parts of .packed
|
Unpacks the foot, body, and coat parts of .packed
|
||||||
@ -490,7 +532,6 @@ class RxPacket(Packet):
|
|||||||
|
|
||||||
self.unpack()
|
self.unpack()
|
||||||
self.foot.parse()
|
self.foot.parse()
|
||||||
self.verify()
|
|
||||||
|
|
||||||
def parseInner(self):
|
def parseInner(self):
|
||||||
'''
|
'''
|
||||||
@ -504,17 +545,4 @@ class RxPacket(Packet):
|
|||||||
Raises PacketError exception If failure
|
Raises PacketError exception If failure
|
||||||
'''
|
'''
|
||||||
self.coat.parse()
|
self.coat.parse()
|
||||||
self.decrypt()
|
|
||||||
self.body.parse()
|
self.body.parse()
|
||||||
|
|
||||||
def verify(self):
|
|
||||||
'''
|
|
||||||
Uses signature in foot to verify (authenticate) packet signature
|
|
||||||
'''
|
|
||||||
return True
|
|
||||||
|
|
||||||
def decrypt(self):
|
|
||||||
'''
|
|
||||||
Uses coat to decrypt body
|
|
||||||
'''
|
|
||||||
return True
|
|
||||||
|
@ -147,10 +147,10 @@ class StackUdp(object):
|
|||||||
|
|
||||||
print "{0} received\n{1}".format(self.name, raw)
|
print "{0} received\n{1}".format(self.name, raw)
|
||||||
|
|
||||||
packet = packeting.RxPacket(packed=raw)
|
packet = packeting.RxPacket(stack=self, packed=raw)
|
||||||
try:
|
try:
|
||||||
packet.parseOuter()
|
packet.parseOuter()
|
||||||
except packeting.PacketError as ex:
|
except raeting.PacketError as ex:
|
||||||
print ex
|
print ex
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ class StackUdp(object):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
packet.parseInner()
|
packet.parseInner()
|
||||||
except packeting.PacketError as ex:
|
except raeting.PacketError as ex:
|
||||||
print ex
|
print ex
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -221,7 +221,7 @@ class StackUdp(object):
|
|||||||
|
|
||||||
def replyJoin(self, packet):
|
def replyJoin(self, packet):
|
||||||
'''
|
'''
|
||||||
Correspond to join transaction
|
Correspond to new join transaction
|
||||||
'''
|
'''
|
||||||
data = odict(hk=self.Hk, bk=self.Bk)
|
data = odict(hk=self.Hk, bk=self.Bk)
|
||||||
joinent = transacting.Joinent(stack=self,
|
joinent = transacting.Joinent(stack=self,
|
||||||
@ -243,11 +243,11 @@ class StackUdp(object):
|
|||||||
|
|
||||||
def replyEndow(self, packet):
|
def replyEndow(self, packet):
|
||||||
'''
|
'''
|
||||||
Correspond to endow transaction
|
Correspond to new endow transaction
|
||||||
'''
|
'''
|
||||||
data = odict(hk=self.Hk, bk=self.Bk)
|
data = odict(hk=self.Hk, bk=self.Bk)
|
||||||
endowent = transacting.Endowent(stack=self,
|
endowent = transacting.Endowent(stack=self,
|
||||||
rid=packet.data['sd'],
|
rdid=packet.data['sd'],
|
||||||
sid=packet.data['si'],
|
sid=packet.data['si'],
|
||||||
tid=packet.data['ti'],
|
tid=packet.data['ti'],
|
||||||
txData=data,
|
txData=data,
|
||||||
|
@ -34,7 +34,7 @@ def test():
|
|||||||
prikey=masterPriKeyHex,)
|
prikey=masterPriKeyHex,)
|
||||||
stack0 = stacking.StackUdp(device=device)
|
stack0 = stacking.StackUdp(device=device)
|
||||||
|
|
||||||
#minon stack
|
#minion stack
|
||||||
device = devicing.LocalDevice( did=0,
|
device = devicing.LocalDevice( did=0,
|
||||||
ha=("", raeting.RAET_TEST_PORT),
|
ha=("", raeting.RAET_TEST_PORT),
|
||||||
signkey=minionSignKeyHex,
|
signkey=minionSignKeyHex,
|
||||||
@ -69,11 +69,37 @@ def test():
|
|||||||
print "{0} transactions=\n{1}".format(stack1.name, stack1.transactions)
|
print "{0} transactions=\n{1}".format(stack1.name, stack1.transactions)
|
||||||
|
|
||||||
stack1.endow()
|
stack1.endow()
|
||||||
|
|
||||||
timer.restart()
|
timer.restart()
|
||||||
|
while not timer.expired:
|
||||||
stack1.serviceUdp()
|
stack1.serviceUdp()
|
||||||
stack0.serviceUdp()
|
stack0.serviceUdp()
|
||||||
|
|
||||||
|
while stack0.udpRxes:
|
||||||
|
stack0.processUdpRx()
|
||||||
|
|
||||||
|
timer.restart()
|
||||||
|
while not timer.expired:
|
||||||
|
stack0.serviceUdp()
|
||||||
|
stack1.serviceUdp()
|
||||||
|
|
||||||
|
while stack1.udpRxes:
|
||||||
|
stack1.processUdpRx()
|
||||||
|
|
||||||
|
timer.restart()
|
||||||
|
while not timer.expired:
|
||||||
|
stack0.serviceUdp()
|
||||||
|
stack1.serviceUdp()
|
||||||
|
|
||||||
|
while stack0.udpRxes:
|
||||||
|
stack0.processUdpRx()
|
||||||
|
|
||||||
|
timer.restart()
|
||||||
|
while not timer.expired:
|
||||||
|
stack0.serviceUdp()
|
||||||
|
stack1.serviceUdp()
|
||||||
|
|
||||||
|
while stack1.udpRxes:
|
||||||
|
stack1.processUdpRx()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -6,6 +6,7 @@ stacking.py raet protocol stacking classes
|
|||||||
|
|
||||||
# Import python libs
|
# Import python libs
|
||||||
import socket
|
import socket
|
||||||
|
import binascii
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import simplejson as json
|
import simplejson as json
|
||||||
@ -103,34 +104,6 @@ class Transaction(object):
|
|||||||
index = self.index
|
index = self.index
|
||||||
self.stack.removeTransaction(index, transaction=self)
|
self.stack.removeTransaction(index, transaction=self)
|
||||||
|
|
||||||
def signature(self, msg):
|
|
||||||
'''
|
|
||||||
Return signature resulting from signing msg
|
|
||||||
'''
|
|
||||||
return (self.stack.device.signer.signature(msg))
|
|
||||||
|
|
||||||
def verify(self, signature, msg):
|
|
||||||
'''
|
|
||||||
Return result of verifying msg with signature
|
|
||||||
'''
|
|
||||||
return (self.stack.devices[self.rdid].verfer.verify(signature, msg))
|
|
||||||
|
|
||||||
def encrypt(self, msg):
|
|
||||||
'''
|
|
||||||
Return (cipher, nonce) duple resulting from encrypting message
|
|
||||||
with short term keys
|
|
||||||
'''
|
|
||||||
remote = self.stack.devices[self.rdid]
|
|
||||||
return (self.stack.device.privee.encrypt(msg, remote.publee.key))
|
|
||||||
|
|
||||||
def decrypt(self, cipher, nonce):
|
|
||||||
'''
|
|
||||||
Return msg resulting from decrypting cipher and nonce
|
|
||||||
with short term keys
|
|
||||||
'''
|
|
||||||
remote = self.stack.devices[self.rdid]
|
|
||||||
return (self.stack.device.privee.decrypt(cipher, nonce, remote.publee, key))
|
|
||||||
|
|
||||||
class Initiator(Transaction):
|
class Initiator(Transaction):
|
||||||
'''
|
'''
|
||||||
RAET protocol initiator transaction class
|
RAET protocol initiator transaction class
|
||||||
@ -229,7 +202,7 @@ class Joiner(Initiator):
|
|||||||
|
|
||||||
body = odict([('verhex', self.stack.device.signer.verhex),
|
body = odict([('verhex', self.stack.device.signer.verhex),
|
||||||
('pubhex', self.stack.device.priver.pubhex)])
|
('pubhex', self.stack.device.priver.pubhex)])
|
||||||
packet = packeting.TxPacket(transaction=self,
|
packet = packeting.TxPacket(stack=self.stack,
|
||||||
kind=raeting.pcktKinds.request,
|
kind=raeting.pcktKinds.request,
|
||||||
embody=body,
|
embody=body,
|
||||||
data=self.txData)
|
data=self.txData)
|
||||||
@ -360,7 +333,7 @@ class Joinent(Correspondent):
|
|||||||
ck=raeting.coatKinds.nada,
|
ck=raeting.coatKinds.nada,
|
||||||
fk=raeting.footKinds.nada,)
|
fk=raeting.footKinds.nada,)
|
||||||
body = odict()
|
body = odict()
|
||||||
packet = packeting.TxPacket(transaction=self,
|
packet = packeting.TxPacket(stack=self.stack,
|
||||||
kind=raeting.pcktKinds.ack,
|
kind=raeting.pcktKinds.ack,
|
||||||
embody=body,
|
embody=body,
|
||||||
data=self.txData)
|
data=self.txData)
|
||||||
@ -400,7 +373,7 @@ class Joinent(Correspondent):
|
|||||||
('rdid', self.stack.device.did),
|
('rdid', self.stack.device.did),
|
||||||
('verhex', self.stack.device.signer.verhex),
|
('verhex', self.stack.device.signer.verhex),
|
||||||
('pubhex', self.stack.device.priver.pubhex)])
|
('pubhex', self.stack.device.priver.pubhex)])
|
||||||
packet = packeting.TxPacket(transaction=self,
|
packet = packeting.TxPacket(stack=self.stack,
|
||||||
kind=raeting.pcktKinds.response,
|
kind=raeting.pcktKinds.response,
|
||||||
embody=body,
|
embody=body,
|
||||||
data=self.txData)
|
data=self.txData)
|
||||||
@ -446,7 +419,7 @@ class Endower(Initiator):
|
|||||||
|
|
||||||
if packet.data['tk'] == raeting.trnsKinds.endow:
|
if packet.data['tk'] == raeting.trnsKinds.endow:
|
||||||
if packet.data['pk'] == raeting.pcktKinds.cookie:
|
if packet.data['pk'] == raeting.pcktKinds.cookie:
|
||||||
self.initiate()
|
self.cookie()
|
||||||
elif packet.data['pk'] == raeting.pcktKinds.ack:
|
elif packet.data['pk'] == raeting.pcktKinds.ack:
|
||||||
self.endow()
|
self.endow()
|
||||||
|
|
||||||
@ -478,14 +451,14 @@ class Endower(Initiator):
|
|||||||
raise raeting.TransactionError(emsg)
|
raise raeting.TransactionError(emsg)
|
||||||
|
|
||||||
remote = self.stack.devices[self.rdid]
|
remote = self.stack.devices[self.rdid]
|
||||||
msg = "".rjust(64, '\x00')
|
msg = binascii.hexlify("".rjust(32, '\x00'))
|
||||||
cipher, nonce = remote.privee.encrypt(msg, remote.pubber.key)
|
cipher, nonce = remote.privee.encrypt(msg, remote.pubber.key, enhex=True)
|
||||||
body = odict([('plain', msg),
|
body = odict([('plain', msg),
|
||||||
('shorthex', remote.privee.pubhex),
|
('shorthex', remote.privee.pubhex),
|
||||||
('cipher', cipher),
|
('cipher', cipher),
|
||||||
('nonce', nonce)])
|
('nonce', nonce)])
|
||||||
|
|
||||||
packet = packeting.TxPacket(transaction=self,
|
packet = packeting.TxPacket(stack=self.stack,
|
||||||
kind=raeting.pcktKinds.hello,
|
kind=raeting.pcktKinds.hello,
|
||||||
embody=body,
|
embody=body,
|
||||||
data=self.txData)
|
data=self.txData)
|
||||||
@ -516,6 +489,8 @@ class Endower(Initiator):
|
|||||||
|
|
||||||
remote = self.stack.devices[self.rdid]
|
remote = self.stack.devices[self.rdid]
|
||||||
|
|
||||||
|
cipher = binascii.unhexlify(cipher)
|
||||||
|
nonce = binascii.unhexlify(nonce)
|
||||||
msg = remote.privee.decrypt(cipher, nonce, remote.pubber.key)
|
msg = remote.privee.decrypt(cipher, nonce, remote.pubber.key)
|
||||||
stuff = json.loads(msg, object_pairs_hook=odict)
|
stuff = json.loads(msg, object_pairs_hook=odict)
|
||||||
|
|
||||||
@ -524,8 +499,7 @@ class Endower(Initiator):
|
|||||||
emsg = "Missing short term key in cookie"
|
emsg = "Missing short term key in cookie"
|
||||||
raise raeting.TransactionError(emsg)
|
raise raeting.TransactionError(emsg)
|
||||||
|
|
||||||
|
if stuff.get('sdid') != remote.did or stuff.get('ddid') != self.stack.device.did:
|
||||||
if stuff.get('sdid') != remote.did or self.get('ddid') != self.stack.device.did:
|
|
||||||
emsg = "Invalid cookie sdid or ddid fields in cookie packet"
|
emsg = "Invalid cookie sdid or ddid fields in cookie packet"
|
||||||
raeting.TransactionError(emsg)
|
raeting.TransactionError(emsg)
|
||||||
|
|
||||||
@ -549,18 +523,25 @@ class Endower(Initiator):
|
|||||||
|
|
||||||
remote = self.stack.devices[self.rdid]
|
remote = self.stack.devices[self.rdid]
|
||||||
vouch = json.dumps(odict(shorthex=remote.privee.pubhex), separators=(',', ':'))
|
vouch = json.dumps(odict(shorthex=remote.privee.pubhex), separators=(',', ':'))
|
||||||
vcipher, vnonce = self.stack.device.priver.encrypt(vouch, remote.pubber.key)
|
vcipher, vnonce = self.stack.device.priver.encrypt(vouch,
|
||||||
|
remote.pubber.key)
|
||||||
|
vcipher = binascii.hexlify(vcipher)
|
||||||
|
vnonce = binascii.hexlify(vcipher)
|
||||||
stuff = odict([('fqdn', remote.fqdn),
|
stuff = odict([('fqdn', remote.fqdn),
|
||||||
('longhex', self.stack.device.priver.keyhex),
|
('longhex', self.stack.device.priver.keyhex),
|
||||||
('vcipher', vcipher),
|
('vcipher', vcipher),
|
||||||
('vnonce', vnonce),])
|
('vnonce', vnonce),])
|
||||||
|
stuff = json.dumps(stuff, separators=(',', ':'))
|
||||||
|
|
||||||
cipher, nonce = remote.privee.encrypt(stuff, remote.publee.key)
|
cipher, nonce = remote.privee.encrypt(stuff, remote.publee.key)
|
||||||
|
cipher = binascii.hexlify(cipher)
|
||||||
|
nonce = binascii.hexlify(nonce)
|
||||||
|
|
||||||
body = odict([('shorthex', remote.privee.pubhex),
|
body = odict([('shorthex', remote.privee.pubhex),
|
||||||
('oreo', self.oreo),
|
('oreo', self.oreo),
|
||||||
('cipher', cipher),
|
('cipher', cipher),
|
||||||
('nonce', nonce)])
|
('nonce', nonce)])
|
||||||
packet = packeting.TxPacket(transaction=self,
|
packet = packeting.TxPacket(stack=self.stack,
|
||||||
kind=raeting.pcktKinds.initiate,
|
kind=raeting.pcktKinds.initiate,
|
||||||
embody=body,
|
embody=body,
|
||||||
data=self.txData)
|
data=self.txData)
|
||||||
@ -577,7 +558,7 @@ class Endower(Initiator):
|
|||||||
'''
|
'''
|
||||||
Perform endowment in response to ack to initiate packet
|
Perform endowment in response to ack to initiate packet
|
||||||
'''
|
'''
|
||||||
self.stack.devices[self.rid].endowed = True
|
self.stack.devices[self.rdid].endowed = True
|
||||||
self.remove()
|
self.remove()
|
||||||
|
|
||||||
class Endowent(Correspondent):
|
class Endowent(Correspondent):
|
||||||
@ -590,8 +571,8 @@ class Endowent(Correspondent):
|
|||||||
Setup instance
|
Setup instance
|
||||||
'''
|
'''
|
||||||
kwa['kind'] = raeting.trnsKinds.endow
|
kwa['kind'] = raeting.trnsKinds.endow
|
||||||
if 'rid' not in kwa:
|
if 'rdid' not in kwa:
|
||||||
emsg = "Missing required keyword argumens: '{0}'".format('rid')
|
emsg = "Missing required keyword argumens: '{0}'".format('rdid')
|
||||||
raise TypeError(emsg)
|
raise TypeError(emsg)
|
||||||
super(Endowent, self).__init__(**kwa)
|
super(Endowent, self).__init__(**kwa)
|
||||||
remote = self.stack.devices[self.rdid]
|
remote = self.stack.devices[self.rdid]
|
||||||
@ -619,7 +600,7 @@ class Endowent(Correspondent):
|
|||||||
'''
|
'''
|
||||||
Prepare .txData
|
Prepare .txData
|
||||||
'''
|
'''
|
||||||
remote = self.stack.devices[self.rid]
|
remote = self.stack.devices[self.rdid]
|
||||||
self.txData.update( sh=self.stack.device.host,
|
self.txData.update( sh=self.stack.device.host,
|
||||||
sp=self.stack.device.port,
|
sp=self.stack.device.port,
|
||||||
dh=remote.host,
|
dh=remote.host,
|
||||||
@ -646,6 +627,7 @@ class Endowent(Correspondent):
|
|||||||
emsg = "Missing plain in hello packet"
|
emsg = "Missing plain in hello packet"
|
||||||
raise raeting.TransactionError(emsg)
|
raise raeting.TransactionError(emsg)
|
||||||
|
|
||||||
|
#plain = binascii.unhexlify(plain)
|
||||||
if len(plain) != 64:
|
if len(plain) != 64:
|
||||||
emsg = "Invalid plain size = {0}".format(len(plain))
|
emsg = "Invalid plain size = {0}".format(len(plain))
|
||||||
raise raeting.TransactionError(emsg)
|
raise raeting.TransactionError(emsg)
|
||||||
@ -665,9 +647,11 @@ class Endowent(Correspondent):
|
|||||||
emsg = "Missing nonce in hello packet"
|
emsg = "Missing nonce in hello packet"
|
||||||
raise raeting.TransactionError(emsg)
|
raise raeting.TransactionError(emsg)
|
||||||
|
|
||||||
|
cipher = binascii.unhexlify(cipher)
|
||||||
|
nonce = binascii.unhexlify(nonce)
|
||||||
remote = self.stack.devices[self.rdid]
|
remote = self.stack.devices[self.rdid]
|
||||||
remote.publee = nacling.Publican(key=shorthex)
|
remote.publee = nacling.Publican(key=shorthex)
|
||||||
msg = remote.publee.decrypt(cipher, nonce, remote.pubber.key)
|
msg = self.stack.device.priver.decrypt(cipher, nonce, remote.publee.key)
|
||||||
if msg != plain :
|
if msg != plain :
|
||||||
emsg = "Invalid plain not match decrypted cipher"
|
emsg = "Invalid plain not match decrypted cipher"
|
||||||
raise raeting.TransactionError(emsg)
|
raise raeting.TransactionError(emsg)
|
||||||
@ -683,17 +667,19 @@ class Endowent(Correspondent):
|
|||||||
raise raeting.TransactionError(emsg)
|
raise raeting.TransactionError(emsg)
|
||||||
|
|
||||||
remote = self.stack.devices[self.rdid]
|
remote = self.stack.devices[self.rdid]
|
||||||
self.oreo = remote.priver.nonce()
|
self.oreo = binascii.hexlify(self.stack.device.priver.nonce())
|
||||||
|
|
||||||
stuff = odict([('shorthex', remote.privee.pubhex),
|
stuff = odict([('shorthex', remote.privee.pubhex),
|
||||||
('sdid', self.stack.devices.did),
|
('sdid', self.stack.device.did),
|
||||||
('ddid', remote.did),
|
('ddid', remote.did),
|
||||||
('oreo', self.oreo)])
|
('oreo', self.oreo)])
|
||||||
stuff = json.dumps(stuff, separators=(',', ':'))
|
stuff = json.dumps(stuff, separators=(',', ':'))
|
||||||
|
|
||||||
cipher, nonce = self.priver.encrypt(stuff, remote.publee.key)
|
cipher, nonce = self.stack.device.priver.encrypt(stuff, remote.publee.key)
|
||||||
|
cipher = binascii.hexlify(cipher)
|
||||||
|
nonce = binascii.hexlify(nonce)
|
||||||
body = odict([('cipher', cipher), ('nonce', nonce)])
|
body = odict([('cipher', cipher), ('nonce', nonce)])
|
||||||
packet = packeting.TxPacket(transaction=self,
|
packet = packeting.TxPacket(stack=self.stack,
|
||||||
kind=raeting.pcktKinds.cookie,
|
kind=raeting.pcktKinds.cookie,
|
||||||
embody=body,
|
embody=body,
|
||||||
data=self.txData)
|
data=self.txData)
|
||||||
@ -738,12 +724,14 @@ class Endowent(Correspondent):
|
|||||||
|
|
||||||
remote = self.stack.devices[self.rdid]
|
remote = self.stack.devices[self.rdid]
|
||||||
remote.publee = nacling.Publican(key=shorthex)
|
remote.publee = nacling.Publican(key=shorthex)
|
||||||
|
cipher = binascii.unhexlify(cipher)
|
||||||
|
nonce = binascii.unhexlify(nonce)
|
||||||
msg = remote.publee.decrypt(cipher, nonce, remote.pubber.key)
|
msg = remote.publee.decrypt(cipher, nonce, remote.pubber.key)
|
||||||
if msg != plain :
|
if msg != plain :
|
||||||
emsg = "Invalid plain not match decrypted cipher"
|
emsg = "Invalid plain not match decrypted cipher"
|
||||||
raise raeting.TransactionError(emsg)
|
raise raeting.TransactionError(emsg)
|
||||||
|
|
||||||
self.cookie()
|
self.ackInitiate()
|
||||||
|
|
||||||
def ackInitiate(self):
|
def ackInitiate(self):
|
||||||
'''
|
'''
|
||||||
@ -755,7 +743,7 @@ class Endowent(Correspondent):
|
|||||||
raise raeting.TransactionError(msg)
|
raise raeting.TransactionError(msg)
|
||||||
|
|
||||||
body = odict()
|
body = odict()
|
||||||
packet = packeting.TxPacket(transaction=self,
|
packet = packeting.TxPacket(stack=self.stack,
|
||||||
kind=raeting.pcktKinds.ack,
|
kind=raeting.pcktKinds.ack,
|
||||||
embody=body,
|
embody=body,
|
||||||
data=self.txData)
|
data=self.txData)
|
||||||
|
Loading…
Reference in New Issue
Block a user