Implement the static methods (that weren't already implemented)
This commit is contained in:
+13
-28
@@ -122,47 +122,32 @@ class MessengerClient:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def RatchetEncrypt(state, plaintext, AD):
|
def RatchetEncrypt(state, plaintext, AD):
|
||||||
Ns, mk = RatchetSendKey(state)
|
Ns, mk = MessengerClient.RatchetSendKey(state)
|
||||||
header = HEADER(state.DHs, state.PN, Ns)
|
header = HEADER(state.DHs, state.PN, Ns)
|
||||||
return header, ENCRYPT(mk, plaintext, CONCAT(AD, header))
|
return header, ENCRYPT(mk, plaintext, CONCAT(AD, header))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def RatchetReceiveKey(state, header):
|
def RatchetReceiveKey(state, header):
|
||||||
mk = TrySkippedMessageKeys(state, header)
|
# mk = TrySkippedMessageKeys(state, header)
|
||||||
if mk != None:
|
# if mk != None:
|
||||||
return mk
|
# return mk
|
||||||
if header.dh != state.DHr:
|
# if header.dh != state.DHr:
|
||||||
SkipMessageKeys(state, header.pn)
|
# SkipMessageKeys(state, header.pn)
|
||||||
DHRatchet(state, header)
|
# DHRatchet(state, header)
|
||||||
SkipMessageKeys(state, header.n)
|
# SkipMessageKeys(state, header.n)
|
||||||
|
if state.DHr is None or header.dh.public_bytes(serialization.Encoding.X962, serialization.PublicFormat.UncompressedPoint) != state.DHr.public_bytes(serialization.Encoding.X962, serialization.PublicFormat.UncompressedPoint):
|
||||||
|
MessengerClient.DHRatchet(state, header)
|
||||||
|
if header.n != state.Nr:
|
||||||
|
return None # out of order
|
||||||
state.CKr, mk = KDF_CK(state.CKr)
|
state.CKr, mk = KDF_CK(state.CKr)
|
||||||
state.Nr += 1
|
state.Nr += 1
|
||||||
return mk
|
return mk
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def RatchetDecrypt(state, header, ciphertext, AD):
|
def RatchetDecrypt(state, header, ciphertext, AD):
|
||||||
mk = RatchetReceiveKey(state, header)
|
mk = MessengerClient.RatchetReceiveKey(state, header)
|
||||||
return DECRYPT(mk, ciphertext, CONCAT(AD, header))
|
return DECRYPT(mk, ciphertext, CONCAT(AD, header))
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def TrySkippedMessageKeys(state, header):
|
|
||||||
if (header.dh, header.n) in state.MKSKIPPED:
|
|
||||||
mk = state.MKSKIPPED[header.dh, header.n]
|
|
||||||
del state.MKSKIPPED[header.dh, header.n]
|
|
||||||
return mk
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def SkipMessageKeys(state, until):
|
|
||||||
if state.Nr + MAX_SKIP < until:
|
|
||||||
raise Error()
|
|
||||||
if state.CKr != None:
|
|
||||||
while state.Nr < until:
|
|
||||||
state.CKr, mk = KDF_CK(state.CKr)
|
|
||||||
state.MKSKIPPED[state.DHr, state.Nr] = mk
|
|
||||||
state.Nr += 1
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def DHRatchet(state, header):
|
def DHRatchet(state, header):
|
||||||
state.PN = state.Ns
|
state.PN = state.Ns
|
||||||
|
|||||||
Reference in New Issue
Block a user