Add naxolotl test for DH ratchet step (#23)

* fix: naxolotl key saving

* chore: add test for DH ratchet step
This commit is contained in:
Jazz Turner-Baggs 2025-11-27 10:06:01 -08:00 committed by GitHub
parent 26c41313d4
commit 07aad9b8b2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 8 deletions

View File

@ -93,7 +93,7 @@ proc dhRatchetRecv(self: var Doubleratchet, remotePublickey: PublicKey ) =
self.dhSelf = generateKeypair().get()[0] self.dhSelf = generateKeypair().get()[0]
let dhOutputPost = self.dhSelf.dhExchange(self.dhRemote).get() let dhOutputPost = self.dhSelf.dhExchange(self.dhRemote).get()
(self.rootKey, self.chainKeyRecv) = kdfRoot(self, self.rootKey, dhOutputPost) (self.rootKey, self.chainKeySend) = kdfRoot(self, self.rootKey, dhOutputPost)
proc skipMessageKeys(self: var Doubleratchet, until: MsgCount): Result[(), string] = proc skipMessageKeys(self: var Doubleratchet, until: MsgCount): Result[(), string] =

View File

@ -3,11 +3,13 @@ import unittest
import results import results
import random import random
import sequtils import sequtils
import std/md5
import strformat
import strutils import strutils
import ../src/naxolotl import ../src/naxolotl
import ../src/naxolotl/utils import ../src/naxolotl/utils
import ../src/naxolotl/types
@ -69,7 +71,7 @@ suite "Doubleratchet":
assert r.isOk() assert r.isOk()
assert r.get() == msg assert r.get() == msg
test "sequence": test "skipped_msg":
let (a_priv, a_pub, b_priv, b_pub) = loadTestKeys() let (a_priv, a_pub, b_priv, b_pub) = loadTestKeys()
@ -80,13 +82,14 @@ suite "Doubleratchet":
var msg0 :seq[byte] = @[1,2,3,4,5,6,7,8,9,10] var msg0 :seq[byte] = @[1,2,3,4,5,6,7,8,9,10]
var msg1 :seq[byte] = @[6,7,8,9,10,1,2,3,4,5] var msg1 :seq[byte] = @[6,7,8,9,10,1,2,3,4,5]
let (header0, ciphertext0) = adr.encrypt(msg0) var m :seq[byte] = @[9,10,1,2,3,4,5,6,7,8]
let (header1, ciphertext1) = adr.encrypt(msg1) discard adr.encrypt(msg0)
discard adr.encrypt(msg1)
let r = bdr.decrypt(header1, ciphertext1, @[]) let (header, ciphertext) = adr.encrypt(m)
let r = bdr.decrypt(header, ciphertext, @[])
assert r.isOk() assert r.isOk()
let recv_msg = r.get() let recv_msg = r.get()
assert recv_msg == msg1 assert recv_msg == m
test "out of order": test "out of order":
@ -157,3 +160,36 @@ suite "Doubleratchet":
let r = bdr.decrypt(header, ciphertext, @[]) let r = bdr.decrypt(header, ciphertext, @[])
assert r.isErr() assert r.isErr()
test "dh_key_updates":
let (a_priv, a_pub, b_priv, b_pub) = loadTestKeys()
let sk = hexToArray[32](ks7748_shared_key)
var adr = initDoubleratchet(sk, a_priv, b_pub, true)
var bdr = initDoubleratchet(sk, b_priv, a_pub, true)
var last_dh_a : PublicKey
var last_dh_b : PublicKey
proc step(src: var DoubleRatchet, dst: var DoubleRatchet, m: var seq[byte], ) : PublicKey =
let (header, ciphertext) = src.encrypt(m)
let r = dst.decrypt(header, ciphertext, @[])
assert m == r.get()
return header.dhPublic
for i in 0..10:
var ma = toMD5(fmt"M{i}_a").toSeq()
var mb = toMD5(fmt"M{i}_b").toSeq()
let dh_a = step(adr, bdr, ma)
let dh_b = step(bdr, adr, mb)
assert dh_a != last_dh_a
assert dh_b != last_dh_b
assert dh_a != dh_b
last_dh_a = dh_a
last_dh_b = dh_b