diff --git a/src/naxolotl.nim b/src/naxolotl.nim index f6410de..aac60d4 100644 --- a/src/naxolotl.nim +++ b/src/naxolotl.nim @@ -1,7 +1,8 @@ import naxolotl/[ naxolotl, curve25519, - types + types, + errors ] -export naxolotl, curve25519 \ No newline at end of file +export naxolotl, curve25519, NaxolotlError \ No newline at end of file diff --git a/src/naxolotl/naxolotl.nim b/src/naxolotl/naxolotl.nim index d0f9ff6..553282c 100644 --- a/src/naxolotl/naxolotl.nim +++ b/src/naxolotl/naxolotl.nim @@ -2,7 +2,9 @@ import curve25519 import results import chronicles import nim_chacha20_poly1305/[common,helpers] - +import strformat +import strutils +import sequtils import tables import chacha @@ -10,18 +12,9 @@ import types import utils import errors -# converter toArray*(x: RootKey): array[32, byte] = -# array[32,byte](x) - -# converter toArray*(x: DhDerivedKey): array[32, byte] = -# array[32,byte](x) - - - const maxSkip = 10 - type Doubleratchet* = object dhSelf: PrivateKey dhRemote: PublicKey @@ -44,15 +37,22 @@ const DomainSepKdfChain = "ChainKey" type DrHeader* = object - dhPublic: PublicKey - msgNumber: uint32 - prevChainLength: uint32 + dhPublic*: PublicKey + msgNumber*: uint32 + prevChainLen*: uint32 func keyId(dh:PublicKey, recvCount: MsgCount ): KeyId = (dh, recvCount) +func hex(a: openArray[byte]) : string = + a.mapIt(&"{it:02X}").join("") + +proc `$`*(x: DrHeader): string = + "DrHeader(pubKey=" & hex(x.dhPublic) & ", msgNum=" & $x.msgNumber & ", msgNum=" & $x.prevChainLen & ")" + + ################################################# # Kdf ################################################# @@ -97,9 +97,6 @@ proc dhRatchetRecv(self: var Doubleratchet, remotePublickey: PublicKey ) = let dhOutputPost = self.dhSelf.dhExchange(self.dhRemote).get() (self.rootKey, self.chainKeyRecv) = kdfRoot(self, self.rootKey, dhOutputPost) - # let (newRootKey, newChainKeySend) = kdfRoot(self, self.rootKey, dhOutputPost) - # self.rootKey = newRootKey - # self.chainKeyRecv = newChainKeySend proc skipMessageKeys(self: var Doubleratchet, until: MsgCount): Result[(), string] = @@ -124,7 +121,7 @@ proc encrypt(self: var Doubleratchet, plaintext: var seq[byte], associatedData: let header = DrHeader( dhPublic: self.dhSelf.public, #TODO Serialize msgNumber: self.msgCountSend, - prevChainLength: self.prevChainLen) + prevChainLen: self.prevChainLen) self.msgCountSend = self.msgCountSend + 1 @@ -153,7 +150,7 @@ proc decrypt*(self: var Doubleratchet, header: DrHeader, ciphertext: CipherText, msgKey = self.skippedMessageKeys[keyId] else: if (peerPublic != self.dhRemote): - let r = self.skipMessageKeys(header.prevChainLength) + let r = self.skipMessageKeys(header.prevChainLen) if r.isErr: error "skipMessages", error = r.error() self.dhRatchetRecv(peerPublic) @@ -189,8 +186,6 @@ func initDoubleratchet*(sharedSecret: array[32, byte], dhSelf: PrivateKey, dhRem msgCountRecv: 0, prevChainLen: 0, skippedMessageKeys: initTable[(PublicKey, MsgCount), MessageKey]() - # chainKeySend: none - # chainKeyRecv: none ) if isSending: