Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions adnl/src/connection/AdnlConnection.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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()

Expand Down
2 changes: 1 addition & 1 deletion block-tlb/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ kotlin {
dependencies {
api(projects.tonKotlinHashmapTlb)
api(projects.tonKotlinTlb)
api(projects.tonKotlinTl)
api(projects.tonKotlinTlLegacy)
implementation(libs.serialization.core)
}
}
Expand Down
2 changes: 1 addition & 1 deletion contract/src/wallet/HighLoadWalletV2Contract.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions contract/src/wallet/MessageText.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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))
}

Expand Down
2 changes: 1 addition & 1 deletion contract/src/wallet/WalletContract.kt
Original file line number Diff line number Diff line change
@@ -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

Expand Down
6 changes: 3 additions & 3 deletions contract/src/wallet/WalletTransfer.kt
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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)
)
}
}
20 changes: 10 additions & 10 deletions contract/src/wallet/WalletV3Contract.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -69,17 +69,17 @@ public class WalletV3R2Contract(
public companion object : TlbConstructor<WalletV3R2Data>(
"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())
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions contract/src/wallet/WalletV4R2Contract.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions contract/test/wallet/WalletV4Example.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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!")
}
Expand Down
1 change: 1 addition & 0 deletions crypto/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ kotlin {
commonMain {
dependencies {
api(libs.kotlinx.io.bytestring)
api(projects.tonKotlinTl)
implementation(libs.serialization.core)
}
}
Expand Down
1 change: 1 addition & 0 deletions crypto/src/commonMain/kotlin/Encryptor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public object EncryptorNone : Encryptor {
startIndex: Int,
endIndex: Int
) {
source.copyInto(destination, destinationOffset, startIndex, endIndex)
}
}

Expand Down
18 changes: 17 additions & 1 deletion crypto/src/commonMain/kotlin/PrivateKey.kt
Original file line number Diff line number Diff line change
@@ -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
)
}
21 changes: 20 additions & 1 deletion crypto/src/commonMain/kotlin/PublicKey.kt
Original file line number Diff line number Diff line change
@@ -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
}
10 changes: 0 additions & 10 deletions crypto/src/commonMain/kotlin/SignatureVerifier.kt

This file was deleted.

17 changes: 0 additions & 17 deletions crypto/src/commonMain/kotlin/Signer.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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)

Expand Down Expand Up @@ -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()})"
}
}
Loading