From 0cf2f44ba698df11e7dbaa604d0a6e6518656874 Mon Sep 17 00:00:00 2001 From: andreypfau Date: Tue, 7 Oct 2025 11:07:09 +0900 Subject: [PATCH] New TL, migrate from old Private/Public keys to new `org.ton.kotlin.crypto` using new TL API Signed-off-by: andreypfau --- adnl/src/connection/AdnlConnection.kt | 13 +- block-tlb/build.gradle.kts | 2 +- .../src/wallet/HighLoadWalletV2Contract.kt | 2 +- contract/src/wallet/MessageText.kt | 8 +- contract/src/wallet/WalletContract.kt | 2 +- contract/src/wallet/WalletTransfer.kt | 6 +- contract/src/wallet/WalletV3Contract.kt | 20 +- contract/src/wallet/WalletV4R2Contract.kt | 4 +- contract/test/wallet/WalletV4Example.kt | 4 +- crypto/build.gradle.kts | 1 + crypto/src/commonMain/kotlin/Encryptor.kt | 1 + crypto/src/commonMain/kotlin/PrivateKey.kt | 18 +- crypto/src/commonMain/kotlin/PublicKey.kt | 21 +- .../commonMain/kotlin/SignatureVerifier.kt | 10 - crypto/src/commonMain/kotlin/Signer.kt | 17 -- .../commonMain/kotlin/{AesCtr.kt => aes.kt} | 52 ++++ crypto/src/commonMain/kotlin/ed25519.kt | 30 +- crypto/src/commonMain/kotlin/overlay.kt | 15 + crypto/src/commonMain/kotlin/unenc.kt | 28 ++ crypto/src/commonTest/kotlin/Ed25519Test.kt | 8 +- examples/src/ExtraCurrencyExample.kt | 2 +- examples/src/ExtraCurrencyMonitor.kt | 8 +- examples/src/WalletV4R2Example.kt | 6 +- examples/src/contract/BaseWalletContract.kt | 4 +- examples/src/contract/WalletV1R3Contract.kt | 2 +- examples/src/faucet/TestnetFaucet.kt | 2 +- liteapi-tl/src/LiteApiClient.kt | 2 +- .../src/liteserver/LiteServerAccountId.kt | 8 +- .../src/liteserver/LiteServerAccountState.kt | 2 +- .../src/liteserver/LiteServerAllShardsInfo.kt | 2 +- .../src/liteserver/LiteServerBlockData.kt | 2 +- .../src/liteserver/LiteServerBlockHeader.kt | 2 +- .../src/liteserver/LiteServerBlockLink.kt | 4 +- .../src/liteserver/LiteServerBlockLinkBack.kt | 2 +- .../liteserver/LiteServerBlockLinkForward.kt | 2 +- .../src/liteserver/LiteServerBlockState.kt | 2 +- .../liteserver/LiteServerBlockTransactions.kt | 2 +- .../src/liteserver/LiteServerConfigInfo.kt | 2 +- .../src/liteserver/LiteServerCurrentTime.kt | 6 +- .../liteserver/LiteServerDebugVerbosity.kt | 8 +- liteapi-tl/src/liteserver/LiteServerError.kt | 6 +- .../liteserver/LiteServerMasterchainInfo.kt | 2 +- .../LiteServerMasterchainInfoExt.kt | 2 +- .../liteserver/LiteServerPartialBlockProof.kt | 2 +- .../src/liteserver/LiteServerQueryPrefix.kt | 8 +- .../liteserver/LiteServerRunMethodResult.kt | 2 +- .../src/liteserver/LiteServerSendMsgStatus.kt | 6 +- .../src/liteserver/LiteServerShardInfo.kt | 2 +- .../src/liteserver/LiteServerSignature.kt | 2 +- .../src/liteserver/LiteServerSignatureSet.kt | 2 +- .../src/liteserver/LiteServerTransactionId.kt | 2 +- .../liteserver/LiteServerTransactionId3.kt | 2 +- .../liteserver/LiteServerTransactionInfo.kt | 2 +- .../liteserver/LiteServerTransactionList.kt | 2 +- .../liteserver/LiteServerValidatorStats.kt | 2 +- .../src/liteserver/LiteServerVersion.kt | 8 +- .../functions/LiteServerGetAccountState.kt | 2 +- .../functions/LiteServerGetAllShardsInfo.kt | 2 +- .../functions/LiteServerGetBlock.kt | 2 +- .../functions/LiteServerGetBlockHeader.kt | 2 +- .../functions/LiteServerGetBlockProof.kt | 2 +- .../functions/LiteServerGetConfigAll.kt | 2 +- .../functions/LiteServerGetConfigParams.kt | 2 +- .../functions/LiteServerGetMasterchainInfo.kt | 2 +- .../LiteServerGetMasterchainInfoExt.kt | 2 +- .../functions/LiteServerGetOneTransaction.kt | 2 +- .../functions/LiteServerGetShardInfo.kt | 2 +- .../functions/LiteServerGetState.kt | 2 +- .../liteserver/functions/LiteServerGetTime.kt | 2 +- .../functions/LiteServerGetTransactions.kt | 2 +- .../functions/LiteServerGetValidatorStats.kt | 2 +- .../functions/LiteServerGetVersion.kt | 2 +- .../LiteServerListBlockTransactions.kt | 2 +- .../functions/LiteServerLookupBlock.kt | 2 +- .../liteserver/functions/LiteServerQuery.kt | 2 +- .../functions/LiteServerRunSmcMethod.kt | 2 +- .../functions/LiteServerSendMessage.kt | 2 +- .../LiteServerWaitMasterchainSeqno.kt | 8 +- liteclient/test@jvm/Config.kt | 7 +- settings.gradle.kts | 1 + tl-legacy/build.gradle.kts | 16 ++ .../commonMain/kotlin/AbstractTlCombinator.kt | 3 +- .../kotlin/ByteStringBase64Serializer.kt | 3 +- .../src/commonMain/kotlin/TlCodec.kt | 5 +- .../src/commonMain/kotlin/TlCombinator.kt | 3 +- .../src/commonMain/kotlin/TlConstructor.kt | 3 +- .../src/commonMain/kotlin/TlDecoder.kt | 3 +- .../src/commonMain/kotlin/TlEncoder.kt | 4 +- .../src/commonMain/kotlin/TlReader.kt | 9 +- .../src/commonMain/kotlin/TlWriter.kt | 10 +- .../kotlin/constructors/BoolTlConstructor.kt | 6 +- .../kotlin/constructors/BytesTlConstructor.kt | 10 +- .../kotlin/constructors/EnumTlCombinator.kt | 5 +- .../src/commonMain/kotlin/deprecation.kt | 5 + tl/build.gradle.kts | 3 +- tl/src/commonMain/kotlin/TL.kt | 88 ++++++ tl/src/commonMain/kotlin/annotations.kt | 59 ++++ .../kotlin/internal/TlDecoderImpl.kt | 268 ++++++++++++++++++ .../kotlin/internal/TlEncoderImpl.kt | 188 ++++++++++++ tl/src/commonMain/kotlin/internal/TlMeta.kt | 56 ++++ tl/src/commonMain/kotlin/internal/TlReader.kt | 73 +++++ tl/src/commonMain/kotlin/internal/TlWriter.kt | 82 ++++++ .../serializers/ByteArrayBase64Serializer.kt | 32 +++ .../serializers/ByteStringBase64Serializer.kt | 35 +++ tonapi-tl/build.gradle.kts | 2 +- tonapi-tl/src/SignedTlObject.kt | 2 +- tonapi-tl/src/adnl/AdnlAddress.kt | 9 +- tonapi-tl/src/adnl/AdnlAddressList.kt | 2 +- tonapi-tl/src/adnl/AdnlIdShort.kt | 5 +- tonapi-tl/src/adnl/AdnlNode.kt | 9 +- tonapi-tl/src/adnl/AdnlNodes.kt | 2 +- tonapi-tl/src/adnl/AdnlPacketContents.kt | 15 +- tonapi-tl/src/adnl/AdnlPing.kt | 6 +- tonapi-tl/src/adnl/AdnlPong.kt | 6 +- tonapi-tl/src/adnl/AdnlProxy.kt | 2 +- tonapi-tl/src/adnl/AdnlProxyTo.kt | 8 +- tonapi-tl/src/adnl/AdnlProxyToSign.kt | 8 +- tonapi-tl/src/adnl/config/AdnlConfigGlobal.kt | 2 +- tonapi-tl/src/adnl/message/AdnlMessage.kt | 6 +- .../src/adnl/message/AdnlMessageAnswer.kt | 4 +- .../adnl/message/AdnlMessageConfirmChannel.kt | 8 +- .../adnl/message/AdnlMessageCreateChannel.kt | 8 +- .../src/adnl/message/AdnlMessageCustom.kt | 10 +- tonapi-tl/src/adnl/message/AdnlMessageNop.kt | 6 +- tonapi-tl/src/adnl/message/AdnlMessagePart.kt | 4 +- .../src/adnl/message/AdnlMessageQuery.kt | 10 +- .../src/adnl/message/AdnlMessageReinit.kt | 6 +- tonapi-tl/src/config/ConfigGlobal.kt | 2 +- tonapi-tl/src/config/ConfigLocal.kt | 27 -- tonapi-tl/src/control/ControlConfigLocal.kt | 20 -- tonapi-tl/src/dht/DhtKey.kt | 2 +- tonapi-tl/src/dht/DhtKeyDescription.kt | 14 +- tonapi-tl/src/dht/DhtMessage.kt | 2 +- tonapi-tl/src/dht/DhtNode.kt | 12 +- tonapi-tl/src/dht/DhtNodes.kt | 2 +- tonapi-tl/src/dht/DhtPong.kt | 2 +- tonapi-tl/src/dht/DhtStore.kt | 2 +- tonapi-tl/src/dht/DhtStored.kt | 2 +- tonapi-tl/src/dht/DhtUpdateRule.kt | 6 +- tonapi-tl/src/dht/DhtValue.kt | 2 +- tonapi-tl/src/dht/DhtValueResult.kt | 2 +- tonapi-tl/src/dht/config/DhtConfigGlobal.kt | 2 +- tonapi-tl/src/dht/config/DhtConfigIdLocal.kt | 2 +- tonapi-tl/src/dht/config/DhtConfigLocal.kt | 6 +- .../src/dht/config/DhtConfigRandomLocal.kt | 6 +- tonapi-tl/src/dht/db/DhtDbBucket.kt | 2 +- tonapi-tl/src/dht/db/DhtDbKey.kt | 2 +- tonapi-tl/src/dht/functions/DhtFindValue.kt | 2 +- tonapi-tl/src/dht/functions/DhtPing.kt | 2 +- tonapi-tl/src/dht/functions/DhtQuery.kt | 2 +- tonapi-tl/src/fec/FecRaptorQ.kt | 8 +- tonapi-tl/src/fec/FecType.kt | 4 +- tonapi-tl/src/http/HttpHeader.kt | 8 +- tonapi-tl/src/http/HttpPayloadPart.kt | 2 +- tonapi-tl/src/http/HttpResponse.kt | 2 +- .../http/functions/HttpGetNextPayloadPart.kt | 2 +- tonapi-tl/src/http/functions/HttpRequest.kt | 2 +- .../src/http/server/HttpServerDnsEntry.kt | 2 +- tonapi-tl/src/http/server/HttpServerHost.kt | 2 +- tonapi-tl/src/id/config/IdConfigLocal.kt | 15 - tonapi-tl/src/liteserver/LiteServerDesc.kt | 2 +- tonapi-tl/src/overlay/OverlayNode.kt | 21 +- tonapi-tl/src/overlay/OverlayNodeToSign.kt | 2 +- tonapi-tl/src/overlay/OverlayNodes.kt | 2 +- tonapi-tl/src/pk/aes.kt | 38 --- tonapi-tl/src/pk/ed25519.kt | 102 ------- tonapi-tl/src/pk/overlay.kt | 38 --- tonapi-tl/src/pk/pk.kt | 23 -- tonapi-tl/src/pk/unenc.kt | 37 --- tonapi-tl/src/pub/ed25519.kt | 86 ------ tonapi-tl/src/pub/pub.kt | 114 -------- tonapi-tl/src/rldp/RldpAnswer.kt | 2 +- tonapi-tl/src/rldp/RldpComplete.kt | 2 +- tonapi-tl/src/rldp/RldpConfirm.kt | 2 +- tonapi-tl/src/rldp/RldpMessage.kt | 4 +- tonapi-tl/src/rldp/RldpMessageData.kt | 2 +- tonapi-tl/src/rldp/RldpMessagePart.kt | 4 +- tonapi-tl/src/rldp/RldpMessagePartData.kt | 2 +- tonapi-tl/src/rldp/RldpQuery.kt | 2 +- tonapi-tl/src/tcp/TcpAuthentificate.kt | 8 +- .../src/tcp/TcpAuthentificationComplete.kt | 13 +- tonapi-tl/src/tcp/TcpAuthentificationNonce.kt | 2 +- tonapi-tl/src/tcp/TcpPing.kt | 8 +- tonapi-tl/src/tcp/TcpPong.kt | 8 +- tonapi-tl/src/tonnode/TonNodeBlockId.kt | 8 +- tonapi-tl/src/tonnode/TonNodeBlockIdExt.kt | 2 +- .../src/tonnode/TonNodeZeroStateIdExt.kt | 8 +- .../validator/config/ValidatorConfigGlobal.kt | 2 +- tonapi-tl/test/PrivateKeyTest.kt | 1 + 189 files changed, 1422 insertions(+), 844 deletions(-) delete mode 100644 crypto/src/commonMain/kotlin/SignatureVerifier.kt delete mode 100644 crypto/src/commonMain/kotlin/Signer.kt rename crypto/src/commonMain/kotlin/{AesCtr.kt => aes.kt} (68%) create mode 100644 crypto/src/commonMain/kotlin/overlay.kt create mode 100644 crypto/src/commonMain/kotlin/unenc.kt create mode 100644 tl-legacy/build.gradle.kts rename {tl => tl-legacy}/src/commonMain/kotlin/AbstractTlCombinator.kt (94%) rename {tl => tl-legacy}/src/commonMain/kotlin/ByteStringBase64Serializer.kt (94%) rename {tl => tl-legacy}/src/commonMain/kotlin/TlCodec.kt (82%) rename {tl => tl-legacy}/src/commonMain/kotlin/TlCombinator.kt (95%) rename {tl => tl-legacy}/src/commonMain/kotlin/TlConstructor.kt (96%) rename {tl => tl-legacy}/src/commonMain/kotlin/TlDecoder.kt (94%) rename {tl => tl-legacy}/src/commonMain/kotlin/TlEncoder.kt (92%) rename {tl => tl-legacy}/src/commonMain/kotlin/TlReader.kt (91%) rename {tl => tl-legacy}/src/commonMain/kotlin/TlWriter.kt (93%) rename {tl => tl-legacy}/src/commonMain/kotlin/constructors/BoolTlConstructor.kt (71%) rename {tl => tl-legacy}/src/commonMain/kotlin/constructors/BytesTlConstructor.kt (79%) rename {tl => tl-legacy}/src/commonMain/kotlin/constructors/EnumTlCombinator.kt (92%) create mode 100644 tl-legacy/src/commonMain/kotlin/deprecation.kt create mode 100644 tl/src/commonMain/kotlin/TL.kt create mode 100644 tl/src/commonMain/kotlin/annotations.kt create mode 100644 tl/src/commonMain/kotlin/internal/TlDecoderImpl.kt create mode 100644 tl/src/commonMain/kotlin/internal/TlEncoderImpl.kt create mode 100644 tl/src/commonMain/kotlin/internal/TlMeta.kt create mode 100644 tl/src/commonMain/kotlin/internal/TlReader.kt create mode 100644 tl/src/commonMain/kotlin/internal/TlWriter.kt create mode 100644 tl/src/commonMain/kotlin/serializers/ByteArrayBase64Serializer.kt create mode 100644 tl/src/commonMain/kotlin/serializers/ByteStringBase64Serializer.kt delete mode 100644 tonapi-tl/src/config/ConfigLocal.kt delete mode 100644 tonapi-tl/src/control/ControlConfigLocal.kt delete mode 100644 tonapi-tl/src/id/config/IdConfigLocal.kt delete mode 100644 tonapi-tl/src/pk/aes.kt delete mode 100644 tonapi-tl/src/pk/ed25519.kt delete mode 100644 tonapi-tl/src/pk/overlay.kt delete mode 100644 tonapi-tl/src/pk/pk.kt delete mode 100644 tonapi-tl/src/pk/unenc.kt delete mode 100644 tonapi-tl/src/pub/ed25519.kt delete mode 100644 tonapi-tl/src/pub/pub.kt diff --git a/adnl/src/connection/AdnlConnection.kt b/adnl/src/connection/AdnlConnection.kt index 2a2e45f9..21c1f7f4 100644 --- a/adnl/src/connection/AdnlConnection.kt +++ b/adnl/src/connection/AdnlConnection.kt @@ -10,10 +10,7 @@ import kotlinx.datetime.Clock import kotlinx.datetime.Instant import org.ton.adnl.network.TcpClient import org.ton.api.liteserver.LiteServerDesc -import org.ton.kotlin.crypto.AesCtr -import org.ton.kotlin.crypto.SecureRandom -import org.ton.kotlin.crypto.Sha256 -import org.ton.kotlin.crypto.sha256 +import org.ton.kotlin.crypto.* import kotlin.coroutines.CoroutineContext import kotlin.time.Duration import kotlin.time.Duration.Companion.ZERO @@ -54,6 +51,10 @@ public class AdnlConnection( request: AdnlRequestData, callContext: CoroutineContext ): AdnlResponseData { + val serverPublicKey = liteServerDesc.id + require(serverPublicKey is Encryptor) { + "Server public key is not supported for encryption: $serverPublicKey" + } val connection = connect() try { val nonce = SecureRandom.nextBytes(160) @@ -66,8 +67,8 @@ public class AdnlConnection( } connection.output.writePacket { - writeFully(liteServerDesc.id.toAdnlIdShort().id.toByteArray()) - writeFully(liteServerDesc.id.encryptToByteArray(nonce)) + writeFully(serverPublicKey.computeShortId().toByteArray()) + writeFully(serverPublicKey.encryptToByteArray(nonce)) } connection.output.flush() diff --git a/block-tlb/build.gradle.kts b/block-tlb/build.gradle.kts index 03064ef7..ca9a4174 100644 --- a/block-tlb/build.gradle.kts +++ b/block-tlb/build.gradle.kts @@ -9,7 +9,7 @@ kotlin { dependencies { api(projects.tonKotlinHashmapTlb) api(projects.tonKotlinTlb) - api(projects.tonKotlinTl) + api(projects.tonKotlinTlLegacy) implementation(libs.serialization.core) } } diff --git a/contract/src/wallet/HighLoadWalletV2Contract.kt b/contract/src/wallet/HighLoadWalletV2Contract.kt index 7d5b23dc..e4ca5c77 100644 --- a/contract/src/wallet/HighLoadWalletV2Contract.kt +++ b/contract/src/wallet/HighLoadWalletV2Contract.kt @@ -12,7 +12,7 @@ //import org.ton.crypto.encoding.base64 //import org.ton.hashmap.HashMapE //import org.ton.lite.api.LiteApi -//import org.ton.kotlin.tl.asByteString +//import org.ton.tl.asByteString //import org.ton.tlb.* //import org.ton.tlb.constructor.AnyTlbConstructor //import org.ton.tlb.providers.TlbConstructorProvider diff --git a/contract/src/wallet/MessageText.kt b/contract/src/wallet/MessageText.kt index 32686181..5a6409aa 100644 --- a/contract/src/wallet/MessageText.kt +++ b/contract/src/wallet/MessageText.kt @@ -2,11 +2,11 @@ package org.ton.contract.wallet import kotlinx.io.bytestring.ByteString import kotlinx.io.bytestring.decodeToString -import org.ton.api.pk.PrivateKey -import org.ton.api.pub.PublicKey import org.ton.cell.CellBuilder import org.ton.cell.CellSlice import org.ton.contract.CellStringTlbConstructor +import org.ton.kotlin.crypto.Encryptor +import org.ton.kotlin.crypto.PrivateKey import org.ton.tlb.TlbCombinator import org.ton.tlb.TlbConstructor import org.ton.tlb.loadTlb @@ -18,8 +18,8 @@ public sealed interface MessageText { public data class Raw( public val text: String ) : MessageText { - public fun encrypt(publicKey: PublicKey): Encrypted { - val encrypted = publicKey.encryptToByteArray(text.encodeToByteArray()) + public fun encrypt(encryptor: Encryptor): Encrypted { + val encrypted = encryptor.encryptToByteArray(text.encodeToByteArray()) return Encrypted(ByteString(*encrypted)) } diff --git a/contract/src/wallet/WalletContract.kt b/contract/src/wallet/WalletContract.kt index d8d519ed..4c4868c4 100644 --- a/contract/src/wallet/WalletContract.kt +++ b/contract/src/wallet/WalletContract.kt @@ -1,7 +1,7 @@ package org.ton.contract.wallet -import org.ton.api.pk.PrivateKeyEd25519 import org.ton.contract.SmartContract +import org.ton.kotlin.crypto.PrivateKeyEd25519 import kotlin.contracts.InvocationKind import kotlin.contracts.contract diff --git a/contract/src/wallet/WalletTransfer.kt b/contract/src/wallet/WalletTransfer.kt index de29e49a..f6c59517 100644 --- a/contract/src/wallet/WalletTransfer.kt +++ b/contract/src/wallet/WalletTransfer.kt @@ -1,8 +1,8 @@ package org.ton.contract.wallet -import org.ton.api.pub.PublicKey import org.ton.block.* import org.ton.cell.Cell +import org.ton.kotlin.crypto.Encryptor import org.ton.kotlin.message.MessageLayout import org.ton.tlb.CellRef import org.ton.tlb.constructor.AnyTlbConstructor @@ -109,8 +109,8 @@ public sealed interface MessageData { ) @JvmStatic - public fun encryptedText(publicKey: PublicKey, text: String): Text = Text( - MessageText.Raw(text).encrypt(publicKey) + public fun encryptedText(encryptor: Encryptor, text: String): Text = Text( + MessageText.Raw(text).encrypt(encryptor) ) } } diff --git a/contract/src/wallet/WalletV3Contract.kt b/contract/src/wallet/WalletV3Contract.kt index bc04c70a..aaa71a53 100644 --- a/contract/src/wallet/WalletV3Contract.kt +++ b/contract/src/wallet/WalletV3Contract.kt @@ -1,8 +1,6 @@ package org.ton.contract.wallet import kotlinx.io.bytestring.ByteString -import org.ton.api.pk.PrivateKeyEd25519 -import org.ton.api.pub.PublicKeyEd25519 import org.ton.bitstring.BitString import org.ton.block.* import org.ton.cell.Cell @@ -11,6 +9,8 @@ import org.ton.cell.CellSlice import org.ton.cell.buildCell import org.ton.contract.exception.AccountNotInitializedException import org.ton.contract.wallet.WalletContract.Companion.DEFAULT_WALLET_ID +import org.ton.kotlin.crypto.PrivateKeyEd25519 +import org.ton.kotlin.crypto.PublicKeyEd25519 import org.ton.lite.client.LiteClient import org.ton.tlb.CellRef import org.ton.tlb.TlbConstructor @@ -69,17 +69,17 @@ public class WalletV3R2Contract( public companion object : TlbConstructor( "wallet.v3r2.data seqno:uint32 sub_wallet_id:int32 public_key:bits256 = WalletV3R2Data" ) { - override fun loadTlb(cellSlice: CellSlice): WalletV3R2Data { - val seqno = cellSlice.loadUInt(32).toInt() - val subWalletId = cellSlice.loadUInt(32).toInt() - val publicKey = PublicKeyEd25519(ByteString(*cellSlice.loadBits(256).toByteArray())) + override fun loadTlb(slice: CellSlice): WalletV3R2Data { + val seqno = slice.loadUInt(32).toInt() + val subWalletId = slice.loadUInt(32).toInt() + val publicKey = PublicKeyEd25519(ByteString(*slice.loadBits(256).toByteArray())) return WalletV3R2Data(seqno, subWalletId, publicKey) } - override fun storeTlb(cellBuilder: CellBuilder, value: WalletV3R2Data) { - cellBuilder.storeUInt(value.seqno, 32) - cellBuilder.storeUInt(value.subWalletId, 32) - cellBuilder.storeBytes(value.publicKey.key.toByteArray()) + override fun storeTlb(builder: CellBuilder, value: WalletV3R2Data) { + builder.storeUInt(value.seqno, 32) + builder.storeUInt(value.subWalletId, 32) + builder.storeBytes(value.publicKey.key.toByteArray()) } } } diff --git a/contract/src/wallet/WalletV4R2Contract.kt b/contract/src/wallet/WalletV4R2Contract.kt index 178af1ee..8b31c465 100644 --- a/contract/src/wallet/WalletV4R2Contract.kt +++ b/contract/src/wallet/WalletV4R2Contract.kt @@ -1,8 +1,6 @@ package org.ton.contract.wallet import kotlinx.io.bytestring.ByteString -import org.ton.api.pk.PrivateKeyEd25519 -import org.ton.api.pub.PublicKeyEd25519 import org.ton.bitstring.BitString import org.ton.block.* import org.ton.boc.BagOfCells @@ -14,6 +12,8 @@ import org.ton.contract.exception.AccountNotInitializedException import org.ton.contract.wallet.WalletContract.Companion.DEFAULT_WALLET_ID import org.ton.hashmap.HashMapE import org.ton.kotlin.account.Account +import org.ton.kotlin.crypto.PrivateKeyEd25519 +import org.ton.kotlin.crypto.PublicKeyEd25519 import org.ton.lite.client.LiteClient import org.ton.tlb.CellRef import org.ton.tlb.TlbConstructor diff --git a/contract/test/wallet/WalletV4Example.kt b/contract/test/wallet/WalletV4Example.kt index c37011f5..68b06a9c 100644 --- a/contract/test/wallet/WalletV4Example.kt +++ b/contract/test/wallet/WalletV4Example.kt @@ -2,10 +2,10 @@ package org.ton.contract.wallet import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking -import org.ton.api.pk.PrivateKeyEd25519 import org.ton.block.AddrStd import org.ton.block.Coins import org.ton.kotlin.account.Account +import org.ton.kotlin.crypto.PrivateKeyEd25519 import org.ton.kotlin.crypto.sha256 import kotlin.test.Test @@ -34,7 +34,7 @@ class WalletV4Example { println("Account balance: $balance toncoins") contract.transfer(pk) { - coins = Coins.Companion.ofNano(100) // 100 nanoton + coins = Coins.ofNano(100) // 100 nanoton destination = AddrStd("kf8ZzXwnCm23GeqkK8ekU0Dxzu_fiXqIYO48FElkd7rVnoix") messageData = MessageData.text("Hello, World!") } diff --git a/crypto/build.gradle.kts b/crypto/build.gradle.kts index d53fd292..aa5dbf60 100644 --- a/crypto/build.gradle.kts +++ b/crypto/build.gradle.kts @@ -8,6 +8,7 @@ kotlin { commonMain { dependencies { api(libs.kotlinx.io.bytestring) + api(projects.tonKotlinTl) implementation(libs.serialization.core) } } diff --git a/crypto/src/commonMain/kotlin/Encryptor.kt b/crypto/src/commonMain/kotlin/Encryptor.kt index de15aafe..4bc111c1 100644 --- a/crypto/src/commonMain/kotlin/Encryptor.kt +++ b/crypto/src/commonMain/kotlin/Encryptor.kt @@ -32,6 +32,7 @@ public object EncryptorNone : Encryptor { startIndex: Int, endIndex: Int ) { + source.copyInto(destination, destinationOffset, startIndex, endIndex) } } diff --git a/crypto/src/commonMain/kotlin/PrivateKey.kt b/crypto/src/commonMain/kotlin/PrivateKey.kt index 5fa5afef..1b48ee3d 100644 --- a/crypto/src/commonMain/kotlin/PrivateKey.kt +++ b/crypto/src/commonMain/kotlin/PrivateKey.kt @@ -1,5 +1,21 @@ package org.ton.kotlin.crypto public sealed interface PrivateKey : Decryptor, Signer { - public val publicKey: PublicKey + public fun publicKey(): PublicKey +} + +public interface Signer { + public fun signToByteArray( + source: ByteArray, + startIndex: Int = 0, + endIndex: Int = source.size + ): ByteArray + + public fun signIntoByteArray( + source: ByteArray, + destination: ByteArray, + destinationOffset: Int = 0, + startIndex: Int = 0, + endIndex: Int = source.size + ) } diff --git a/crypto/src/commonMain/kotlin/PublicKey.kt b/crypto/src/commonMain/kotlin/PublicKey.kt index e57bdb36..1d630be6 100644 --- a/crypto/src/commonMain/kotlin/PublicKey.kt +++ b/crypto/src/commonMain/kotlin/PublicKey.kt @@ -1,3 +1,22 @@ package org.ton.kotlin.crypto -public sealed interface PublicKey : Encryptor, SignatureVerifier +import kotlinx.io.bytestring.ByteString +import kotlinx.serialization.Serializable +import org.ton.kotlin.tl.TL + +@Serializable +public sealed interface PublicKey { + public fun computeShortId(): ByteString { + val value = TL.Boxed.encodeToByteArray(serializer(), this) + return ByteString(*sha256(value)) + } +} + +public interface SignatureVerifier { + public fun verifySignature( + source: ByteArray, + signature: ByteArray, + startIndex: Int = 0, + endIndex: Int = source.size + ): Boolean +} diff --git a/crypto/src/commonMain/kotlin/SignatureVerifier.kt b/crypto/src/commonMain/kotlin/SignatureVerifier.kt deleted file mode 100644 index c1831820..00000000 --- a/crypto/src/commonMain/kotlin/SignatureVerifier.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.ton.kotlin.crypto - -public interface SignatureVerifier { - public fun verifySignature( - source: ByteArray, - signature: ByteArray, - startIndex: Int = 0, - endIndex: Int = source.size - ): Boolean -} diff --git a/crypto/src/commonMain/kotlin/Signer.kt b/crypto/src/commonMain/kotlin/Signer.kt deleted file mode 100644 index 019e01de..00000000 --- a/crypto/src/commonMain/kotlin/Signer.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.ton.kotlin.crypto - -public interface Signer { - public fun signToByteArray( - source: ByteArray, - startIndex: Int = 0, - endIndex: Int = source.size - ): ByteArray - - public fun signIntoByteArray( - source: ByteArray, - destination: ByteArray, - destinationOffset: Int = 0, - startIndex: Int = 0, - endIndex: Int = source.size - ) -} diff --git a/crypto/src/commonMain/kotlin/AesCtr.kt b/crypto/src/commonMain/kotlin/aes.kt similarity index 68% rename from crypto/src/commonMain/kotlin/AesCtr.kt rename to crypto/src/commonMain/kotlin/aes.kt index 6a76cced..cbd316a4 100644 --- a/crypto/src/commonMain/kotlin/AesCtr.kt +++ b/crypto/src/commonMain/kotlin/aes.kt @@ -1,5 +1,13 @@ package org.ton.kotlin.crypto +import kotlinx.io.bytestring.ByteString +import kotlinx.io.bytestring.toHexString +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.ton.kotlin.tl.Bits256 +import org.ton.kotlin.tl.TlConstructorId +import org.ton.kotlin.tl.serializers.ByteStringBase64Serializer + public expect class AesCtr : AutoCloseable { public constructor(key: ByteArray, iv: ByteArray) @@ -97,3 +105,47 @@ public class DecryptorAes( } } } + +@Serializable +@SerialName("pub.aes") +@TlConstructorId(0x2dbcadd4) +public class PublicKeyAes( + @Bits256 + @Serializable(ByteStringBase64Serializer::class) + private val key: ByteString +) : PublicKey, Encryptor { + private val encryptor by lazy { + EncryptorAes(key.toByteArray()) + } + + override fun encryptToByteArray( + source: ByteArray, + startIndex: Int, + endIndex: Int + ): ByteArray { + return encryptor.encryptToByteArray(source, startIndex, endIndex) + } + + override fun encryptIntoByteArray( + source: ByteArray, + destination: ByteArray, + destinationOffset: Int, + startIndex: Int, + endIndex: Int + ) { + encryptor.encryptIntoByteArray(source, destination, destinationOffset, startIndex, endIndex) + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is PublicKeyAes) return false + if (key != other.key) return false + return true + } + + override fun hashCode(): Int = key.hashCode() + + override fun toString(): String { + return "PublicKeyAes(key=${key.toHexString()})" + } +} diff --git a/crypto/src/commonMain/kotlin/ed25519.kt b/crypto/src/commonMain/kotlin/ed25519.kt index e95e00aa..8e995bfe 100644 --- a/crypto/src/commonMain/kotlin/ed25519.kt +++ b/crypto/src/commonMain/kotlin/ed25519.kt @@ -2,24 +2,37 @@ package org.ton.kotlin.crypto import kotlinx.io.bytestring.ByteString import kotlinx.io.bytestring.toHexString +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import org.ton.kotlin.crypto.curve25519.constants.tables.ED25519_BASEPOINT_TABLE import org.ton.kotlin.crypto.curve25519.edwards.CompressedEdwardsY import org.ton.kotlin.crypto.curve25519.edwards.EdwardsPoint import org.ton.kotlin.crypto.curve25519.internal.varTimeDoubleScalarBaseMul import org.ton.kotlin.crypto.curve25519.montgomery.MontgomeryPoint import org.ton.kotlin.crypto.curve25519.scalar.Scalar +import org.ton.kotlin.tl.Bits256 +import org.ton.kotlin.tl.TlConstructorId +import org.ton.kotlin.tl.serializers.ByteStringBase64Serializer import kotlin.random.Random public class PrivateKeyEd25519( public val key: ByteString ) : PrivateKey { - override val publicKey: PublicKeyEd25519 by lazy { + public constructor(key: ByteArray) : this(ByteString(key)) + + init { + check(key.size == 32) { "Invalid private key size, expected: 32, actual: ${key.size}" } + } + + private val publicKey: PublicKeyEd25519 by lazy { val scalar = Scalar.fromByteArray(clampedScalar()) val edwardsPoint = EdwardsPoint.mul(ED25519_BASEPOINT_TABLE, scalar) val compressedEdwardsY = CompressedEdwardsY(edwardsPoint) PublicKeyEd25519(ByteString(*compressedEdwardsY.data)) } + override fun publicKey(): PublicKeyEd25519 = publicKey + private val decryptor by lazy { DecryptorEd25519(this) } @@ -85,7 +98,7 @@ public class PrivateKeyEd25519( val s = Scalar() val hashRam = Sha512().use { it.update(rCompressed.data) - it.update(publicKey.key.toByteArray()) + it.update(publicKey().key.toByteArray()) it.update(source, startIndex, endIndex) it.digest() } @@ -118,10 +131,17 @@ public class PrivateKeyEd25519( } } +@Serializable +@SerialName("pub.ed25519") +@TlConstructorId(0x4813b4c6) public class PublicKeyEd25519( + @Serializable(ByteStringBase64Serializer::class) + @Bits256 public val key: ByteString -) : PublicKey { - private val encryptor = EncryptorEd25519(this) +) : PublicKey, Encryptor, SignatureVerifier { + private val encryptor by lazy { + EncryptorEd25519(this) + } override fun encryptToByteArray(source: ByteArray, startIndex: Int, endIndex: Int): ByteArray { return encryptor.encryptToByteArray(source, startIndex, endIndex) @@ -233,7 +253,7 @@ public class EncryptorEd25519( startIndex, endIndex ) - pk.publicKey.key.copyInto( + pk.publicKey().key.copyInto( destination, destinationOffset, startIndex = 0, diff --git a/crypto/src/commonMain/kotlin/overlay.kt b/crypto/src/commonMain/kotlin/overlay.kt new file mode 100644 index 00000000..509cbfbc --- /dev/null +++ b/crypto/src/commonMain/kotlin/overlay.kt @@ -0,0 +1,15 @@ +package org.ton.kotlin.crypto + +import kotlinx.io.bytestring.ByteString +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.ton.kotlin.tl.TlConstructorId +import org.ton.kotlin.tl.serializers.ByteStringBase64Serializer + +@Serializable +@SerialName("pub.overlay") +@TlConstructorId(0x34ba45cb) +public data class PublicKeyOverlay( + @Serializable(ByteStringBase64Serializer::class) + val name: ByteString +) : PublicKey diff --git a/crypto/src/commonMain/kotlin/unenc.kt b/crypto/src/commonMain/kotlin/unenc.kt new file mode 100644 index 00000000..51f66240 --- /dev/null +++ b/crypto/src/commonMain/kotlin/unenc.kt @@ -0,0 +1,28 @@ +package org.ton.kotlin.crypto + +import kotlinx.io.bytestring.ByteString +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.ton.kotlin.tl.TlConstructorId +import org.ton.kotlin.tl.serializers.ByteStringBase64Serializer + +@Serializable +@SerialName("pub.unenc") +@TlConstructorId(0xb61f450a) +public class PublicKeyUnencrypted( + @Serializable(ByteStringBase64Serializer::class) + public val data: ByteString +) : PublicKey, Encryptor by EncryptorNone, SignatureVerifier { + override fun verifySignature( + source: ByteArray, + signature: ByteArray, + startIndex: Int, + endIndex: Int + ): Boolean { + return true + } + + init { + require(data.size == 32) + } +} diff --git a/crypto/src/commonTest/kotlin/Ed25519Test.kt b/crypto/src/commonTest/kotlin/Ed25519Test.kt index 648e3761..310cf9e0 100644 --- a/crypto/src/commonTest/kotlin/Ed25519Test.kt +++ b/crypto/src/commonTest/kotlin/Ed25519Test.kt @@ -12,7 +12,7 @@ open class Ed25519Test { val privateKey = PrivateKeyEd25519.random() val message = "test message".encodeToByteArray() val signature = privateKey.signToByteArray(message) - val publicKey = privateKey.publicKey + val publicKey = privateKey.publicKey() assertTrue(publicKey.verifySignature(message, signature)) val wrongMessage = "wrong message".encodeToByteArray() assertFalse(publicKey.verifySignature(wrongMessage, signature)) @@ -21,10 +21,10 @@ open class Ed25519Test { @Test fun sharedKey() { val alicePrivate = PrivateKeyEd25519.random() - val alicePublic = alicePrivate.publicKey + val alicePublic = alicePrivate.publicKey() val bobPrivate = PrivateKeyEd25519.random() - val bobPublic = bobPrivate.publicKey + val bobPublic = bobPrivate.publicKey() val aliceShared = alicePrivate.computeSharedSecret(bobPublic) val bobShared = bobPrivate.computeSharedSecret(alicePublic) @@ -53,7 +53,7 @@ open class Ed25519Test { val sig2 = priv.signToByteArray(msg) assertContentEquals(sig, sig2) - val pubKey2 = priv.publicKey.key.toByteArray() + val pubKey2 = priv.publicKey().key.toByteArray() assertContentEquals(pubKey, pubKey2) assertContentEquals(goldenData.privateBytes.copyOf(32), priv.key.toByteArray()) diff --git a/examples/src/ExtraCurrencyExample.kt b/examples/src/ExtraCurrencyExample.kt index 5b742cc4..d8520441 100644 --- a/examples/src/ExtraCurrencyExample.kt +++ b/examples/src/ExtraCurrencyExample.kt @@ -1,10 +1,10 @@ package org.ton.kotlin.examples -import org.ton.api.pk.PrivateKeyEd25519 import org.ton.block.AddrStd import org.ton.block.Coins import org.ton.block.CurrencyCollection import org.ton.contract.wallet.WalletTransfer +import org.ton.kotlin.crypto.PrivateKeyEd25519 import org.ton.kotlin.currency.VarUInt248 import org.ton.kotlin.examples.contract.WalletV1R3Contract import org.ton.kotlin.examples.faucet.TestnetFaucet diff --git a/examples/src/ExtraCurrencyMonitor.kt b/examples/src/ExtraCurrencyMonitor.kt index e9c2c3de..3633ab19 100644 --- a/examples/src/ExtraCurrencyMonitor.kt +++ b/examples/src/ExtraCurrencyMonitor.kt @@ -3,12 +3,12 @@ package org.ton.kotlin.examples import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.io.bytestring.ByteString -import org.ton.api.pk.PrivateKeyEd25519 import org.ton.block.* import org.ton.contract.wallet.MessageData import org.ton.contract.wallet.WalletTransfer import org.ton.kotlin.account.Account import org.ton.kotlin.account.balance +import org.ton.kotlin.crypto.PrivateKeyEd25519 import org.ton.kotlin.currency.VarUInt248 import org.ton.kotlin.examples.contract.WalletV1R3Contract import org.ton.kotlin.examples.faucet.TestnetFaucet @@ -23,8 +23,8 @@ private val swapAddress = AddrStd("kQC_rkxBuZDwS81yvMSLzeXBNLCGFNofm0avwlMfNXCwo private val faucet = TestnetFaucet(provider) suspend fun main(): Unit = coroutineScope { - val key1 = PrivateKeyEd25519() - val key2 = PrivateKeyEd25519() + val key1 = PrivateKeyEd25519.random() + val key2 = PrivateKeyEd25519.random() var (wallet1, state1) = deployWallet(key1) val (wallet2, _) = deployWallet(key2) println("requesting from $swapAddress ECHIDNA...") @@ -93,4 +93,4 @@ suspend fun deployWallet(key: PrivateKeyEd25519): Pair(CONFIG_RAW) + classDiscriminator = "@type" +} + +val CONFIG = json.decodeFromString(CONFIG_RAW) diff --git a/settings.gradle.kts b/settings.gradle.kts index 2b36281f..8afe2376 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -31,6 +31,7 @@ dependencyResolutionManagement { submodule("crypto") submodule("bitstring") submodule("tl") +submodule("tl-legacy") submodule("bigint") submodule("tvm") submodule("tlb") diff --git a/tl-legacy/build.gradle.kts b/tl-legacy/build.gradle.kts new file mode 100644 index 00000000..74d28afc --- /dev/null +++ b/tl-legacy/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("multiplatform") + id("publish") +} + +kotlin { + sourceSets { + commonMain { + dependencies { + api(projects.tonKotlinCrypto) + api(libs.serialization.json) + api(libs.kotlinx.io.core) + } + } + } +} diff --git a/tl/src/commonMain/kotlin/AbstractTlCombinator.kt b/tl-legacy/src/commonMain/kotlin/AbstractTlCombinator.kt similarity index 94% rename from tl/src/commonMain/kotlin/AbstractTlCombinator.kt rename to tl-legacy/src/commonMain/kotlin/AbstractTlCombinator.kt index 114267ec..6293b616 100644 --- a/tl/src/commonMain/kotlin/AbstractTlCombinator.kt +++ b/tl-legacy/src/commonMain/kotlin/AbstractTlCombinator.kt @@ -1,7 +1,8 @@ -package org.ton.kotlin.tl +package org.ton.tl import kotlin.reflect.KClass +@Deprecated(DEPRECATION_MESSAGE) public abstract class AbstractTlCombinator : TlCodec { public abstract val baseClass: KClass diff --git a/tl/src/commonMain/kotlin/ByteStringBase64Serializer.kt b/tl-legacy/src/commonMain/kotlin/ByteStringBase64Serializer.kt similarity index 94% rename from tl/src/commonMain/kotlin/ByteStringBase64Serializer.kt rename to tl-legacy/src/commonMain/kotlin/ByteStringBase64Serializer.kt index 5ab5d853..1474c924 100644 --- a/tl/src/commonMain/kotlin/ByteStringBase64Serializer.kt +++ b/tl-legacy/src/commonMain/kotlin/ByteStringBase64Serializer.kt @@ -1,4 +1,4 @@ -package org.ton.kotlin.tl +package org.ton.tl import kotlinx.io.bytestring.ByteString import kotlinx.io.bytestring.decodeToByteString @@ -11,6 +11,7 @@ import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlin.io.encoding.Base64 +@Deprecated(DEPRECATION_MESSAGE) public object ByteStringBase64Serializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ByteString", PrimitiveKind.STRING) diff --git a/tl/src/commonMain/kotlin/TlCodec.kt b/tl-legacy/src/commonMain/kotlin/TlCodec.kt similarity index 82% rename from tl/src/commonMain/kotlin/TlCodec.kt rename to tl-legacy/src/commonMain/kotlin/TlCodec.kt index 987c13c7..39908189 100644 --- a/tl/src/commonMain/kotlin/TlCodec.kt +++ b/tl-legacy/src/commonMain/kotlin/TlCodec.kt @@ -1,7 +1,9 @@ -package org.ton.kotlin.tl +package org.ton.tl +@Deprecated(DEPRECATION_MESSAGE) public interface TlCodec : TlDecoder, TlEncoder +@Deprecated(DEPRECATION_MESSAGE) public interface TlObject where T : TlObject { public fun tlCodec(): TlCodec @@ -15,6 +17,7 @@ public interface TlObject where T : TlObject { } } +@Deprecated(DEPRECATION_MESSAGE) public interface TLFunction { public fun tlCodec(): TlCodec public fun resultTlCodec(): TlCodec diff --git a/tl/src/commonMain/kotlin/TlCombinator.kt b/tl-legacy/src/commonMain/kotlin/TlCombinator.kt similarity index 95% rename from tl/src/commonMain/kotlin/TlCombinator.kt rename to tl-legacy/src/commonMain/kotlin/TlCombinator.kt index 4eebf332..e3519a32 100644 --- a/tl/src/commonMain/kotlin/TlCombinator.kt +++ b/tl-legacy/src/commonMain/kotlin/TlCombinator.kt @@ -1,7 +1,8 @@ -package org.ton.kotlin.tl +package org.ton.tl import kotlin.reflect.KClass +@Deprecated(DEPRECATION_MESSAGE) public abstract class TlCombinator private constructor( override val baseClass: KClass, constructors: List, TlConstructor>> diff --git a/tl/src/commonMain/kotlin/TlConstructor.kt b/tl-legacy/src/commonMain/kotlin/TlConstructor.kt similarity index 96% rename from tl/src/commonMain/kotlin/TlConstructor.kt rename to tl-legacy/src/commonMain/kotlin/TlConstructor.kt index 4c58ec3a..d2cc4deb 100644 --- a/tl/src/commonMain/kotlin/TlConstructor.kt +++ b/tl-legacy/src/commonMain/kotlin/TlConstructor.kt @@ -1,7 +1,8 @@ -package org.ton.kotlin.tl +package org.ton.tl import org.ton.kotlin.crypto.crc32 +@Deprecated(DEPRECATION_MESSAGE) public abstract class TlConstructor( schema: String, id: Int? = null, diff --git a/tl/src/commonMain/kotlin/TlDecoder.kt b/tl-legacy/src/commonMain/kotlin/TlDecoder.kt similarity index 94% rename from tl/src/commonMain/kotlin/TlDecoder.kt rename to tl-legacy/src/commonMain/kotlin/TlDecoder.kt index c332eae4..d9227df8 100644 --- a/tl/src/commonMain/kotlin/TlDecoder.kt +++ b/tl-legacy/src/commonMain/kotlin/TlDecoder.kt @@ -1,10 +1,11 @@ -package org.ton.kotlin.tl +package org.ton.tl import kotlinx.io.Buffer import kotlinx.io.Source import kotlinx.io.bytestring.ByteString import kotlinx.io.write +@Deprecated(DEPRECATION_MESSAGE) public interface TlDecoder { public fun decode(byteArray: ByteArray): T = decode(Buffer().also { it.write(byteArray) diff --git a/tl/src/commonMain/kotlin/TlEncoder.kt b/tl-legacy/src/commonMain/kotlin/TlEncoder.kt similarity index 92% rename from tl/src/commonMain/kotlin/TlEncoder.kt rename to tl-legacy/src/commonMain/kotlin/TlEncoder.kt index b7e74dea..b5d7a3ea 100644 --- a/tl/src/commonMain/kotlin/TlEncoder.kt +++ b/tl-legacy/src/commonMain/kotlin/TlEncoder.kt @@ -1,4 +1,4 @@ -package org.ton.kotlin.tl +package org.ton.tl import kotlinx.io.Buffer import kotlinx.io.Sink @@ -6,6 +6,7 @@ import kotlinx.io.bytestring.ByteString import kotlinx.io.readByteArray import org.ton.kotlin.crypto.sha256 +@Deprecated(DEPRECATION_MESSAGE) public interface TlEncoder { public fun encode(sink: Sink, value: T): Unit = encode(TlWriter(sink), value) public fun encode(writer: TlWriter, value: T) @@ -25,5 +26,6 @@ public interface TlEncoder { sha256(encodeToByteArray(value)) } +@Deprecated(DEPRECATION_MESSAGE) @Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE") internal inline fun TlEncoder<*>.cast(): TlEncoder = this as TlEncoder diff --git a/tl/src/commonMain/kotlin/TlReader.kt b/tl-legacy/src/commonMain/kotlin/TlReader.kt similarity index 91% rename from tl/src/commonMain/kotlin/TlReader.kt rename to tl-legacy/src/commonMain/kotlin/TlReader.kt index f5907824..0efde805 100644 --- a/tl/src/commonMain/kotlin/TlReader.kt +++ b/tl-legacy/src/commonMain/kotlin/TlReader.kt @@ -1,9 +1,10 @@ -package org.ton.kotlin.tl +package org.ton.tl import kotlinx.io.* import kotlinx.io.bytestring.ByteString -import org.ton.kotlin.tl.constructors.BoolTlCombinator +import org.ton.tl.constructors.BoolTlCombinator +@Deprecated(DEPRECATION_MESSAGE) public class TlReader( public val input: Source ) { @@ -61,11 +62,15 @@ public class TlReader( } } +@Deprecated(DEPRECATION_MESSAGE) public inline operator fun TlReader.invoke(block: TlReader.() -> R): R = block() +@Deprecated(DEPRECATION_MESSAGE) public inline fun TlReader.read(codec: TlCodec): T = codec.decode(this) +@Deprecated(DEPRECATION_MESSAGE) public inline fun TlReader.readNullable(flag: Int, index: Int, block: TlReader.() -> E): E? = readNullable(flag and (1 shl index) != 0, block) +@Deprecated(DEPRECATION_MESSAGE) public inline fun TlReader.readNullable(check: Boolean, block: TlReader.() -> E): E? = if (check) block() else null diff --git a/tl/src/commonMain/kotlin/TlWriter.kt b/tl-legacy/src/commonMain/kotlin/TlWriter.kt similarity index 93% rename from tl/src/commonMain/kotlin/TlWriter.kt rename to tl-legacy/src/commonMain/kotlin/TlWriter.kt index 924f61a8..45525a89 100644 --- a/tl/src/commonMain/kotlin/TlWriter.kt +++ b/tl-legacy/src/commonMain/kotlin/TlWriter.kt @@ -1,10 +1,11 @@ -package org.ton.kotlin.tl +package org.ton.tl import kotlinx.io.* import kotlinx.io.bytestring.ByteString -import org.ton.kotlin.tl.constructors.Bool -import org.ton.kotlin.tl.constructors.BoolTlCombinator +import org.ton.tl.constructors.Bool +import org.ton.tl.constructors.BoolTlCombinator +@Deprecated(DEPRECATION_MESSAGE) public class TlWriter( public val output: Sink ) { @@ -89,14 +90,17 @@ public class TlWriter( } } +@Deprecated(DEPRECATION_MESSAGE) public inline fun TlWriter.write(codec: TlCodec, value: T) { codec.encode(this, value) } +@Deprecated(DEPRECATION_MESSAGE) public inline fun TlWriter.writeNullable(flag: Int, index: Int, value: T?, block: TlWriter.(T) -> Unit) { writeNullable(flag and (1 shl index) != 0, value, block) } +@Deprecated(DEPRECATION_MESSAGE) public inline fun TlWriter.writeNullable(flag: Boolean, value: T?, block: TlWriter.(T) -> Unit) { if (flag) { if (value != null) { diff --git a/tl/src/commonMain/kotlin/constructors/BoolTlConstructor.kt b/tl-legacy/src/commonMain/kotlin/constructors/BoolTlConstructor.kt similarity index 71% rename from tl/src/commonMain/kotlin/constructors/BoolTlConstructor.kt rename to tl-legacy/src/commonMain/kotlin/constructors/BoolTlConstructor.kt index 99e2699a..4d98a535 100644 --- a/tl/src/commonMain/kotlin/constructors/BoolTlConstructor.kt +++ b/tl-legacy/src/commonMain/kotlin/constructors/BoolTlConstructor.kt @@ -1,5 +1,8 @@ -package org.ton.kotlin.tl.constructors +package org.ton.tl.constructors +import org.ton.tl.DEPRECATION_MESSAGE + +@Deprecated(DEPRECATION_MESSAGE) internal enum class Bool(val value: Boolean) { TRUE(true), FALSE(false); @@ -9,6 +12,7 @@ internal enum class Bool(val value: Boolean) { } } +@Deprecated(DEPRECATION_MESSAGE) internal object BoolTlCombinator : EnumTlCombinator( Bool::class, Bool.TRUE to "boolTrue = Bool", diff --git a/tl/src/commonMain/kotlin/constructors/BytesTlConstructor.kt b/tl-legacy/src/commonMain/kotlin/constructors/BytesTlConstructor.kt similarity index 79% rename from tl/src/commonMain/kotlin/constructors/BytesTlConstructor.kt rename to tl-legacy/src/commonMain/kotlin/constructors/BytesTlConstructor.kt index 34edc287..9454cf64 100644 --- a/tl/src/commonMain/kotlin/constructors/BytesTlConstructor.kt +++ b/tl-legacy/src/commonMain/kotlin/constructors/BytesTlConstructor.kt @@ -1,12 +1,14 @@ @file:Suppress("OPT_IN_USAGE") -package org.ton.kotlin.tl.constructors +package org.ton.tl.constructors import kotlinx.io.bytestring.ByteString -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.DEPRECATION_MESSAGE +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter +@Deprecated(DEPRECATION_MESSAGE) public object BytesTlConstructor : TlConstructor( schema = "bytes data:string = Bytes" ) { diff --git a/tl/src/commonMain/kotlin/constructors/EnumTlCombinator.kt b/tl-legacy/src/commonMain/kotlin/constructors/EnumTlCombinator.kt similarity index 92% rename from tl/src/commonMain/kotlin/constructors/EnumTlCombinator.kt rename to tl-legacy/src/commonMain/kotlin/constructors/EnumTlCombinator.kt index 7bf8340f..aa0789d1 100644 --- a/tl/src/commonMain/kotlin/constructors/EnumTlCombinator.kt +++ b/tl-legacy/src/commonMain/kotlin/constructors/EnumTlCombinator.kt @@ -1,8 +1,9 @@ -package org.ton.kotlin.tl.constructors +package org.ton.tl.constructors -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.reflect.KClass +@Deprecated(DEPRECATION_MESSAGE) public open class EnumTlCombinator>( override val baseClass: KClass, values: List> diff --git a/tl-legacy/src/commonMain/kotlin/deprecation.kt b/tl-legacy/src/commonMain/kotlin/deprecation.kt new file mode 100644 index 00000000..3f565180 --- /dev/null +++ b/tl-legacy/src/commonMain/kotlin/deprecation.kt @@ -0,0 +1,5 @@ +package org.ton.tl + +internal const val DEPRECATION_MESSAGE = + "TL implementation using TlConstructor/TlCombinator from `org.ton.tl` package is deprecated, " + + "use kotlinx-serialization based implementation from `org.ton.kotlin.tl` package instead" diff --git a/tl/build.gradle.kts b/tl/build.gradle.kts index 74d28afc..e3b07a6e 100644 --- a/tl/build.gradle.kts +++ b/tl/build.gradle.kts @@ -5,9 +5,10 @@ plugins { kotlin { sourceSets { + applyDefaultHierarchyTemplate() + commonMain { dependencies { - api(projects.tonKotlinCrypto) api(libs.serialization.json) api(libs.kotlinx.io.core) } diff --git a/tl/src/commonMain/kotlin/TL.kt b/tl/src/commonMain/kotlin/TL.kt new file mode 100644 index 00000000..918fd09f --- /dev/null +++ b/tl/src/commonMain/kotlin/TL.kt @@ -0,0 +1,88 @@ +@file:OptIn(ExperimentalSerializationApi::class, ExperimentalUnsignedTypes::class) + +package org.ton.kotlin.tl + +import kotlinx.io.* +import kotlinx.io.bytestring.ByteString +import kotlinx.serialization.* +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.modules.EmptySerializersModule +import kotlinx.serialization.modules.SerializersModule +import org.ton.kotlin.tl.internal.SinkTlWriter +import org.ton.kotlin.tl.internal.SourceTlReader +import org.ton.kotlin.tl.internal.TlDecoderImpl +import org.ton.kotlin.tl.internal.TlEncoderImpl + +internal const val TL_BOOL_TRUE = 0x997275b5.toInt() +internal const val TL_BOOL_FALSE = 0xbc799737.toInt() + +public open class TL( + override val serializersModule: SerializersModule = EmptySerializersModule(), + public val boxed: Boolean = true +) : BinaryFormat { + override fun encodeToByteArray( + serializer: SerializationStrategy, + value: T + ): ByteArray { + val buffer = Buffer() + encodeIntoSink(serializer, value, buffer) + return buffer.readByteArray() + } + + override fun decodeFromByteArray( + deserializer: DeserializationStrategy, + bytes: ByteArray + ): T { + val buffer = Buffer() + buffer.write(bytes) + return decodeFromSource(deserializer, buffer) + } + + public fun encodeToByteString(serializer: SerializationStrategy, value: T): ByteString { + val buffer = Buffer() + encodeIntoSink(serializer, value, buffer) + return buffer.readByteString() + } + + public fun decodeFromByteString( + deserializer: DeserializationStrategy, + byteString: ByteString + ): T { + val buffer = Buffer() + buffer.write(byteString) + return decodeFromSource(deserializer, buffer) + } + + public inline fun decodeFromByteString(byteString: ByteString): T = + decodeFromByteString(serializer(), byteString) + + public inline fun encodeToByteString(value: T): ByteString = encodeToByteString(serializer(), value) + + public fun decodeFromSource( + deserializer: DeserializationStrategy, + source: Source + ): T { + val decoder = TlDecoderImpl(this, SourceTlReader(source)) + return decoder.decodeSerializableValue(deserializer) + } + + public fun encodeIntoSink(serializer: SerializationStrategy, value: T, sink: Sink) { + val encoder = TlEncoderImpl(this, SinkTlWriter(sink)) + encoder.encodeSerializableValue(serializer, value) + } + + public companion object : TL() + + public object Boxed : TL(boxed = true) +} + +public interface TlDecoder : Decoder { + public val tl: TL + + public fun decodeByteArray(size: Int): ByteArray +} + +public interface TlEncoder : Encoder { + public val tl: TL +} diff --git a/tl/src/commonMain/kotlin/annotations.kt b/tl/src/commonMain/kotlin/annotations.kt new file mode 100644 index 00000000..fcf89dd2 --- /dev/null +++ b/tl/src/commonMain/kotlin/annotations.kt @@ -0,0 +1,59 @@ +@file:Suppress("OPT_IN_USAGE") + +package org.ton.kotlin.tl + +import kotlinx.serialization.InternalSerializationApi +import kotlinx.serialization.SerialInfo +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.internal.AbstractPolymorphicSerializer + +@SerialInfo +@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) +public annotation class TlConstructorId( + val id: Long +) + +@SerialInfo +@Target(AnnotationTarget.PROPERTY) +public annotation class TlConditional( + val field: String, + val mask: Int +) + +@SerialInfo +@Target(AnnotationTarget.PROPERTY) +public annotation class Bits128 + +@SerialInfo +@Target(AnnotationTarget.PROPERTY) +public annotation class Bits256 + +@SerialInfo +@Target(AnnotationTarget.PROPERTY) +public annotation class TlFixedSize( + val value: Int = -1, +) + +internal fun SerialDescriptor.getTlConstructorId(): Int { + for (i in annotations.indices) { + val annotation = annotations[i] + if (annotation is TlConstructorId) { + return annotation.id.toInt() + } + } + error("No TLConstructorId annotation found for $serialName") +} + +// TODO: use caching inside TL +@OptIn(InternalSerializationApi::class) +internal fun AbstractPolymorphicSerializer<*>.constructorIdToSerialName(tl: TL): Map { + val variantsDescriptor = descriptor.getElementDescriptor(1) + val variantsCount = variantsDescriptor.elementsCount + val result = HashMap(variantsCount, 1.0f) + for (variantIndex in 0 until variantsCount) { + val variantDescriptor = variantsDescriptor.getElementDescriptor(variantIndex) + val constructorId = variantDescriptor.getTlConstructorId() + result[constructorId] = variantDescriptor.serialName + } + return result +} diff --git a/tl/src/commonMain/kotlin/internal/TlDecoderImpl.kt b/tl/src/commonMain/kotlin/internal/TlDecoderImpl.kt new file mode 100644 index 00000000..6e6d2c7d --- /dev/null +++ b/tl/src/commonMain/kotlin/internal/TlDecoderImpl.kt @@ -0,0 +1,268 @@ +package org.ton.kotlin.tl.internal + +import kotlinx.serialization.* +import kotlinx.serialization.builtins.ByteArraySerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.CompositeDecoder +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.internal.AbstractPolymorphicSerializer +import kotlinx.serialization.modules.SerializersModule +import org.ton.kotlin.tl.* + + +internal open class TlDecoderImpl( + override val tl: TL, + val reader: TlReader +) : TlDecoder { + override val serializersModule: SerializersModule get() = tl.serializersModule + + @ExperimentalSerializationApi + override fun decodeNotNullMark(): Boolean = true + + @ExperimentalSerializationApi + override fun decodeNull(): Nothing? = null + + override fun decodeBoolean(): Boolean = reader.readBoolean() + override fun decodeByte(): Byte = reader.readByte() + override fun decodeShort(): Short = reader.readShort() + override fun decodeChar(): Char = reader.readChar() + override fun decodeInt(): Int = reader.readInt() + override fun decodeLong(): Long = reader.readLong() + override fun decodeFloat(): Float = reader.readFloat() + override fun decodeDouble(): Double = reader.readDouble() + override fun decodeString(): String = reader.readString() + override fun decodeByteArray(size: Int): ByteArray = reader.readByteArray(size) + + + override fun decodeEnum(enumDescriptor: SerialDescriptor): Int { + TODO("Not yet implemented") + } + + override fun decodeInline(descriptor: SerialDescriptor): Decoder = this + + @OptIn(InternalSerializationApi::class) + override fun decodeSerializableValue(deserializer: DeserializationStrategy): T { + if (tl.boxed && deserializer !is AbstractPolymorphicSerializer<*>) { + val constructorId = decodeInt() + val annotations = deserializer.descriptor.annotations + for (i in annotations.indices) { + val annotation = annotations[i] + if (annotation is TlConstructorId) { + if (annotation.id.toInt() != constructorId) { + throw SerializationException("Unexpected constructor id 0x${constructorId.toHexString()} ($constructorId) for ${deserializer.descriptor.serialName}") + } + break + } + } + } + if (deserializer !is AbstractPolymorphicSerializer<*>) { + return super.decodeSerializableValue(deserializer) + } + val constructorId = decodeInt() + val constructor2name = deserializer.constructorIdToSerialName(tl) + val typeName = constructor2name[constructorId] + ?: error("Unknown constructor id 0x${constructorId.toHexString()}($constructorId) for ${deserializer.descriptor.serialName}") + + @Suppress("UNCHECKED_CAST") + val decoder = TlStructureDecoder(tl, reader, deserializer.descriptor) + val actualSerializer = deserializer.findPolymorphicSerializer(decoder, typeName) + as DeserializationStrategy + return actualSerializer.deserialize(decoder) + } + + override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder { + return TlStructureDecoder(tl, reader, descriptor) + } +} + +internal class TlStructureDecoder( + tl: TL, + reader: TlReader, + val descriptor: SerialDescriptor, + var exactSize: Int = -1 +) : TlDecoderImpl(tl, reader), CompositeDecoder { + private val intValues = Array(descriptor.elementsCount) { 0 } + + private var index = 0 + + override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder { + return TlStructureDecoder(tl, reader, descriptor, exactSize) + } + + override fun endStructure(descriptor: SerialDescriptor) { + } + + @ExperimentalSerializationApi + override fun decodeSequentially(): Boolean { + return true // Sequential decoding is assumed for TL structures + } + + override fun decodeCollectionSize(descriptor: SerialDescriptor): Int = reader.readInt() + + override fun decodeElementIndex(descriptor: SerialDescriptor): Int { + val elementIndex = index++ + if (elementIndex >= descriptor.elementsCount) { + return CompositeDecoder.DECODE_DONE + } + return elementIndex + } + + override fun decodeBooleanElement( + descriptor: SerialDescriptor, + index: Int + ): Boolean { + val value = reader.readBoolean() + if (value) { + intValues[index] = 1.inv() + } else { + intValues[index] = 0 + } + return value + } + + override fun decodeByteElement( + descriptor: SerialDescriptor, + index: Int + ): Byte { + val value = reader.readByte() + intValues[index] = value.toInt() + return value + } + + override fun decodeCharElement( + descriptor: SerialDescriptor, + index: Int + ): Char { + val value = reader.readChar() + intValues[index] = value.code + return value + } + + override fun decodeShortElement( + descriptor: SerialDescriptor, + index: Int + ): Short { + val value = reader.readShort() + intValues[index] = value.toInt() + return value + } + + override fun decodeIntElement( + descriptor: SerialDescriptor, + index: Int + ): Int { + val value = reader.readInt() + intValues[index] = value + return value + } + + override fun decodeLongElement( + descriptor: SerialDescriptor, + index: Int + ): Long { + val value = reader.readLong() + intValues[index] = value.toInt() // Assuming we want to store the int representation + return value + } + + override fun decodeFloatElement( + descriptor: SerialDescriptor, + index: Int + ): Float = decodeFloat() + + override fun decodeDoubleElement( + descriptor: SerialDescriptor, + index: Int + ): Double = decodeDouble() + + override fun decodeStringElement( + descriptor: SerialDescriptor, + index: Int + ): String = decodeString() + + override fun decodeInlineElement( + descriptor: SerialDescriptor, + index: Int + ): Decoder = decodeInline(descriptor.getElementDescriptor(index)) + + override fun decodeSerializableElement( + descriptor: SerialDescriptor, + index: Int, + deserializer: DeserializationStrategy, + previousValue: T? + ): T { + try { + for (annotation in descriptor.getElementAnnotations(index)) { + if (annotation is Bits128) { + exactSize = 16 + break + } else if (annotation is Bits256) { + exactSize = 32 + break + } else if (annotation is TlFixedSize) { + exactSize = annotation.value + break + } + } + return decodeSerializableValue(deserializer) + } catch (e: Exception) { + throw SerializationException( + "Error decoding element at index $index in ${descriptor.serialName}: ${descriptor.getElementName(index)}", + e + ) + } finally { + exactSize = -1 // Reset exactSize after reading + } + } + + @ExperimentalSerializationApi + override fun decodeNullableSerializableElement( + descriptor: SerialDescriptor, + index: Int, + deserializer: DeserializationStrategy, + previousValue: T? + ): T? { + for (annotation in descriptor.getElementAnnotations(index)) { + if (annotation is TlConditional) { + val flagFieldIndex = descriptor.getElementIndex(annotation.field) + if (flagFieldIndex == CompositeDecoder.UNKNOWN_NAME) { + throw MissingFieldException(annotation.field, descriptor.serialName) + } + val flag = intValues[flagFieldIndex] + return if (flag and annotation.mask != 0) { + decodeSerializableValue(deserializer) + } else { + null + } + } + } + return null + } + + @OptIn(InternalSerializationApi::class) + override fun decodeSerializableValue(deserializer: DeserializationStrategy): T { + if (deserializer.descriptor == ByteArraySerializer().descriptor) { + if (exactSize > 0) { + val byteArray = reader.readByteArray(exactSize) + exactSize = -1 // Reset exactSize after reading + @Suppress("UNCHECKED_CAST") + return byteArray as T + } else { + @Suppress("UNCHECKED_CAST") + return reader.readByteArray() as T + } + } + if (deserializer !is AbstractPolymorphicSerializer<*>) { + return deserializer.deserialize(this) + } + val constructorId = decodeInt() + val constructor2name = deserializer.constructorIdToSerialName(tl) + val typeName = constructor2name[constructorId] + ?: error("Unknown constructor id 0x${constructorId.toHexString()} ($constructorId) for ${deserializer.descriptor.serialName}") + + @Suppress("UNCHECKED_CAST") + val actualSerializer = deserializer.findPolymorphicSerializer(this, typeName) + as DeserializationStrategy + return actualSerializer.deserialize(this) + } +} diff --git a/tl/src/commonMain/kotlin/internal/TlEncoderImpl.kt b/tl/src/commonMain/kotlin/internal/TlEncoderImpl.kt new file mode 100644 index 00000000..a9d4c0a3 --- /dev/null +++ b/tl/src/commonMain/kotlin/internal/TlEncoderImpl.kt @@ -0,0 +1,188 @@ +package org.ton.kotlin.tl.internal + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.InternalSerializationApi +import kotlinx.serialization.SerializationStrategy +import kotlinx.serialization.builtins.ByteArraySerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.CompositeEncoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.internal.AbstractPolymorphicSerializer +import kotlinx.serialization.modules.SerializersModule +import org.ton.kotlin.tl.* + +internal open class TlEncoderImpl( + override val tl: TL, + val writer: TlWriter, +) : TlEncoder { + override val serializersModule: SerializersModule get() = tl.serializersModule + + @ExperimentalSerializationApi + override fun encodeNull() { + } + + override fun encodeBoolean(value: Boolean) = writer.writeBoolean(value) + override fun encodeByte(value: Byte) = writer.writeByte(value) + override fun encodeChar(value: Char) = writer.writeChar(value) + override fun encodeShort(value: Short) = writer.writeShort(value) + override fun encodeInt(value: Int) = writer.writeInt(value) + override fun encodeLong(value: Long) = writer.writeLong(value) + override fun encodeFloat(value: Float) = writer.writeFloat(value) + override fun encodeDouble(value: Double) = writer.writeDouble(value) + override fun encodeInline(descriptor: SerialDescriptor): Encoder = this + override fun encodeString(value: String) = writer.writeString(value) + + override fun beginStructure(descriptor: SerialDescriptor): CompositeEncoder { + return TlCompositeEncoder(tl, writer) + } + + override fun encodeEnum(enumDescriptor: SerialDescriptor, index: Int) { + TODO() + } + + override fun beginCollection(descriptor: SerialDescriptor, collectionSize: Int): CompositeEncoder { + writer.writeInt(collectionSize) + return beginStructure(descriptor) + } + + @OptIn(InternalSerializationApi::class) + override fun encodeSerializableValue(serializer: SerializationStrategy, value: T) { + if (serializer !is AbstractPolymorphicSerializer) { + if (tl.boxed) { + encodeInt(serializer.descriptor.getTlConstructorId()) + } + return serializer.serialize(this, value) + } + val actualSerializer = serializer.findPolymorphicSerializerOrNull(this, value) + ?: error("No polymorphic serializer found for value: $value") + val constructorId = actualSerializer.descriptor.getTlConstructorId() + encodeInt(constructorId) + actualSerializer.serialize(this, value) + } + + open class TlCompositeEncoder( + tl: TL, + writer: TlWriter, + var fixedSize: Int = -1, + ) : TlEncoderImpl(tl, writer), CompositeEncoder { + override fun beginStructure(descriptor: SerialDescriptor): CompositeEncoder { + return TlCompositeEncoder(tl, writer, fixedSize) + } + + override fun endStructure(descriptor: SerialDescriptor) { + } + + override fun encodeBooleanElement( + descriptor: SerialDescriptor, + index: Int, + value: Boolean + ) = encodeBoolean(value) + + override fun encodeByteElement( + descriptor: SerialDescriptor, + index: Int, + value: Byte + ) = encodeByte(value) + + override fun encodeShortElement( + descriptor: SerialDescriptor, + index: Int, + value: Short + ) = encodeShort(value) + + override fun encodeCharElement( + descriptor: SerialDescriptor, + index: Int, + value: Char + ) = encodeChar(value) + + override fun encodeIntElement( + descriptor: SerialDescriptor, + index: Int, + value: Int + ) = encodeInt(value) + + override fun encodeLongElement( + descriptor: SerialDescriptor, + index: Int, + value: Long + ) = encodeLong(value) + + override fun encodeFloatElement( + descriptor: SerialDescriptor, + index: Int, + value: Float + ) = encodeFloat(value) + + override fun encodeDoubleElement( + descriptor: SerialDescriptor, + index: Int, + value: Double + ) = encodeDouble(value) + + override fun encodeStringElement( + descriptor: SerialDescriptor, + index: Int, + value: String + ) = encodeString(value) + + override fun encodeInlineElement( + descriptor: SerialDescriptor, + index: Int + ): Encoder = encodeInline(descriptor) + + @OptIn(InternalSerializationApi::class) + override fun encodeSerializableValue(serializer: SerializationStrategy, value: T) { + if (serializer.descriptor == ByteArraySerializer().descriptor) { + return if (fixedSize > 0) { + writer.writeByteArray(value as ByteArray, 0, fixedSize) + fixedSize = -1 // Reset fixedSize after writing + } else { + writer.writeByteArray(value as ByteArray) + } + } + if (serializer !is AbstractPolymorphicSerializer) { + return serializer.serialize(this, value) + } + val actualSerializer = serializer.findPolymorphicSerializerOrNull(this, value) + ?: error("No polymorphic serializer found for value: $value") + val constructorId = actualSerializer.descriptor.getTlConstructorId() + encodeInt(constructorId) + actualSerializer.serialize(this, value) + } + + @OptIn(InternalSerializationApi::class) + override fun encodeSerializableElement( + descriptor: SerialDescriptor, + index: Int, + serializer: SerializationStrategy, + value: T + ) { + try { + for (annotation in descriptor.getElementAnnotations(index)) { + if (annotation is Bits128) { + fixedSize = 16 + break + } else if (annotation is Bits256) { + fixedSize = 32 + break + } else if (annotation is TlFixedSize) { + fixedSize = annotation.value + break + } + } + encodeSerializableValue(serializer, value) + } finally { + fixedSize = -1 + } + } + + @ExperimentalSerializationApi + override fun encodeNullableSerializableElement( + descriptor: SerialDescriptor, + index: Int, + serializer: SerializationStrategy, + value: T? + ) = encodeNullableSerializableValue(serializer, value) + } +} diff --git a/tl/src/commonMain/kotlin/internal/TlMeta.kt b/tl/src/commonMain/kotlin/internal/TlMeta.kt new file mode 100644 index 00000000..05942263 --- /dev/null +++ b/tl/src/commonMain/kotlin/internal/TlMeta.kt @@ -0,0 +1,56 @@ +package org.ton.kotlin.tl.internal + +import kotlinx.serialization.SerializationException +import kotlinx.serialization.descriptors.SerialDescriptor +import org.ton.kotlin.tl.Bits128 +import org.ton.kotlin.tl.Bits256 +import org.ton.kotlin.tl.TlConditional + +internal data class TlMeta( + val index: Int, + val name: String, + val isBits128: Boolean = false, + val isBits256: Boolean = false, + val conditional: TlConditional? = null, +) + +internal fun SerialDescriptor.getTlMeta(index: Int): TlMeta { + var isBits128 = false + var isBits256 = false + var conditional: TlConditional? = null + for (annotation in getElementAnnotations(index)) { + when (annotation) { + is TlConditional -> { + if (conditional != null) { + multipleAnnotationsError(index, serialName, "TlConditional") + } + conditional = annotation + } + + is Bits128 -> { + if (isBits128) { + multipleAnnotationsError(index, serialName, "Bits128") + } + isBits128 = true + } + + is Bits256 -> { + if (isBits256) { + multipleAnnotationsError(index, serialName, "Bits267") + } + isBits256 = true + } + } + } + return TlMeta( + index = index, + name = getElementName(index), + isBits128 = isBits128, + isBits256 = isBits256, + conditional = conditional + ) +} + +private fun multipleAnnotationsError(index: Int, serialName: String, annotationType: String): Nothing { + throw SerializationException("Multiple $annotationType annotations found for element $index in $serialName") +} diff --git a/tl/src/commonMain/kotlin/internal/TlReader.kt b/tl/src/commonMain/kotlin/internal/TlReader.kt new file mode 100644 index 00000000..e923194d --- /dev/null +++ b/tl/src/commonMain/kotlin/internal/TlReader.kt @@ -0,0 +1,73 @@ +package org.ton.kotlin.tl.internal + +import kotlinx.io.* +import org.ton.kotlin.tl.TL_BOOL_FALSE +import org.ton.kotlin.tl.TL_BOOL_TRUE + +internal interface TlReader { + fun readBoolean(): Boolean + fun readInt(): Int + fun readByte(): Byte + fun readShort(): Short + fun readChar(): Char + fun readLong(): Long + fun readDouble(): Double + fun readFloat(): Float + fun readString(): String + fun readByteArray(byteCount: Int): ByteArray + fun readByteArray(): ByteArray +} + +internal class SourceTlReader( + private val input: Source +) : TlReader { + override fun readBoolean(): Boolean { + return when (val value = input.readIntLe()) { + TL_BOOL_TRUE -> true + TL_BOOL_FALSE -> false + else -> throw IllegalStateException("Expected ${TL_BOOL_TRUE.toHexString()}($TL_BOOL_TRUE) or ${TL_BOOL_FALSE.toHexString()}($TL_BOOL_FALSE), got ${value.toHexString()}($value)") + } + } + + override fun readInt(): Int = input.readIntLe() + override fun readByte(): Byte = input.readIntLe().toByte() + override fun readShort(): Short = input.readIntLe().toShort() + override fun readChar(): Char = input.readIntLe().toChar() + override fun readLong(): Long = input.readLongLe() + + override fun readDouble(): Double = Double.fromBits(input.readLongLe()) + + override fun readFloat(): Float = Float.fromBits(input.readIntLe()) + + override fun readString(): String = readByteArray().decodeToString() + + override fun readByteArray(byteCount: Int): ByteArray = input.readByteArray(byteCount) + + override fun readByteArray(): ByteArray { + val firstByte = input.readUByte().toInt() + val size: Int + val lenBytes: Int + if (firstByte < 254) { + size = firstByte + lenBytes = 1 + } else { + size = input.readUByte().toInt() or + (input.readUByte().toInt() shl 8) or + (input.readUByte().toInt() shl 16) + lenBytes = 4 + } + + val result = try { + input.readByteArray(size) + } catch (e: Exception) { + throw IllegalStateException( + "Failed to read ByteArray of size $size, at: |${ + input.peek().readByteArray().toHexString() + }", e + ) + } + val paddingBytes = -(lenBytes + size) and 3 + input.skip(paddingBytes.toLong()) + return result + } +} diff --git a/tl/src/commonMain/kotlin/internal/TlWriter.kt b/tl/src/commonMain/kotlin/internal/TlWriter.kt new file mode 100644 index 00000000..2eb90547 --- /dev/null +++ b/tl/src/commonMain/kotlin/internal/TlWriter.kt @@ -0,0 +1,82 @@ +package org.ton.kotlin.tl.internal + +import kotlinx.io.Sink +import kotlinx.io.writeIntLe +import kotlinx.io.writeLongLe +import kotlinx.io.writeUByte +import org.ton.kotlin.tl.TL_BOOL_FALSE +import org.ton.kotlin.tl.TL_BOOL_TRUE + +internal interface TlWriter { + fun writeBoolean(value: Boolean) + fun writeInt(value: Int) + fun writeByte(value: Byte) + fun writeShort(value: Short) + fun writeChar(value: Char) + fun writeLong(value: Long) + fun writeDouble(value: Double) + fun writeFloat(value: Float) + fun writeString(value: String) + fun writeByteArray(byteArray: ByteArray) + fun writeByteArray(byteArray: ByteArray, offset: Int, length: Int) +} + +internal class SinkTlWriter( + private val sink: Sink +) : TlWriter { + override fun writeBoolean(value: Boolean) { + sink.writeIntLe(if (value) TL_BOOL_TRUE else TL_BOOL_FALSE) + } + + override fun writeInt(value: Int) = sink.writeIntLe(value) + + override fun writeByte(value: Byte) = sink.writeIntLe(value.toInt()) + + override fun writeShort(value: Short) = sink.writeIntLe(value.toInt()) + + override fun writeChar(value: Char) = sink.writeIntLe(value.code) + + override fun writeLong(value: Long) = sink.writeLongLe(value) + + override fun writeDouble(value: Double) = sink.writeLongLe(value.toBits()) + + override fun writeFloat(value: Float) = sink.writeIntLe(value.toBits()) + + override fun writeString(value: String) = writeByteArray(value.encodeToByteArray()) + + override fun writeByteArray(byteArray: ByteArray) { + val collectionSize = byteArray.size + val lenBytes = if (collectionSize < 254) { + sink.writeUByte(collectionSize.toUByte()) + 1 + } else if (collectionSize < (1 shl 24)) { + sink.writeUByte(254u) + sink.writeUByte((collectionSize and 255).toUByte()) + sink.writeUByte(((collectionSize shr 8) and 255).toUByte()) + sink.writeUByte((collectionSize shr 16).toUByte()) + 4 + } else if (collectionSize < Int.MAX_VALUE) { + sink.writeUByte(255u) + sink.writeUByte((collectionSize and 255).toUByte()) + sink.writeUByte(((collectionSize shr 8) and 255).toUByte()) + sink.writeUByte(((collectionSize shr 16) and 255).toUByte()) + sink.writeUByte(((collectionSize shr 24) and 255).toUByte()) + sink.writeByte(0) + sink.writeByte(0) + sink.writeByte(0) + 8 + } else { + error("Too big byte array: $collectionSize") + } + // (4 - ((lenBytes + collectionSize) % 4)) % 4 + val paddingBytes = -(lenBytes + collectionSize) and 3 + sink.write(byteArray, 0, collectionSize) + for (i in 0 until paddingBytes) { + sink.writeByte(0) + } + } + + override fun writeByteArray(byteArray: ByteArray, offset: Int, length: Int) { + sink.write(byteArray, offset, length) + } +} diff --git a/tl/src/commonMain/kotlin/serializers/ByteArrayBase64Serializer.kt b/tl/src/commonMain/kotlin/serializers/ByteArrayBase64Serializer.kt new file mode 100644 index 00000000..604a8ebf --- /dev/null +++ b/tl/src/commonMain/kotlin/serializers/ByteArrayBase64Serializer.kt @@ -0,0 +1,32 @@ +package org.ton.kotlin.tl.serializers + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ByteArraySerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonEncoder +import kotlin.io.encoding.Base64 + +public object ByteArrayBase64Serializer : KSerializer { + private val byteArraySerializer = ByteArraySerializer() + + override val descriptor: SerialDescriptor = byteArraySerializer.descriptor + + override fun serialize(encoder: Encoder, value: ByteArray) { + if (encoder is JsonEncoder) { + encoder.encodeString(Base64.encode(value)) + } else { + encoder.encodeSerializableValue(byteArraySerializer, value) + } + } + + override fun deserialize(decoder: Decoder): ByteArray { + return if (decoder is JsonDecoder) { + Base64.decode(decoder.decodeString()) + } else { + decoder.decodeSerializableValue(byteArraySerializer) + } + } +} diff --git a/tl/src/commonMain/kotlin/serializers/ByteStringBase64Serializer.kt b/tl/src/commonMain/kotlin/serializers/ByteStringBase64Serializer.kt new file mode 100644 index 00000000..c536598e --- /dev/null +++ b/tl/src/commonMain/kotlin/serializers/ByteStringBase64Serializer.kt @@ -0,0 +1,35 @@ +package org.ton.kotlin.tl.serializers + +import kotlinx.io.bytestring.ByteString +import kotlinx.io.bytestring.decodeToByteString +import kotlinx.io.bytestring.encode +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ByteArraySerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonEncoder +import kotlin.io.encoding.Base64 + +public object ByteStringBase64Serializer : KSerializer { + private val byteArraySerializer = ByteArraySerializer() + override val descriptor: SerialDescriptor = + SerialDescriptor("ByteString", byteArraySerializer.descriptor) + + override fun serialize(encoder: Encoder, value: ByteString) { + if (encoder is JsonEncoder) { + encoder.encodeString(Base64.encode(value)) + } else { + encoder.encodeSerializableValue(byteArraySerializer, value.toByteArray()) + } + } + + override fun deserialize(decoder: Decoder): ByteString { + return if (decoder is JsonDecoder) { + return Base64.decodeToByteString(decoder.decodeString()) + } else { + ByteString(*decoder.decodeSerializableValue(byteArraySerializer)) + } + } +} diff --git a/tonapi-tl/build.gradle.kts b/tonapi-tl/build.gradle.kts index 3ea2dec9..e4dc95a7 100644 --- a/tonapi-tl/build.gradle.kts +++ b/tonapi-tl/build.gradle.kts @@ -8,7 +8,7 @@ kotlin { commonMain { dependencies { api(projects.tonKotlinBigint) - api(projects.tonKotlinTl) + api(projects.tonKotlinTlLegacy) api(projects.tonKotlinBitstring) api(projects.tonKotlinTlb) api(libs.datetime) diff --git a/tonapi-tl/src/SignedTlObject.kt b/tonapi-tl/src/SignedTlObject.kt index 10bb23f4..54f4a2c1 100644 --- a/tonapi-tl/src/SignedTlObject.kt +++ b/tonapi-tl/src/SignedTlObject.kt @@ -3,7 +3,7 @@ package org.ton.api import kotlinx.io.bytestring.ByteString import org.ton.kotlin.crypto.SignatureVerifier import org.ton.kotlin.crypto.Signer -import org.ton.kotlin.tl.TlObject +import org.ton.tl.TlObject public interface SignedTlObject> : TlObject { public val signature: ByteString? diff --git a/tonapi-tl/src/adnl/AdnlAddress.kt b/tonapi-tl/src/adnl/AdnlAddress.kt index 4a12a258..536fb7be 100644 --- a/tonapi-tl/src/adnl/AdnlAddress.kt +++ b/tonapi-tl/src/adnl/AdnlAddress.kt @@ -8,8 +8,9 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.api.pub.PublicKey -import org.ton.kotlin.tl.* +import org.ton.kotlin.crypto.PublicKey +import org.ton.kotlin.tl.TL +import org.ton.tl.* import kotlin.jvm.JvmName @Polymorphic @@ -100,12 +101,12 @@ public data class AdnlAddressTunnel( ) { override fun encode(writer: TlWriter, value: AdnlAddressTunnel) { writer.writeRaw(value.to) - writer.write(PublicKey, value.pubKey) + TL.Boxed.encodeIntoSink(PublicKey.serializer(), value.pubKey, writer.output) } override fun decode(reader: TlReader): AdnlAddressTunnel { val to = reader.readByteString(32) - val pubKey = reader.read(PublicKey) + val pubKey = TL.Boxed.decodeFromSource(PublicKey.serializer(), reader.input) return AdnlAddressTunnel(to, pubKey) } } diff --git a/tonapi-tl/src/adnl/AdnlAddressList.kt b/tonapi-tl/src/adnl/AdnlAddressList.kt index aba5c0fc..60845688 100644 --- a/tonapi-tl/src/adnl/AdnlAddressList.kt +++ b/tonapi-tl/src/adnl/AdnlAddressList.kt @@ -2,7 +2,7 @@ package org.ton.api.adnl import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/adnl/AdnlIdShort.kt b/tonapi-tl/src/adnl/AdnlIdShort.kt index 7e8a3d94..2e8731d2 100644 --- a/tonapi-tl/src/adnl/AdnlIdShort.kt +++ b/tonapi-tl/src/adnl/AdnlIdShort.kt @@ -3,13 +3,12 @@ package org.ton.api.adnl import kotlinx.io.bytestring.ByteString -import kotlinx.io.bytestring.isEmpty import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.overlay.OverlayNode import org.ton.api.overlay.OverlayNodeToSign import org.ton.kotlin.crypto.SignatureVerifier -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmStatic @Serializable @@ -21,7 +20,7 @@ public data class AdnlIdShort( public fun verify(node: OverlayNode): Boolean { if (node.overlay != id) return false val key = node.id - val peerId = key.toAdnlIdShort() + val peerId = AdnlIdShort(key.computeShortId()) val nodeToSign = OverlayNodeToSign( id = peerId, overlay = node.overlay, diff --git a/tonapi-tl/src/adnl/AdnlNode.kt b/tonapi-tl/src/adnl/AdnlNode.kt index a0f5998b..aed61d88 100644 --- a/tonapi-tl/src/adnl/AdnlNode.kt +++ b/tonapi-tl/src/adnl/AdnlNode.kt @@ -2,8 +2,9 @@ package org.ton.api.adnl import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.api.pub.PublicKey -import org.ton.kotlin.tl.* +import org.ton.kotlin.crypto.PublicKey +import org.ton.kotlin.tl.TL +import org.ton.tl.* import kotlin.jvm.JvmName @Serializable @@ -20,12 +21,12 @@ public data class AdnlNode( schema = "adnl.node id:PublicKey addr_list:adnl.addressList = adnl.Node" ) { override fun encode(writer: TlWriter, value: AdnlNode) { - writer.write(PublicKey, value.id) + TL.Boxed.encodeIntoSink(PublicKey.serializer(), value.id, writer.output) writer.write(AdnlAddressList, value.addrList) } override fun decode(reader: TlReader): AdnlNode { - val id = reader.read(PublicKey) + val id = TL.Boxed.decodeFromSource(PublicKey.serializer(), reader.input) val addrList = reader.read(AdnlAddressList) return AdnlNode(id, addrList) } diff --git a/tonapi-tl/src/adnl/AdnlNodes.kt b/tonapi-tl/src/adnl/AdnlNodes.kt index 3101efbd..1b4438fc 100644 --- a/tonapi-tl/src/adnl/AdnlNodes.kt +++ b/tonapi-tl/src/adnl/AdnlNodes.kt @@ -2,7 +2,7 @@ package org.ton.api.adnl import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/adnl/AdnlPacketContents.kt b/tonapi-tl/src/adnl/AdnlPacketContents.kt index 93e0abba..35db3db4 100644 --- a/tonapi-tl/src/adnl/AdnlPacketContents.kt +++ b/tonapi-tl/src/adnl/AdnlPacketContents.kt @@ -5,10 +5,11 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.SignedTlObject import org.ton.api.adnl.message.AdnlMessage -import org.ton.api.pub.PublicKey +import org.ton.kotlin.crypto.PublicKey import org.ton.kotlin.crypto.SignatureVerifier import org.ton.kotlin.crypto.Signer -import org.ton.kotlin.tl.* +import org.ton.kotlin.tl.TL +import org.ton.tl.* import kotlin.jvm.JvmName import kotlin.random.Random @@ -133,7 +134,7 @@ public data class AdnlPacketContents( if (message != null && messages != null) { throw IllegalArgumentException("both fields `message` and `messages` set") } - if (from != null && fromShort != null && from.toAdnlIdShort() != fromShort) { + if (from != null && fromShort != null && from.computeShortId() != fromShort.id) { throw IllegalArgumentException("`from` and `from_short` mismatch") } // if (address != null && address.addrs.isEmpty()) { @@ -296,7 +297,9 @@ private object AdnlPacketContentsTlConstructor : TlConstructor diff --git a/tonapi-tl/src/adnl/AdnlPing.kt b/tonapi-tl/src/adnl/AdnlPing.kt index c0f9295e..359e8655 100644 --- a/tonapi-tl/src/adnl/AdnlPing.kt +++ b/tonapi-tl/src/adnl/AdnlPing.kt @@ -2,9 +2,9 @@ package org.ton.api.adnl import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/adnl/AdnlPong.kt b/tonapi-tl/src/adnl/AdnlPong.kt index 0e4c2f4e..b98a2c9c 100644 --- a/tonapi-tl/src/adnl/AdnlPong.kt +++ b/tonapi-tl/src/adnl/AdnlPong.kt @@ -2,9 +2,9 @@ package org.ton.api.adnl import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/adnl/AdnlProxy.kt b/tonapi-tl/src/adnl/AdnlProxy.kt index 66effa55..e12bd494 100644 --- a/tonapi-tl/src/adnl/AdnlProxy.kt +++ b/tonapi-tl/src/adnl/AdnlProxy.kt @@ -6,7 +6,7 @@ import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @JsonClassDiscriminator("@type") diff --git a/tonapi-tl/src/adnl/AdnlProxyTo.kt b/tonapi-tl/src/adnl/AdnlProxyTo.kt index 8f148867..703adc8f 100644 --- a/tonapi-tl/src/adnl/AdnlProxyTo.kt +++ b/tonapi-tl/src/adnl/AdnlProxyTo.kt @@ -3,10 +3,10 @@ package org.ton.api.adnl import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.ByteStringBase64Serializer +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/adnl/AdnlProxyToSign.kt b/tonapi-tl/src/adnl/AdnlProxyToSign.kt index 53c6d63e..be87d952 100644 --- a/tonapi-tl/src/adnl/AdnlProxyToSign.kt +++ b/tonapi-tl/src/adnl/AdnlProxyToSign.kt @@ -3,10 +3,10 @@ package org.ton.api.adnl import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.ByteStringBase64Serializer +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/adnl/config/AdnlConfigGlobal.kt b/tonapi-tl/src/adnl/config/AdnlConfigGlobal.kt index 55ba6b7c..8e83e08c 100644 --- a/tonapi-tl/src/adnl/config/AdnlConfigGlobal.kt +++ b/tonapi-tl/src/adnl/config/AdnlConfigGlobal.kt @@ -3,7 +3,7 @@ package org.ton.api.adnl.config import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.adnl.AdnlNodes -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @SerialName("adnl.config.global") diff --git a/tonapi-tl/src/adnl/message/AdnlMessage.kt b/tonapi-tl/src/adnl/message/AdnlMessage.kt index ea66981b..24bc23d2 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessage.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessage.kt @@ -5,9 +5,9 @@ package org.ton.api.adnl.message import kotlinx.serialization.Polymorphic import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.kotlin.tl.TlCodec -import org.ton.kotlin.tl.TlCombinator -import org.ton.kotlin.tl.TlObject +import org.ton.tl.TlCodec +import org.ton.tl.TlCombinator +import org.ton.tl.TlObject @Polymorphic @Serializable diff --git a/tonapi-tl/src/adnl/message/AdnlMessageAnswer.kt b/tonapi-tl/src/adnl/message/AdnlMessageAnswer.kt index 9178f6a6..0afab25d 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessageAnswer.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessageAnswer.kt @@ -3,8 +3,8 @@ package org.ton.api.adnl.message import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* -import org.ton.kotlin.tl.constructors.BytesTlConstructor +import org.ton.tl.* +import org.ton.tl.constructors.BytesTlConstructor import kotlin.jvm.JvmName @SerialName("adnl.message.answer") diff --git a/tonapi-tl/src/adnl/message/AdnlMessageConfirmChannel.kt b/tonapi-tl/src/adnl/message/AdnlMessageConfirmChannel.kt index 5de5fbb2..0f977392 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessageConfirmChannel.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessageConfirmChannel.kt @@ -5,10 +5,10 @@ package org.ton.api.adnl.message import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.ByteStringBase64Serializer +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter import kotlin.jvm.JvmName @SerialName("adnl.message.confirmChannel") diff --git a/tonapi-tl/src/adnl/message/AdnlMessageCreateChannel.kt b/tonapi-tl/src/adnl/message/AdnlMessageCreateChannel.kt index ad371989..9d8eadf1 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessageCreateChannel.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessageCreateChannel.kt @@ -3,10 +3,10 @@ package org.ton.api.adnl.message import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.ByteStringBase64Serializer +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter import kotlin.jvm.JvmName @SerialName("adnl.message.createChannel") diff --git a/tonapi-tl/src/adnl/message/AdnlMessageCustom.kt b/tonapi-tl/src/adnl/message/AdnlMessageCustom.kt index 58617b31..58a3aacb 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessageCustom.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessageCustom.kt @@ -3,11 +3,11 @@ package org.ton.api.adnl.message import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter -import org.ton.kotlin.tl.constructors.BytesTlConstructor +import org.ton.tl.ByteStringBase64Serializer +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter +import org.ton.tl.constructors.BytesTlConstructor import kotlin.jvm.JvmName @SerialName("adnl.message.custom") diff --git a/tonapi-tl/src/adnl/message/AdnlMessageNop.kt b/tonapi-tl/src/adnl/message/AdnlMessageNop.kt index c71e3d35..4f2aad65 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessageNop.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessageNop.kt @@ -1,9 +1,9 @@ package org.ton.api.adnl.message import kotlinx.serialization.SerialName -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter @SerialName("adnl.message.nop") public object AdnlMessageNop : AdnlMessage, TlConstructor( diff --git a/tonapi-tl/src/adnl/message/AdnlMessagePart.kt b/tonapi-tl/src/adnl/message/AdnlMessagePart.kt index 5e2ba5fe..081b856b 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessagePart.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessagePart.kt @@ -3,8 +3,8 @@ package org.ton.api.adnl.message import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* -import org.ton.kotlin.tl.constructors.BytesTlConstructor +import org.ton.tl.* +import org.ton.tl.constructors.BytesTlConstructor import kotlin.jvm.JvmName import kotlin.jvm.JvmStatic diff --git a/tonapi-tl/src/adnl/message/AdnlMessageQuery.kt b/tonapi-tl/src/adnl/message/AdnlMessageQuery.kt index 1e44f88a..1adbaabc 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessageQuery.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessageQuery.kt @@ -3,11 +3,11 @@ package org.ton.api.adnl.message import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter -import org.ton.kotlin.tl.constructors.BytesTlConstructor +import org.ton.tl.ByteStringBase64Serializer +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter +import org.ton.tl.constructors.BytesTlConstructor import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/adnl/message/AdnlMessageReinit.kt b/tonapi-tl/src/adnl/message/AdnlMessageReinit.kt index 874a90ec..94d879ec 100644 --- a/tonapi-tl/src/adnl/message/AdnlMessageReinit.kt +++ b/tonapi-tl/src/adnl/message/AdnlMessageReinit.kt @@ -2,9 +2,9 @@ package org.ton.api.adnl.message import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter import kotlin.jvm.JvmName @SerialName("adnl.message.reinit") diff --git a/tonapi-tl/src/config/ConfigGlobal.kt b/tonapi-tl/src/config/ConfigGlobal.kt index 787eca01..3e19b0dc 100644 --- a/tonapi-tl/src/config/ConfigGlobal.kt +++ b/tonapi-tl/src/config/ConfigGlobal.kt @@ -8,7 +8,7 @@ import kotlinx.serialization.json.JsonClassDiscriminator import org.ton.api.adnl.config.AdnlConfigGlobal import org.ton.api.dht.config.DhtConfigGlobal import org.ton.api.validator.config.ValidatorConfigGlobal -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/config/ConfigLocal.kt b/tonapi-tl/src/config/ConfigLocal.kt deleted file mode 100644 index 0f885789..00000000 --- a/tonapi-tl/src/config/ConfigLocal.kt +++ /dev/null @@ -1,27 +0,0 @@ -@file:Suppress("OPT_IN_USAGE") - -package org.ton.api.config - -import kotlinx.serialization.Polymorphic -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.api.control.ControlConfigLocal -import org.ton.api.dht.config.DhtConfigLocal -import org.ton.api.id.config.IdConfigLocal -import org.ton.api.liteserver.config.LiteServerConfigLocal -import org.ton.api.validator.config.ValidatorConfigLocal - -@Serializable -@Polymorphic -@SerialName("config.local") -@JsonClassDiscriminator("@type") -public data class ConfigLocal( - @SerialName("local_ids") - val localIds: Collection, - val dht: Collection, - val validators: Collection, - @SerialName("liteservers") - val liteServers: Collection, - val control: Collection -) diff --git a/tonapi-tl/src/control/ControlConfigLocal.kt b/tonapi-tl/src/control/ControlConfigLocal.kt deleted file mode 100644 index e25b602e..00000000 --- a/tonapi-tl/src/control/ControlConfigLocal.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.ton.api.control - -import kotlinx.io.bytestring.ByteString -import kotlinx.serialization.Polymorphic -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.api.pk.PrivateKey -import org.ton.kotlin.tl.ByteStringBase64Serializer - -@Serializable -@Polymorphic -@SerialName("control.config.local") -@JsonClassDiscriminator("@type") -public data class ControlConfigLocal( - val priv: PrivateKey, - @Serializable(ByteStringBase64Serializer::class) - val pub: ByteString, - val port: Int -) diff --git a/tonapi-tl/src/dht/DhtKey.kt b/tonapi-tl/src/dht/DhtKey.kt index bb14166d..3e2618de 100644 --- a/tonapi-tl/src/dht/DhtKey.kt +++ b/tonapi-tl/src/dht/DhtKey.kt @@ -3,7 +3,7 @@ package org.ton.api.dht import kotlinx.io.bytestring.ByteString import kotlinx.serialization.Serializable import org.ton.api.adnl.AdnlIdShort -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName import kotlin.jvm.JvmOverloads import kotlin.jvm.JvmStatic diff --git a/tonapi-tl/src/dht/DhtKeyDescription.kt b/tonapi-tl/src/dht/DhtKeyDescription.kt index 34c413b2..7455b22f 100644 --- a/tonapi-tl/src/dht/DhtKeyDescription.kt +++ b/tonapi-tl/src/dht/DhtKeyDescription.kt @@ -4,11 +4,11 @@ import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.SignedTlObject -import org.ton.api.pk.PrivateKey -import org.ton.api.pub.PublicKey +import org.ton.kotlin.crypto.PublicKey import org.ton.kotlin.crypto.SignatureVerifier import org.ton.kotlin.crypto.Signer -import org.ton.kotlin.tl.* +import org.ton.kotlin.tl.TL +import org.ton.tl.* import kotlin.jvm.JvmStatic @Serializable @@ -36,10 +36,10 @@ public data class DhtKeyDescription( public companion object : TlCodec by DhtKeyDescriptionTlConstructor { @JvmStatic - public fun signed(name: String, key: Signer): DhtKeyDescription { + public fun signed(name: String, key: org.ton.kotlin.crypto.PrivateKeyEd25519): DhtKeyDescription { val keyDescription = DhtKeyDescription( id = key.publicKey(), - key = DhtKey(key.publicKey().toAdnlIdShort().id, name) + key = DhtKey(key.publicKey().computeShortId(), name) ) return keyDescription.signed(key) } @@ -51,14 +51,14 @@ private object DhtKeyDescriptionTlConstructor : TlConstructor ) { override fun encode(writer: TlWriter, value: DhtKeyDescription) { writer.write(DhtKey, value.key) - writer.write(PublicKey, value.id) + TL.Boxed.encodeIntoSink(PublicKey.serializer(), value.id, writer.output) writer.write(DhtUpdateRule, value.updateRule) writer.writeBytes(value.signature) } override fun decode(reader: TlReader): DhtKeyDescription { val key = reader.read(DhtKey) - val id = reader.read(PublicKey) + val id = TL.Boxed.decodeFromSource(PublicKey.serializer(), reader.input) val updateRule = reader.read(DhtUpdateRule) val signature = reader.readByteString() return DhtKeyDescription(key, id, updateRule, signature) diff --git a/tonapi-tl/src/dht/DhtMessage.kt b/tonapi-tl/src/dht/DhtMessage.kt index 8b10f679..f22bb5b4 100644 --- a/tonapi-tl/src/dht/DhtMessage.kt +++ b/tonapi-tl/src/dht/DhtMessage.kt @@ -1,7 +1,7 @@ package org.ton.api.dht import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable public data class DhtMessage( diff --git a/tonapi-tl/src/dht/DhtNode.kt b/tonapi-tl/src/dht/DhtNode.kt index b0ceaa15..ab9ef4a5 100644 --- a/tonapi-tl/src/dht/DhtNode.kt +++ b/tonapi-tl/src/dht/DhtNode.kt @@ -7,10 +7,12 @@ import org.ton.api.SignedTlObject import org.ton.api.adnl.AdnlAddressList import org.ton.api.adnl.AdnlIdShort import org.ton.api.adnl.AdnlNode -import org.ton.api.pub.PublicKey +import org.ton.kotlin.crypto.PublicKey import org.ton.kotlin.crypto.SignatureVerifier import org.ton.kotlin.crypto.Signer -import org.ton.kotlin.tl.* +import org.ton.kotlin.tl.TL +import org.ton.kotlin.tl.serializers.ByteStringBase64Serializer +import org.ton.tl.* import kotlin.jvm.JvmName @Serializable @@ -30,7 +32,7 @@ public data class DhtNode( override val signature: ByteString ) : SignedTlObject { public fun toAdnlNode(): AdnlNode = AdnlNode(id, addrList) - public fun key(): AdnlIdShort = id.toAdnlIdShort() + public fun key(): AdnlIdShort = AdnlIdShort(id.computeShortId()) override fun signed(privateKey: Signer): DhtNode = copy(signature = ByteString(*privateKey.signToByteArray(tlCodec().encodeToByteArray(this)))) @@ -47,14 +49,14 @@ private object DhtNodeTlConstructor : TlConstructor( schema = "dht.node id:PublicKey addr_list:adnl.addressList version:int signature:bytes = dht.Node" ) { override fun encode(writer: TlWriter, value: DhtNode) { - writer.write(PublicKey, value.id) + TL.Boxed.encodeIntoSink(PublicKey.serializer(), value.id, writer.output) writer.write(AdnlAddressList, value.addrList) writer.writeInt(value.version) writer.writeBytes(value.signature) } override fun decode(reader: TlReader): DhtNode { - val id = reader.read(PublicKey) + val id = TL.Boxed.decodeFromSource(PublicKey.serializer(), reader.input) val addrList = reader.read(AdnlAddressList) val version = reader.readInt() val signature = reader.readByteString() diff --git a/tonapi-tl/src/dht/DhtNodes.kt b/tonapi-tl/src/dht/DhtNodes.kt index e1de9d6c..3b8e17c0 100644 --- a/tonapi-tl/src/dht/DhtNodes.kt +++ b/tonapi-tl/src/dht/DhtNodes.kt @@ -3,7 +3,7 @@ package org.ton.api.dht import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator import org.ton.api.adnl.AdnlNodes -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable @JsonClassDiscriminator("@type") diff --git a/tonapi-tl/src/dht/DhtPong.kt b/tonapi-tl/src/dht/DhtPong.kt index ee2c63a3..b1816c94 100644 --- a/tonapi-tl/src/dht/DhtPong.kt +++ b/tonapi-tl/src/dht/DhtPong.kt @@ -2,7 +2,7 @@ package org.ton.api.dht import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable public data class DhtPong( diff --git a/tonapi-tl/src/dht/DhtStore.kt b/tonapi-tl/src/dht/DhtStore.kt index 68efdf63..fa633c32 100644 --- a/tonapi-tl/src/dht/DhtStore.kt +++ b/tonapi-tl/src/dht/DhtStore.kt @@ -1,6 +1,6 @@ package org.ton.api.dht -import org.ton.kotlin.tl.* +import org.ton.tl.* public data class DhtStore( val value: DhtValue diff --git a/tonapi-tl/src/dht/DhtStored.kt b/tonapi-tl/src/dht/DhtStored.kt index b8b9a6fc..d6d09b4d 100644 --- a/tonapi-tl/src/dht/DhtStored.kt +++ b/tonapi-tl/src/dht/DhtStored.kt @@ -1,6 +1,6 @@ package org.ton.api.dht -import org.ton.kotlin.tl.* +import org.ton.tl.* public object DhtStored : TlConstructor( schema = "dht.stored = dht.Stored" diff --git a/tonapi-tl/src/dht/DhtUpdateRule.kt b/tonapi-tl/src/dht/DhtUpdateRule.kt index 14ac8545..80c98848 100644 --- a/tonapi-tl/src/dht/DhtUpdateRule.kt +++ b/tonapi-tl/src/dht/DhtUpdateRule.kt @@ -2,9 +2,9 @@ package org.ton.api.dht import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlCodec -import org.ton.kotlin.tl.TlObject -import org.ton.kotlin.tl.constructors.EnumTlCombinator +import org.ton.tl.TlCodec +import org.ton.tl.TlObject +import org.ton.tl.constructors.EnumTlCombinator @Serializable public enum class DhtUpdateRule : TlObject { diff --git a/tonapi-tl/src/dht/DhtValue.kt b/tonapi-tl/src/dht/DhtValue.kt index 31c8d242..241b9208 100644 --- a/tonapi-tl/src/dht/DhtValue.kt +++ b/tonapi-tl/src/dht/DhtValue.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable import org.ton.api.SignedTlObject import org.ton.kotlin.crypto.SignatureVerifier import org.ton.kotlin.crypto.Signer -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/dht/DhtValueResult.kt b/tonapi-tl/src/dht/DhtValueResult.kt index 63119627..25998496 100644 --- a/tonapi-tl/src/dht/DhtValueResult.kt +++ b/tonapi-tl/src/dht/DhtValueResult.kt @@ -5,7 +5,7 @@ package org.ton.api.dht import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable @JsonClassDiscriminator("@type") diff --git a/tonapi-tl/src/dht/config/DhtConfigGlobal.kt b/tonapi-tl/src/dht/config/DhtConfigGlobal.kt index 26e6e2fa..b48c56d0 100644 --- a/tonapi-tl/src/dht/config/DhtConfigGlobal.kt +++ b/tonapi-tl/src/dht/config/DhtConfigGlobal.kt @@ -7,7 +7,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator import org.ton.api.dht.DhtNode import org.ton.api.dht.DhtNodes -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/dht/config/DhtConfigIdLocal.kt b/tonapi-tl/src/dht/config/DhtConfigIdLocal.kt index e1a249cc..582a2221 100644 --- a/tonapi-tl/src/dht/config/DhtConfigIdLocal.kt +++ b/tonapi-tl/src/dht/config/DhtConfigIdLocal.kt @@ -4,7 +4,7 @@ package org.ton.api.dht.config import kotlinx.serialization.SerialName import org.ton.api.adnl.AdnlIdShort -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @SerialName("dht.config.local") diff --git a/tonapi-tl/src/dht/config/DhtConfigLocal.kt b/tonapi-tl/src/dht/config/DhtConfigLocal.kt index 9aab4fcc..a5034d4d 100644 --- a/tonapi-tl/src/dht/config/DhtConfigLocal.kt +++ b/tonapi-tl/src/dht/config/DhtConfigLocal.kt @@ -5,9 +5,9 @@ package org.ton.api.dht.config import kotlinx.serialization.Polymorphic import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.kotlin.tl.TlCodec -import org.ton.kotlin.tl.TlCombinator -import org.ton.kotlin.tl.TlObject +import org.ton.tl.TlCodec +import org.ton.tl.TlCombinator +import org.ton.tl.TlObject @Polymorphic @Serializable diff --git a/tonapi-tl/src/dht/config/DhtConfigRandomLocal.kt b/tonapi-tl/src/dht/config/DhtConfigRandomLocal.kt index 1579adbb..c8bd9aee 100644 --- a/tonapi-tl/src/dht/config/DhtConfigRandomLocal.kt +++ b/tonapi-tl/src/dht/config/DhtConfigRandomLocal.kt @@ -6,9 +6,9 @@ import kotlinx.serialization.Polymorphic import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter import kotlin.jvm.JvmName @SerialName("dht.config.random.local") diff --git a/tonapi-tl/src/dht/db/DhtDbBucket.kt b/tonapi-tl/src/dht/db/DhtDbBucket.kt index e8246f86..dfeaf02c 100644 --- a/tonapi-tl/src/dht/db/DhtDbBucket.kt +++ b/tonapi-tl/src/dht/db/DhtDbBucket.kt @@ -3,7 +3,7 @@ package org.ton.api.dht.db import kotlinx.serialization.Serializable import org.ton.api.dht.DhtNode import org.ton.api.dht.DhtNodes -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable public data class DhtDbBucket( diff --git a/tonapi-tl/src/dht/db/DhtDbKey.kt b/tonapi-tl/src/dht/db/DhtDbKey.kt index 77e62a15..02577790 100644 --- a/tonapi-tl/src/dht/db/DhtDbKey.kt +++ b/tonapi-tl/src/dht/db/DhtDbKey.kt @@ -1,7 +1,7 @@ package org.ton.api.dht.db import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable public data class DhtDbKey( diff --git a/tonapi-tl/src/dht/functions/DhtFindValue.kt b/tonapi-tl/src/dht/functions/DhtFindValue.kt index 0eb9afdd..9b9420c4 100644 --- a/tonapi-tl/src/dht/functions/DhtFindValue.kt +++ b/tonapi-tl/src/dht/functions/DhtFindValue.kt @@ -3,7 +3,7 @@ package org.ton.api.dht.functions import kotlinx.io.bytestring.ByteString import org.ton.api.dht.DhtKey import org.ton.api.dht.DhtValueResult -import org.ton.kotlin.tl.* +import org.ton.tl.* public data class DhtFindValue( val key: ByteString, diff --git a/tonapi-tl/src/dht/functions/DhtPing.kt b/tonapi-tl/src/dht/functions/DhtPing.kt index 5c269d2c..9585f462 100644 --- a/tonapi-tl/src/dht/functions/DhtPing.kt +++ b/tonapi-tl/src/dht/functions/DhtPing.kt @@ -3,7 +3,7 @@ package org.ton.api.dht.functions import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.dht.DhtPong -import org.ton.kotlin.tl.* +import org.ton.tl.* @SerialName("dht.ping") @Serializable diff --git a/tonapi-tl/src/dht/functions/DhtQuery.kt b/tonapi-tl/src/dht/functions/DhtQuery.kt index 81a1ba56..12ed5e48 100644 --- a/tonapi-tl/src/dht/functions/DhtQuery.kt +++ b/tonapi-tl/src/dht/functions/DhtQuery.kt @@ -3,7 +3,7 @@ package org.ton.api.dht.functions import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.dht.DhtNode -import org.ton.kotlin.tl.* +import org.ton.tl.* public interface DhtQueryFunction { public fun query(node: DhtNode) diff --git a/tonapi-tl/src/fec/FecRaptorQ.kt b/tonapi-tl/src/fec/FecRaptorQ.kt index 8c1d60ec..5dfc0d8b 100644 --- a/tonapi-tl/src/fec/FecRaptorQ.kt +++ b/tonapi-tl/src/fec/FecRaptorQ.kt @@ -2,10 +2,10 @@ package org.ton.api.fec import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlCodec -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.TlCodec +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter @SerialName("fec.raptorQ") @Serializable diff --git a/tonapi-tl/src/fec/FecType.kt b/tonapi-tl/src/fec/FecType.kt index fe1cab8d..0503251e 100644 --- a/tonapi-tl/src/fec/FecType.kt +++ b/tonapi-tl/src/fec/FecType.kt @@ -1,8 +1,8 @@ package org.ton.api.fec import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlCombinator -import org.ton.kotlin.tl.TlObject +import org.ton.tl.TlCombinator +import org.ton.tl.TlObject @Serializable public sealed interface FecType : TlObject { diff --git a/tonapi-tl/src/http/HttpHeader.kt b/tonapi-tl/src/http/HttpHeader.kt index a4fb5a71..8b6f9c50 100644 --- a/tonapi-tl/src/http/HttpHeader.kt +++ b/tonapi-tl/src/http/HttpHeader.kt @@ -2,10 +2,10 @@ package org.ton.api.http import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlCodec -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.TlCodec +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter @SerialName("http.header") @Serializable diff --git a/tonapi-tl/src/http/HttpPayloadPart.kt b/tonapi-tl/src/http/HttpPayloadPart.kt index 1b32d023..f0a5a533 100644 --- a/tonapi-tl/src/http/HttpPayloadPart.kt +++ b/tonapi-tl/src/http/HttpPayloadPart.kt @@ -3,7 +3,7 @@ package org.ton.api.http import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @SerialName("http.payloadPart") @Serializable diff --git a/tonapi-tl/src/http/HttpResponse.kt b/tonapi-tl/src/http/HttpResponse.kt index 3881b6c6..8136f7c7 100644 --- a/tonapi-tl/src/http/HttpResponse.kt +++ b/tonapi-tl/src/http/HttpResponse.kt @@ -2,7 +2,7 @@ package org.ton.api.http import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @SerialName("http.response") @Serializable diff --git a/tonapi-tl/src/http/functions/HttpGetNextPayloadPart.kt b/tonapi-tl/src/http/functions/HttpGetNextPayloadPart.kt index d84ce3b6..03dfa7de 100644 --- a/tonapi-tl/src/http/functions/HttpGetNextPayloadPart.kt +++ b/tonapi-tl/src/http/functions/HttpGetNextPayloadPart.kt @@ -4,7 +4,7 @@ import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.http.HttpPayloadPart -import org.ton.kotlin.tl.* +import org.ton.tl.* @SerialName("http.getNextPayloadPart") @Serializable diff --git a/tonapi-tl/src/http/functions/HttpRequest.kt b/tonapi-tl/src/http/functions/HttpRequest.kt index 75c3c41f..1cd4714c 100644 --- a/tonapi-tl/src/http/functions/HttpRequest.kt +++ b/tonapi-tl/src/http/functions/HttpRequest.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.http.HttpHeader import org.ton.api.http.HttpResponse -import org.ton.kotlin.tl.* +import org.ton.tl.* @SerialName("http.request") @Serializable diff --git a/tonapi-tl/src/http/server/HttpServerDnsEntry.kt b/tonapi-tl/src/http/server/HttpServerDnsEntry.kt index 8081c8cf..dd4aba8e 100644 --- a/tonapi-tl/src/http/server/HttpServerDnsEntry.kt +++ b/tonapi-tl/src/http/server/HttpServerDnsEntry.kt @@ -3,7 +3,7 @@ package org.ton.api.http.server import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.adnl.AdnlIdShort -import org.ton.kotlin.tl.* +import org.ton.tl.* @SerialName("http.server.dnsEntry") @Serializable diff --git a/tonapi-tl/src/http/server/HttpServerHost.kt b/tonapi-tl/src/http/server/HttpServerHost.kt index e8b46c62..85dc65ea 100644 --- a/tonapi-tl/src/http/server/HttpServerHost.kt +++ b/tonapi-tl/src/http/server/HttpServerHost.kt @@ -2,7 +2,7 @@ package org.ton.api.http.server import kotlinx.serialization.SerialName import org.ton.api.adnl.AdnlIdShort -import org.ton.kotlin.tl.* +import org.ton.tl.* public data class HttpServerHost( val domains: Collection, diff --git a/tonapi-tl/src/id/config/IdConfigLocal.kt b/tonapi-tl/src/id/config/IdConfigLocal.kt deleted file mode 100644 index 57dd99e2..00000000 --- a/tonapi-tl/src/id/config/IdConfigLocal.kt +++ /dev/null @@ -1,15 +0,0 @@ -@file:Suppress("OPT_IN_USAGE") - -package org.ton.api.id.config - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.api.pk.PrivateKey - -@Serializable -@SerialName("id.config.local") -@JsonClassDiscriminator("@type") -public data class IdConfigLocal( - val id: PrivateKey -) diff --git a/tonapi-tl/src/liteserver/LiteServerDesc.kt b/tonapi-tl/src/liteserver/LiteServerDesc.kt index bdea8479..530472ed 100644 --- a/tonapi-tl/src/liteserver/LiteServerDesc.kt +++ b/tonapi-tl/src/liteserver/LiteServerDesc.kt @@ -2,7 +2,7 @@ package org.ton.api.liteserver import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.api.pub.PublicKey +import org.ton.kotlin.crypto.PublicKey import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/overlay/OverlayNode.kt b/tonapi-tl/src/overlay/OverlayNode.kt index 5396a020..97f34ea8 100644 --- a/tonapi-tl/src/overlay/OverlayNode.kt +++ b/tonapi-tl/src/overlay/OverlayNode.kt @@ -5,10 +5,15 @@ import kotlinx.io.bytestring.isEmpty import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.SignedTlObject -import org.ton.api.pub.PublicKey +import org.ton.kotlin.crypto.PublicKey import org.ton.kotlin.crypto.SignatureVerifier import org.ton.kotlin.crypto.Signer -import org.ton.kotlin.tl.* +import org.ton.kotlin.tl.TL +import org.ton.kotlin.tl.serializers.ByteStringBase64Serializer +import org.ton.tl.TlCodec +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter @Serializable @SerialName("overlay.node") @@ -21,10 +26,10 @@ public data class OverlayNode( override val signature: ByteString = ByteString() ) : SignedTlObject { - override fun signed(privateKey: Signer): OverlayNode = + override fun signed(signer: Signer): OverlayNode = copy( signature = ByteString( - *privateKey.signToByteArray( + *signer.signToByteArray( tlCodec().encodeToByteArray( copy(signature = ByteString()) ) @@ -32,12 +37,12 @@ public data class OverlayNode( ) ) - override fun verify(publicKey: SignatureVerifier): Boolean { + override fun verify(signatureVerifier: SignatureVerifier): Boolean { if (signature.isEmpty()) return false val check = copy( signature = ByteString() ) - return publicKey.verifySignature(tlCodec().encodeToByteArray(check), signature.toByteArray()) + return signatureVerifier.verifySignature(tlCodec().encodeToByteArray(check), signature.toByteArray()) } override fun tlCodec(): TlCodec = Companion @@ -46,14 +51,14 @@ public data class OverlayNode( schema = "overlay.node id:PublicKey overlay:int256 version:int signature:bytes = overlay.Node", ) { override fun encode(writer: TlWriter, value: OverlayNode) { - writer.write(PublicKey, value.id) + TL.Boxed.encodeIntoSink(PublicKey.serializer(), value.id, writer.output) writer.writeRaw(value.overlay) writer.writeInt(value.version) writer.writeBytes(value.signature) } override fun decode(reader: TlReader): OverlayNode { - val id = reader.read(PublicKey) + val id = TL.Boxed.decodeFromSource(PublicKey.serializer(), reader.input) val overlay = reader.readByteString(32) val version = reader.readInt() val signature = reader.readByteString() diff --git a/tonapi-tl/src/overlay/OverlayNodeToSign.kt b/tonapi-tl/src/overlay/OverlayNodeToSign.kt index 574465b6..690ecc28 100644 --- a/tonapi-tl/src/overlay/OverlayNodeToSign.kt +++ b/tonapi-tl/src/overlay/OverlayNodeToSign.kt @@ -4,7 +4,7 @@ import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.adnl.AdnlIdShort -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable @SerialName("overlay.node.toSign") diff --git a/tonapi-tl/src/overlay/OverlayNodes.kt b/tonapi-tl/src/overlay/OverlayNodes.kt index a9ec7c41..72b6496e 100644 --- a/tonapi-tl/src/overlay/OverlayNodes.kt +++ b/tonapi-tl/src/overlay/OverlayNodes.kt @@ -2,7 +2,7 @@ package org.ton.api.overlay import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable @SerialName("overlay.nodes") diff --git a/tonapi-tl/src/pk/aes.kt b/tonapi-tl/src/pk/aes.kt deleted file mode 100644 index 2e0b083c..00000000 --- a/tonapi-tl/src/pk/aes.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.ton.api.pk - -import kotlinx.io.bytestring.ByteString -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.api.pub.PublicKeyAes -import org.ton.kotlin.crypto.Decryptor -import org.ton.kotlin.crypto.DecryptorAes -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter - -@JsonClassDiscriminator("@type") -@SerialName("pk.aes") -@Serializable -public data class PrivateKeyAes( - @Serializable(ByteStringBase64Serializer::class) - val key: ByteString -) : PrivateKey, Decryptor by DecryptorAes(key.toByteArray()) { - override fun publicKey(): PublicKeyAes = PublicKeyAes(key) - - override fun toString(): String = toAdnlIdShort().toString() - - public companion object : TlConstructor( - schema = "pk.aes key:int256 = PrivateKey" - ) { - override fun encode(output: TlWriter, value: PrivateKeyAes) { - output.writeRaw(value.key) - } - - override fun decode(input: TlReader): PrivateKeyAes { - val key = input.readByteString(32) - return PrivateKeyAes(key) - } - } -} diff --git a/tonapi-tl/src/pk/ed25519.kt b/tonapi-tl/src/pk/ed25519.kt deleted file mode 100644 index afd83afb..00000000 --- a/tonapi-tl/src/pk/ed25519.kt +++ /dev/null @@ -1,102 +0,0 @@ -package org.ton.api.pk - -import kotlinx.io.bytestring.ByteString -import kotlinx.io.bytestring.toHexString -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import org.ton.api.pub.PublicKeyEd25519 -import org.ton.kotlin.crypto.Decryptor -import org.ton.kotlin.crypto.SecureRandom -import org.ton.kotlin.crypto.Signer -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter -import kotlin.jvm.JvmStatic -import kotlin.random.Random - -public inline fun PrivateKeyEd25519(random: Random = SecureRandom): PrivateKeyEd25519 = - PrivateKeyEd25519.generate(random) - -@Serializable -@SerialName("pk.ed25519") -public data class PrivateKeyEd25519( - @Serializable(ByteStringBase64Serializer::class) - public val key: ByteString -) : PrivateKey, Decryptor, Signer { - public constructor(key: ByteArray) : this(ByteString(*key.copyOf(32))) - - init { - require(key.size == 32) { "key must be 32 byte long" } - } - - private val _publicKey: PublicKeyEd25519 by lazy(LazyThreadSafetyMode.PUBLICATION) { - PublicKeyEd25519(_privateKey.publicKey.key) - } - private val _privateKey: org.ton.kotlin.crypto.PrivateKeyEd25519 by lazy(LazyThreadSafetyMode.PUBLICATION) { - org.ton.kotlin.crypto.PrivateKeyEd25519(key) - } - - override fun publicKey(): PublicKeyEd25519 = _publicKey - - public fun sharedKey(publicKey: PublicKeyEd25519): ByteArray = - _privateKey.computeSharedSecret(org.ton.kotlin.crypto.PublicKeyEd25519(publicKey.key)) - - override fun toString(): String = "PrivateKeyEd25519(${key.toHexString()})" - - override fun decryptToByteArray(source: ByteArray, startIndex: Int, endIndex: Int): ByteArray { - return _privateKey.decryptToByteArray(source, startIndex, endIndex) - } - - override fun decryptIntoByteArray( - source: ByteArray, - destination: ByteArray, - destinationOffset: Int, - startIndex: Int, - endIndex: Int - ) { - _privateKey.decryptIntoByteArray(source, destination, destinationOffset, startIndex, endIndex) - } - - override fun signToByteArray(source: ByteArray, startIndex: Int, endIndex: Int): ByteArray { - return _privateKey.signToByteArray(source, startIndex, endIndex) - } - - override fun signIntoByteArray( - source: ByteArray, - destination: ByteArray, - destinationOffset: Int, - startIndex: Int, - endIndex: Int - ) { - _privateKey.signIntoByteArray(source, destination, destinationOffset, startIndex, endIndex) - } - - public companion object : TlConstructor( - schema = "pk.ed25519 key:int256 = PrivateKey" - ) { - @JvmStatic - public fun tlConstructor(): TlConstructor = this - - @JvmStatic - public fun generate(random: Random = SecureRandom): PrivateKeyEd25519 = - PrivateKeyEd25519(ByteString(*random.nextBytes(32))) - - @JvmStatic - public fun of(byteArray: ByteArray): PrivateKeyEd25519 = - when (byteArray.size) { - 32 -> PrivateKeyEd25519(byteArray) - 32 + Int.SIZE_BYTES -> decodeBoxed(byteArray) - else -> throw IllegalArgumentException("Invalid key size: ${byteArray.size}") - } - - public override fun encode(writer: TlWriter, value: PrivateKeyEd25519) { - writer.writeRaw(value.key) - } - - public override fun decode(reader: TlReader): PrivateKeyEd25519 { - val key = reader.readByteString(32) - return PrivateKeyEd25519(key) - } - } -} diff --git a/tonapi-tl/src/pk/overlay.kt b/tonapi-tl/src/pk/overlay.kt deleted file mode 100644 index c2d7e779..00000000 --- a/tonapi-tl/src/pk/overlay.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.ton.api.pk - -import kotlinx.io.bytestring.ByteString -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.api.pub.PublicKeyOverlay -import org.ton.kotlin.crypto.Decryptor -import org.ton.kotlin.crypto.DecryptorFail -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter - -@JsonClassDiscriminator("@type") -@SerialName("pk.overlay") -@Serializable -public data class PrivateKeyOverlay( - @Serializable(ByteStringBase64Serializer::class) - val name: ByteString -) : PrivateKey, Decryptor by DecryptorFail { - override fun publicKey(): PublicKeyOverlay = PublicKeyOverlay(name) - - override fun toString(): String = toAdnlIdShort().toString() - - public companion object : TlConstructor( - schema = "pk.overlay name:bytes = PrivateKey" - ) { - override fun encode(writer: TlWriter, value: PrivateKeyOverlay) { - writer.writeBytes(value.name) - } - - override fun decode(reader: TlReader): PrivateKeyOverlay { - val name = reader.readByteString() - return PrivateKeyOverlay(name) - } - } -} diff --git a/tonapi-tl/src/pk/pk.kt b/tonapi-tl/src/pk/pk.kt deleted file mode 100644 index f773166c..00000000 --- a/tonapi-tl/src/pk/pk.kt +++ /dev/null @@ -1,23 +0,0 @@ -@file:Suppress("OPT_IN_USAGE") - -package org.ton.api.pk - -import kotlinx.serialization.Serializable -import org.ton.api.adnl.AdnlIdShort -import org.ton.api.pub.PublicKey -import org.ton.kotlin.crypto.Decryptor -import org.ton.kotlin.tl.TlCombinator - -@Serializable -public sealed interface PrivateKey : Decryptor { - public fun publicKey(): PublicKey - public fun toAdnlIdShort(): AdnlIdShort = publicKey().toAdnlIdShort() - - public companion object : TlCombinator( - PrivateKey::class, - PrivateKeyUnencrypted::class to PrivateKeyUnencrypted, - PrivateKeyEd25519::class to PrivateKeyEd25519, - PrivateKeyAes::class to PrivateKeyAes, - PrivateKeyOverlay::class to PrivateKeyOverlay, - ) -} diff --git a/tonapi-tl/src/pk/unenc.kt b/tonapi-tl/src/pk/unenc.kt deleted file mode 100644 index 943e4b32..00000000 --- a/tonapi-tl/src/pk/unenc.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.ton.api.pk - -import kotlinx.io.bytestring.ByteString -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.api.pub.PublicKeyUnencrypted -import org.ton.kotlin.crypto.Decryptor -import org.ton.kotlin.crypto.DecryptorNone -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter - -@JsonClassDiscriminator("@type") -@SerialName("pk.unenc") -@Serializable -public data class PrivateKeyUnencrypted( - @Serializable(ByteStringBase64Serializer::class) - val data: ByteString -) : PrivateKey, Decryptor by DecryptorNone { - override fun publicKey(): PublicKeyUnencrypted = PublicKeyUnencrypted(data) - - override fun toString(): String = toAdnlIdShort().toString() - - public companion object : TlConstructor( - schema = "pk.unenc data:bytes = PrivateKey" - ) { - override fun encode(writer: TlWriter, value: PrivateKeyUnencrypted) { - writer.writeBytes(value.data) - } - - override fun decode(reader: TlReader): PrivateKeyUnencrypted { - return PrivateKeyUnencrypted(reader.readByteString()) - } - } -} diff --git a/tonapi-tl/src/pub/ed25519.kt b/tonapi-tl/src/pub/ed25519.kt deleted file mode 100644 index 119821d1..00000000 --- a/tonapi-tl/src/pub/ed25519.kt +++ /dev/null @@ -1,86 +0,0 @@ -@file:Suppress("NOTHING_TO_INLINE") - -package org.ton.api.pub - -import kotlinx.io.bytestring.ByteString -import kotlinx.io.bytestring.toHexString -import kotlinx.serialization.Polymorphic -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import org.ton.api.adnl.AdnlIdShort -import org.ton.api.pk.PrivateKeyEd25519 -import org.ton.kotlin.crypto.Encryptor -import org.ton.kotlin.crypto.SignatureVerifier -import org.ton.kotlin.tl.ByteStringBase64Serializer -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter -import kotlin.jvm.JvmStatic - -public inline fun PublicKeyEd25519(privateKey: PrivateKeyEd25519): PublicKeyEd25519 = PublicKeyEd25519.of(privateKey) - -@Serializable -@SerialName("pub.ed25519") -@Polymorphic -public data class PublicKeyEd25519( - @Serializable(ByteStringBase64Serializer::class) - val key: ByteString -) : PublicKey, Encryptor, SignatureVerifier { - public constructor(byteArray: ByteArray) : this(ByteString(byteArray)) - - private val _publicKey by lazy(LazyThreadSafetyMode.PUBLICATION) { - org.ton.kotlin.crypto.PublicKeyEd25519(key) - } - - private val _adnlIdShort: AdnlIdShort by lazy(LazyThreadSafetyMode.PUBLICATION) { - AdnlIdShort(ByteString(*hash(this))) - } - - override fun toAdnlIdShort(): AdnlIdShort = _adnlIdShort - - override fun toString(): String = "PublicKeyEd25519(${key.toHexString()})" - - override fun encryptToByteArray( - source: ByteArray, - startIndex: Int, - endIndex: Int - ): ByteArray { - return _publicKey.encryptToByteArray(source, startIndex, endIndex) - } - - override fun encryptIntoByteArray( - source: ByteArray, - destination: ByteArray, - destinationOffset: Int, - startIndex: Int, - endIndex: Int - ) { - _publicKey.encryptIntoByteArray(source, destination, destinationOffset, startIndex, endIndex) - } - - override fun verifySignature( - source: ByteArray, - signature: ByteArray, - startIndex: Int, - endIndex: Int - ): Boolean { - return _publicKey.verifySignature(source, signature, startIndex, endIndex) - } - - public companion object : TlConstructor( - schema = "pub.ed25519 key:int256 = PublicKey", - ) { - @JvmStatic - public fun of(privateKey: PrivateKeyEd25519): PublicKeyEd25519 = - privateKey.publicKey() - - override fun encode(writer: TlWriter, value: PublicKeyEd25519) { - writer.writeRaw(value.key) - } - - override fun decode(reader: TlReader): PublicKeyEd25519 { - val key = reader.readByteString(32) - return PublicKeyEd25519(key) - } - } -} diff --git a/tonapi-tl/src/pub/pub.kt b/tonapi-tl/src/pub/pub.kt deleted file mode 100644 index 181fcb37..00000000 --- a/tonapi-tl/src/pub/pub.kt +++ /dev/null @@ -1,114 +0,0 @@ -@file:Suppress("OPT_IN_USAGE") - -package org.ton.api.pub - -import kotlinx.io.bytestring.ByteString -import kotlinx.io.bytestring.isEmpty -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.api.adnl.AdnlIdShort -import org.ton.api.dht.DhtKeyDescription -import org.ton.api.dht.DhtUpdateRule -import org.ton.kotlin.crypto.* -import org.ton.kotlin.tl.* - -@Serializable -@JsonClassDiscriminator("@type") -public sealed interface PublicKey : Encryptor, TlObject { - override fun tlCodec(): TlCodec = Companion - - public fun toAdnlIdShort(): AdnlIdShort - - public companion object : TlCombinator( - PublicKey::class, - PublicKeyEd25519::class to PublicKeyEd25519, - PublicKeyUnencrypted::class to PublicKeyUnencrypted, - PublicKeyAes::class to PublicKeyAes, - PublicKeyOverlay::class to PublicKeyOverlay, - ) -} - -@SerialName("pub.unenc") -@Serializable -public data class PublicKeyUnencrypted( - @Serializable(ByteStringBase64Serializer::class) - val data: ByteString -) : PublicKey, Encryptor by EncryptorNone { - - override fun toAdnlIdShort(): AdnlIdShort = AdnlIdShort(ByteString(*hash(this))) - - public companion object : TlConstructor( - schema = "pub.unenc data:bytes = PublicKey" - ) { - override fun encode(writer: TlWriter, value: PublicKeyUnencrypted) { - writer.writeBytes(value.data) - } - - override fun decode(reader: TlReader): PublicKeyUnencrypted { - val data = reader.readByteString() - return PublicKeyUnencrypted(data) - } - } -} - -@SerialName("pub.aes") -@Serializable -public data class PublicKeyAes( - @Serializable(ByteStringBase64Serializer::class) - val key: ByteString -) : PublicKey, Encryptor by EncryptorAes(key.toByteArray()) { - private val _adnlIdShort by lazy(LazyThreadSafetyMode.PUBLICATION) { - AdnlIdShort(ByteString(*hash(this))) - } - - override fun toAdnlIdShort(): AdnlIdShort = _adnlIdShort - - public companion object : TlConstructor( - schema = "pub.aes key:int256 = PublicKey" - ) { - override fun encode(writer: TlWriter, value: PublicKeyAes) { - writer.writeRaw(value.key) - } - - override fun decode(reader: TlReader): PublicKeyAes { - val key = reader.readByteString(32) - return PublicKeyAes(key) - } - } -} - -@SerialName("pub.overlay") -@Serializable -public data class PublicKeyOverlay( - @Serializable(ByteStringBase64Serializer::class) - val name: ByteString -) : PublicKey, Encryptor by EncryptorFail, SignatureVerifier { - - override fun toAdnlIdShort(): AdnlIdShort = AdnlIdShort( - ByteString(*hash(this)) - ) - - override fun verifySignature(source: ByteArray, signature: ByteArray, startIndex: Int, endIndex: Int): Boolean { - val result = try { - DhtKeyDescription.decodeBoxed(source) - } catch (e: Exception) { - return false - } - if (result.updateRule != DhtUpdateRule.OVERLAY_NODES) return false - return result.signature.isEmpty() - } - - public companion object : TlConstructor( - schema = "pub.overlay name:bytes = PublicKey" - ) { - override fun encode(writer: TlWriter, value: PublicKeyOverlay) { - writer.writeBytes(value.name) - } - - override fun decode(reader: TlReader): PublicKeyOverlay { - val name = reader.readByteString() - return PublicKeyOverlay(name) - } - } -} diff --git a/tonapi-tl/src/rldp/RldpAnswer.kt b/tonapi-tl/src/rldp/RldpAnswer.kt index ec3d6b93..42ab837e 100644 --- a/tonapi-tl/src/rldp/RldpAnswer.kt +++ b/tonapi-tl/src/rldp/RldpAnswer.kt @@ -3,7 +3,7 @@ package org.ton.api.rldp import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @SerialName("rldp.answer") @Serializable diff --git a/tonapi-tl/src/rldp/RldpComplete.kt b/tonapi-tl/src/rldp/RldpComplete.kt index 344739ac..278204da 100644 --- a/tonapi-tl/src/rldp/RldpComplete.kt +++ b/tonapi-tl/src/rldp/RldpComplete.kt @@ -3,7 +3,7 @@ package org.ton.api.rldp import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable @SerialName("rldp.complete") diff --git a/tonapi-tl/src/rldp/RldpConfirm.kt b/tonapi-tl/src/rldp/RldpConfirm.kt index 204600e7..4519adc4 100644 --- a/tonapi-tl/src/rldp/RldpConfirm.kt +++ b/tonapi-tl/src/rldp/RldpConfirm.kt @@ -3,7 +3,7 @@ package org.ton.api.rldp import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable @SerialName("rldp.confirm") diff --git a/tonapi-tl/src/rldp/RldpMessage.kt b/tonapi-tl/src/rldp/RldpMessage.kt index a35fb7da..d337a48a 100644 --- a/tonapi-tl/src/rldp/RldpMessage.kt +++ b/tonapi-tl/src/rldp/RldpMessage.kt @@ -6,8 +6,8 @@ import kotlinx.io.bytestring.ByteString import kotlinx.serialization.Polymorphic import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator -import org.ton.kotlin.tl.TlCombinator -import org.ton.kotlin.tl.TlObject +import org.ton.tl.TlCombinator +import org.ton.tl.TlObject @Polymorphic @Serializable diff --git a/tonapi-tl/src/rldp/RldpMessageData.kt b/tonapi-tl/src/rldp/RldpMessageData.kt index 1393871e..49029c8a 100644 --- a/tonapi-tl/src/rldp/RldpMessageData.kt +++ b/tonapi-tl/src/rldp/RldpMessageData.kt @@ -3,7 +3,7 @@ package org.ton.api.rldp import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable @SerialName("rldp.message") diff --git a/tonapi-tl/src/rldp/RldpMessagePart.kt b/tonapi-tl/src/rldp/RldpMessagePart.kt index 4ad676b4..90a8f3ba 100644 --- a/tonapi-tl/src/rldp/RldpMessagePart.kt +++ b/tonapi-tl/src/rldp/RldpMessagePart.kt @@ -2,8 +2,8 @@ package org.ton.api.rldp import kotlinx.io.bytestring.ByteString import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlCombinator -import org.ton.kotlin.tl.TlObject +import org.ton.tl.TlCombinator +import org.ton.tl.TlObject @Serializable public sealed interface RldpMessagePart : TlObject { diff --git a/tonapi-tl/src/rldp/RldpMessagePartData.kt b/tonapi-tl/src/rldp/RldpMessagePartData.kt index 0b1e9577..69ebe713 100644 --- a/tonapi-tl/src/rldp/RldpMessagePartData.kt +++ b/tonapi-tl/src/rldp/RldpMessagePartData.kt @@ -4,7 +4,7 @@ import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.ton.api.fec.FecType -import org.ton.kotlin.tl.* +import org.ton.tl.* import kotlin.jvm.JvmName @Serializable diff --git a/tonapi-tl/src/rldp/RldpQuery.kt b/tonapi-tl/src/rldp/RldpQuery.kt index 35f23e2b..b77c84cb 100644 --- a/tonapi-tl/src/rldp/RldpQuery.kt +++ b/tonapi-tl/src/rldp/RldpQuery.kt @@ -3,7 +3,7 @@ package org.ton.api.rldp import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.* +import org.ton.tl.* @Serializable @SerialName("rldp.query") diff --git a/tonapi-tl/src/tcp/TcpAuthentificate.kt b/tonapi-tl/src/tcp/TcpAuthentificate.kt index 76e44e9c..17d54261 100644 --- a/tonapi-tl/src/tcp/TcpAuthentificate.kt +++ b/tonapi-tl/src/tcp/TcpAuthentificate.kt @@ -2,10 +2,10 @@ package org.ton.api.tcp import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.kotlin.tl.TlCodec -import org.ton.kotlin.tl.TlConstructor -import org.ton.kotlin.tl.TlReader -import org.ton.kotlin.tl.TlWriter +import org.ton.tl.TlCodec +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter @SerialName("tcp.authentificate") @Serializable diff --git a/tonapi-tl/src/tcp/TcpAuthentificationComplete.kt b/tonapi-tl/src/tcp/TcpAuthentificationComplete.kt index 1f3fa4a2..3e973195 100644 --- a/tonapi-tl/src/tcp/TcpAuthentificationComplete.kt +++ b/tonapi-tl/src/tcp/TcpAuthentificationComplete.kt @@ -3,8 +3,13 @@ package org.ton.api.tcp import kotlinx.io.bytestring.ByteString import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.ton.api.pub.PublicKey -import org.ton.kotlin.tl.* +import org.ton.kotlin.crypto.PublicKey +import org.ton.kotlin.tl.TL +import org.ton.kotlin.tl.serializers.ByteStringBase64Serializer +import org.ton.tl.TlCodec +import org.ton.tl.TlConstructor +import org.ton.tl.TlReader +import org.ton.tl.TlWriter @SerialName("tcp.authentificationComplete") @Serializable @@ -20,13 +25,13 @@ private object TcpAuthentificationCompleteTlConstructor : TlConstructor