Skip to content

Commit dd29da4

Browse files
nplastererkele-leanes
authored and
kele-leanes
committedFeb 28, 2024
get the test to pass
1 parent ca3416c commit dd29da4

File tree

4 files changed

+39
-53
lines changed

4 files changed

+39
-53
lines changed
 

‎library/src/androidTest/java/org/xmtp/android/library/CodecTest.kt

+22-36
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import org.junit.Assert.assertEquals
66
import org.junit.Assert.assertTrue
77
import org.junit.Test
88
import org.junit.runner.RunWith
9-
import org.xmtp.android.library.Crypto.Companion.calculateMac
109
import org.xmtp.android.library.Crypto.Companion.verifyHmacSignature
1110
import org.xmtp.android.library.codecs.CompositeCodec
1211
import org.xmtp.android.library.codecs.ContentCodec
@@ -15,19 +14,11 @@ import org.xmtp.android.library.codecs.ContentTypeIdBuilder
1514
import org.xmtp.android.library.codecs.DecodedComposite
1615
import org.xmtp.android.library.codecs.EncodedContent
1716
import org.xmtp.android.library.codecs.TextCodec
18-
import org.xmtp.android.library.messages.InvitationV1
17+
import org.xmtp.android.library.messages.InvitationV1ContextBuilder
1918
import org.xmtp.android.library.messages.MessageV2Builder
2019
import org.xmtp.android.library.messages.PrivateKeyBuilder
21-
import org.xmtp.android.library.messages.PrivateKeyBundleV1
22-
import org.xmtp.android.library.messages.SealedInvitationBuilder
23-
import org.xmtp.android.library.messages.createDeterministic
24-
import org.xmtp.android.library.messages.generate
25-
import org.xmtp.android.library.messages.getPublicKeyBundle
26-
import org.xmtp.android.library.messages.toV2
2720
import org.xmtp.android.library.messages.walletAddress
28-
import java.security.Key
2921
import java.time.Instant
30-
import java.util.Date
3122

3223
data class NumberCodec(
3324
override var contentType: ContentTypeId = ContentTypeIdBuilder.builderFromAuthorityId(
@@ -158,52 +149,48 @@ class CodecTest {
158149

159150
@Test
160151
fun testReturnsAllHMACKeys() {
161-
val baseTime = Instant.now()
162-
val timestamps = List(5) { i -> baseTime.plusSeconds(i.toLong()) }
163-
val fixtures = fixtures()
164-
165-
val invites = timestamps.map { createdAt ->
166-
val fakeWallet = FakeWallet.generate()
167-
val recipient = PrivateKeyBundleV1.newBuilder().build().generate(wallet = fakeWallet)
168-
InvitationV1.newBuilder().build().createDeterministic(
169-
sender = fixtures.aliceClient.privateKeyBundleV1.toV2(),
170-
recipient = recipient.toV2().getPublicKeyBundle()
152+
val alix = PrivateKeyBuilder()
153+
val clientOptions =
154+
ClientOptions(api = ClientOptions.Api(env = XMTPEnvironment.LOCAL, isSecure = false))
155+
val alixClient = Client().create(alix, clientOptions)
156+
val conversations = mutableListOf<Conversation>()
157+
repeat(5) {
158+
val account = PrivateKeyBuilder()
159+
val client = Client().create(account, clientOptions)
160+
conversations.add(
161+
alixClient.conversations.newConversation(
162+
client.address,
163+
context = InvitationV1ContextBuilder.buildFromConversation(conversationId = "hi")
164+
)
171165
)
172166
}
173167

174168
val thirtyDayPeriodsSinceEpoch = Instant.now().epochSecond / 60 / 60 / 24 / 30
175169

176-
val periods = listOf(
177-
thirtyDayPeriodsSinceEpoch - 1,
178-
thirtyDayPeriodsSinceEpoch,
179-
thirtyDayPeriodsSinceEpoch + 1
180-
)
181-
182-
val hmacKeys = fixtures.aliceClient.conversations.getHmacKeys()
170+
val hmacKeys = alixClient.conversations.getHmacKeys()
183171

184172
val topics = hmacKeys.hmacKeysMap.keys
185-
invites.forEach { invite ->
186-
assertTrue(topics.contains(invite.topic))
173+
conversations.forEach { convo ->
174+
assertTrue(topics.contains(convo.topic))
187175
}
188176

189177
val topicHmacs = mutableMapOf<String, ByteArray>()
190178
val headerBytes = ByteArray(10)
191179

192-
invites.map { invite ->
193-
val topic = invite.topic
180+
conversations.map { conversation ->
181+
val topic = conversation.topic
194182
val payload = TextCodec().encode(content = "Hello, world!")
195183

196184
val message = MessageV2Builder.buildEncode(
197-
client = fixtures.aliceClient,
185+
client = alixClient,
198186
encodedContent = payload,
199187
topic = topic,
200188
keyMaterial = headerBytes,
201189
codec = TextCodec()
202190
)
203191

204-
val conversation = fixtures.aliceClient.fetchConversation(topic)
205-
val keyMaterial = conversation?.keyMaterial
206-
val info = "$thirtyDayPeriodsSinceEpoch-${fixtures.aliceClient.address}"
192+
val keyMaterial = conversation.keyMaterial
193+
val info = "$thirtyDayPeriodsSinceEpoch-${alixClient.address}"
207194
val hmac = Crypto.calculateMac(
208195
Crypto.deriveKey(keyMaterial!!, ByteArray(0), info.toByteArray()),
209196
headerBytes
@@ -222,6 +209,5 @@ class CodecTest {
222209
assertTrue(valid == (idx == 1))
223210
}
224211
}
225-
226212
}
227213
}

‎library/src/main/java/org/xmtp/android/library/Conversations.kt

+16-15
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ import java.util.Date
5252
import kotlin.time.Duration.Companion.nanoseconds
5353
import kotlin.time.DurationUnit
5454

55-
5655
data class Conversations(
5756
var client: Client,
5857
var conversationsByTopic: MutableMap<String, Conversation> = mutableMapOf(),
@@ -320,21 +319,23 @@ data class Conversations(
320319

321320
topics.forEach {
322321
val conversation = it.value
323-
324-
(thirtyDayPeriodsSinceEpoch - 1..thirtyDayPeriodsSinceEpoch + 1).map { value ->
325-
val info = "$value-${client.address}"
326-
val hmacKey =
327-
Crypto.calculateMac(
328-
conversation.keyMaterial!!,
329-
info.toByteStringUtf8().toByteArray()
322+
if (conversation.keyMaterial != null) {
323+
(thirtyDayPeriodsSinceEpoch - 1..thirtyDayPeriodsSinceEpoch + 1).map { value ->
324+
val info = "$value-${client.address}"
325+
val hmacKey =
326+
Crypto.calculateMac(
327+
conversation.keyMaterial!!,
328+
info.toByteStringUtf8().toByteArray()
329+
)
330+
331+
hmacKeys.putHmacKeys(
332+
conversation.topic,
333+
HmacKeys.newBuilder().addValues(
334+
HmacKeyData.newBuilder().setHmacKey(hmacKey.toByteString())
335+
.setThirtyDayPeriodsSinceEpoch(value).build()
336+
).build()
330337
)
331-
332-
hmacKeys.putHmacKeys(
333-
conversation.topic, HmacKeys.newBuilder().addValues(
334-
HmacKeyData.newBuilder().setHmacKey(hmacKey.toByteString())
335-
.setThirtyDayPeriodsSinceEpoch(value).build()
336-
).build()
337-
)
338+
}
338339
}
339340
}
340341

‎library/src/main/java/org/xmtp/android/library/Crypto.kt

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import org.bouncycastle.crypto.generators.HKDFBytesGenerator
88
import org.bouncycastle.crypto.params.HKDFParameters
99
import org.xmtp.proto.message.contents.CiphertextOuterClass
1010
import java.security.GeneralSecurityException
11-
import java.security.Key
1211
import java.security.SecureRandom
1312
import javax.crypto.Cipher
1413
import javax.crypto.Mac

‎library/src/main/java/org/xmtp/android/library/messages/MessageV2.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,4 @@ class MessageV2Builder(val senderHmac: ByteArray? = null, val shouldPush: Boolea
169169
)
170170
}
171171
}
172-
}
172+
}

0 commit comments

Comments
 (0)