1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
# -*- coding: utf-8 -*-
from ...state import storageprotos_pb2 as storageprotos
from ..ratchet.senderchainkey import SenderChainKey
from ..ratchet.sendermessagekey import SenderMessageKey
from ...ecc.curve import Curve
class SenderKeyState:
def __init__(self, id=None, iteration=None, chainKey=None,
signatureKeyPublic=None, signatureKeyPrivate=None,
signatureKeyPair=None, senderKeyStateStructure=None):
"""
:type id: int
:type iteration: int
:type chainKey: bytearray
:type signatureKeyPublic: ECPublicKey
:type signatureKeyPrivate: ECPrivateKey
:type signatureKeyPair: ECKeyPair
:type senderKeyStateStructure: SenderKeyStateStructure
"""
assert (bool(id) and bool(iteration) and bool(chainKey)) or \
(bool(senderKeyStateStructure) ^ bool(signatureKeyPublic or signatureKeyPair)) or \
(bool(signatureKeyPublic) ^ bool(signatureKeyPair)), "Missing required arguments"
if senderKeyStateStructure:
self.senderKeyStateStructure = senderKeyStateStructure
else:
if signatureKeyPair:
signatureKeyPublic = signatureKeyPair.getPublicKey()
signatureKeyPrivate = signatureKeyPair.getPrivateKey()
self.senderKeyStateStructure = storageprotos.SenderKeyStateStructure()
senderChainKeyStructure = self.senderKeyStateStructure.SenderChainKey()
senderChainKeyStructure.iteration = iteration
senderChainKeyStructure.seed = chainKey
self.senderKeyStateStructure.senderChainKey.MergeFrom(senderChainKeyStructure)
signingKeyStructure = self.senderKeyStateStructure.SenderSigningKey()
signingKeyStructure.public = signatureKeyPublic.serialize()
if signatureKeyPrivate:
signingKeyStructure.private = signatureKeyPrivate.serialize()
self.senderKeyStateStructure.senderKeyId = id
self.senderChainKey = senderChainKeyStructure
self.senderKeyStateStructure.senderSigningKey.CopyFrom(signingKeyStructure)
def getKeyId(self):
return self.senderKeyStateStructure.senderKeyId
def getSenderChainKey(self):
return SenderChainKey(self.senderKeyStateStructure.senderChainKey.iteration,
bytearray(self.senderKeyStateStructure.senderChainKey.seed))
def setSenderChainKey(self, chainKey):
self.senderKeyStateStructure.senderChainKey.iteration = chainKey.getIteration()
self.senderKeyStateStructure.senderChainKey.seed = chainKey.getSeed()
def getSigningKeyPublic(self):
return Curve.decodePoint(bytearray(self.senderKeyStateStructure.senderSigningKey.public), 0)
def getSigningKeyPrivate(self):
return Curve.decodePrivatePoint(self.senderKeyStateStructure.senderSigningKey.private)
def hasSenderMessageKey(self, iteration):
for senderMessageKey in self.senderKeyStateStructure.senderMessageKeys:
if senderMessageKey.iteration == iteration:
return True
return False
def addSenderMessageKey(self, senderMessageKey):
smk = self.senderKeyStateStructure.SenderMessageKey()
smk.iteration = senderMessageKey.iteration
smk.seed = senderMessageKey.seed
self.senderKeyStateStructure.senderMessageKeys.extend([smk])
def removeSenderMessageKey(self, iteration):
keys = self.senderKeyStateStructure.senderMessageKeys
result = None
for i in range(0, len(keys)):
senderMessageKey = keys[i]
if senderMessageKey.iteration == iteration:
result = senderMessageKey
del keys[i]
break
if result is not None:
return SenderMessageKey(result.iteration, bytearray(result.seed))
return None
def getStructure(self):
return self.senderKeyStateStructure
|