Check arguments to constraints
This commit is contained in:
parent
9e287feb26
commit
b064c0bcf0
@ -200,10 +200,10 @@ public object NativeSecp256k1 : Secp256k1 {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun frostPublicKeyTweak(pk: ByteArray): ByteArray {
|
override fun frostPublicKeyTweak(xOnlyPublicKey: ByteArray): ByteArray {
|
||||||
return Secp256k1CFunctions.secp256k1_frost_pubkey_tweak(
|
return Secp256k1CFunctions.secp256k1_frost_pubkey_tweak(
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
pk
|
xOnlyPublicKey
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +289,7 @@ public interface Secp256k1 {
|
|||||||
*/
|
*/
|
||||||
public fun frostComputePublicShare(threshold: Int, id33: ByteArray, vssCommitments: Array<Array<ByteArray>>, totalSignersCount: Int): ByteArray
|
public fun frostComputePublicShare(threshold: Int, id33: ByteArray, vssCommitments: Array<Array<ByteArray>>, totalSignersCount: Int): ByteArray
|
||||||
|
|
||||||
public fun frostPublicKeyTweak(pk: ByteArray): ByteArray
|
public fun frostPublicKeyTweak(xOnlyPublicKey: ByteArray): ByteArray
|
||||||
|
|
||||||
public fun frostPublicKeyEcTweakAdd(tweakCache: ByteArray, tweak32: ByteArray): ByteArray
|
public fun frostPublicKeyEcTweakAdd(tweakCache: ByteArray, tweak32: ByteArray): ByteArray
|
||||||
|
|
||||||
@ -319,6 +319,8 @@ public interface Secp256k1 {
|
|||||||
public fun get(): Secp256k1 = this
|
public fun get(): Secp256k1 = this
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
|
public const val X_ONLY_PUBKEY_SIZE: Int = 64
|
||||||
|
|
||||||
public const val MUSIG2_SECRET_NONCE_SIZE: Int = 132
|
public const val MUSIG2_SECRET_NONCE_SIZE: Int = 132
|
||||||
public const val MUSIG2_PUBLIC_NONCE_SIZE: Int = 66
|
public const val MUSIG2_PUBLIC_NONCE_SIZE: Int = 66
|
||||||
public const val MUSIG2_PUBLIC_KEYAGG_CACHE_SIZE: Int = 197
|
public const val MUSIG2_PUBLIC_KEYAGG_CACHE_SIZE: Int = 197
|
||||||
@ -326,14 +328,14 @@ public interface Secp256k1 {
|
|||||||
|
|
||||||
public const val FROST_PARTIAL_SIGNATURE_SIZE: Int = 36
|
public const val FROST_PARTIAL_SIGNATURE_SIZE: Int = 36
|
||||||
|
|
||||||
public const val FROST_SHARE_SIZE: Int = 36
|
public const val FROST_SHARE_SIZE: Int = 37
|
||||||
public const val FROST_TWEAK_CACHE_SIZE: Int = 101
|
public const val FROST_TWEAK_CACHE_SIZE: Int = 102
|
||||||
public const val FROST_SESSION_SIZE: Int = 133
|
public const val FROST_SESSION_SIZE: Int = 134
|
||||||
public const val FROST_SECNONCE_SIZE: Int = 68
|
public const val FROST_SECNONCE_SIZE: Int = 69
|
||||||
public const val FROST_PUBNONCE_SIZE: Int = 132
|
public const val FROST_PUBNONCE_SIZE: Int = 133
|
||||||
public const val FROST_SERIALIZED_PARTIAL_SIGNATURE_SIZE: Int = 32
|
public const val FROST_SERIALIZED_PARTIAL_SIGNATURE_SIZE: Int = 33
|
||||||
public const val FROST_SERIALIZED_SHARE_SIZE: Int = 32
|
public const val FROST_SERIALIZED_SHARE_SIZE: Int = 33
|
||||||
public const val FROST_SERIALIZED_PUBNONCE_SIZE: Int = 66
|
public const val FROST_SERIALIZED_PUBNONCE_SIZE: Int = 67
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -490,8 +490,13 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
totalSigners: Int,
|
totalSigners: Int,
|
||||||
ids33: Array<ByteArray>
|
ids33: Array<ByteArray>
|
||||||
): Pair<Array<ByteArray>, Array<ByteArray>> {
|
): Pair<Array<ByteArray>, Array<ByteArray>> {
|
||||||
|
require(pok64.size == 64)
|
||||||
|
require(seed32.size == 32)
|
||||||
|
require(threshold > 0)
|
||||||
|
require(threshold <= totalSigners)
|
||||||
|
require(ids33.size == totalSigners)
|
||||||
|
ids33.forEach { require(it.size == 33) }
|
||||||
|
|
||||||
// TODO("Constraints not yet implemented")
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nShares = allocArray<secp256k1_frost_share>(ids33.size)
|
val nShares = allocArray<secp256k1_frost_share>(ids33.size)
|
||||||
val nVssCommitment = allocArray<secp256k1_pubkey>(threshold)
|
val nVssCommitment = allocArray<secp256k1_pubkey>(threshold)
|
||||||
@ -529,11 +534,22 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
threshold: Int,
|
threshold: Int,
|
||||||
id33: ByteArray
|
id33: ByteArray
|
||||||
): Pair<ByteArray, ByteArray> {
|
): Pair<ByteArray, ByteArray> {
|
||||||
TODO("Constraints not yet implemented")
|
require(totalShares.size == totalShareCount)
|
||||||
|
totalShares.forEach { require(it.size == 33) }
|
||||||
|
require(vssCommitments.size == totalShareCount)
|
||||||
|
vssCommitments.forEach { vssCommitment ->
|
||||||
|
require(vssCommitment.size == threshold)
|
||||||
|
vssCommitment.forEach { publicKey ->
|
||||||
|
require(publicKey.size == 33 || publicKey.size == 65)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require(threshold > 0)
|
||||||
|
require(threshold <= totalShareCount)
|
||||||
|
require(id33.size == 33)
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nAggShare = alloc<secp256k1_frost_share>()
|
val nAggregateShare = alloc<secp256k1_frost_share>()
|
||||||
val nAggPublicKey = alloc<secp256k1_xonly_pubkey>()
|
val nAggregatePublicKey = alloc<secp256k1_xonly_pubkey>()
|
||||||
|
|
||||||
val nTotalShares = totalShares.map { allocFrostShare(it).ptr }
|
val nTotalShares = totalShares.map { allocFrostShare(it).ptr }
|
||||||
|
|
||||||
@ -548,8 +564,8 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
|
|
||||||
secp256k1_frost_share_agg(
|
secp256k1_frost_share_agg(
|
||||||
ctx = ctx,
|
ctx = ctx,
|
||||||
agg_share = nAggShare.ptr,
|
agg_share = nAggregateShare.ptr,
|
||||||
agg_pk = nAggPublicKey.ptr,
|
agg_pk = nAggregatePublicKey.ptr,
|
||||||
shares = nTotalShares.toCValues(),
|
shares = nTotalShares.toCValues(),
|
||||||
vss_commitments = nVssCommitments,
|
vss_commitments = nVssCommitments,
|
||||||
n_shares = totalShareCount.convert(),
|
n_shares = totalShareCount.convert(),
|
||||||
@ -558,8 +574,8 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
)
|
)
|
||||||
|
|
||||||
return Pair(
|
return Pair(
|
||||||
serializeFrostShare(nAggShare),
|
serializeFrostShare(nAggregateShare),
|
||||||
serializeXonlyPubkey(nAggPublicKey)
|
serializeXonlyPubkey(nAggregatePublicKey)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -571,7 +587,14 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
share: ByteArray,
|
share: ByteArray,
|
||||||
vssCommitment: Array<ByteArray>
|
vssCommitment: Array<ByteArray>
|
||||||
): Int {
|
): Int {
|
||||||
TODO("Constraints not yet implemented")
|
require(threshold > 0)
|
||||||
|
require(id33.size == 33)
|
||||||
|
require(share.size == Secp256k1.FROST_SHARE_SIZE)
|
||||||
|
|
||||||
|
require(vssCommitment.size == threshold)
|
||||||
|
vssCommitment.forEach { publicKey ->
|
||||||
|
require(publicKey.size == 33 || publicKey.size == 65)
|
||||||
|
}
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nId33 = toNat(id33);
|
val nId33 = toNat(id33);
|
||||||
@ -594,10 +617,20 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
vssCommitments: Array<Array<ByteArray>>,
|
vssCommitments: Array<Array<ByteArray>>,
|
||||||
totalSignersCount: Int
|
totalSignersCount: Int
|
||||||
): ByteArray {
|
): ByteArray {
|
||||||
|
require(threshold > 0)
|
||||||
|
require(threshold <= totalSignersCount)
|
||||||
|
require(id33.size == 33)
|
||||||
|
|
||||||
|
require(vssCommitments.size == totalSignersCount)
|
||||||
|
vssCommitments.forEach { vssCommitment ->
|
||||||
|
require(vssCommitment.size == threshold)
|
||||||
|
vssCommitment.forEach { publicKey ->
|
||||||
|
require(publicKey.size == 33 || publicKey.size == 65)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO("Constraints not yet implemented")
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nPubshare = alloc<secp256k1_pubkey>()
|
val nPublicShare = alloc<secp256k1_pubkey>()
|
||||||
|
|
||||||
val nVssCommitments = allocArray<CPointerVar<secp256k1_pubkey>>(vssCommitments.size)
|
val nVssCommitments = allocArray<CPointerVar<secp256k1_pubkey>>(vssCommitments.size)
|
||||||
vssCommitments.forEachIndexed { index, vssCommitment ->
|
vssCommitments.forEachIndexed { index, vssCommitment ->
|
||||||
@ -610,22 +643,23 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
|
|
||||||
secp256k1_frost_compute_pubshare(
|
secp256k1_frost_compute_pubshare(
|
||||||
ctx = ctx,
|
ctx = ctx,
|
||||||
pubshare = nPubshare.ptr,
|
pubshare = nPublicShare.ptr,
|
||||||
threshold = threshold.convert(),
|
threshold = threshold.convert(),
|
||||||
id33 = toNat(id33),
|
id33 = toNat(id33),
|
||||||
vss_commitments = nVssCommitments,
|
vss_commitments = nVssCommitments,
|
||||||
n_participants = totalSignersCount.convert()
|
n_participants = totalSignersCount.convert()
|
||||||
)
|
)
|
||||||
|
|
||||||
return serializePubkey(nPubshare)
|
return serializePubkey(nPublicShare)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun frostPublicKeyTweak(pk: ByteArray): ByteArray {
|
override fun frostPublicKeyTweak(xOnlyPublicKey: ByteArray): ByteArray {
|
||||||
TODO("Constraints not yet implemented")
|
require(xOnlyPublicKey.size == Secp256k1.X_ONLY_PUBKEY_SIZE)
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nTweakCache = alloc<secp256k1_frost_tweak_cache>()
|
val nTweakCache = alloc<secp256k1_frost_tweak_cache>()
|
||||||
val nPublicKey = allocXonlyPublicKey(pk)
|
val nPublicKey = allocXonlyPublicKey(xOnlyPublicKey)
|
||||||
|
|
||||||
secp256k1_frost_pubkey_tweak(
|
secp256k1_frost_pubkey_tweak(
|
||||||
ctx = ctx,
|
ctx = ctx,
|
||||||
@ -638,7 +672,8 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun frostPublicKeyEcTweakAdd(tweakCache: ByteArray, tweak32: ByteArray): ByteArray {
|
override fun frostPublicKeyEcTweakAdd(tweakCache: ByteArray, tweak32: ByteArray): ByteArray {
|
||||||
TODO("Constraints not yet implemented")
|
require(tweakCache.size == Secp256k1.FROST_TWEAK_CACHE_SIZE)
|
||||||
|
require(tweak32.size == 32)
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nTweakCache = alloc<secp256k1_frost_tweak_cache>()
|
val nTweakCache = alloc<secp256k1_frost_tweak_cache>()
|
||||||
@ -662,7 +697,8 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun frostPublicKeyXonlyTweakAdd(tweakCache: ByteArray, tweak32: ByteArray): Pair<ByteArray, ByteArray> {
|
override fun frostPublicKeyXonlyTweakAdd(tweakCache: ByteArray, tweak32: ByteArray): Pair<ByteArray, ByteArray> {
|
||||||
TODO("Constraints not yet implemented")
|
require(tweakCache.size == Secp256k1.FROST_TWEAK_CACHE_SIZE)
|
||||||
|
require(tweak32.size == 32)
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nPublicKey = alloc<secp256k1_pubkey>()
|
val nPublicKey = alloc<secp256k1_pubkey>()
|
||||||
@ -704,11 +740,17 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
publicKey: ByteArray,
|
publicKey: ByteArray,
|
||||||
extraInput32: ByteArray?
|
extraInput32: ByteArray?
|
||||||
): Pair<ByteArray, ByteArray> {
|
): Pair<ByteArray, ByteArray> {
|
||||||
TODO("Constraints not yet implemented")
|
require(sessionId32.size == 32)
|
||||||
|
require(share.size == Secp256k1.FROST_SHARE_SIZE)
|
||||||
|
require(msg32.size == 33)
|
||||||
|
require(publicKey.size == 33 || publicKey.size == 65)
|
||||||
|
extraInput32?.let {
|
||||||
|
require(it.size == 33)
|
||||||
|
}
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nForstSecnonce = alloc<secp256k1_frost_secnonce>()
|
val nFrostSecnonce = alloc<secp256k1_frost_secnonce>()
|
||||||
val nPubnonce = alloc<secp256k1_frost_pubnonce>()
|
val nPublicNonce = alloc<secp256k1_frost_pubnonce>()
|
||||||
|
|
||||||
val nShare = allocFrostShare(share)
|
val nShare = allocFrostShare(share)
|
||||||
val nPublicKey = allocXonlyPublicKey(publicKey)
|
val nPublicKey = allocXonlyPublicKey(publicKey)
|
||||||
@ -718,8 +760,8 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
|
|
||||||
secp256k1_frost_nonce_gen(
|
secp256k1_frost_nonce_gen(
|
||||||
ctx = ctx,
|
ctx = ctx,
|
||||||
secnonce = nForstSecnonce.ptr,
|
secnonce = nFrostSecnonce.ptr,
|
||||||
pubnonce = nPubnonce.ptr,
|
pubnonce = nPublicNonce.ptr,
|
||||||
session_id32 = toNat(sessionId32),
|
session_id32 = toNat(sessionId32),
|
||||||
agg_share = nShare.ptr,
|
agg_share = nShare.ptr,
|
||||||
msg32 = toNat(msg32),
|
msg32 = toNat(msg32),
|
||||||
@ -728,8 +770,8 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
)
|
)
|
||||||
|
|
||||||
return Pair(
|
return Pair(
|
||||||
serializeFrostSecnonce(nForstSecnonce),
|
serializeFrostSecnonce(nFrostSecnonce),
|
||||||
serializeFrostPubnonce(nPubnonce)
|
serializeFrostPubnonce(nPublicNonce)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -749,7 +791,18 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
tweakCache: ByteArray,
|
tweakCache: ByteArray,
|
||||||
adaptor: ByteArray?
|
adaptor: ByteArray?
|
||||||
): ByteArray {
|
): ByteArray {
|
||||||
TODO("Constraint not yet implemented")
|
publicNonces.forEach { publicNonce ->
|
||||||
|
require(publicNonce.size == Secp256k1.FROST_PUBNONCE_SIZE)
|
||||||
|
}
|
||||||
|
require(msg32.size == 32)
|
||||||
|
require(publicKey.size == 33 || publicKey.size == 65)
|
||||||
|
ids33.forEach {
|
||||||
|
require(it.size == 33)
|
||||||
|
}
|
||||||
|
require(tweakCache.size == Secp256k1.FROST_TWEAK_CACHE_SIZE)
|
||||||
|
adaptor?.let {
|
||||||
|
require(it.size == 33 || it.size == 65)
|
||||||
|
}
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nSession = alloc<secp256k1_frost_session>();
|
val nSession = alloc<secp256k1_frost_session>();
|
||||||
@ -799,7 +852,10 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
session: ByteArray,
|
session: ByteArray,
|
||||||
tweakCache: ByteArray
|
tweakCache: ByteArray
|
||||||
): ByteArray {
|
): ByteArray {
|
||||||
TODO("Constraints not yet implemented")
|
require(secnonce.size == Secp256k1.FROST_SECNONCE_SIZE)
|
||||||
|
require(share.size == Secp256k1.FROST_SHARE_SIZE)
|
||||||
|
require(session.size == Secp256k1.FROST_SESSION_SIZE)
|
||||||
|
require(tweakCache.size == Secp256k1.FROST_TWEAK_CACHE_SIZE)
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nPartialSignature = alloc<secp256k1_frost_partial_sig>();
|
val nPartialSignature = alloc<secp256k1_frost_partial_sig>();
|
||||||
@ -835,7 +891,11 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
session: ByteArray,
|
session: ByteArray,
|
||||||
tweakCache: ByteArray
|
tweakCache: ByteArray
|
||||||
): Int {
|
): Int {
|
||||||
TODO("Constraints not yet implemented")
|
require(partialSig.size == 32)
|
||||||
|
require(publicNonce.size == Secp256k1.MUSIG2_PUBLIC_NONCE_SIZE)
|
||||||
|
require(publicShare.size == 33 || publicShare.size == 65)
|
||||||
|
require(session.size == Secp256k1.FROST_SESSION_SIZE)
|
||||||
|
require(tweakCache.size == Secp256k1.FROST_TWEAK_CACHE_SIZE)
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val nPartialSignature = allocFrostPartialSignature(partialSig)
|
val nPartialSignature = allocFrostPartialSignature(partialSig)
|
||||||
@ -858,7 +918,10 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun frostPartialSignatureAggregate(session: ByteArray, partialSignatures: Array<ByteArray>): ByteArray {
|
override fun frostPartialSignatureAggregate(session: ByteArray, partialSignatures: Array<ByteArray>): ByteArray {
|
||||||
TODO("Not yet implemented")
|
require(session.size == Secp256k1.FROST_SESSION_SIZE)
|
||||||
|
partialSignatures.forEach { partialSig ->
|
||||||
|
require(partialSig.size == 32)
|
||||||
|
}
|
||||||
|
|
||||||
memScoped {
|
memScoped {
|
||||||
val sig64 = ByteArray(64)
|
val sig64 = ByteArray(64)
|
||||||
@ -877,7 +940,6 @@ public object Secp256k1Native : Secp256k1 {
|
|||||||
|
|
||||||
return sig64
|
return sig64
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun cleanup() {
|
public override fun cleanup() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user