@@ -3,11 +3,13 @@ import unittest
33import results
44import random
55import sequtils
6-
6+ import std/ md5
7+ import strformat
78import strutils
89
910import ../ src/ naxolotl
1011import ../ src/ naxolotl/ utils
12+ import ../ src/ naxolotl/ types
1113
1214
1315
@@ -69,7 +71,7 @@ suite "Doubleratchet":
6971 assert r.isOk ()
7072 assert r.get () == msg
7173
72- test " sequence " :
74+ test " skipped_msg " :
7375
7476 let (a_priv, a_pub, b_priv, b_pub) = loadTestKeys ()
7577
@@ -80,13 +82,14 @@ suite "Doubleratchet":
8082
8183 var msg0 :seq [byte ] = @ [1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ]
8284 var msg1 :seq [byte ] = @ [6 ,7 ,8 ,9 ,10 ,1 ,2 ,3 ,4 ,5 ]
83- let (header0, ciphertext0) = adr.encrypt (msg0)
84- let (header1, ciphertext1) = adr.encrypt (msg1)
85-
86- let r = bdr.decrypt (header1, ciphertext1, @ [])
85+ var m :seq [byte ] = @ [9 ,10 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ]
86+ discard adr.encrypt (msg0)
87+ discard adr.encrypt (msg1)
88+ let (header, ciphertext) = adr.encrypt (m)
89+ let r = bdr.decrypt (header, ciphertext, @ [])
8790 assert r.isOk ()
8891 let recv_msg = r.get ()
89- assert recv_msg == msg1
92+ assert recv_msg == m
9093
9194
9295 test " out of order" :
@@ -157,3 +160,36 @@ suite "Doubleratchet":
157160
158161 let r = bdr.decrypt (header, ciphertext, @ [])
159162 assert r.isErr ()
163+
164+ test " dh_key_updates" :
165+
166+ let (a_priv, a_pub, b_priv, b_pub) = loadTestKeys ()
167+
168+ let sk = hexToArray [32 ](ks7748_shared_key)
169+
170+ var adr = initDoubleratchet (sk, a_priv, b_pub, true )
171+ var bdr = initDoubleratchet (sk, b_priv, a_pub, true )
172+
173+ var last_dh_a : PublicKey
174+ var last_dh_b : PublicKey
175+
176+
177+ proc step (src: var DoubleRatchet , dst: var DoubleRatchet , m: var seq [byte ], ) : PublicKey =
178+ let (header, ciphertext) = src.encrypt (m)
179+ let r = dst.decrypt (header, ciphertext, @ [])
180+ assert m == r.get ()
181+ return header.dhPublic
182+
183+ for i in 0 .. 10 :
184+ var ma = toMD5 (fmt" M{ i} _a " ).toSeq ()
185+ var mb = toMD5 (fmt" M{ i} _b " ).toSeq ()
186+
187+ let dh_a = step (adr, bdr, ma)
188+ let dh_b = step (bdr, adr, mb)
189+
190+ assert dh_a != last_dh_a
191+ assert dh_b != last_dh_b
192+ assert dh_a != dh_b
193+
194+ last_dh_a = dh_a
195+ last_dh_b = dh_b
0 commit comments