All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.net.folivo.trixnity.client.key.utils.kt Maven / Gradle / Ivy

There is a newer version: 4.7.1
Show newest version
package net.folivo.trixnity.client.key

import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import net.folivo.trixnity.client.store.GlobalAccountDataStore
import net.folivo.trixnity.client.store.KeyStore
import net.folivo.trixnity.client.store.StoredCrossSigningKeys
import net.folivo.trixnity.client.store.get
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.model.events.m.MegolmBackupV1EventContent
import net.folivo.trixnity.core.model.events.m.crosssigning.SelfSigningKeyEventContent
import net.folivo.trixnity.core.model.events.m.crosssigning.UserSigningKeyEventContent
import net.folivo.trixnity.core.model.keys.*
import net.folivo.trixnity.crypto.SecretType

private val log = KotlinLogging.logger { }
internal suspend inline fun  KeyStore.getAllKeysFromUser(
    userId: UserId,
    filterDeviceId: String? = null,
    filterUsage: CrossSigningKeysUsage? = null
): Set {
    val deviceKeys = getDeviceKeys(userId).first()
        ?.entries?.filter { if (filterDeviceId != null) it.key == filterDeviceId else true }
        ?.flatMap { it.value.value.signed.keys.filterIsInstance() } ?: listOf()
    val crossSigningKeys =
        getCrossSigningKeys(userId).first()
            ?.filter { if (filterUsage != null) it.value.signed.usage.contains(filterUsage) else true }
            ?.flatMap { it.value.signed.keys.filterIsInstance() } ?: listOf()
    return (deviceKeys + crossSigningKeys).toSet()
}


internal fun KeyStore.getDeviceKey(userId: UserId, deviceId: String) =
    this.getDeviceKeys(userId).map { it?.get(deviceId) }

internal suspend inline fun KeyStore.getCrossSigningKey(
    userId: UserId,
    usage: CrossSigningKeysUsage,
): StoredCrossSigningKeys? {
    return this.getCrossSigningKeys(userId).first()
        ?.firstOrNull { it.value.signed.usage.contains(usage) }
}

internal suspend inline fun KeyStore.getCrossSigningKey(
    userId: UserId,
    keyId: String,
): StoredCrossSigningKeys? {
    return this.getCrossSigningKeys(userId).first()?.find { keys ->
        keys.value.signed.keys.keys.filterIsInstance().any { it.keyId == keyId }
    }
}

internal inline fun  DeviceKeys.get(): T? {
    return keys.keys.filterIsInstance().firstOrNull()
}

internal inline fun  CrossSigningKeys.get(): T? {
    return keys.keys.filterIsInstance().firstOrNull()
}

internal inline fun  Keys.get(): T? {
    return keys.filterIsInstance().firstOrNull()
}

internal inline fun  SignedDeviceKeys.get(): T? {
    return signed.keys.keys.filterIsInstance().firstOrNull()
}

internal fun SecretType.getEncryptedSecret(globalAccountDataStore: GlobalAccountDataStore) = when (this) {
    SecretType.M_CROSS_SIGNING_USER_SIGNING -> globalAccountDataStore.get()
    SecretType.M_CROSS_SIGNING_SELF_SIGNING -> globalAccountDataStore.get()
    SecretType.M_MEGOLM_BACKUP_V1 -> globalAccountDataStore.get()
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy