XYOracleNetwork/sdk-core-kotlin

View on GitHub
core-android-library/src/main/kotlin/network/xyo/sdkcorekotlin/crypto/signing/ecdsa/secp256k/XyoEcSecp256K1.kt

Summary

Maintainability
A
0 mins
Test Coverage
package network.xyo.sdkcorekotlin.crypto.signing.ecdsa.secp256k

import network.xyo.sdkcorekotlin.crypto.signing.XyoPublicKey
import network.xyo.sdkcorekotlin.crypto.signing.ecdsa.XyoEcPrivateKey
import network.xyo.sdkcorekotlin.crypto.signing.ecdsa.XyoGeneralEc
import network.xyo.sdkcorekotlin.crypto.signing.ecdsa.XyoUncompressedEcPublicKey
import org.bouncycastle.crypto.params.ECDomainParameters
import org.bouncycastle.jce.ECNamedCurveTable
import org.bouncycastle.jce.interfaces.ECPrivateKey
import org.bouncycastle.jce.interfaces.ECPublicKey
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec
import org.bouncycastle.jce.spec.ECParameterSpec
import java.math.BigInteger
import java.security.KeyPair


/**
 * A base class for all EC operations using the Secp256K curve.
 */
abstract class XyoEcSecp256K1 (privateKey: ECPrivateKey?) : XyoGeneralEc(privateKey) {
    override val spec: ECParameterSpec
        get() = ecSpec

    override val publicKey: XyoPublicKey
        get() = keyPair.public as XyoPublicKey

    override val privateKey: XyoEcPrivateKey
        get() = keyPair.private as XyoEcPrivateKey

    override fun ecKeyPairToXyoKeyPair(ecPublicKey: ECPublicKey, ecPrivateKey : ECPrivateKey): KeyPair {
        return KeyPair(
                object : XyoUncompressedEcPublicKey() {
                    override val x: BigInteger
                        get() = ecPublicKey.q.xCoord.toBigInteger()

                    override val y: BigInteger
                        get() = ecPublicKey.q.yCoord.toBigInteger()

                    override var allowedOffset: Int = 0

                    override val ecSpec: ECParameterSpec = spec
                },
                XyoEcPrivateKey.getInstanceFromQ(ecPrivateKey.d, spec)
        )
    }

    companion object {
        val ecCurve : ECNamedCurveParameterSpec = ECNamedCurveTable.getParameterSpec("secp256k1")
        val ecDomainParameters = ECDomainParameters(ecCurve.curve, ecCurve.g, ecCurve.n)
        val ecSpec: ECParameterSpec = ECParameterSpec(ecCurve.curve, ecCurve.g, ecCurve.n)
    }
}