Skip to content

Commit 41e78f3

Browse files
committed
chore: add test for DH ratchet step
1 parent 425fb0d commit 41e78f3

File tree

1 file changed

+43
-7
lines changed

1 file changed

+43
-7
lines changed

tests/test_naxolotl.nim

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import unittest
33
import results
44
import random
55
import sequtils
6-
6+
import std/md5
7+
import strformat
78
import strutils
89

910
import ../src/naxolotl
1011
import ../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

Comments
 (0)