feat: implement Ed25519 and X25519 crypto for Apple/iOS and Linux native platforms

Replace TODO stubs with pure Kotlin implementations of Ed25519 (RFC 8032) and
X25519 (RFC 7748) for native targets, completing Marmot MLS support on iOS.
Shared field arithmetic over GF(2^255-19) is extracted to nativeMain. Also
fixes MarmotSubscriptionManagerTest assertions to account for the ownKeyPackageFilter
added to buildFilters().

https://claude.ai/code/session_01LpR6qsF6nep1RnXA9KbXGs
This commit is contained in:
Claude
2026-04-08 13:19:38 +00:00
parent 3322a953c2
commit b5ee266169
6 changed files with 1219 additions and 20 deletions
@@ -142,24 +142,24 @@ class MarmotSubscriptionManagerTest {
}
@Test
fun testBuildFiltersIncludesBothTypes() =
fun testBuildFiltersIncludesAllTypes() =
runTest {
val manager = MarmotSubscriptionManager(userPubKey)
manager.subscribeGroup(groupId1)
val allFilters = manager.buildFilters()
// Should have 1 group filter + 1 gift wrap filter
assertEquals(2, allFilters.size)
// Should have 1 group filter + 1 gift wrap filter + 1 own key package filter
assertEquals(3, allFilters.size)
}
@Test
fun testBuildFiltersWithNoGroupsHasGiftWrapOnly() {
fun testBuildFiltersWithNoGroupsHasGiftWrapAndKeyPackage() {
val manager = MarmotSubscriptionManager(userPubKey)
val allFilters = manager.buildFilters()
// Only the gift wrap filter
assertEquals(1, allFilters.size)
// Gift wrap filter + own key package filter
assertEquals(2, allFilters.size)
assertEquals(listOf(GiftWrapEvent.KIND), allFilters[0].kinds)
}