Using javac to generate header
This commit is contained in:
parent
720637ec24
commit
6e4763e55b
@ -51,7 +51,7 @@ kotlin {
|
|||||||
implementation(kotlin("stdlib-jdk8"))
|
implementation(kotlin("stdlib-jdk8"))
|
||||||
}
|
}
|
||||||
compilations["test"].dependencies {
|
compilations["test"].dependencies {
|
||||||
implementation(project(":jni"))
|
implementation(project(":jni:jvm"))
|
||||||
implementation(kotlin("stdlib-jdk8"))
|
implementation(kotlin("stdlib-jdk8"))
|
||||||
implementation(kotlin("test-junit"))
|
implementation(kotlin("test-junit"))
|
||||||
}
|
}
|
||||||
|
48
jni/android/build.gradle.kts
Normal file
48
jni/android/build.gradle.kts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
plugins {
|
||||||
|
id("com.android.library")
|
||||||
|
kotlin("android")
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
explicitApi()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
api(project(":jni"))
|
||||||
|
implementation(kotlin("stdlib-jdk8"))
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
defaultConfig {
|
||||||
|
compileSdkVersion(30)
|
||||||
|
minSdkVersion(21)
|
||||||
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
externalNativeBuild {
|
||||||
|
cmake {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
|
||||||
|
externalNativeBuild {
|
||||||
|
cmake {
|
||||||
|
setPath("src/main/CMakeLists.txt")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ndkVersion = "21.3.6528147"
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
tasks.withType<com.android.build.gradle.tasks.factory.AndroidUnitTest>().all {
|
||||||
|
enabled = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
configure(listOf("Debug", "Release").map { tasks["externalNativeBuild$it"] }) {
|
||||||
|
dependsOn(":native:buildSecp256k1Android")
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest package="fr.acinq.secp256k1">
|
<manifest package="fr.acinq.secp256k1.jni">
|
||||||
</manifest>
|
</manifest>
|
14
jni/android/src/main/CMakeLists.txt
Normal file
14
jni/android/src/main/CMakeLists.txt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.10.0)
|
||||||
|
|
||||||
|
add_library( secp256k1-jni SHARED
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/../../../../native/jni/src/org_bitcoin_Secp256k1CFunctions.c
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories( secp256k1-jni
|
||||||
|
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/secp256k1
|
||||||
|
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/jni/headers/java
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries( secp256k1-jni
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/../../../../native/build/android/${ANDROID_ABI}/libsecp256k1.a
|
||||||
|
)
|
@ -3,12 +3,12 @@ package fr.acinq.secp256k1.jni
|
|||||||
import fr.acinq.secp256k1.Secp256k1
|
import fr.acinq.secp256k1.Secp256k1
|
||||||
import org.bitcoin.NativeSecp256k1
|
import org.bitcoin.NativeSecp256k1
|
||||||
|
|
||||||
public actual object NativeSecp256k1Loader {
|
public object NativeSecp256k1Loader {
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Synchronized
|
@Synchronized
|
||||||
@Throws(Exception::class)
|
@Throws(Exception::class)
|
||||||
actual fun load(): Secp256k1 {
|
fun load(): Secp256k1 {
|
||||||
System.loadLibrary("secp256k1-jni")
|
System.loadLibrary("secp256k1-jni")
|
||||||
return NativeSecp256k1
|
return NativeSecp256k1
|
||||||
}
|
}
|
@ -1,104 +1,27 @@
|
|||||||
plugins {
|
plugins {
|
||||||
kotlin("multiplatform") // version "1.4-M2-mt"
|
kotlin("jvm")
|
||||||
id("com.android.library")
|
|
||||||
`maven-publish`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val currentOs = org.gradle.internal.os.OperatingSystem.current()
|
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
explicitApi()
|
explicitApi()
|
||||||
|
}
|
||||||
|
|
||||||
val commonMain by sourceSets.getting {
|
dependencies {
|
||||||
dependencies {
|
|
||||||
api(rootProject)
|
api(rootProject)
|
||||||
implementation(kotlin("stdlib-common"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val commonTest by sourceSets.getting {
|
|
||||||
dependencies {
|
|
||||||
implementation(kotlin("test-common"))
|
|
||||||
implementation(kotlin("test-annotations-common"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
jvm {
|
|
||||||
compilations.all {
|
|
||||||
kotlinOptions.jvmTarget = "1.8"
|
|
||||||
}
|
|
||||||
(tasks[compilations["main"].processResourcesTaskName] as ProcessResources).apply {
|
|
||||||
dependsOn("copyJni")
|
|
||||||
from(buildDir.resolve("jniResources"))
|
|
||||||
}
|
|
||||||
compilations["main"].dependencies {
|
|
||||||
implementation(kotlin("stdlib-jdk8"))
|
implementation(kotlin("stdlib-jdk8"))
|
||||||
}
|
|
||||||
compilations["test"].dependencies {
|
|
||||||
implementation(kotlin("test-junit"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
|
||||||
publishLibraryVariants("release", "debug")
|
|
||||||
compilations.all {
|
|
||||||
kotlinOptions.jvmTarget = "1.8"
|
|
||||||
}
|
|
||||||
sourceSets["androidMain"].dependencies {
|
|
||||||
implementation(kotlin("stdlib-jdk8"))
|
|
||||||
}
|
|
||||||
sourceSets["androidTest"].dependencies {
|
|
||||||
implementation(kotlin("test-junit"))
|
|
||||||
implementation("androidx.test.ext:junit:1.1.1")
|
|
||||||
implementation("androidx.test.espresso:espresso-core:3.2.0")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets.all {
|
|
||||||
languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
val generateJniHeaders by tasks.creating(JavaCompile::class) {
|
||||||
defaultConfig {
|
group = "build"
|
||||||
compileSdkVersion(30)
|
classpath = sourceSets["main"].compileClasspath
|
||||||
minSdkVersion(21)
|
destinationDir = file("${buildDir}/generated/jni")
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
source = sourceSets["main"].java
|
||||||
externalNativeBuild {
|
options.compilerArgs = listOf(
|
||||||
cmake {}
|
"-h", file("${buildDir}/generated/jni").absolutePath,
|
||||||
}
|
"-d", file("${buildDir}/generated/jni-tmp").absolutePath
|
||||||
}
|
)
|
||||||
|
// options.verbose = true
|
||||||
compileOptions {
|
doLast {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
delete(file("${buildDir}/generated/jni-tmp"))
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
setPath("src/androidMain/CMakeLists.txt")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ndkVersion = "21.3.6528147"
|
|
||||||
|
|
||||||
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
|
|
||||||
|
|
||||||
afterEvaluate {
|
|
||||||
tasks.withType<com.android.build.gradle.tasks.factory.AndroidUnitTest>().all {
|
|
||||||
enabled = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val copyJni by tasks.creating(Sync::class) {
|
|
||||||
dependsOn(":native:buildSecp256k1Jvm")
|
|
||||||
from(rootDir.resolve("native/build/linux/libsecp256k1-jni.so")) { rename { "libsecp256k1-jni-linux-x86_64.so" } }
|
|
||||||
from(rootDir.resolve("native/build/darwin/libsecp256k1-jni.dylib")) { rename { "libsecp256k1-jni-darwin-x86_64.dylib" } }
|
|
||||||
from(rootDir.resolve("native/build/mingw/secp256k1-jni.dll")) { rename { "secp256k1-jni-mingw-x86_64.dll" } }
|
|
||||||
into(buildDir.resolve("jniResources/fr/acinq/secp256k1/jni/native"))
|
|
||||||
}
|
|
||||||
|
|
||||||
afterEvaluate {
|
|
||||||
configure(listOf("Debug", "Release").map { tasks["externalNativeBuild$it"] }) {
|
|
||||||
dependsOn(":native:buildSecp256k1Android")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
jni/jvm/build.gradle.kts
Normal file
25
jni/jvm/build.gradle.kts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
plugins {
|
||||||
|
kotlin("jvm")
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
explicitApi()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
api(project(":jni"))
|
||||||
|
implementation(kotlin("stdlib-jdk8"))
|
||||||
|
}
|
||||||
|
|
||||||
|
val copyJni by tasks.creating(Sync::class) {
|
||||||
|
dependsOn(":native:buildSecp256k1Jvm")
|
||||||
|
from(rootDir.resolve("native/build/linux/libsecp256k1-jni.so")) { rename { "libsecp256k1-jni-linux-x86_64.so" } }
|
||||||
|
from(rootDir.resolve("native/build/darwin/libsecp256k1-jni.dylib")) { rename { "libsecp256k1-jni-darwin-x86_64.dylib" } }
|
||||||
|
from(rootDir.resolve("native/build/mingw/secp256k1-jni.dll")) { rename { "secp256k1-jni-mingw-x86_64.dll" } }
|
||||||
|
into(buildDir.resolve("jniResources/fr/acinq/secp256k1/jni/native"))
|
||||||
|
}
|
||||||
|
|
||||||
|
(tasks["processResources"] as ProcessResources).apply {
|
||||||
|
dependsOn("copyJni")
|
||||||
|
from(buildDir.resolve("jniResources"))
|
||||||
|
}
|
@ -14,7 +14,7 @@ import java.util.*
|
|||||||
*
|
*
|
||||||
* @author leo
|
* @author leo
|
||||||
*/
|
*/
|
||||||
public actual object NativeSecp256k1Loader {
|
public object NativeSecp256k1Loader {
|
||||||
private var extracted = false
|
private var extracted = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,7 +26,7 @@ public actual object NativeSecp256k1Loader {
|
|||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Synchronized
|
@Synchronized
|
||||||
@Throws(Exception::class)
|
@Throws(Exception::class)
|
||||||
public actual fun load(): Secp256k1 {
|
public fun load(): Secp256k1 {
|
||||||
// only cleanup before the first extract
|
// only cleanup before the first extract
|
||||||
if (!extracted) {
|
if (!extracted) {
|
||||||
cleanup()
|
cleanup()
|
@ -1,14 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 3.10.0)
|
|
||||||
|
|
||||||
add_library( secp256k1-jni SHARED
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/../../../native/jni/src/org_bitcoin_NativeSecp256k1.c
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/../../../native/jni/src/org_bitcoin_Secp256k1Context.c
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories( secp256k1-jni
|
|
||||||
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../native/secp256k1
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries( secp256k1-jni
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/../../../native/build/android/${ANDROID_ABI}/libsecp256k1.a
|
|
||||||
)
|
|
@ -1,10 +0,0 @@
|
|||||||
package fr.acinq.secp256k1.jni
|
|
||||||
|
|
||||||
import fr.acinq.secp256k1.Secp256k1
|
|
||||||
|
|
||||||
|
|
||||||
public expect object NativeSecp256k1Loader {
|
|
||||||
|
|
||||||
public fun load(): Secp256k1
|
|
||||||
|
|
||||||
}
|
|
24
jni/src/main/java/org/bitcoin/Secp256k1CFunctions.java
Normal file
24
jni/src/main/java/org/bitcoin/Secp256k1CFunctions.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package org.bitcoin;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
public class Secp256k1CFunctions {
|
||||||
|
static native long secp256k1_init_context();
|
||||||
|
static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context);
|
||||||
|
static native byte[][] secp256k1_privkey_negate(ByteBuffer byteBuff, long context);
|
||||||
|
static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context);
|
||||||
|
static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context);
|
||||||
|
static native byte[][] secp256k1_pubkey_negate(ByteBuffer byteBuff, long context, int pubLen);
|
||||||
|
static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen);
|
||||||
|
static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen);
|
||||||
|
static native void secp256k1_destroy_context(long context);
|
||||||
|
static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen);
|
||||||
|
static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, boolean compact, long context);
|
||||||
|
static native byte[][] secp256k1_ecdsa_normalize(ByteBuffer byteBuff, int sigLen, boolean compact, long context);
|
||||||
|
static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context);
|
||||||
|
static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, boolean compressed, long context);
|
||||||
|
static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen, boolean compressed);
|
||||||
|
static native byte[][] secp256k1_ec_pubkey_add(ByteBuffer byteBuff, long context, int lent1, int len2);
|
||||||
|
static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen);
|
||||||
|
static native byte[][] secp256k1_ecdsa_recover(ByteBuffer byteBuff, long context, int recid, boolean compressed);
|
||||||
|
}
|
@ -40,7 +40,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock
|
|||||||
* or point the JVM to the folder containing it with -Djava.library.path
|
* or point the JVM to the folder containing it with -Djava.library.path
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
internal object NativeSecp256k1 : Secp256k1 {
|
public object NativeSecp256k1 : Secp256k1 {
|
||||||
private val rwl = ReentrantReadWriteLock()
|
private val rwl = ReentrantReadWriteLock()
|
||||||
private val r: Lock = rwl.readLock()
|
private val r: Lock = rwl.readLock()
|
||||||
private val w: Lock = rwl.writeLock()
|
private val w: Lock = rwl.writeLock()
|
||||||
@ -80,7 +80,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val byteBuff = pack(data, signature, pub)
|
val byteBuff = pack(data, signature, pub)
|
||||||
r.lock()
|
r.lock()
|
||||||
return try {
|
return try {
|
||||||
secp256k1_ecdsa_verify(
|
Secp256k1CFunctions.secp256k1_ecdsa_verify(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
signature.size,
|
signature.size,
|
||||||
@ -107,7 +107,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_ecdsa_sign(
|
Secp256k1CFunctions.secp256k1_ecdsa_sign(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
format == SigFormat.COMPACT,
|
format == SigFormat.COMPACT,
|
||||||
Secp256k1Context.getContext()
|
Secp256k1Context.getContext()
|
||||||
@ -133,7 +133,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_ecdsa_normalize(
|
Secp256k1CFunctions.secp256k1_ecdsa_normalize(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
sig.size,
|
sig.size,
|
||||||
format == SigFormat.COMPACT,
|
format == SigFormat.COMPACT,
|
||||||
@ -165,7 +165,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val byteBuff = pack(seckey)
|
val byteBuff = pack(seckey)
|
||||||
r.lock()
|
r.lock()
|
||||||
return try {
|
return try {
|
||||||
secp256k1_ec_seckey_verify(
|
Secp256k1CFunctions.secp256k1_ec_seckey_verify(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext()
|
Secp256k1Context.getContext()
|
||||||
) == 1
|
) == 1
|
||||||
@ -189,7 +189,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_ec_pubkey_create(
|
Secp256k1CFunctions.secp256k1_ec_pubkey_create(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
format == PubKeyFormat.COMPRESSED,
|
format == PubKeyFormat.COMPRESSED,
|
||||||
Secp256k1Context.getContext()
|
Secp256k1Context.getContext()
|
||||||
@ -216,7 +216,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_ec_pubkey_parse(
|
Secp256k1CFunctions.secp256k1_ec_pubkey_parse(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
pubkey.size,
|
pubkey.size,
|
||||||
@ -244,7 +244,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
override fun cleanup() {
|
override fun cleanup() {
|
||||||
w.lock()
|
w.lock()
|
||||||
try {
|
try {
|
||||||
secp256k1_destroy_context(Secp256k1Context.getContext())
|
Secp256k1CFunctions.secp256k1_destroy_context(Secp256k1Context.getContext())
|
||||||
} finally {
|
} finally {
|
||||||
w.unlock()
|
w.unlock()
|
||||||
}
|
}
|
||||||
@ -257,7 +257,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_privkey_negate(
|
Secp256k1CFunctions.secp256k1_privkey_negate(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext()
|
Secp256k1Context.getContext()
|
||||||
)
|
)
|
||||||
@ -291,7 +291,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_privkey_tweak_mul(
|
Secp256k1CFunctions.secp256k1_privkey_tweak_mul(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext()
|
Secp256k1Context.getContext()
|
||||||
)
|
)
|
||||||
@ -325,7 +325,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_privkey_tweak_add(
|
Secp256k1CFunctions.secp256k1_privkey_tweak_add(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext()
|
Secp256k1Context.getContext()
|
||||||
)
|
)
|
||||||
@ -347,7 +347,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_pubkey_negate(
|
Secp256k1CFunctions.secp256k1_pubkey_negate(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
pubkey.size
|
pubkey.size
|
||||||
@ -378,7 +378,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_pubkey_tweak_add(
|
Secp256k1CFunctions.secp256k1_pubkey_tweak_add(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
pubkey.size
|
pubkey.size
|
||||||
@ -409,7 +409,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_pubkey_tweak_mul(
|
Secp256k1CFunctions.secp256k1_pubkey_tweak_mul(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
pubkey.size
|
pubkey.size
|
||||||
@ -433,7 +433,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_ec_pubkey_add(
|
Secp256k1CFunctions.secp256k1_ec_pubkey_add(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
pubkey1.size,
|
pubkey1.size,
|
||||||
@ -465,7 +465,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_ecdh(
|
Secp256k1CFunctions.secp256k1_ecdh(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
pubkey.size
|
pubkey.size
|
||||||
@ -488,7 +488,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val retByteArray: Array<ByteArray>
|
val retByteArray: Array<ByteArray>
|
||||||
r.lock()
|
r.lock()
|
||||||
retByteArray = try {
|
retByteArray = try {
|
||||||
secp256k1_ecdsa_recover(
|
Secp256k1CFunctions.secp256k1_ecdsa_recover(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext(),
|
Secp256k1Context.getContext(),
|
||||||
recid,
|
recid,
|
||||||
@ -522,7 +522,7 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
val byteBuff = pack(seed)
|
val byteBuff = pack(seed)
|
||||||
w.lock()
|
w.lock()
|
||||||
return try {
|
return try {
|
||||||
secp256k1_context_randomize(
|
Secp256k1CFunctions.secp256k1_context_randomize(
|
||||||
byteBuff,
|
byteBuff,
|
||||||
Secp256k1Context.getContext()
|
Secp256k1Context.getContext()
|
||||||
) == 1
|
) == 1
|
||||||
@ -530,22 +530,4 @@ internal object NativeSecp256k1 : Secp256k1 {
|
|||||||
w.unlock()
|
w.unlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic private external fun secp256k1_context_randomize(byteBuff: ByteBuffer, context: Long): Int
|
|
||||||
@JvmStatic private external fun secp256k1_privkey_negate(byteBuff: ByteBuffer, context: Long): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_privkey_tweak_add(byteBuff: ByteBuffer, context: Long): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_privkey_tweak_mul(byteBuff: ByteBuffer, context: Long): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_pubkey_negate(byteBuff: ByteBuffer, context: Long, pubLen: Int): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_pubkey_tweak_add(byteBuff: ByteBuffer, context: Long, pubLen: Int): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_pubkey_tweak_mul(byteBuff: ByteBuffer, context: Long, pubLen: Int): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_destroy_context(context: Long)
|
|
||||||
@JvmStatic private external fun secp256k1_ecdsa_verify(byteBuff: ByteBuffer, context: Long, sigLen: Int, pubLen: Int): Int
|
|
||||||
@JvmStatic private external fun secp256k1_ecdsa_sign(byteBuff: ByteBuffer, compact: Boolean, context: Long): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_ecdsa_normalize(byteBuff: ByteBuffer, sigLen: Int, compact: Boolean, context: Long): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_ec_seckey_verify(byteBuff: ByteBuffer, context: Long): Int
|
|
||||||
@JvmStatic private external fun secp256k1_ec_pubkey_create(byteBuff: ByteBuffer, compressed: Boolean, context: Long): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_ec_pubkey_parse(byteBuff: ByteBuffer, context: Long, inputLen: Int, compressed: Boolean): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_ec_pubkey_add(byteBuff: ByteBuffer, context: Long, lent1: Int, len2: Int): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_ecdh(byteBuff: ByteBuffer, context: Long, inputLen: Int): Array<ByteArray>
|
|
||||||
@JvmStatic private external fun secp256k1_ecdsa_recover(byteBuff: ByteBuffer, context: Long, recid: Int, compressed: Boolean): Array<ByteArray>
|
|
||||||
}
|
}
|
@ -29,11 +29,8 @@ public object Secp256k1Context {
|
|||||||
return if (!isEnabled) -1 else context //sanity check
|
return if (!isEnabled) -1 else context //sanity check
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic private external fun secp256k1_init_context(): Long
|
|
||||||
|
|
||||||
init { //static initializer
|
init { //static initializer
|
||||||
isEnabled = true
|
isEnabled = true
|
||||||
context =
|
context = Secp256k1CFunctions.secp256k1_init_context()
|
||||||
secp256k1_init_context()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,9 +1,16 @@
|
|||||||
evaluationDependsOn(":jni")
|
evaluationDependsOn(":jni:android")
|
||||||
|
|
||||||
val currentOs = org.gradle.internal.os.OperatingSystem.current()
|
val currentOs = org.gradle.internal.os.OperatingSystem.current()
|
||||||
|
|
||||||
val buildSecp256k1 by tasks.creating { group = "build" }
|
val buildSecp256k1 by tasks.creating { group = "build" }
|
||||||
|
|
||||||
|
val generateJniHeaders by tasks.creating(Sync::class) {
|
||||||
|
group = "build"
|
||||||
|
dependsOn(":jni:generateJniHeaders")
|
||||||
|
from(rootDir.resolve("jni/build/generated/jni"))
|
||||||
|
into(projectDir.resolve("jni/headers/java"))
|
||||||
|
}
|
||||||
|
|
||||||
sealed class Cross {
|
sealed class Cross {
|
||||||
abstract fun cmd(target: String, nativeDir: File): List<String>
|
abstract fun cmd(target: String, nativeDir: File): List<String>
|
||||||
class DockCross(val cross: String) : Cross() {
|
class DockCross(val cross: String) : Cross() {
|
||||||
@ -73,7 +80,7 @@ fun creatingBuildSecp256k1Android(arch: String) = tasks.creating(Exec::class) {
|
|||||||
}
|
}
|
||||||
environment("TOOLCHAIN", toolchain)
|
environment("TOOLCHAIN", toolchain)
|
||||||
environment("ARCH", arch)
|
environment("ARCH", arch)
|
||||||
environment("ANDROID_NDK", (project(":jni").extensions["android"] as com.android.build.gradle.LibraryExtension).ndkDirectory)
|
environment("ANDROID_NDK", (project(":jni:android").extensions["android"] as com.android.build.gradle.LibraryExtension).ndkDirectory)
|
||||||
commandLine("./build-android.sh")
|
commandLine("./build-android.sh")
|
||||||
}
|
}
|
||||||
val buildSecp256k1AndroidX86_64 by creatingBuildSecp256k1Android("x86_64")
|
val buildSecp256k1AndroidX86_64 by creatingBuildSecp256k1Android("x86_64")
|
||||||
@ -82,6 +89,7 @@ val buildSecp256k1AndroidArm64v8a by creatingBuildSecp256k1Android("arm64-v8a")
|
|||||||
val buildSecp256k1AndroidArmeabiv7a by creatingBuildSecp256k1Android("armeabi-v7a")
|
val buildSecp256k1AndroidArmeabiv7a by creatingBuildSecp256k1Android("armeabi-v7a")
|
||||||
|
|
||||||
val clean by tasks.creating {
|
val clean by tasks.creating {
|
||||||
|
group = "build"
|
||||||
doLast {
|
doLast {
|
||||||
delete(projectDir.resolve("build"))
|
delete(projectDir.resolve("build"))
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ elif [ "$TARGET" == "mingw" ]; then
|
|||||||
CC_OPTS="-fpic"
|
CC_OPTS="-fpic"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$CC -shared $CC_OPTS -o build/$TARGET/$OUTFILE jni/src/org_bitcoin_NativeSecp256k1.c jni/src/org_bitcoin_Secp256k1Context.c -Ijni/headers/ -Ijni/headers/$JNI_HEADERS/ -Isecp256k1/ -lsecp256k1 -Lbuild/$TARGET/ $ADD_LIB
|
$CC -shared $CC_OPTS -o build/$TARGET/$OUTFILE jni/src/org_bitcoin_Secp256k1CFunctions.c -Ijni/headers/ -Ijni/headers/java -Ijni/headers/$JNI_HEADERS/ -Isecp256k1/ -lsecp256k1 -Lbuild/$TARGET/ $ADD_LIB
|
||||||
|
|
||||||
[[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID build
|
[[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID build
|
||||||
|
|
||||||
|
157
native/jni/headers/java/org_bitcoin_Secp256k1CFunctions.h
Normal file
157
native/jni/headers/java/org_bitcoin_Secp256k1CFunctions.h
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class org_bitcoin_Secp256k1CFunctions */
|
||||||
|
|
||||||
|
#ifndef _Included_org_bitcoin_Secp256k1CFunctions
|
||||||
|
#define _Included_org_bitcoin_Secp256k1CFunctions
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_init_context
|
||||||
|
* Signature: ()J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1init_1context
|
||||||
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_context_randomize
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;J)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1context_1randomize
|
||||||
|
(JNIEnv *, jclass, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_privkey_negate
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;J)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1negate
|
||||||
|
(JNIEnv *, jclass, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_privkey_tweak_add
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;J)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1tweak_1add
|
||||||
|
(JNIEnv *, jclass, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_privkey_tweak_mul
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;J)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1tweak_1mul
|
||||||
|
(JNIEnv *, jclass, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_pubkey_negate
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1negate
|
||||||
|
(JNIEnv *, jclass, jobject, jlong, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_pubkey_tweak_add
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1tweak_1add
|
||||||
|
(JNIEnv *, jclass, jobject, jlong, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_pubkey_tweak_mul
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1tweak_1mul
|
||||||
|
(JNIEnv *, jclass, jobject, jlong, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_destroy_context
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1destroy_1context
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ecdsa_verify
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;JII)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1verify
|
||||||
|
(JNIEnv *, jclass, jobject, jlong, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ecdsa_sign
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;ZJ)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1sign
|
||||||
|
(JNIEnv *, jclass, jobject, jboolean, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ecdsa_normalize
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;IZJ)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1normalize
|
||||||
|
(JNIEnv *, jclass, jobject, jint, jboolean, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ec_seckey_verify
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;J)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1seckey_1verify
|
||||||
|
(JNIEnv *, jclass, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ec_pubkey_create
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;ZJ)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1create
|
||||||
|
(JNIEnv *, jclass, jobject, jboolean, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ec_pubkey_parse
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;JIZ)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1parse
|
||||||
|
(JNIEnv *, jclass, jobject, jlong, jint, jboolean);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ec_pubkey_add
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;JII)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1add
|
||||||
|
(JNIEnv *, jclass, jobject, jlong, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ecdh
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdh
|
||||||
|
(JNIEnv *, jclass, jobject, jlong, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_bitcoin_Secp256k1CFunctions
|
||||||
|
* Method: secp256k1_ecdsa_recover
|
||||||
|
* Signature: (Ljava/nio/ByteBuffer;JIZ)[[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1recover
|
||||||
|
(JNIEnv *, jclass, jobject, jlong, jint, jboolean);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
@ -1,157 +0,0 @@
|
|||||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
|
||||||
#include <jni.h>
|
|
||||||
/* Header for class org_bitcoin_NativeSecp256k1 */
|
|
||||||
|
|
||||||
#ifndef _Included_org_bitcoin_NativeSecp256k1
|
|
||||||
#define _Included_org_bitcoin_NativeSecp256k1
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ctx_clone
|
|
||||||
* Signature: (J)J
|
|
||||||
*/
|
|
||||||
JNIEXPORT jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone
|
|
||||||
(JNIEnv *, jclass, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_context_randomize
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;J)I
|
|
||||||
*/
|
|
||||||
JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize
|
|
||||||
(JNIEnv *, jclass, jobject, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_privkey_negate
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;J)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1negate
|
|
||||||
(JNIEnv *, jclass, jobject, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_privkey_tweak_add
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;J)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add
|
|
||||||
(JNIEnv *, jclass, jobject, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_privkey_tweak_mul
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;J)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul
|
|
||||||
(JNIEnv *, jclass, jobject, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_pubkey_negate
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1negate
|
|
||||||
(JNIEnv *, jclass, jobject, jlong, jint);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_pubkey_tweak_add
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add
|
|
||||||
(JNIEnv *, jclass, jobject, jlong, jint);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_pubkey_tweak_mul
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul
|
|
||||||
(JNIEnv *, jclass, jobject, jlong, jint);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_destroy_context
|
|
||||||
* Signature: (J)V
|
|
||||||
*/
|
|
||||||
JNIEXPORT void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context
|
|
||||||
(JNIEnv *, jclass, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ecdsa_verify
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JII)I
|
|
||||||
*/
|
|
||||||
JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify
|
|
||||||
(JNIEnv *, jclass, jobject, jlong, jint, jint);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ecdsa_sign
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;ZJ)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign
|
|
||||||
(JNIEnv *, jclass, jobject, jboolean, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ecdsa_normalize
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;I114:1ZJ)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1normalize
|
|
||||||
(JNIEnv *, jclass, jobject, jint, jboolean, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ec_seckey_verify
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;J)I
|
|
||||||
*/
|
|
||||||
JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify
|
|
||||||
(JNIEnv *, jclass, jobject, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ec_pubkey_create
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;ZJ)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create
|
|
||||||
(JNIEnv *, jclass, jobject, jboolean, jlong);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ec_pubkey_parse
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JIZ)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse
|
|
||||||
(JNIEnv *, jclass, jobject, jlong, jint, jboolean);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ec_pubkey_add
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JII)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1add
|
|
||||||
(JNIEnv *, jclass, jobject, jlong, jint, jint);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ecdh
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh
|
|
||||||
(JNIEnv *, jclass, jobject, jlong, jint);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_NativeSecp256k1
|
|
||||||
* Method: secp256k1_ecdsa_recover
|
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JIZ)[[B
|
|
||||||
*/
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1recover
|
|
||||||
(JNIEnv *, jclass, jobject, jlong, jint, jboolean);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
@ -1,13 +1,23 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "org_bitcoin_NativeSecp256k1.h"
|
#include "org_bitcoin_Secp256k1CFunctions.h"
|
||||||
#include "include/secp256k1.h"
|
#include "include/secp256k1.h"
|
||||||
#include "include/secp256k1_ecdh.h"
|
#include "include/secp256k1_ecdh.h"
|
||||||
#include "include/secp256k1_recovery.h"
|
#include "include/secp256k1_recovery.h"
|
||||||
|
|
||||||
|
|
||||||
SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone
|
SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1init_1context
|
||||||
|
(JNIEnv* env, jclass classObject)
|
||||||
|
{
|
||||||
|
secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
|
||||||
|
|
||||||
|
(void)classObject;(void)env;
|
||||||
|
|
||||||
|
return (uintptr_t)ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ctx_1clone
|
||||||
(JNIEnv* env, jclass classObject, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jlong ctx_l)
|
||||||
{
|
{
|
||||||
const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -20,7 +30,7 @@ SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clo
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize
|
SECP256K1_API jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1context_1randomize
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -33,7 +43,7 @@ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context
|
SECP256K1_API void JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1destroy_1context
|
||||||
(JNIEnv* env, jclass classObject, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -43,7 +53,7 @@ SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1
|
|||||||
(void)classObject;(void)env;
|
(void)classObject;(void)env;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify
|
SECP256K1_API jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1verify
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -75,7 +85,7 @@ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1ve
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1sign
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jboolean compact, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jboolean compact, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -121,7 +131,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1normalize
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1normalize
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jint siglen, jboolean compact, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jint siglen, jboolean compact, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -178,7 +188,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify
|
SECP256K1_API jint JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1seckey_1verify
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -189,7 +199,7 @@ SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1secke
|
|||||||
return secp256k1_ec_seckey_verify(ctx, secKey);
|
return secp256k1_ec_seckey_verify(ctx, secKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1create
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jboolean compressed, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jboolean compressed, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -230,7 +240,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1parse
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint inputlen, jboolean compressed)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint inputlen, jboolean compressed)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -271,7 +281,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1negate
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1negate
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -305,7 +315,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1tweak_1add
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -340,7 +350,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1privkey_1tweak_1mul
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -375,7 +385,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1negate
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1negate
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -418,7 +428,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubke
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1tweak_1add
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -463,7 +473,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1pubkey_1tweak_1mul
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -507,7 +517,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1p
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1add
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ec_1pubkey_1add
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen1, jint publen2)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen1, jint publen2)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -554,7 +564,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1p
|
|||||||
return retArray;
|
return retArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh
|
SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdh
|
||||||
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
|
(JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
||||||
@ -605,7 +615,7 @@ SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1e
|
|||||||
* Method: secp256k1_ecdsa_recover
|
* Method: secp256k1_ecdsa_recover
|
||||||
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
* Signature: (Ljava/nio/ByteBuffer;JI)[[B
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1recover
|
JNIEXPORT jobjectArray JNICALL Java_org_bitcoin_Secp256k1CFunctions_secp256k1_1ecdsa_1recover
|
||||||
(JNIEnv *env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint recid, jboolean compressed)
|
(JNIEnv *env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint recid, jboolean compressed)
|
||||||
{
|
{
|
||||||
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;
|
@ -1,15 +0,0 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "org_bitcoin_Secp256k1Context.h"
|
|
||||||
#include "include/secp256k1.h"
|
|
||||||
|
|
||||||
SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context
|
|
||||||
(JNIEnv* env, jclass classObject)
|
|
||||||
{
|
|
||||||
secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
|
|
||||||
|
|
||||||
(void)classObject;(void)env;
|
|
||||||
|
|
||||||
return (uintptr_t)ctx;
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
|
||||||
#include <jni.h>
|
|
||||||
#include "include/secp256k1.h"
|
|
||||||
/* Header for class org_bitcoin_Secp256k1Context */
|
|
||||||
|
|
||||||
#ifndef _Included_org_bitcoin_Secp256k1Context
|
|
||||||
#define _Included_org_bitcoin_Secp256k1Context
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Class: org_bitcoin_Secp256k1Context
|
|
||||||
* Method: secp256k1_init_context
|
|
||||||
* Signature: ()J
|
|
||||||
*/
|
|
||||||
SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context
|
|
||||||
(JNIEnv *, jclass);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
@ -10,5 +10,8 @@ rootProject.name = "secp256k1-kmp"
|
|||||||
|
|
||||||
include(
|
include(
|
||||||
":native",
|
":native",
|
||||||
":jni"
|
":jni",
|
||||||
|
":jni:android",
|
||||||
|
":jni:jvm"
|
||||||
|
// ":jni"
|
||||||
)
|
)
|
@ -2,11 +2,11 @@ package fr.acinq.secp256k1
|
|||||||
|
|
||||||
import kotlin.jvm.JvmStatic
|
import kotlin.jvm.JvmStatic
|
||||||
|
|
||||||
internal object Hex {
|
public object Hex {
|
||||||
private val hexCode = arrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')
|
private val hexCode = arrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun decode(hex: String): ByteArray {
|
public fun decode(hex: String): ByteArray {
|
||||||
val input = hex.filterNot { it.isWhitespace() }
|
val input = hex.filterNot { it.isWhitespace() }
|
||||||
val offset = when {
|
val offset = when {
|
||||||
input.length >= 2 && input[0] == '0' && input[1] == 'x' -> 2
|
input.length >= 2 && input[0] == '0' && input[1] == 'x' -> 2
|
||||||
@ -32,7 +32,7 @@ internal object Hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun encode(input: ByteArray, offset: Int, len: Int): String {
|
public fun encode(input: ByteArray, offset: Int, len: Int): String {
|
||||||
val r = StringBuilder(len * 2)
|
val r = StringBuilder(len * 2)
|
||||||
for (i in 0 until len) {
|
for (i in 0 until len) {
|
||||||
val b = input[offset + i]
|
val b = input[offset + i]
|
||||||
@ -43,5 +43,5 @@ internal object Hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun encode(input: ByteArray): String = encode(input, 0, input.size)
|
public fun encode(input: ByteArray): String = encode(input, 0, input.size)
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user