mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-05 19:28:25 +00:00
refactor(mls): move the RFC 9420 engine out of marmot/
`quartz/marmot/mls/` is 11,964 LOC of RFC 9420 that has nothing to do with Marmot: TLS codec, HPKE, X25519/Ed25519, the ratchet tree, the key schedule, the secret tree, message framing. Only 3 of its 28 files import anything from `marmot/` at all. It already has a second consumer, and that consumer had to reach through the wrong package to get it: `quic/tls/TlsClient.kt` imports `quartz.marmot.mls.crypto.X25519` for its TLS 1.3 handshake, which is neither Marmot nor MLS. `:contextvm`/cordn will be the third, needing the engine without Marmot's bindings. So the engine moves to `quartz/mls/` and `marmot/` keeps everything else. Pure `git mv` plus the package rename across all six source sets (commonMain, jvmAndroid, appleMain, linuxMain, commonTest, jvmAndroidTest) and the five modules that reference it. No logic change: `:quartz:jvmTest` is 5074 before and 5074 after. The dependency still points the wrong way -- `mls/` retains 10 imports of `marmot/` -- which the next commits fix. Doing the move first keeps that diff small enough to read. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BfD4txdnsaPRXmNXbup9n
This commit is contained in:
@@ -208,7 +208,7 @@ import com.vitorpamplona.quartz.experimental.profileGallery.image
|
|||||||
import com.vitorpamplona.quartz.experimental.profileGallery.mimeType
|
import com.vitorpamplona.quartz.experimental.profileGallery.mimeType
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.transport.MarmotQuicTransport
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.transport.MarmotQuicTransport
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageEvent
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Address
|
import com.vitorpamplona.quartz.nip01Core.core.Address
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
@@ -377,7 +377,7 @@ class Account(
|
|||||||
val client: INostrClient,
|
val client: INostrClient,
|
||||||
val scope: CoroutineScope,
|
val scope: CoroutineScope,
|
||||||
val mlsGroupStateStore: MlsGroupStateStore? = null,
|
val mlsGroupStateStore: MlsGroupStateStore? = null,
|
||||||
val marmotMessageStore: com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore? = null,
|
val marmotMessageStore: com.vitorpamplona.quartz.mls.group.MarmotMessageStore? = null,
|
||||||
val marmotKeyPackageStore: com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore? = null,
|
val marmotKeyPackageStore: com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore? = null,
|
||||||
/**
|
/**
|
||||||
* Durable publish obligations. Null means publish-before-apply does not
|
* Durable publish obligations. Null means publish-before-apply does not
|
||||||
|
|||||||
@@ -692,7 +692,7 @@ class AccountMarmotActions(
|
|||||||
/**
|
/**
|
||||||
* Revoke admin privileges from [targetPubKey]. Rejects any change that
|
* Revoke admin privileges from [targetPubKey]. Rejects any change that
|
||||||
* would leave the group with zero admins — MIP-03's admin-depletion guard
|
* would leave the group with zero admins — MIP-03's admin-depletion guard
|
||||||
* in [com.vitorpamplona.quartz.marmot.mls.group.MlsGroup] would otherwise
|
* in [com.vitorpamplona.quartz.mls.group.MlsGroup] would otherwise
|
||||||
* throw at commit time.
|
* throw at commit time.
|
||||||
*/
|
*/
|
||||||
suspend fun revokeMarmotGroupAdmin(
|
suspend fun revokeMarmotGroupAdmin(
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
package com.vitorpamplona.amethyst.model.marmot
|
package com.vitorpamplona.amethyst.model.marmot
|
||||||
|
|
||||||
import com.vitorpamplona.amethyst.model.preferences.KeyStoreEncryption
|
import com.vitorpamplona.amethyst.model.preferences.KeyStoreEncryption
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
import com.vitorpamplona.quartz.utils.Log
|
import com.vitorpamplona.quartz.utils.Log
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
package com.vitorpamplona.amethyst.model.marmot
|
package com.vitorpamplona.amethyst.model.marmot
|
||||||
|
|
||||||
import com.vitorpamplona.amethyst.model.preferences.KeyStoreEncryption
|
import com.vitorpamplona.amethyst.model.preferences.KeyStoreEncryption
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.utils.Log
|
import com.vitorpamplona.quartz.utils.Log
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextSt
|
|||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.InMemoryAgentTextStreamSequenceStore
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.InMemoryAgentTextStreamSequenceStore
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.PreviewStatus
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.PreviewStatus
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.RecordOutcome
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.RecordOutcome
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ import com.vitorpamplona.amethyst.cli.SecureFileIO
|
|||||||
import com.vitorpamplona.amethyst.commons.util.deleteOrWarn
|
import com.vitorpamplona.amethyst.commons.util.deleteOrWarn
|
||||||
import com.vitorpamplona.quartz.marmot.MarmotIngestDedupStore
|
import com.vitorpamplona.quartz.marmot.MarmotIngestDedupStore
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotPublishObligationStore
|
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotPublishObligationStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.commons.marmot
|
package com.vitorpamplona.amethyst.commons.marmot
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.utils.concurrent.ConcurrentMap
|
import com.vitorpamplona.quartz.utils.concurrent.ConcurrentMap
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+6
-6
@@ -59,12 +59,12 @@ import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
|||||||
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeEvent
|
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup
|
import com.vitorpamplona.quartz.mls.group.MlsGroup
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.CommitResult
|
import com.vitorpamplona.quartz.mls.messages.CommitResult
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Credential
|
import com.vitorpamplona.quartz.mls.tree.Credential
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.LocalOutboundGate
|
import com.vitorpamplona.quartz.marmot.protocolCore.LocalOutboundGate
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotPublishGate
|
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotPublishGate
|
||||||
|
|||||||
+1
-1
@@ -92,7 +92,7 @@ class LegacyGroupContractTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ProbeStateStore : com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore {
|
private class ProbeStateStore : com.vitorpamplona.quartz.mls.group.MlsGroupStateStore {
|
||||||
private val states = mutableMapOf<String, ByteArray>()
|
private val states = mutableMapOf<String, ByteArray>()
|
||||||
private val retained = mutableMapOf<String, List<ByteArray>>()
|
private val retained = mutableMapOf<String, List<ByteArray>>()
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -29,8 +29,8 @@ import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.transport.M
|
|||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.transport.MarmotQuicTransport
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.transport.MarmotQuicTransport
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
||||||
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
||||||
import kotlinx.coroutines.CompletableDeferred
|
import kotlinx.coroutines.CompletableDeferred
|
||||||
|
|||||||
+2
-2
@@ -22,8 +22,8 @@ package com.vitorpamplona.amethyst.commons.marmot
|
|||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageUtils
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageUtils
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
||||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
||||||
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
||||||
|
|||||||
+3
-3
@@ -22,8 +22,8 @@ package com.vitorpamplona.amethyst.commons.marmot
|
|||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
||||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
||||||
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
||||||
@@ -39,7 +39,7 @@ import kotlin.test.assertTrue
|
|||||||
/**
|
/**
|
||||||
* End-to-end leave + rejoin round-trip at the [MarmotManager] layer.
|
* End-to-end leave + rejoin round-trip at the [MarmotManager] layer.
|
||||||
*
|
*
|
||||||
* One level above [com.vitorpamplona.quartz.marmot.mls.MlsGroupManagerTest.testLeaveAndRejoin_SameGroupIdEndToEnd]
|
* One level above [com.vitorpamplona.quartz.mls.MlsGroupManagerTest.testLeaveAndRejoin_SameGroupIdEndToEnd]
|
||||||
* in quartz, which only exercises the MLS engine. This one drives the full
|
* in quartz, which only exercises the MLS engine. This one drives the full
|
||||||
* commons-layer pipeline:
|
* commons-layer pipeline:
|
||||||
*
|
*
|
||||||
|
|||||||
+2
-2
@@ -22,8 +22,8 @@ package com.vitorpamplona.amethyst.commons.marmot
|
|||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
||||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
||||||
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
||||||
|
|||||||
+1
-1
@@ -439,7 +439,7 @@ class MarmotPublishBeforeApplyTest {
|
|||||||
assertEquals(listOf(relay), fx.manager.groupRelays(fx.groupId))
|
assertEquals(listOf(relay), fx.manager.groupRelays(fx.groupId))
|
||||||
}
|
}
|
||||||
|
|
||||||
private class InMemoryStateStore : com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore {
|
private class InMemoryStateStore : com.vitorpamplona.quartz.mls.group.MlsGroupStateStore {
|
||||||
private val states = mutableMapOf<String, ByteArray>()
|
private val states = mutableMapOf<String, ByteArray>()
|
||||||
private val retained = mutableMapOf<String, List<ByteArray>>()
|
private val retained = mutableMapOf<String, List<ByteArray>>()
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
package com.vitorpamplona.amethyst.commons.marmot
|
package com.vitorpamplona.amethyst.commons.marmot
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotPublishObligationStore
|
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotPublishObligationStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
|
|||||||
+2
-2
@@ -21,8 +21,8 @@
|
|||||||
package com.vitorpamplona.amethyst.commons.marmot
|
package com.vitorpamplona.amethyst.commons.marmot
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
|
|
||||||
// In-memory stand-ins for the durable stores a MarmotManager needs.
|
// In-memory stand-ins for the durable stores a MarmotManager needs.
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ package com.vitorpamplona.marmotbench
|
|||||||
|
|
||||||
import com.vitorpamplona.amethyst.commons.marmot.MarmotPublisher
|
import com.vitorpamplona.amethyst.commons.marmot.MarmotPublisher
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageBundleStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MarmotMessageStore
|
import com.vitorpamplona.quartz.mls.group.MarmotMessageStore
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
|
|
||||||
// In-memory stores, matching the commons test doubles byte for byte.
|
// In-memory stores, matching the commons test doubles byte for byte.
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.marmotbench
|
package com.vitorpamplona.marmotbench
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519
|
import com.vitorpamplona.quartz.mls.crypto.Ed25519
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.X25519
|
import com.vitorpamplona.quartz.mls.crypto.X25519
|
||||||
|
|
||||||
// The elliptic-curve primitives on their own.
|
// The elliptic-curve primitives on their own.
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||||
import io.github.andreypfau.kotlinx.crypto.Sha512
|
import io.github.andreypfau.kotlinx.crypto.Sha512
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||||
|
|
||||||
+10
-10
@@ -25,21 +25,21 @@ import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageRotationManage
|
|||||||
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeEvent
|
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.ContentType
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.PrivateMessage
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.PublicMessage
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.KeyPackageBundle
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Welcome
|
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceAdmission
|
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceAdmission
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceResolution
|
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceResolution
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceStatus
|
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceStatus
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotConvergenceEngine
|
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotConvergenceEngine
|
||||||
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
|
import com.vitorpamplona.quartz.mls.framing.ContentType
|
||||||
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
|
import com.vitorpamplona.quartz.mls.framing.PrivateMessage
|
||||||
|
import com.vitorpamplona.quartz.mls.framing.PublicMessage
|
||||||
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager
|
||||||
|
import com.vitorpamplona.quartz.mls.group.MlsGroupState
|
||||||
|
import com.vitorpamplona.quartz.mls.messages.KeyPackageBundle
|
||||||
|
import com.vitorpamplona.quartz.mls.messages.Welcome
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
|
|||||||
+4
-4
@@ -24,7 +24,7 @@ import com.vitorpamplona.quartz.marmot.foundation.appEvents.MarmotAppEvent
|
|||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
@@ -160,15 +160,15 @@ class MarmotOutboundProcessor(
|
|||||||
* The commit bytes are already MLS-formatted (PublicMessage envelope).
|
* The commit bytes are already MLS-formatted (PublicMessage envelope).
|
||||||
*
|
*
|
||||||
* @param nostrGroupId the Nostr group ID
|
* @param nostrGroupId the Nostr group ID
|
||||||
* @param commitBytes the framed MLS commit bytes from [com.vitorpamplona.quartz.marmot.mls.group.StagedCommit.framedCommitBytes]
|
* @param commitBytes the framed MLS commit bytes from [com.vitorpamplona.quartz.mls.group.StagedCommit.framedCommitBytes]
|
||||||
* @param exporterKey optional explicit outer-encryption key. Callers
|
* @param exporterKey optional explicit outer-encryption key. Callers
|
||||||
* publishing a Commit MUST pass the **pre-commit** exporter secret
|
* publishing a Commit MUST pass the **pre-commit** exporter secret
|
||||||
* (from [com.vitorpamplona.quartz.marmot.mls.group.StagedCommit.preCommitExporterSecret])
|
* (from [com.vitorpamplona.quartz.mls.group.StagedCommit.preCommitExporterSecret])
|
||||||
* so that other existing members at epoch N can decrypt and process
|
* so that other existing members at epoch N can decrypt and process
|
||||||
* the commit. If null, falls back to the current epoch's exporter
|
* the commit. If null, falls back to the current epoch's exporter
|
||||||
* secret — which is only correct when the commit has *not* been
|
* secret — which is only correct when the commit has *not* been
|
||||||
* applied locally yet (i.e. this call is made before
|
* applied locally yet (i.e. this call is made before
|
||||||
* [com.vitorpamplona.quartz.marmot.mls.group.MlsGroup.mergeStagedCommit]).
|
* [com.vitorpamplona.quartz.mls.group.MlsGroup.mergeStagedCommit]).
|
||||||
* @return the signed GroupEvent ready for relay publishing
|
* @return the signed GroupEvent ready for relay publishing
|
||||||
*/
|
*/
|
||||||
suspend fun buildCommitEvent(
|
suspend fun buildCommitEvent(
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
package com.vitorpamplona.quartz.marmot
|
package com.vitorpamplona.quartz.marmot
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeGiftWrap
|
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeGiftWrap
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.CommitResult
|
import com.vitorpamplona.quartz.mls.messages.CommitResult
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
|
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
|
||||||
import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner
|
import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
|
|||||||
+8
-8
@@ -23,14 +23,14 @@ package com.vitorpamplona.quartz.marmot.appComponents
|
|||||||
import com.vitorpamplona.quartz.marmot.appComponents.accountIdentityProof.AccountIdentityProofV2
|
import com.vitorpamplona.quartz.marmot.appComponents.accountIdentityProof.AccountIdentityProofV2
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextStreamQuicPolicyV1
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextStreamQuicPolicyV1
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MlsCiphersuite
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MlsCiphersuite
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.AppDataDictionary
|
import com.vitorpamplona.quartz.mls.components.AppDataDictionary
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.ComponentData
|
import com.vitorpamplona.quartz.mls.components.ComponentData
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.ComponentsList
|
import com.vitorpamplona.quartz.mls.components.ComponentsList
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519
|
import com.vitorpamplona.quartz.mls.crypto.Ed25519
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519KeyPair
|
import com.vitorpamplona.quartz.mls.crypto.Ed25519KeyPair
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup
|
import com.vitorpamplona.quartz.mls.group.MlsGroup
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.KeyPackageBundle
|
import com.vitorpamplona.quartz.mls.messages.KeyPackageBundle
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner
|
import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
|
|
||||||
/** One blob-store endpoint and the locator kind it serves. */
|
/** One blob-store endpoint and the locator kind it serves. */
|
||||||
data class BlobStoreEndpointV2(
|
data class BlobStoreEndpointV2(
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.nip44Encryption.crypto.ChaCha20Poly1305
|
import com.vitorpamplona.quartz.nip44Encryption.crypto.ChaCha20Poly1305
|
||||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `marmot.group.avatar-url.v1`, component `0x8007` — a group avatar behind an
|
* `marmot.group.avatar-url.v1`, component `0x8007` — a group avatar behind an
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `marmot.group.profile.v1`, component `0x8001` — the group's display name and
|
* `marmot.group.profile.v1`, component `0x8001` — the group's display name and
|
||||||
|
|||||||
+3
-3
@@ -21,9 +21,9 @@
|
|||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextStreamQuicPolicyV1
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextStreamQuicPolicyV1
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.AppDataDictionary
|
import com.vitorpamplona.quartz.mls.components.AppDataDictionary
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.ComponentsList
|
import com.vitorpamplona.quartz.mls.components.ComponentsList
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The current profile's read view of a GroupContext `app_data_dictionary` — the
|
* The current profile's read view of a GroupContext `app_data_dictionary` — the
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `marmot.group.message-retention.v1`, component `0x8005` — disappearing
|
* `marmot.group.message-retention.v1`, component `0x8005` — disappearing
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents.agentTextStream
|
package com.vitorpamplona.quartz.marmot.appComponents.agentTextStream
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.nip44Encryption.crypto.ChaCha20Poly1305
|
import com.vitorpamplona.quartz.nip44Encryption.crypto.ChaCha20Poly1305
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
package com.vitorpamplona.quartz.marmot.appComponents.agentTextStream
|
package com.vitorpamplona.quartz.marmot.appComponents.agentTextStream
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.AppComponentIds
|
import com.vitorpamplona.quartz.marmot.appComponents.AppComponentIds
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.ComponentData
|
import com.vitorpamplona.quartz.mls.components.ComponentData
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `marmot.group.agent-text-stream.quic.v1` (component `0x8006`).
|
* `marmot.group.agent-text-stream.quic.v1` (component `0x8006`).
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents.agentTextStream
|
package com.vitorpamplona.quartz.marmot.appComponents.agentTextStream
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The rolling hash a stream's final kind-9 chat publishes as `stream-hash`,
|
* The rolling hash a stream's final kind-9 chat publishes as `stream-hash`,
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.foundation.authorizationProofs
|
package com.vitorpamplona.quartz.marmot.foundation.authorizationProofs
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.crypto.EventHasher
|
import com.vitorpamplona.quartz.nip01Core.crypto.EventHasher
|
||||||
|
|||||||
+3
-3
@@ -24,9 +24,9 @@ import androidx.compose.runtime.Immutable
|
|||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.AppComponentsTag
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.AppComponentsTag
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.EncodingTag
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.EncodingTag
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.MlsProposalsTag
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.MlsProposalsTag
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.AppDataDictionary
|
import com.vitorpamplona.quartz.mls.components.AppDataDictionary
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.ComponentsList
|
import com.vitorpamplona.quartz.mls.components.ComponentsList
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.MlsKeyPackage
|
import com.vitorpamplona.quartz.mls.messages.MlsKeyPackage
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent
|
import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
|
import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder
|
||||||
|
|||||||
+13
-13
@@ -23,19 +23,19 @@ package com.vitorpamplona.quartz.marmot.mip00KeyPackages
|
|||||||
import com.vitorpamplona.quartz.marmot.appComponents.CurrentProfileGroupFactory
|
import com.vitorpamplona.quartz.marmot.appComponents.CurrentProfileGroupFactory
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageRotationManager.Companion.SNAPSHOT_VERSION
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageRotationManager.Companion.SNAPSHOT_VERSION
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MlsCiphersuite
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MlsCiphersuite
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519
|
import com.vitorpamplona.quartz.mls.crypto.Ed25519
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.X25519
|
import com.vitorpamplona.quartz.mls.crypto.X25519
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.KeyPackageBundle
|
import com.vitorpamplona.quartz.mls.messages.KeyPackageBundle
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.MlsKeyPackage
|
import com.vitorpamplona.quartz.mls.messages.MlsKeyPackage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Capabilities
|
import com.vitorpamplona.quartz.mls.tree.Capabilities
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Credential
|
import com.vitorpamplona.quartz.mls.tree.Credential
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNode
|
import com.vitorpamplona.quartz.mls.tree.LeafNode
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNodeSource
|
import com.vitorpamplona.quartz.mls.tree.LeafNodeSource
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Lifetime
|
import com.vitorpamplona.quartz.mls.tree.Lifetime
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner
|
import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner
|
||||||
import com.vitorpamplona.quartz.utils.Log
|
import com.vitorpamplona.quartz.utils.Log
|
||||||
|
|||||||
+8
-8
@@ -29,14 +29,14 @@ import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.MlsCiphersuiteTag
|
|||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.MlsProposalsTag
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.MlsProposalsTag
|
||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.MlsProtocolVersionTag
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.tags.MlsProtocolVersionTag
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MlsCiphersuite
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MlsCiphersuite
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.AppDataDictionary
|
import com.vitorpamplona.quartz.mls.components.AppDataDictionary
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.ComponentsList
|
import com.vitorpamplona.quartz.mls.components.ComponentsList
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.MlsKeyPackage
|
import com.vitorpamplona.quartz.mls.messages.MlsKeyPackage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Credential
|
import com.vitorpamplona.quartz.mls.tree.Credential
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.Event
|
import com.vitorpamplona.quartz.nip01Core.core.Event
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
|
|||||||
+3
-3
@@ -22,9 +22,9 @@ package com.vitorpamplona.quartz.marmot.mip01Groups
|
|||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData.Companion.decodeTls
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData.Companion.decodeTls
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mip01Groups
|
package com.vitorpamplona.quartz.marmot.mip01Groups
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MIP-01 image & Blossom upload key derivations.
|
* MIP-01 image & Blossom upload key derivations.
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mip04EncryptedMedia
|
package com.vitorpamplona.quartz.marmot.mip04EncryptedMedia
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.nip44Encryption.crypto.ChaCha20Poly1305
|
import com.vitorpamplona.quartz.nip44Encryption.crypto.ChaCha20Poly1305
|
||||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||||
import com.vitorpamplona.quartz.utils.sha256.sha256
|
import com.vitorpamplona.quartz.utils.sha256.sha256
|
||||||
|
|||||||
+4
-4
@@ -20,10 +20,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.protocolCore
|
package com.vitorpamplona.quartz.marmot.protocolCore
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.ContentType
|
import com.vitorpamplona.quartz.mls.framing.ContentType
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup
|
import com.vitorpamplona.quartz.mls.group.MlsGroup
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState
|
import com.vitorpamplona.quartz.mls.group.MlsGroupState
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.utils.Log
|
import com.vitorpamplona.quartz.utils.Log
|
||||||
|
|||||||
+4
-4
@@ -20,10 +20,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.protocolCore
|
package com.vitorpamplona.quartz.marmot.protocolCore
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState
|
import com.vitorpamplona.quartz.mls.group.MlsGroupState
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.utils.sha256.sha256
|
import com.vitorpamplona.quartz.utils.sha256.sha256
|
||||||
|
|||||||
+7
-7
@@ -20,13 +20,13 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.protocolCore
|
package com.vitorpamplona.quartz.marmot.protocolCore
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.ContentType
|
import com.vitorpamplona.quartz.mls.framing.ContentType
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.PublicMessage
|
import com.vitorpamplona.quartz.mls.framing.PublicMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup
|
import com.vitorpamplona.quartz.mls.group.MlsGroup
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState
|
import com.vitorpamplona.quartz.mls.group.MlsGroupState
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.utils.sha256.sha256
|
import com.vitorpamplona.quartz.utils.sha256.sha256
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.codec
|
package com.vitorpamplona.quartz.mls.codec
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decoder for TLS presentation language (RFC 8446 Section 3).
|
* Decoder for TLS presentation language (RFC 8446 Section 3).
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.codec
|
package com.vitorpamplona.quartz.mls.codec
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for types that can be serialized to TLS presentation language
|
* Interface for types that can be serialized to TLS presentation language
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.codec
|
package com.vitorpamplona.quartz.mls.codec
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encoder for TLS presentation language (RFC 8446 Section 3).
|
* Encoder for TLS presentation language (RFC 8446 Section 3).
|
||||||
+5
-5
@@ -18,12 +18,12 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.components
|
package com.vitorpamplona.quartz.mls.components
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The `app_data_dictionary` MLS extension (draft-ietf-mls-extensions-10 §4.6),
|
* The `app_data_dictionary` MLS extension (draft-ietf-mls-extensions-10 §4.6),
|
||||||
+4
-4
@@ -18,11 +18,11 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.components
|
package com.vitorpamplona.quartz.mls.components
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* One entry in an [AppDataDictionary] (draft-ietf-mls-extensions-10 §4.6).
|
* One entry in an [AppDataDictionary] (draft-ietf-mls-extensions-10 §4.6).
|
||||||
+3
-3
@@ -18,10 +18,10 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.components
|
package com.vitorpamplona.quartz.mls.components
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The `ComponentsList` payload shared by the upstream `app_components`
|
* The `ComponentsList` payload shared by the upstream `app_components`
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Field arithmetic over GF(2^255-19) for Curve25519 and Ed25519.
|
* Field arithmetic over GF(2^255-19) for Curve25519 and Ed25519.
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ed25519 digital signature operations for MLS ciphersuite 0x0001.
|
* Ed25519 digital signature operations for MLS ciphersuite 0x0001.
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.utils.ciphers.AESGCM
|
import com.vitorpamplona.quartz.utils.ciphers.AESGCM
|
||||||
|
|
||||||
+4
-4
@@ -18,11 +18,11 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.nip44Encryption.crypto.Hkdf
|
import com.vitorpamplona.quartz.nip44Encryption.crypto.Hkdf
|
||||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||||
import com.vitorpamplona.quartz.utils.ciphers.AESGCM
|
import com.vitorpamplona.quartz.utils.ciphers.AESGCM
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* X25519 Diffie-Hellman key exchange for MLS DHKEM (RFC 9180).
|
* X25519 Diffie-Hellman key exchange for MLS DHKEM (RFC 9180).
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.framing
|
package com.vitorpamplona.quartz.mls.framing
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS ContentType (RFC 9420 Section 6.1).
|
* MLS ContentType (RFC 9420 Section 6.1).
|
||||||
+6
-6
@@ -18,13 +18,13 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.framing
|
package com.vitorpamplona.quartz.mls.framing
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Commit
|
import com.vitorpamplona.quartz.mls.messages.Commit
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Proposal
|
import com.vitorpamplona.quartz.mls.messages.Proposal
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS MLSMessage (RFC 9420 Section 6).
|
* MLS MLSMessage (RFC 9420 Section 6).
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.group
|
package com.vitorpamplona.quartz.mls.group
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encrypted local storage for decrypted Marmot inner event JSONs.
|
* Encrypted local storage for decrypted Marmot inner event JSONs.
|
||||||
+59
-59
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.group
|
package com.vitorpamplona.quartz.mls.group
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.AdminPolicyV1
|
import com.vitorpamplona.quartz.marmot.appComponents.AdminPolicyV1
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.AppComponentIds
|
import com.vitorpamplona.quartz.marmot.appComponents.AppComponentIds
|
||||||
@@ -27,49 +27,49 @@ import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextSt
|
|||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextStreamQuicPolicyV1
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextStreamQuicPolicyV1
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextStreamRoles
|
import com.vitorpamplona.quartz.marmot.appComponents.agentTextStream.AgentTextStreamRoles
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.AppDataDictionary
|
import com.vitorpamplona.quartz.mls.components.AppDataDictionary
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519
|
import com.vitorpamplona.quartz.mls.crypto.Ed25519
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519KeyPair
|
import com.vitorpamplona.quartz.mls.crypto.Ed25519KeyPair
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.Hpke
|
import com.vitorpamplona.quartz.mls.crypto.Hpke
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.X25519
|
import com.vitorpamplona.quartz.mls.crypto.X25519
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.ContentType
|
import com.vitorpamplona.quartz.mls.framing.ContentType
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.PrivateMessage
|
import com.vitorpamplona.quartz.mls.framing.PrivateMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.PublicMessage
|
import com.vitorpamplona.quartz.mls.framing.PublicMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.Sender
|
import com.vitorpamplona.quartz.mls.framing.Sender
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.SenderType
|
import com.vitorpamplona.quartz.mls.framing.SenderType
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.encodeSender
|
import com.vitorpamplona.quartz.mls.framing.encodeSender
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup.Companion.externalJoin
|
import com.vitorpamplona.quartz.mls.group.MlsGroup.Companion.externalJoin
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Commit
|
import com.vitorpamplona.quartz.mls.messages.Commit
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.CommitResult
|
import com.vitorpamplona.quartz.mls.messages.CommitResult
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.EncryptedGroupSecrets
|
import com.vitorpamplona.quartz.mls.messages.EncryptedGroupSecrets
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.ExternalJoinResult
|
import com.vitorpamplona.quartz.mls.messages.ExternalJoinResult
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.GroupContext
|
import com.vitorpamplona.quartz.mls.messages.GroupContext
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.GroupInfo
|
import com.vitorpamplona.quartz.mls.messages.GroupInfo
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.GroupSecrets
|
import com.vitorpamplona.quartz.mls.messages.GroupSecrets
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.KeyPackageBundle
|
import com.vitorpamplona.quartz.mls.messages.KeyPackageBundle
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.MlsKeyPackage
|
import com.vitorpamplona.quartz.mls.messages.MlsKeyPackage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Proposal
|
import com.vitorpamplona.quartz.mls.messages.Proposal
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.ProposalOrRef
|
import com.vitorpamplona.quartz.mls.messages.ProposalOrRef
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.UpdatePath
|
import com.vitorpamplona.quartz.mls.messages.UpdatePath
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Welcome
|
import com.vitorpamplona.quartz.mls.messages.Welcome
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.EpochSecrets
|
import com.vitorpamplona.quartz.mls.schedule.EpochSecrets
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.KeySchedule
|
import com.vitorpamplona.quartz.mls.schedule.KeySchedule
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.SecretTree
|
import com.vitorpamplona.quartz.mls.schedule.SecretTree
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.BinaryTree
|
import com.vitorpamplona.quartz.mls.tree.BinaryTree
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Capabilities
|
import com.vitorpamplona.quartz.mls.tree.Capabilities
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Credential
|
import com.vitorpamplona.quartz.mls.tree.Credential
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNode
|
import com.vitorpamplona.quartz.mls.tree.LeafNode
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNodeSource
|
import com.vitorpamplona.quartz.mls.tree.LeafNodeSource
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Lifetime
|
import com.vitorpamplona.quartz.mls.tree.Lifetime
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.PathSecretAndKey
|
import com.vitorpamplona.quartz.mls.tree.PathSecretAndKey
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree
|
import com.vitorpamplona.quartz.mls.tree.RatchetTree
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.UpdatePathNode
|
import com.vitorpamplona.quartz.mls.tree.UpdatePathNode
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.utils.TimeUtils
|
import com.vitorpamplona.quartz.utils.TimeUtils
|
||||||
@@ -132,7 +132,7 @@ class MlsGroup private constructor(
|
|||||||
private var interimTranscriptHash: ByteArray,
|
private var interimTranscriptHash: ByteArray,
|
||||||
private val pskStore: MutableMap<String, ByteArray> = mutableMapOf(),
|
private val pskStore: MutableMap<String, ByteArray> = mutableMapOf(),
|
||||||
private val pendingProposals: MutableList<PendingProposal> = mutableListOf(),
|
private val pendingProposals: MutableList<PendingProposal> = mutableListOf(),
|
||||||
private val sentKeys: MutableMap<Int, com.vitorpamplona.quartz.marmot.mls.schedule.KeyNonceGeneration> = mutableMapOf(),
|
private val sentKeys: MutableMap<Int, com.vitorpamplona.quartz.mls.schedule.KeyNonceGeneration> = mutableMapOf(),
|
||||||
/** Staged keys from proposeSigningKeyRotation — only promoted on successful commit */
|
/** Staged keys from proposeSigningKeyRotation — only promoted on successful commit */
|
||||||
private var pendingSigningKey: ByteArray? = null,
|
private var pendingSigningKey: ByteArray? = null,
|
||||||
private var pendingEncryptionKey: ByteArray? = null,
|
private var pendingEncryptionKey: ByteArray? = null,
|
||||||
@@ -154,7 +154,7 @@ class MlsGroup private constructor(
|
|||||||
val groupId: ByteArray get() = groupContext.groupId
|
val groupId: ByteArray get() = groupContext.groupId
|
||||||
val epoch: Long get() = groupContext.epoch
|
val epoch: Long get() = groupContext.epoch
|
||||||
val leafIndex: Int get() = myLeafIndex
|
val leafIndex: Int get() = myLeafIndex
|
||||||
val extensions: List<com.vitorpamplona.quartz.marmot.mls.tree.Extension> get() = groupContext.extensions
|
val extensions: List<com.vitorpamplona.quartz.mls.tree.Extension> get() = groupContext.extensions
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True while our own leaf is still live in the tree.
|
* True while our own leaf is still live in the tree.
|
||||||
@@ -797,7 +797,7 @@ class MlsGroup private constructor(
|
|||||||
computeSenderParentHashes(myLeafIndex, preUpdateSiblingHashes)
|
computeSenderParentHashes(myLeafIndex, preUpdateSiblingHashes)
|
||||||
for (nodeIdx in filteredDp) {
|
for (nodeIdx in filteredDp) {
|
||||||
val existing = tree.getNode(nodeIdx)
|
val existing = tree.getNode(nodeIdx)
|
||||||
if (existing is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent) {
|
if (existing is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent) {
|
||||||
tree.setParent(
|
tree.setParent(
|
||||||
nodeIdx,
|
nodeIdx,
|
||||||
existing.parentNode.copy(
|
existing.parentNode.copy(
|
||||||
@@ -872,11 +872,11 @@ class MlsGroup private constructor(
|
|||||||
val node = tree.getNode(resNode) ?: return@mapNotNull null
|
val node = tree.getNode(resNode) ?: return@mapNotNull null
|
||||||
val recipientPub =
|
val recipientPub =
|
||||||
when (node) {
|
when (node) {
|
||||||
is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Leaf -> {
|
is com.vitorpamplona.quartz.mls.tree.TreeNode.Leaf -> {
|
||||||
node.leafNode.encryptionKey
|
node.leafNode.encryptionKey
|
||||||
}
|
}
|
||||||
|
|
||||||
is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent -> {
|
is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent -> {
|
||||||
node.parentNode.encryptionKey
|
node.parentNode.encryptionKey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1855,7 +1855,7 @@ class MlsGroup private constructor(
|
|||||||
val (filteredDp, filteredCp) = tree.filteredDirectPath(senderLeafIndex)
|
val (filteredDp, filteredCp) = tree.filteredDirectPath(senderLeafIndex)
|
||||||
for (nodeIdx in filteredDp) {
|
for (nodeIdx in filteredDp) {
|
||||||
val existing = tree.getNode(nodeIdx)
|
val existing = tree.getNode(nodeIdx)
|
||||||
if (existing is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent) {
|
if (existing is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent) {
|
||||||
tree.setParent(
|
tree.setParent(
|
||||||
nodeIdx,
|
nodeIdx,
|
||||||
existing.parentNode.copy(
|
existing.parentNode.copy(
|
||||||
@@ -2304,7 +2304,7 @@ class MlsGroup private constructor(
|
|||||||
): Pair<Map<Int, ByteArray>, ByteArray> = computeSenderParentHashes(tree, senderLeafIndex, preUpdateSiblingHashes)
|
): Pair<Map<Int, ByteArray>, ByteArray> = computeSenderParentHashes(tree, senderLeafIndex, preUpdateSiblingHashes)
|
||||||
|
|
||||||
private fun computeSenderParentHashes(
|
private fun computeSenderParentHashes(
|
||||||
tree: com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree,
|
tree: com.vitorpamplona.quartz.mls.tree.RatchetTree,
|
||||||
senderLeafIndex: Int,
|
senderLeafIndex: Int,
|
||||||
preUpdateSiblingHashes: Map<Int, ByteArray>,
|
preUpdateSiblingHashes: Map<Int, ByteArray>,
|
||||||
): Pair<Map<Int, ByteArray>, ByteArray> {
|
): Pair<Map<Int, ByteArray>, ByteArray> {
|
||||||
@@ -2335,7 +2335,7 @@ class MlsGroup private constructor(
|
|||||||
val parentIdx = filteredDp[i + 1]
|
val parentIdx = filteredDp[i + 1]
|
||||||
val parentLevel = filteredLevels[i + 1]
|
val parentLevel = filteredLevels[i + 1]
|
||||||
val parentNode = tree.getNode(parentIdx)
|
val parentNode = tree.getNode(parentIdx)
|
||||||
if (parentNode !is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent) {
|
if (parentNode !is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent) {
|
||||||
hashes[xIdx] = ByteArray(0)
|
hashes[xIdx] = ByteArray(0)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -2358,7 +2358,7 @@ class MlsGroup private constructor(
|
|||||||
val immediateParentLevel = filteredLevels.first()
|
val immediateParentLevel = filteredLevels.first()
|
||||||
val immediateParent = tree.getNode(immediateParentIdx)
|
val immediateParent = tree.getNode(immediateParentIdx)
|
||||||
val leafParentHash =
|
val leafParentHash =
|
||||||
if (immediateParent is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent) {
|
if (immediateParent is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent) {
|
||||||
val siblingTreeHash =
|
val siblingTreeHash =
|
||||||
preUpdateSiblingHashes[immediateParentLevel]
|
preUpdateSiblingHashes[immediateParentLevel]
|
||||||
?: error("missing pre-update sibling tree hash at level $immediateParentLevel")
|
?: error("missing pre-update sibling tree hash at level $immediateParentLevel")
|
||||||
@@ -3147,7 +3147,7 @@ class MlsGroup private constructor(
|
|||||||
* (without constructing an [MlsGroup] first).
|
* (without constructing an [MlsGroup] first).
|
||||||
*/
|
*/
|
||||||
private fun computeExternalSenderParentHashes(
|
private fun computeExternalSenderParentHashes(
|
||||||
tree: com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree,
|
tree: com.vitorpamplona.quartz.mls.tree.RatchetTree,
|
||||||
senderLeafIndex: Int,
|
senderLeafIndex: Int,
|
||||||
preUpdateSiblingHashes: Map<Int, ByteArray>,
|
preUpdateSiblingHashes: Map<Int, ByteArray>,
|
||||||
): Pair<Map<Int, ByteArray>, ByteArray> {
|
): Pair<Map<Int, ByteArray>, ByteArray> {
|
||||||
@@ -3160,7 +3160,7 @@ class MlsGroup private constructor(
|
|||||||
val xIdx = directPath[i]
|
val xIdx = directPath[i]
|
||||||
val parentIdx = directPath[i + 1]
|
val parentIdx = directPath[i + 1]
|
||||||
val parentNode = tree.getNode(parentIdx)
|
val parentNode = tree.getNode(parentIdx)
|
||||||
if (parentNode !is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent) {
|
if (parentNode !is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent) {
|
||||||
hashes[xIdx] = ByteArray(0)
|
hashes[xIdx] = ByteArray(0)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -3176,7 +3176,7 @@ class MlsGroup private constructor(
|
|||||||
val immediateParentIdx = directPath.first()
|
val immediateParentIdx = directPath.first()
|
||||||
val immediateParent = tree.getNode(immediateParentIdx)
|
val immediateParent = tree.getNode(immediateParentIdx)
|
||||||
val leafParentHash =
|
val leafParentHash =
|
||||||
if (immediateParent is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent) {
|
if (immediateParent is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent) {
|
||||||
val siblingTreeHash =
|
val siblingTreeHash =
|
||||||
preUpdateSiblingHashes[0]
|
preUpdateSiblingHashes[0]
|
||||||
?: error("missing pre-update sibling tree hash at leaf level")
|
?: error("missing pre-update sibling tree hash at leaf level")
|
||||||
@@ -3978,7 +3978,7 @@ class MlsGroup private constructor(
|
|||||||
computeExternalSenderParentHashes(tree, myLeafIndex, preUpdateSiblingHashes)
|
computeExternalSenderParentHashes(tree, myLeafIndex, preUpdateSiblingHashes)
|
||||||
for (nodeIdx in BinaryTree.directPath(myLeafIndex, tree.leafCount)) {
|
for (nodeIdx in BinaryTree.directPath(myLeafIndex, tree.leafCount)) {
|
||||||
val existing = tree.getNode(nodeIdx)
|
val existing = tree.getNode(nodeIdx)
|
||||||
if (existing is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent) {
|
if (existing is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent) {
|
||||||
tree.setParent(
|
tree.setParent(
|
||||||
nodeIdx,
|
nodeIdx,
|
||||||
existing.parentNode.copy(
|
existing.parentNode.copy(
|
||||||
@@ -4021,11 +4021,11 @@ class MlsGroup private constructor(
|
|||||||
val node = tree.getNode(resNode) ?: return@mapNotNull null
|
val node = tree.getNode(resNode) ?: return@mapNotNull null
|
||||||
val recipientPub =
|
val recipientPub =
|
||||||
when (node) {
|
when (node) {
|
||||||
is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Leaf -> {
|
is com.vitorpamplona.quartz.mls.tree.TreeNode.Leaf -> {
|
||||||
node.leafNode.encryptionKey
|
node.leafNode.encryptionKey
|
||||||
}
|
}
|
||||||
|
|
||||||
is com.vitorpamplona.quartz.marmot.mls.tree.TreeNode.Parent -> {
|
is com.vitorpamplona.quartz.mls.tree.TreeNode.Parent -> {
|
||||||
node.parentNode.encryptionKey
|
node.parentNode.encryptionKey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+19
-19
@@ -18,22 +18,22 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.group
|
package com.vitorpamplona.quartz.mls.group
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.AdminPolicyV1
|
import com.vitorpamplona.quartz.marmot.appComponents.AdminPolicyV1
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.GroupLifecycleV1
|
import com.vitorpamplona.quartz.marmot.appComponents.GroupLifecycleV1
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.ComponentsList
|
import com.vitorpamplona.quartz.mls.components.ComponentsList
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.PublicMessage
|
import com.vitorpamplona.quartz.mls.framing.PublicMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager.Companion.EPOCH_RETENTION_WINDOW
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager.Companion.EPOCH_RETENTION_WINDOW
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.CommitResult
|
import com.vitorpamplona.quartz.mls.messages.CommitResult
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.ExternalJoinResult
|
import com.vitorpamplona.quartz.mls.messages.ExternalJoinResult
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.KeyPackageBundle
|
import com.vitorpamplona.quartz.mls.messages.KeyPackageBundle
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.KeySchedule
|
import com.vitorpamplona.quartz.mls.schedule.KeySchedule
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.SecretTree
|
import com.vitorpamplona.quartz.mls.schedule.SecretTree
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.utils.Log
|
import com.vitorpamplona.quartz.utils.Log
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
@@ -270,7 +270,7 @@ class MlsGroupManager(
|
|||||||
nostrGroupId: HexKey,
|
nostrGroupId: HexKey,
|
||||||
identity: ByteArray,
|
identity: ByteArray,
|
||||||
signingKey: ByteArray? = null,
|
signingKey: ByteArray? = null,
|
||||||
initialExtensions: List<com.vitorpamplona.quartz.marmot.mls.tree.Extension> = emptyList(),
|
initialExtensions: List<com.vitorpamplona.quartz.mls.tree.Extension> = emptyList(),
|
||||||
): MlsGroup =
|
): MlsGroup =
|
||||||
mutex.withLock {
|
mutex.withLock {
|
||||||
Log.d(TAG) { "createGroup($nostrGroupId): creating new MLS group" }
|
Log.d(TAG) { "createGroup($nostrGroupId): creating new MLS group" }
|
||||||
@@ -603,7 +603,7 @@ class MlsGroupManager(
|
|||||||
senderLeafIndex: Int,
|
senderLeafIndex: Int,
|
||||||
confirmationTag: ByteArray,
|
confirmationTag: ByteArray,
|
||||||
signature: ByteArray = ByteArray(0),
|
signature: ByteArray = ByteArray(0),
|
||||||
wireFormat: com.vitorpamplona.quartz.marmot.mls.framing.WireFormat = com.vitorpamplona.quartz.marmot.mls.framing.WireFormat.PUBLIC_MESSAGE,
|
wireFormat: com.vitorpamplona.quartz.mls.framing.WireFormat = com.vitorpamplona.quartz.mls.framing.WireFormat.PUBLIC_MESSAGE,
|
||||||
) = mutex.withLock {
|
) = mutex.withLock {
|
||||||
val group = requireGroup(nostrGroupId)
|
val group = requireGroup(nostrGroupId)
|
||||||
|
|
||||||
@@ -702,7 +702,7 @@ class MlsGroupManager(
|
|||||||
// command, so we MUST persist here or reloaded state
|
// command, so we MUST persist here or reloaded state
|
||||||
// silently reverts to the pre-commit extensions (including
|
// silently reverts to the pre-commit extensions (including
|
||||||
// admin list).
|
// admin list).
|
||||||
if (result.contentType == com.vitorpamplona.quartz.marmot.mls.framing.ContentType.COMMIT && group.epoch != preEpoch) {
|
if (result.contentType == com.vitorpamplona.quartz.mls.framing.ContentType.COMMIT && group.epoch != preEpoch) {
|
||||||
pushRetainedEpoch(nostrGroupId, retainedBefore)
|
pushRetainedEpoch(nostrGroupId, retainedBefore)
|
||||||
persistGroup(nostrGroupId)
|
persistGroup(nostrGroupId)
|
||||||
}
|
}
|
||||||
@@ -1000,15 +1000,15 @@ class MlsGroupManager(
|
|||||||
try {
|
try {
|
||||||
val secretTree = SecretTree(retained.encryptionSecret, retained.leafCount)
|
val secretTree = SecretTree(retained.encryptionSecret, retained.leafCount)
|
||||||
val mlsMsg =
|
val mlsMsg =
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
.decodeTls(TlsReader(messageBytes))
|
.decodeTls(TlsReader(messageBytes))
|
||||||
|
|
||||||
if (mlsMsg.wireFormat != com.vitorpamplona.quartz.marmot.mls.framing.WireFormat.PRIVATE_MESSAGE) {
|
if (mlsMsg.wireFormat != com.vitorpamplona.quartz.mls.framing.WireFormat.PRIVATE_MESSAGE) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
val privMsg =
|
val privMsg =
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.PrivateMessage
|
com.vitorpamplona.quartz.mls.framing.PrivateMessage
|
||||||
.decodeTls(TlsReader(mlsMsg.payload))
|
.decodeTls(TlsReader(mlsMsg.payload))
|
||||||
if (privMsg.epoch != retained.epoch) return null
|
if (privMsg.epoch != retained.epoch) return null
|
||||||
|
|
||||||
+8
-8
@@ -18,14 +18,14 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.group
|
package com.vitorpamplona.quartz.mls.group
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.GroupContext
|
import com.vitorpamplona.quartz.mls.messages.GroupContext
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Proposal
|
import com.vitorpamplona.quartz.mls.messages.Proposal
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.EpochSecrets
|
import com.vitorpamplona.quartz.mls.schedule.EpochSecrets
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.SenderRatchetState
|
import com.vitorpamplona.quartz.mls.schedule.SenderRatchetState
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serializable snapshot of an MLS group's complete state.
|
* Serializable snapshot of an MLS group's complete state.
|
||||||
@@ -46,7 +46,7 @@ import com.vitorpamplona.quartz.marmot.mls.schedule.SenderRatchetState
|
|||||||
* [senderRatchetStates] carries each sender's live SecretTree ratchet position
|
* [senderRatchetStates] carries each sender's live SecretTree ratchet position
|
||||||
* (RFC 9420 §9). Preserving it is what stops the restored local member from
|
* (RFC 9420 §9). Preserving it is what stops the restored local member from
|
||||||
* re-emitting an already-used generation within the same epoch — see
|
* re-emitting an already-used generation within the same epoch — see
|
||||||
* [com.vitorpamplona.quartz.marmot.mls.schedule.SecretTree.exportSenderStates].
|
* [com.vitorpamplona.quartz.mls.schedule.SecretTree.exportSenderStates].
|
||||||
* It is optional (empty for STATE_VERSION 1 blobs) so older persisted state
|
* It is optional (empty for STATE_VERSION 1 blobs) so older persisted state
|
||||||
* still decodes.
|
* still decodes.
|
||||||
*/
|
*/
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.group
|
package com.vitorpamplona.quartz.mls.group
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for encrypted local storage of MLS group state.
|
* Interface for encrypted local storage of MLS group state.
|
||||||
+10
-10
@@ -18,13 +18,13 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.messages
|
package com.vitorpamplona.quartz.mls.messages
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNode
|
import com.vitorpamplona.quartz.mls.tree.LeafNode
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.UpdatePathNode
|
import com.vitorpamplona.quartz.mls.tree.UpdatePathNode
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS Commit (RFC 9420 Section 12.4).
|
* MLS Commit (RFC 9420 Section 12.4).
|
||||||
@@ -93,7 +93,7 @@ data class UpdatePath(
|
|||||||
* Result of creating a Commit: the MLS messages to distribute.
|
* Result of creating a Commit: the MLS messages to distribute.
|
||||||
*
|
*
|
||||||
* [commitBytes] is the raw TLS-encoded [Commit] struct (RFC 9420 §12.4), useful
|
* [commitBytes] is the raw TLS-encoded [Commit] struct (RFC 9420 §12.4), useful
|
||||||
* for unit tests and the [com.vitorpamplona.quartz.marmot.mls.group.MlsGroup.processCommit]
|
* for unit tests and the [com.vitorpamplona.quartz.mls.group.MlsGroup.processCommit]
|
||||||
* entry point. For on-the-wire distribution, callers MUST publish
|
* entry point. For on-the-wire distribution, callers MUST publish
|
||||||
* [framedCommitBytes] (the MlsMessage(PublicMessage(FramedContent(commit))) envelope)
|
* [framedCommitBytes] (the MlsMessage(PublicMessage(FramedContent(commit))) envelope)
|
||||||
* so that receivers can parse the sender's leaf index and confirmation tag.
|
* so that receivers can parse the sender's leaf index and confirmation tag.
|
||||||
@@ -130,17 +130,17 @@ data class CommitResult(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Result of [com.vitorpamplona.quartz.marmot.mls.group.MlsGroup.externalJoin].
|
* Result of [com.vitorpamplona.quartz.mls.group.MlsGroup.externalJoin].
|
||||||
*
|
*
|
||||||
* [commitBytes] is the raw TLS-encoded [Commit] struct. For on-the-wire
|
* [commitBytes] is the raw TLS-encoded [Commit] struct. For on-the-wire
|
||||||
* distribution to existing group members, callers MUST publish [framedCommitBytes]
|
* distribution to existing group members, callers MUST publish [framedCommitBytes]
|
||||||
* — a `MlsMessage(PublicMessage(FramedContent(commit)))` envelope with sender
|
* — a `MlsMessage(PublicMessage(FramedContent(commit)))` envelope with sender
|
||||||
* `new_member_commit` (RFC 9420 §12.4.3) — so that receivers can parse the
|
* `new_member_commit` (RFC 9420 §12.4.3) — so that receivers can parse the
|
||||||
* confirmation_tag and process the commit via
|
* confirmation_tag and process the commit via
|
||||||
* [com.vitorpamplona.quartz.marmot.mls.group.MlsGroup.processFramedCommit].
|
* [com.vitorpamplona.quartz.mls.group.MlsGroup.processFramedCommit].
|
||||||
*/
|
*/
|
||||||
data class ExternalJoinResult(
|
data class ExternalJoinResult(
|
||||||
val group: com.vitorpamplona.quartz.marmot.mls.group.MlsGroup,
|
val group: com.vitorpamplona.quartz.mls.group.MlsGroup,
|
||||||
val commitBytes: ByteArray,
|
val commitBytes: ByteArray,
|
||||||
val framedCommitBytes: ByteArray,
|
val framedCommitBytes: ByteArray,
|
||||||
) {
|
) {
|
||||||
+8
-8
@@ -18,16 +18,16 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.messages
|
package com.vitorpamplona.quartz.mls.messages
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.appComponents.AppComponentIds
|
import com.vitorpamplona.quartz.marmot.appComponents.AppComponentIds
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.AppDataDictionary
|
import com.vitorpamplona.quartz.mls.components.AppDataDictionary
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNode
|
import com.vitorpamplona.quartz.mls.tree.LeafNode
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS KeyPackage (RFC 9420 Section 10).
|
* MLS KeyPackage (RFC 9420 Section 10).
|
||||||
+6
-6
@@ -18,13 +18,13 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.messages
|
package com.vitorpamplona.quartz.mls.messages
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNode
|
import com.vitorpamplona.quartz.mls.tree.LeafNode
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS Proposal types (RFC 9420 Section 12).
|
* MLS Proposal types (RFC 9420 Section 12).
|
||||||
+7
-7
@@ -18,14 +18,14 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.messages
|
package com.vitorpamplona.quartz.mls.messages
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.HpkeCiphertext
|
import com.vitorpamplona.quartz.mls.crypto.HpkeCiphertext
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS Welcome message (RFC 9420 Section 12.4.3.1).
|
* MLS Welcome message (RFC 9420 Section 12.4.3.1).
|
||||||
+2
-2
@@ -18,9 +18,9 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.schedule
|
package com.vitorpamplona.quartz.mls.schedule
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS Key Schedule (RFC 9420 Section 8).
|
* MLS Key Schedule (RFC 9420 Section 8).
|
||||||
+3
-3
@@ -18,10 +18,10 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.schedule
|
package com.vitorpamplona.quartz.mls.schedule
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.BinaryTree
|
import com.vitorpamplona.quartz.mls.tree.BinaryTree
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS Secret Tree (RFC 9420 Section 9).
|
* MLS Secret Tree (RFC 9420 Section 9).
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.tree
|
package com.vitorpamplona.quartz.mls.tree
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Left-balanced binary tree index arithmetic for MLS ratchet trees (RFC 9420 Section 7.1).
|
* Left-balanced binary tree index arithmetic for MLS ratchet trees (RFC 9420 Section 7.1).
|
||||||
+4
-4
@@ -18,11 +18,11 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.tree
|
package com.vitorpamplona.quartz.mls.tree
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS Credential (RFC 9420 Section 5.3).
|
* MLS Credential (RFC 9420 Section 5.3).
|
||||||
+4
-4
@@ -18,11 +18,11 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.tree
|
package com.vitorpamplona.quartz.mls.tree
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS ParentNode (RFC 9420 Section 7.1).
|
* MLS ParentNode (RFC 9420 Section 7.1).
|
||||||
+8
-8
@@ -18,12 +18,12 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.tree
|
package com.vitorpamplona.quartz.mls.tree
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MLS Ratchet Tree (RFC 9420 Section 7).
|
* MLS Ratchet Tree (RFC 9420 Section 7).
|
||||||
@@ -461,7 +461,7 @@ class RatchetTree(
|
|||||||
// reject the UpdatePath with `UpdatePathError(PathMismatch)`.
|
// reject the UpdatePath with `UpdatePathError(PathMismatch)`.
|
||||||
val nodeSecret = MlsCryptoProvider.deriveSecret(currentSecret, "node")
|
val nodeSecret = MlsCryptoProvider.deriveSecret(currentSecret, "node")
|
||||||
val kp =
|
val kp =
|
||||||
com.vitorpamplona.quartz.marmot.mls.crypto.Hpke
|
com.vitorpamplona.quartz.mls.crypto.Hpke
|
||||||
.deriveKeyPair(nodeSecret)
|
.deriveKeyPair(nodeSecret)
|
||||||
|
|
||||||
results.add(PathSecretAndKey(currentSecret, kp.privateKey, kp.publicKey))
|
results.add(PathSecretAndKey(currentSecret, kp.privateKey, kp.publicKey))
|
||||||
@@ -610,7 +610,7 @@ sealed class TreeNode : TlsSerializable {
|
|||||||
/** UpdatePath node: public key + encrypted path secrets for copath nodes */
|
/** UpdatePath node: public key + encrypted path secrets for copath nodes */
|
||||||
data class UpdatePathNode(
|
data class UpdatePathNode(
|
||||||
val encryptionKey: ByteArray,
|
val encryptionKey: ByteArray,
|
||||||
val encryptedPathSecret: List<com.vitorpamplona.quartz.marmot.mls.crypto.HpkeCiphertext>,
|
val encryptedPathSecret: List<com.vitorpamplona.quartz.mls.crypto.HpkeCiphertext>,
|
||||||
) : TlsSerializable {
|
) : TlsSerializable {
|
||||||
override fun encodeTls(writer: TlsWriter) {
|
override fun encodeTls(writer: TlsWriter) {
|
||||||
writer.putOpaqueVarInt(encryptionKey)
|
writer.putOpaqueVarInt(encryptionKey)
|
||||||
@@ -635,7 +635,7 @@ data class UpdatePathNode(
|
|||||||
encryptionKey = reader.readOpaqueVarInt(),
|
encryptionKey = reader.readOpaqueVarInt(),
|
||||||
encryptedPathSecret =
|
encryptedPathSecret =
|
||||||
reader.readVectorVarInt {
|
reader.readVectorVarInt {
|
||||||
com.vitorpamplona.quartz.marmot.mls.crypto.HpkeCiphertext
|
com.vitorpamplona.quartz.mls.crypto.HpkeCiphertext
|
||||||
.decodeTls(it)
|
.decodeTls(it)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
+1
-1
@@ -56,7 +56,7 @@ class SharedKeyCache {
|
|||||||
* hex string). The precomputed [hash] is only a bucket selector — [equals] does
|
* hex string). The precomputed [hash] is only a bucket selector — [equals] does
|
||||||
* the authoritative full-content comparison, so hash collisions can never return
|
* the authoritative full-content comparison, so hash collisions can never return
|
||||||
* the wrong peer's secret. Callers must treat the passed arrays as immutable
|
* the wrong peer's secret. Callers must treat the passed arrays as immutable
|
||||||
* (the same value-type contract [com.vitorpamplona.quartz.marmot.mls.crypto.X25519KeyPair]
|
* (the same value-type contract [com.vitorpamplona.quartz.mls.crypto.X25519KeyPair]
|
||||||
* relies on when used as a map key).
|
* relies on when used as a map key).
|
||||||
*/
|
*/
|
||||||
private class CacheKey(
|
private class CacheKey(
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
|||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupImageCipher
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupImageCipher
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupImageEncryption
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupImageEncryption
|
||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.Mip01ImageCrypto
|
import com.vitorpamplona.quartz.marmot.mip01Groups.Mip01ImageCrypto
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.nip44Encryption.crypto.ChaCha20Poly1305
|
import com.vitorpamplona.quartz.nip44Encryption.crypto.ChaCha20Poly1305
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.protocolCore
|
package com.vitorpamplona.quartz.marmot.protocolCore
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup
|
import com.vitorpamplona.quartz.mls.group.MlsGroup
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState
|
import com.vitorpamplona.quartz.mls.group.MlsGroupState
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.utils.sha256.sha256
|
import com.vitorpamplona.quartz.utils.sha256.sha256
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
|
|||||||
+2
-2
@@ -18,9 +18,9 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls
|
package com.vitorpamplona.quartz.mls
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.BinaryTree
|
import com.vitorpamplona.quartz.mls.tree.BinaryTree
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertFails
|
import kotlin.test.assertFails
|
||||||
+4
-4
@@ -18,11 +18,11 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls
|
package com.vitorpamplona.quartz.mls
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.GroupContext
|
import com.vitorpamplona.quartz.mls.messages.GroupContext
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.KeySchedule
|
import com.vitorpamplona.quartz.mls.schedule.KeySchedule
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertFalse
|
import kotlin.test.assertFalse
|
||||||
+17
-17
@@ -18,24 +18,24 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls
|
package com.vitorpamplona.quartz.mls
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.ContentType
|
import com.vitorpamplona.quartz.mls.framing.ContentType
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.PrivateMessage
|
import com.vitorpamplona.quartz.mls.framing.PrivateMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Commit
|
import com.vitorpamplona.quartz.mls.messages.Commit
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.GroupContext
|
import com.vitorpamplona.quartz.mls.messages.GroupContext
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Proposal
|
import com.vitorpamplona.quartz.mls.messages.Proposal
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.ProposalOrRef
|
import com.vitorpamplona.quartz.mls.messages.ProposalOrRef
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Capabilities
|
import com.vitorpamplona.quartz.mls.tree.Capabilities
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Credential
|
import com.vitorpamplona.quartz.mls.tree.Credential
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Extension
|
import com.vitorpamplona.quartz.mls.tree.Extension
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNode
|
import com.vitorpamplona.quartz.mls.tree.LeafNode
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.LeafNodeSource
|
import com.vitorpamplona.quartz.mls.tree.LeafNodeSource
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.Lifetime
|
import com.vitorpamplona.quartz.mls.tree.Lifetime
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.ParentNode
|
import com.vitorpamplona.quartz.mls.tree.ParentNode
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
+4
-4
@@ -18,11 +18,11 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls
|
package com.vitorpamplona.quartz.mls
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsSerializable
|
import com.vitorpamplona.quartz.mls.codec.TlsSerializable
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
+5
-5
@@ -18,12 +18,12 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.group
|
package com.vitorpamplona.quartz.mls.group
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.PublicMessage
|
import com.vitorpamplona.quartz.mls.framing.PublicMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertFailsWith
|
import kotlin.test.assertFailsWith
|
||||||
+2
-2
@@ -18,10 +18,10 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
+2
-2
@@ -18,10 +18,10 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.KeySchedule
|
import com.vitorpamplona.quartz.mls.schedule.KeySchedule
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
+8
-8
@@ -18,16 +18,16 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Commit
|
import com.vitorpamplona.quartz.mls.messages.Commit
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.MlsKeyPackage
|
import com.vitorpamplona.quartz.mls.messages.MlsKeyPackage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree
|
import com.vitorpamplona.quartz.mls.tree.RatchetTree
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import kotlinx.serialization.SerialName
|
import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
+4
-4
@@ -18,12 +18,12 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
+2
-2
@@ -18,10 +18,10 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.schedule.SecretTree
|
import com.vitorpamplona.quartz.mls.schedule.SecretTree
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
+3
-3
@@ -18,11 +18,11 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
+4
-4
@@ -18,12 +18,12 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree
|
import com.vitorpamplona.quartz.mls.tree.RatchetTree
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
+2
-2
@@ -18,10 +18,10 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.BinaryTree
|
import com.vitorpamplona.quartz.mls.tree.BinaryTree
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
+4
-4
@@ -18,12 +18,12 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree
|
import com.vitorpamplona.quartz.mls.tree.RatchetTree
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
+5
-5
@@ -18,13 +18,13 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsWriter
|
import com.vitorpamplona.quartz.mls.codec.TlsWriter
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.BinaryTree
|
import com.vitorpamplona.quartz.mls.tree.BinaryTree
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree
|
import com.vitorpamplona.quartz.mls.tree.RatchetTree
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
+11
-11
@@ -18,19 +18,19 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.interop
|
package com.vitorpamplona.quartz.mls.interop
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.TestResourceLoader
|
import com.vitorpamplona.quartz.TestResourceLoader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
import com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
import com.vitorpamplona.quartz.marmot.mls.crypto.X25519
|
import com.vitorpamplona.quartz.mls.crypto.X25519
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
import com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.framing.WireFormat
|
import com.vitorpamplona.quartz.mls.framing.WireFormat
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.GroupInfo
|
import com.vitorpamplona.quartz.mls.messages.GroupInfo
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.GroupSecrets
|
import com.vitorpamplona.quartz.mls.messages.GroupSecrets
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.MlsKeyPackage
|
import com.vitorpamplona.quartz.mls.messages.MlsKeyPackage
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.Welcome
|
import com.vitorpamplona.quartz.mls.messages.Welcome
|
||||||
import com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree
|
import com.vitorpamplona.quartz.mls.tree.RatchetTree
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
import com.vitorpamplona.quartz.nip01Core.core.JsonMapper
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||||
import io.github.andreypfau.kotlinx.crypto.Sha512
|
import io.github.andreypfau.kotlinx.crypto.Sha512
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.mls.crypto
|
package com.vitorpamplona.quartz.mls.crypto
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||||
|
|
||||||
+1
-1
@@ -24,11 +24,11 @@ import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageRotationManage
|
|||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager
|
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergencePolicy
|
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergencePolicy
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceStatus
|
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceStatus
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotConvergenceEngine
|
import com.vitorpamplona.quartz.marmot.protocolCore.MarmotConvergenceEngine
|
||||||
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.utils.sha256.sha256
|
import com.vitorpamplona.quartz.utils.sha256.sha256
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
|
|||||||
+36
-36
@@ -23,10 +23,10 @@ package com.vitorpamplona.quartz.marmot
|
|||||||
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
import com.vitorpamplona.quartz.marmot.mip01Groups.MarmotGroupData
|
||||||
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeEvent
|
import com.vitorpamplona.quartz.marmot.mip02Welcome.WelcomeEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader
|
import com.vitorpamplona.quartz.mls.codec.TlsReader
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup
|
import com.vitorpamplona.quartz.mls.group.MlsGroup
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager
|
||||||
import com.vitorpamplona.quartz.marmot.mls.messages.KeyPackageBundle
|
import com.vitorpamplona.quartz.mls.messages.KeyPackageBundle
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
||||||
@@ -405,10 +405,10 @@ class MarmotMipBehaviorTest {
|
|||||||
// must reject because Remove is admin-only.
|
// must reject because Remove is admin-only.
|
||||||
val proposals =
|
val proposals =
|
||||||
listOf(
|
listOf(
|
||||||
com.vitorpamplona.quartz.marmot.mls.group
|
com.vitorpamplona.quartz.mls.group
|
||||||
.PendingProposal(
|
.PendingProposal(
|
||||||
proposal =
|
proposal =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.Remove(removedLeafIndex = 0),
|
.Remove(removedLeafIndex = 0),
|
||||||
senderLeafIndex = 1,
|
senderLeafIndex = 1,
|
||||||
@@ -444,10 +444,10 @@ class MarmotMipBehaviorTest {
|
|||||||
// proposal list passes.
|
// proposal list passes.
|
||||||
val proposals =
|
val proposals =
|
||||||
listOf(
|
listOf(
|
||||||
com.vitorpamplona.quartz.marmot.mls.group
|
com.vitorpamplona.quartz.mls.group
|
||||||
.PendingProposal(
|
.PendingProposal(
|
||||||
proposal =
|
proposal =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.SelfRemove(),
|
.SelfRemove(),
|
||||||
senderLeafIndex = 99,
|
senderLeafIndex = 99,
|
||||||
@@ -470,10 +470,10 @@ class MarmotMipBehaviorTest {
|
|||||||
val alice = manager.getGroup(groupId)!!
|
val alice = manager.getGroup(groupId)!!
|
||||||
val proposals =
|
val proposals =
|
||||||
listOf(
|
listOf(
|
||||||
com.vitorpamplona.quartz.marmot.mls.group
|
com.vitorpamplona.quartz.mls.group
|
||||||
.PendingProposal(
|
.PendingProposal(
|
||||||
proposal =
|
proposal =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.GroupContextExtensions(
|
.GroupContextExtensions(
|
||||||
extensions =
|
extensions =
|
||||||
@@ -517,7 +517,7 @@ class MarmotMipBehaviorTest {
|
|||||||
val staged = alice.pendingProposalsSnapshot()
|
val staged = alice.pendingProposalsSnapshot()
|
||||||
assertEquals(1, staged.size, "buildSelfRemoveProposalMessage must also stage to pending pool")
|
assertEquals(1, staged.size, "buildSelfRemoveProposalMessage must also stage to pending pool")
|
||||||
val entry = staged.single()
|
val entry = staged.single()
|
||||||
assertIs<com.vitorpamplona.quartz.marmot.mls.messages.Proposal.SelfRemove>(entry.proposal)
|
assertIs<com.vitorpamplona.quartz.mls.messages.Proposal.SelfRemove>(entry.proposal)
|
||||||
assertEquals(alice.leafIndex, entry.senderLeafIndex)
|
assertEquals(alice.leafIndex, entry.senderLeafIndex)
|
||||||
// The captured AC bytes are what RFC 9420 §5.2's MakeProposalRef
|
// The captured AC bytes are what RFC 9420 §5.2's MakeProposalRef
|
||||||
// hashes — must be present so a peer's commit referencing this
|
// hashes — must be present so a peer's commit referencing this
|
||||||
@@ -574,7 +574,7 @@ class MarmotMipBehaviorTest {
|
|||||||
val (alice, bob) = build2MemberGroupWithBobJoined()
|
val (alice, bob) = build2MemberGroupWithBobJoined()
|
||||||
|
|
||||||
val proposal =
|
val proposal =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.SelfRemove()
|
.SelfRemove()
|
||||||
val before = alice.pendingProposalsSnapshot().size
|
val before = alice.pendingProposalsSnapshot().size
|
||||||
@@ -582,14 +582,14 @@ class MarmotMipBehaviorTest {
|
|||||||
val result = alice.decrypt(wireBytes)
|
val result = alice.decrypt(wireBytes)
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.ContentType.PROPOSAL,
|
com.vitorpamplona.quartz.mls.framing.ContentType.PROPOSAL,
|
||||||
result.contentType,
|
result.contentType,
|
||||||
)
|
)
|
||||||
assertEquals(bob.leafIndex, result.senderLeafIndex)
|
assertEquals(bob.leafIndex, result.senderLeafIndex)
|
||||||
val after = alice.pendingProposalsSnapshot()
|
val after = alice.pendingProposalsSnapshot()
|
||||||
assertEquals(before + 1, after.size, "decrypt must stage the proposal in pending pool")
|
assertEquals(before + 1, after.size, "decrypt must stage the proposal in pending pool")
|
||||||
val staged = after.last()
|
val staged = after.last()
|
||||||
assertIs<com.vitorpamplona.quartz.marmot.mls.messages.Proposal.SelfRemove>(staged.proposal)
|
assertIs<com.vitorpamplona.quartz.mls.messages.Proposal.SelfRemove>(staged.proposal)
|
||||||
assertEquals(bob.leafIndex, staged.senderLeafIndex)
|
assertEquals(bob.leafIndex, staged.senderLeafIndex)
|
||||||
assertNotNull(
|
assertNotNull(
|
||||||
staged.authenticatedContentBytes,
|
staged.authenticatedContentBytes,
|
||||||
@@ -610,7 +610,7 @@ class MarmotMipBehaviorTest {
|
|||||||
val (alice, bob) = build2MemberGroupWithBobJoined()
|
val (alice, bob) = build2MemberGroupWithBobJoined()
|
||||||
|
|
||||||
val proposal =
|
val proposal =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.Psk(pskType = 1, pskId = ByteArray(16) { 0xAB.toByte() }, pskNonce = ByteArray(16))
|
.Psk(pskType = 1, pskId = ByteArray(16) { 0xAB.toByte() }, pskNonce = ByteArray(16))
|
||||||
val wireBytes = bob.encryptProposalAsPrivateMessage(proposal)
|
val wireBytes = bob.encryptProposalAsPrivateMessage(proposal)
|
||||||
@@ -658,7 +658,7 @@ class MarmotMipBehaviorTest {
|
|||||||
@Test
|
@Test
|
||||||
fun secretTree_rejectsRatchetJumpsBeyondCap() {
|
fun secretTree_rejectsRatchetJumpsBeyondCap() {
|
||||||
val st =
|
val st =
|
||||||
com.vitorpamplona.quartz.marmot.mls.schedule.SecretTree(
|
com.vitorpamplona.quartz.mls.schedule.SecretTree(
|
||||||
encryptionSecret = ByteArray(32),
|
encryptionSecret = ByteArray(32),
|
||||||
leafCount = 1,
|
leafCount = 1,
|
||||||
)
|
)
|
||||||
@@ -682,7 +682,7 @@ class MarmotMipBehaviorTest {
|
|||||||
@Test
|
@Test
|
||||||
fun privateMessage_rejectsOversizedAuthenticatedData() {
|
fun privateMessage_rejectsOversizedAuthenticatedData() {
|
||||||
val w =
|
val w =
|
||||||
com.vitorpamplona.quartz.marmot.mls.codec
|
com.vitorpamplona.quartz.mls.codec
|
||||||
.TlsWriter()
|
.TlsWriter()
|
||||||
w.putOpaqueVarInt(ByteArray(32)) // group_id
|
w.putOpaqueVarInt(ByteArray(32)) // group_id
|
||||||
w.putUint64(0L) // epoch
|
w.putUint64(0L) // epoch
|
||||||
@@ -692,9 +692,9 @@ class MarmotMipBehaviorTest {
|
|||||||
w.putOpaqueVarInt(ByteArray(64)) // ciphertext (small)
|
w.putOpaqueVarInt(ByteArray(64)) // ciphertext (small)
|
||||||
val ex =
|
val ex =
|
||||||
assertFailsWith<IllegalArgumentException> {
|
assertFailsWith<IllegalArgumentException> {
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.PrivateMessage
|
com.vitorpamplona.quartz.mls.framing.PrivateMessage
|
||||||
.decodeTls(
|
.decodeTls(
|
||||||
com.vitorpamplona.quartz.marmot.mls.codec
|
com.vitorpamplona.quartz.mls.codec
|
||||||
.TlsReader(w.toByteArray()),
|
.TlsReader(w.toByteArray()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -717,9 +717,9 @@ class MarmotMipBehaviorTest {
|
|||||||
fun verifyTreeParentHashesForJoin_acceptsSingleMemberTree() {
|
fun verifyTreeParentHashesForJoin_acceptsSingleMemberTree() {
|
||||||
val alice = MlsGroup.create(aliceId.hexToByteArray())
|
val alice = MlsGroup.create(aliceId.hexToByteArray())
|
||||||
val tree =
|
val tree =
|
||||||
com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree
|
com.vitorpamplona.quartz.mls.tree.RatchetTree
|
||||||
.decodeTls(
|
.decodeTls(
|
||||||
com.vitorpamplona.quartz.marmot.mls.codec
|
com.vitorpamplona.quartz.mls.codec
|
||||||
.TlsReader(alice.exportTreeBytes()),
|
.TlsReader(alice.exportTreeBytes()),
|
||||||
)
|
)
|
||||||
assertNull(MlsGroup.verifyTreeParentHashesForJoin(tree))
|
assertNull(MlsGroup.verifyTreeParentHashesForJoin(tree))
|
||||||
@@ -749,9 +749,9 @@ class MarmotMipBehaviorTest {
|
|||||||
|
|
||||||
val alice = manager.getGroup(groupId)!!
|
val alice = manager.getGroup(groupId)!!
|
||||||
val originalTree =
|
val originalTree =
|
||||||
com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree
|
com.vitorpamplona.quartz.mls.tree.RatchetTree
|
||||||
.decodeTls(
|
.decodeTls(
|
||||||
com.vitorpamplona.quartz.marmot.mls.codec
|
com.vitorpamplona.quartz.mls.codec
|
||||||
.TlsReader(alice.exportTreeBytes()),
|
.TlsReader(alice.exportTreeBytes()),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -763,7 +763,7 @@ class MarmotMipBehaviorTest {
|
|||||||
for (i in 0 until originalTree.leafCount) {
|
for (i in 0 until originalTree.leafCount) {
|
||||||
val leaf = originalTree.getLeaf(i) ?: continue
|
val leaf = originalTree.getLeaf(i) ?: continue
|
||||||
if (leaf.leafNodeSource ==
|
if (leaf.leafNodeSource ==
|
||||||
com.vitorpamplona.quartz.marmot.mls.tree.LeafNodeSource.COMMIT
|
com.vitorpamplona.quartz.mls.tree.LeafNodeSource.COMMIT
|
||||||
) {
|
) {
|
||||||
val tampered = leaf.copy(parentHash = ByteArray(32) { 0x99.toByte() })
|
val tampered = leaf.copy(parentHash = ByteArray(32) { 0x99.toByte() })
|
||||||
originalTree.setLeaf(i, tampered)
|
originalTree.setLeaf(i, tampered)
|
||||||
@@ -823,7 +823,7 @@ class MarmotMipBehaviorTest {
|
|||||||
)
|
)
|
||||||
// Missing 0xF2EE.
|
// Missing 0xF2EE.
|
||||||
val caps =
|
val caps =
|
||||||
com.vitorpamplona.quartz.marmot.mls.tree.Capabilities(
|
com.vitorpamplona.quartz.mls.tree.Capabilities(
|
||||||
extensions = emptyList(),
|
extensions = emptyList(),
|
||||||
proposals = listOf(0x000A),
|
proposals = listOf(0x000A),
|
||||||
credentials = listOf(0x0001),
|
credentials = listOf(0x0001),
|
||||||
@@ -847,7 +847,7 @@ class MarmotMipBehaviorTest {
|
|||||||
credentials = emptyList(),
|
credentials = emptyList(),
|
||||||
)
|
)
|
||||||
val caps =
|
val caps =
|
||||||
com.vitorpamplona.quartz.marmot.mls.tree.Capabilities(
|
com.vitorpamplona.quartz.mls.tree.Capabilities(
|
||||||
extensions = emptyList(),
|
extensions = emptyList(),
|
||||||
proposals = emptyList(),
|
proposals = emptyList(),
|
||||||
credentials = listOf(0x0001),
|
credentials = listOf(0x0001),
|
||||||
@@ -866,7 +866,7 @@ class MarmotMipBehaviorTest {
|
|||||||
credentials = listOf(0x0001),
|
credentials = listOf(0x0001),
|
||||||
)
|
)
|
||||||
val caps =
|
val caps =
|
||||||
com.vitorpamplona.quartz.marmot.mls.tree.Capabilities(
|
com.vitorpamplona.quartz.mls.tree.Capabilities(
|
||||||
extensions = listOf(0xF2EE, 0x1234),
|
extensions = listOf(0xF2EE, 0x1234),
|
||||||
proposals = listOf(0x000A, 0x000B),
|
proposals = listOf(0x000A, 0x000B),
|
||||||
credentials = listOf(0x0001, 0x0002),
|
credentials = listOf(0x0001, 0x0002),
|
||||||
@@ -905,7 +905,7 @@ class MarmotMipBehaviorTest {
|
|||||||
* (SelfRemove), then re-sign so the KP's outer signature still
|
* (SelfRemove), then re-sign so the KP's outer signature still
|
||||||
* validates. Useful for testing the §7.2 gate in isolation.
|
* validates. Useful for testing the §7.2 gate in isolation.
|
||||||
*/
|
*/
|
||||||
private fun createKeyPackageWithoutSelfRemove(identity: String): com.vitorpamplona.quartz.marmot.mls.messages.MlsKeyPackage {
|
private fun createKeyPackageWithoutSelfRemove(identity: String): com.vitorpamplona.quartz.mls.messages.MlsKeyPackage {
|
||||||
val tempGroup = MlsGroup.create(identity.hexToByteArray())
|
val tempGroup = MlsGroup.create(identity.hexToByteArray())
|
||||||
val bundle = tempGroup.createKeyPackage(identity.hexToByteArray(), ByteArray(0))
|
val bundle = tempGroup.createKeyPackage(identity.hexToByteArray(), ByteArray(0))
|
||||||
val original = bundle.keyPackage
|
val original = bundle.keyPackage
|
||||||
@@ -923,7 +923,7 @@ class MarmotMipBehaviorTest {
|
|||||||
originalLeaf.copy(capabilities = tamperedCaps).let { lf ->
|
originalLeaf.copy(capabilities = tamperedCaps).let { lf ->
|
||||||
val tbs = lf.encodeTbs()
|
val tbs = lf.encodeTbs()
|
||||||
val sig =
|
val sig =
|
||||||
com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
.signWithLabel(bundle.signaturePrivateKey, "LeafNodeTBS", tbs)
|
.signWithLabel(bundle.signaturePrivateKey, "LeafNodeTBS", tbs)
|
||||||
lf.copy(signature = sig)
|
lf.copy(signature = sig)
|
||||||
}
|
}
|
||||||
@@ -931,7 +931,7 @@ class MarmotMipBehaviorTest {
|
|||||||
val unsigned = original.copy(leafNode = tamperedLeaf, signature = ByteArray(0))
|
val unsigned = original.copy(leafNode = tamperedLeaf, signature = ByteArray(0))
|
||||||
return unsigned.copy(
|
return unsigned.copy(
|
||||||
signature =
|
signature =
|
||||||
com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
.signWithLabel(bundle.signaturePrivateKey, "KeyPackageTBS", unsigned.encodeTbs()),
|
.signWithLabel(bundle.signaturePrivateKey, "KeyPackageTBS", unsigned.encodeTbs()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -977,7 +977,7 @@ class MarmotMipBehaviorTest {
|
|||||||
alice.registerPsk(pskId, pskValue)
|
alice.registerPsk(pskId, pskValue)
|
||||||
|
|
||||||
val proposal =
|
val proposal =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.Psk(pskType = 1, pskId = pskId, pskNonce = pskNonce)
|
.Psk(pskType = 1, pskId = pskId, pskNonce = pskNonce)
|
||||||
|
|
||||||
@@ -985,11 +985,11 @@ class MarmotMipBehaviorTest {
|
|||||||
|
|
||||||
// Reference computation per §5.3 (PSKType=1, no usage/group/epoch).
|
// Reference computation per §5.3 (PSKType=1, no usage/group/epoch).
|
||||||
val zero = ByteArray(32)
|
val zero = ByteArray(32)
|
||||||
val crypto = com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider
|
val crypto = com.vitorpamplona.quartz.mls.crypto.MlsCryptoProvider
|
||||||
val pskExtracted = crypto.hkdfExtract(salt = zero, ikm = pskValue)
|
val pskExtracted = crypto.hkdfExtract(salt = zero, ikm = pskValue)
|
||||||
|
|
||||||
val labelWriter =
|
val labelWriter =
|
||||||
com.vitorpamplona.quartz.marmot.mls.codec
|
com.vitorpamplona.quartz.mls.codec
|
||||||
.TlsWriter()
|
.TlsWriter()
|
||||||
labelWriter.putUint8(1) // PSKType external
|
labelWriter.putUint8(1) // PSKType external
|
||||||
labelWriter.putOpaqueVarInt(pskId)
|
labelWriter.putOpaqueVarInt(pskId)
|
||||||
@@ -1022,7 +1022,7 @@ class MarmotMipBehaviorTest {
|
|||||||
alice.registerPsk(pskId, ByteArray(32))
|
alice.registerPsk(pskId, ByteArray(32))
|
||||||
|
|
||||||
val proposal =
|
val proposal =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.Psk(pskType = 2, pskId = pskId, pskNonce = ByteArray(16))
|
.Psk(pskType = 2, pskId = pskId, pskNonce = ByteArray(16))
|
||||||
|
|
||||||
@@ -1045,11 +1045,11 @@ class MarmotMipBehaviorTest {
|
|||||||
alice.registerPsk(idB, ByteArray(32) { 0x44 })
|
alice.registerPsk(idB, ByteArray(32) { 0x44 })
|
||||||
|
|
||||||
val pskA =
|
val pskA =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.Psk(pskType = 1, pskId = idA, pskNonce = ByteArray(8))
|
.Psk(pskType = 1, pskId = idA, pskNonce = ByteArray(8))
|
||||||
val pskB =
|
val pskB =
|
||||||
com.vitorpamplona.quartz.marmot.mls.messages
|
com.vitorpamplona.quartz.mls.messages
|
||||||
.Proposal
|
.Proposal
|
||||||
.Psk(pskType = 1, pskId = idB, pskNonce = ByteArray(8))
|
.Psk(pskType = 1, pskId = idB, pskNonce = ByteArray(8))
|
||||||
|
|
||||||
|
|||||||
+12
-12
@@ -23,10 +23,10 @@ package com.vitorpamplona.quartz.marmot
|
|||||||
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageRotationManager
|
import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageRotationManager
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEvent
|
||||||
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
import com.vitorpamplona.quartz.marmot.mip03GroupMessages.GroupEventEncryption
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupManager
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupStateStore
|
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceStatus
|
import com.vitorpamplona.quartz.marmot.protocolCore.ConvergenceStatus
|
||||||
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
import com.vitorpamplona.quartz.marmot.protocolCore.GroupLifecycleState
|
||||||
|
import com.vitorpamplona.quartz.mls.group.MlsGroupManager
|
||||||
|
import com.vitorpamplona.quartz.mls.group.MlsGroupStateStore
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair
|
||||||
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal
|
||||||
@@ -380,28 +380,28 @@ class MarmotPipelineTest {
|
|||||||
// The framedCommitBytes must decode as an MlsMessage(PublicMessage(commit))
|
// The framedCommitBytes must decode as an MlsMessage(PublicMessage(commit))
|
||||||
val framed = commitResult.framedCommitBytes
|
val framed = commitResult.framedCommitBytes
|
||||||
val mlsMessage =
|
val mlsMessage =
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
.decodeTls(
|
.decodeTls(
|
||||||
com.vitorpamplona.quartz.marmot.mls.codec
|
com.vitorpamplona.quartz.mls.codec
|
||||||
.TlsReader(framed),
|
.TlsReader(framed),
|
||||||
)
|
)
|
||||||
assertEquals(
|
assertEquals(
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.WireFormat.PUBLIC_MESSAGE,
|
com.vitorpamplona.quartz.mls.framing.WireFormat.PUBLIC_MESSAGE,
|
||||||
mlsMessage.wireFormat,
|
mlsMessage.wireFormat,
|
||||||
)
|
)
|
||||||
|
|
||||||
val publicMessage =
|
val publicMessage =
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.PublicMessage
|
com.vitorpamplona.quartz.mls.framing.PublicMessage
|
||||||
.decodeTls(
|
.decodeTls(
|
||||||
com.vitorpamplona.quartz.marmot.mls.codec
|
com.vitorpamplona.quartz.mls.codec
|
||||||
.TlsReader(mlsMessage.payload),
|
.TlsReader(mlsMessage.payload),
|
||||||
)
|
)
|
||||||
assertEquals(
|
assertEquals(
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.ContentType.COMMIT,
|
com.vitorpamplona.quartz.mls.framing.ContentType.COMMIT,
|
||||||
publicMessage.contentType,
|
publicMessage.contentType,
|
||||||
)
|
)
|
||||||
assertEquals(
|
assertEquals(
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.SenderType.MEMBER,
|
com.vitorpamplona.quartz.mls.framing.SenderType.MEMBER,
|
||||||
publicMessage.sender.senderType,
|
publicMessage.sender.senderType,
|
||||||
)
|
)
|
||||||
assertNotNull(publicMessage.confirmationTag, "confirmation_tag must be present on a commit")
|
assertNotNull(publicMessage.confirmationTag, "confirmation_tag must be present on a commit")
|
||||||
@@ -431,13 +431,13 @@ class MarmotPipelineTest {
|
|||||||
val exporterKey = manager.exporterSecret(groupId)
|
val exporterKey = manager.exporterSecret(groupId)
|
||||||
val mlsBytes = GroupEventEncryption.decrypt(event.content, exporterKey)
|
val mlsBytes = GroupEventEncryption.decrypt(event.content, exporterKey)
|
||||||
val mlsMessage =
|
val mlsMessage =
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.MlsMessage
|
com.vitorpamplona.quartz.mls.framing.MlsMessage
|
||||||
.decodeTls(
|
.decodeTls(
|
||||||
com.vitorpamplona.quartz.marmot.mls.codec
|
com.vitorpamplona.quartz.mls.codec
|
||||||
.TlsReader(mlsBytes),
|
.TlsReader(mlsBytes),
|
||||||
)
|
)
|
||||||
assertEquals(
|
assertEquals(
|
||||||
com.vitorpamplona.quartz.marmot.mls.framing.WireFormat.PUBLIC_MESSAGE,
|
com.vitorpamplona.quartz.mls.framing.WireFormat.PUBLIC_MESSAGE,
|
||||||
mlsMessage.wireFormat,
|
mlsMessage.wireFormat,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.vitorpamplona.quartz.marmot.appComponents
|
package com.vitorpamplona.quartz.marmot.appComponents
|
||||||
|
|
||||||
import com.vitorpamplona.quartz.marmot.mls.components.AppDataDictionary
|
import com.vitorpamplona.quartz.mls.components.AppDataDictionary
|
||||||
import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup
|
import com.vitorpamplona.quartz.mls.group.MlsGroup
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user