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

commonMain.org.ton.api.pk.ed25519.kt Maven / Gradle / Ivy

@file:Suppress("NOTHING_TO_INLINE", "OPT_IN_USAGE")

package org.ton.api.pk

import io.ktor.utils.io.core.*
import kotlinx.serialization.Polymorphic
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonClassDiscriminator
import org.ton.api.pub.PublicKeyEd25519
import org.ton.crypto.Decryptor
import org.ton.crypto.DecryptorEd25519
import org.ton.crypto.Ed25519
import org.ton.crypto.SecureRandom
import org.ton.tl.*
import kotlin.jvm.JvmStatic
import kotlin.random.Random

public inline fun PrivateKeyEd25519(byteArray: ByteArray): PrivateKeyEd25519 =
    PrivateKeyEd25519.of(byteArray)

public inline fun PrivateKeyEd25519(random: Random = SecureRandom): PrivateKeyEd25519 =
    PrivateKeyEd25519.generate(random)

public interface PrivateKeyEd25519 : PrivateKey {
    public val key: Bits256

    override fun publicKey(): PublicKeyEd25519

    public fun sharedKey(publicKey: PublicKeyEd25519): ByteArray

    public companion object : TlCodec by PrivateKeyEd25519TlConstructor {
        @JvmStatic
        public fun tlConstructor(): TlConstructor = PrivateKeyEd25519TlConstructor

        @JvmStatic
        public fun generate(random: Random = SecureRandom): PrivateKeyEd25519 =
            PrivateKeyEd25519Impl(random.nextBytes(32))

        @JvmStatic
        public fun of(byteArray: ByteArray): PrivateKeyEd25519 =
            when (byteArray.size) {
                Ed25519.KEY_SIZE_BYTES -> PrivateKeyEd25519Impl(byteArray.copyOf())
                Ed25519.KEY_SIZE_BYTES + Int.SIZE_BYTES -> decodeBoxed(byteArray)
                else -> throw IllegalArgumentException("Invalid key size: ${byteArray.size}")
            }
    }
}

@Polymorphic
@JsonClassDiscriminator("@type")
@SerialName("pk.ed25519")
@Serializable
private class PrivateKeyEd25519Impl(
    override val key: Bits256
) : PrivateKeyEd25519, Decryptor by DecryptorEd25519(key.toByteArray()) {
    constructor(key: ByteArray) : this(Bits256(key))

    private val _publicKey: PublicKeyEd25519 by lazy(LazyThreadSafetyMode.PUBLICATION) {
        PublicKeyEd25519(Ed25519.publicKey(key.toByteArray()))
    }

    override fun publicKey(): PublicKeyEd25519 = _publicKey

    override fun sharedKey(publicKey: PublicKeyEd25519): ByteArray =
        Ed25519.sharedKey(key.toByteArray(), publicKey.key.toByteArray())

    override fun toString(): String = toAdnlIdShort().toString()
}

private object PrivateKeyEd25519TlConstructor : TlConstructor(
    schema = "pk.ed25519 key:int256 = PrivateKey"
) {
    override fun encode(writer: TlWriter, value: PrivateKeyEd25519) {
        writer.writeBits256(value.key)
    }

    override fun decode(reader: TlReader): PrivateKeyEd25519 {
        val key = reader.readBits256()
        return PrivateKeyEd25519Impl(key)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy