Skip to content

Commit 6dff127

Browse files
committed
skip outgoing messages for decryption
1 parent ba124a3 commit 6dff127

File tree

4 files changed

+40
-5
lines changed

4 files changed

+40
-5
lines changed

examples/pingpong.nim

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ proc main() {.async.} =
3131
let sIdent = Identity(name: "saro", privateKey: sKey)
3232

3333
# Create Clients
34+
info "create saro client"
3435
var saro = newClient(cfg_saro, sIdent)
36+
37+
info "create raya client"
3538
var raya = newClient(cfg_raya, Identity(name: "raya", privateKey: rKey))
3639

3740
var ri = 0

src/chat_sdk/conversations/private_v1.nim

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,16 @@ proc calcMsgId(self: PrivateV1, msgBytes: seq[byte]): string =
7272

7373
proc encrypt*(convo: PrivateV1, plaintext: var seq[byte]): EncryptedPayload =
7474

75+
info "encrypt metadata"
76+
info "Doubleratchet DH Self: ", dhSelf = convo.doubleratchet.dhSelf
77+
info "dh self public:" , dhSelfPub = convo.doubleratchet.dhSelf.public
78+
info "dhRemote: ", dhRemote = convo.doubleratchet.dhRemote
79+
7580
let (header, ciphertext) = convo.doubleratchet.encrypt(plaintext) #TODO: Associated Data
7681

82+
info "encrypt done"
83+
info "header dh public: ", dhPub = header.dhPublic
84+
7785
result = EncryptedPayload(doubleratchet: proto_types.DoubleRatchet(
7886
dh: toSeq(header.dhPublic),
7987
msgNum: header.msgNumber,
@@ -93,6 +101,16 @@ proc decrypt*(convo: PrivateV1, enc: EncryptedPayload): Result[seq[byte], ChatEr
93101
prevChainLen: dr.prevChainLen
94102
)
95103
copyMem(addr header.dhPublic[0], unsafeAddr dr.dh[0], dr.dh.len) # TODO: Avoid this copy
104+
105+
info "decrypt metadata"
106+
info "header dh public: ", dhPub = header.dhPublic
107+
info "Doubleratchet DH Remote: ", dhRemote = convo.doubleratchet.dhRemote
108+
info "dh self:", dhSelf = convo.doubleratchet.dhSelf
109+
info "dh self public:" , dhSelfPub = convo.doubleratchet.dhSelf.public
110+
111+
if convo.doubleratchet.dhSelf.public == header.dhPublic:
112+
info "outgoing message, no need to decrypt"
113+
return err(ChatError(code: errDecryptOutgoing, context: "Attempted to decrypt outgoing message"))
96114

97115
convo.doubleratchet.decrypt(header, dr.ciphertext, @[]).mapErr(proc(e: NaxolotlError): ChatError = ChatError(code: errWrapped, context: repr(e) ))
98116

src/chat_sdk/errors.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ type
88
ErrorCode* = enum
99
errTypeError
1010
errWrapped
11+
errDecryptOutgoing
1112

1213

1314
proc `$`*(x: ChatError): string =

src/naxolotl/naxolotl.nim

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ const maxSkip = 10
1616

1717

1818
type Doubleratchet* = object
19-
dhSelf: PrivateKey
20-
dhRemote: PublicKey
19+
dhSelf*: PrivateKey
20+
dhRemote*: PublicKey
2121

2222
rootKey: RootKey
2323
chainKeySend: ChainKey
@@ -73,15 +73,18 @@ func kdfChain(self: Doubleratchet, chainKey: ChainKey): (MessageKey, ChainKey) =
7373

7474
return(msgKey, chainKey)
7575

76-
func dhRatchetSend(self: var Doubleratchet) =
76+
proc dhRatchetSend(self: var Doubleratchet) =
7777
# Perform DH Ratchet step when receiving a new peer key.
78+
info "dhRatchetSend DH Self: ", dhSelf = self.dhSelf
7879
let dhOutput : DhDerivedKey = dhExchange(self.dhSelf, self.dhRemote).get()
7980
let (newRootKey, newChainKeySend) = kdfRoot(self, self.rootKey, dhOutput)
8081
self.rootKey = newRootKey
8182
self.chainKeySend = newChainKeySend
8283
self.msgCountSend = 0
8384

8485
proc dhRatchetRecv(self: var Doubleratchet, remotePublickey: PublicKey ) =
86+
info "dh ratchet happens"
87+
info "dhRatchetRecv DH Remote: ", dhRemote = remotePublickey
8588
self.prevChainLen = self.msgCountSend
8689
self.msgCountSend = 0
8790
self.msgCountRecv = 0
@@ -96,7 +99,7 @@ proc dhRatchetRecv(self: var Doubleratchet, remotePublickey: PublicKey ) =
9699
self.dhSelf = generateKeypair().get()[0]
97100

98101
let dhOutputPost = self.dhSelf.dhExchange(self.dhRemote).get()
99-
(self.rootKey, self.chainKeyRecv) = kdfRoot(self, self.rootKey, dhOutputPost)
102+
(self.rootKey, self.chainKeySend) = kdfRoot(self, self.rootKey, dhOutputPost)
100103

101104

102105
proc skipMessageKeys(self: var Doubleratchet, until: MsgCount): Result[(), string] =
@@ -138,9 +141,15 @@ proc encrypt(self: var Doubleratchet, plaintext: var seq[byte], associatedData:
138141

139142

140143
proc decrypt*(self: var Doubleratchet, header: DrHeader, ciphertext: CipherText, associatedData: openArray[byte] ) : Result[seq[byte], NaxolotlError] =
144+
info "double ratchet decrypt", header = $header
145+
info "dhRemote: ", dhRemote = self.dhRemote
146+
info "dhSelf: ", dhSelf = self.dhSelf
147+
info "dhSelf public: ", dhSelf = self.dhSelf.public
141148

142149
let peerPublic = header.dhPublic
143150

151+
info "peerPublic: ", peerPublic = peerPublic
152+
144153
var msgKey : MessageKey
145154

146155
# Check Skipped Keys
@@ -176,8 +185,12 @@ proc encrypt*(self: var Doubleratchet, plaintext: var seq[byte]) : (DrHeader, Ci
176185
encrypt(self, plaintext,@[])
177186

178187

179-
func initDoubleratchet*(sharedSecret: array[32, byte], dhSelf: PrivateKey, dhRemote: PublicKey, isSending: bool = true): Doubleratchet =
188+
proc initDoubleratchet*(sharedSecret: array[32, byte], dhSelf: PrivateKey, dhRemote: PublicKey, isSending: bool = true): Doubleratchet =
180189

190+
info "Initializing Double Ratchet"
191+
info "DH Self: ", dhSelf = dhSelf
192+
info "DH Self public: ", dhSelf = dhSelf.public
193+
info "DH Remote: ", dhRemote = dhRemote
181194
result = Doubleratchet(
182195
dhSelf: dhSelf,
183196
dhRemote: dhRemote,

0 commit comments

Comments
 (0)