diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/crypto/EventAssembler.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/crypto/EventAssembler.kt index 6212ec589..abc6791ba 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/crypto/EventAssembler.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/crypto/EventAssembler.kt @@ -26,29 +26,27 @@ import com.vitorpamplona.quartz.nip01Core.core.toHexKey import com.vitorpamplona.quartz.utils.EventFactory import com.vitorpamplona.quartz.utils.RandomInstance -class EventAssembler { - companion object { - fun hashAndSign( - pubKey: HexKey, - createdAt: Long, - kind: Int, - tags: Array>, - content: String, - privKey: ByteArray, - nonce: ByteArray? = RandomInstance.bytes(32), - ): T { - val id = EventHasher.hashIdBytes(pubKey, createdAt, kind, tags, content) - val sig = Nip01Crypto.sign(id, privKey, nonce).toHexKey() +object EventAssembler { + fun hashAndSign( + pubKey: HexKey, + createdAt: Long, + kind: Int, + tags: Array>, + content: String, + privKey: ByteArray, + nonce: ByteArray? = RandomInstance.bytes(32), + ): T { + val id = EventHasher.hashIdBytes(pubKey, createdAt, kind, tags, content) + val sig = Nip01Crypto.sign(id, privKey, nonce).toHexKey() - return EventFactory.create( - id.toHexKey(), - pubKey, - createdAt, - kind, - tags, - content, - sig, - ) - } + return EventFactory.create( + id.toHexKey(), + pubKey, + createdAt, + kind, + tags, + content, + sig, + ) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/crypto/EventHasher.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/crypto/EventHasher.kt index 2828d086c..1c9ad080b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/crypto/EventHasher.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/crypto/EventHasher.kt @@ -24,33 +24,29 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.toHexKey import com.vitorpamplona.quartz.utils.sha256.sha256 -class EventHasher { - companion object { - fun hashIdBytes( - pubKey: HexKey, - createdAt: Long, - kind: Int, - tags: Array>, - content: String, - ): ByteArray = sha256(EventHasherSerializer.fastMakeJsonForId(pubKey, createdAt, kind, tags, content)) +object EventHasher { + fun hashIdBytes( + pubKey: HexKey, + createdAt: Long, + kind: Int, + tags: Array>, + content: String, + ): ByteArray = sha256(EventHasherSerializer.fastMakeJsonForId(pubKey, createdAt, kind, tags, content)) - fun hashId(serializedJsonAsBytes: ByteArray): String = sha256(serializedJsonAsBytes).toHexKey() + fun hashId( + pubKey: HexKey, + createdAt: Long, + kind: Int, + tags: Array>, + content: String, + ): String = hashIdBytes(pubKey, createdAt, kind, tags, content).toHexKey() - fun hashId( - pubKey: HexKey, - createdAt: Long, - kind: Int, - tags: Array>, - content: String, - ): String = hashIdBytes(pubKey, createdAt, kind, tags, content).toHexKey() - - fun hashIdCheck( - id: HexKey, - pubKey: HexKey, - createdAt: Long, - kind: Int, - tags: Array>, - content: String, - ): Boolean = EventHasherSerializer.makeJsonForIdHashAndCheck(id, pubKey, createdAt, kind, tags, content) - } + fun hashIdCheck( + id: HexKey, + pubKey: HexKey, + createdAt: Long, + kind: Int, + tags: Array>, + content: String, + ): Boolean = EventHasherSerializer.makeJsonForIdHashAndCheck(id, pubKey, createdAt, kind, tags, content) } diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/utils/DeterministicSigner.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/utils/DeterministicSigner.kt deleted file mode 100644 index 9ff016c6a..000000000 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/utils/DeterministicSigner.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2025 Vitor Pamplona - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the - * Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package com.vitorpamplona.quartz.utils - -import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.core.toHexKey -import com.vitorpamplona.quartz.nip01Core.crypto.EventAssembler -import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair -import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate - -class DeterministicSigner( - val key: KeyPair, - val pubKey: HexKey = key.pubKey.toHexKey(), -) { - fun sign( - createdAt: Long, - kind: Int, - tags: Array>, - content: String, - ): T = EventAssembler.Companion.hashAndSign(pubKey, createdAt, kind, tags, content, key.privKey!!, nonce = null) - - fun sign(ev: EventTemplate): T = sign(ev.createdAt, ev.kind, ev.tags, ev.content) -} diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/utils/SignerUtils.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/utils/SignerUtils.kt index 62b52abfe..2b16ae2a4 100644 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/utils/SignerUtils.kt +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/utils/SignerUtils.kt @@ -20,9 +20,28 @@ */ package com.vitorpamplona.quartz.utils +import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.core.HexKey +import com.vitorpamplona.quartz.nip01Core.core.toHexKey +import com.vitorpamplona.quartz.nip01Core.crypto.EventAssembler import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair +import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate import com.vitorpamplona.quartz.nip19Bech32.bech32.bechToBytes fun String.nsecToKeyPair() = KeyPair(this.bechToBytes()) fun String.nsecToSigner() = this.nsecToKeyPair().let { DeterministicSigner(it) } + +class DeterministicSigner( + val key: KeyPair, + val pubKey: HexKey = key.pubKey.toHexKey(), +) { + fun sign( + createdAt: Long, + kind: Int, + tags: Array>, + content: String, + ): T = EventAssembler.hashAndSign(pubKey, createdAt, kind, tags, content, key.privKey!!, nonce = null) + + fun sign(ev: EventTemplate): T = sign(ev.createdAt, ev.kind, ev.tags, ev.content) +}