github.com/klaytn/klaytn@v1.12.1/crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_NativeSecp256k1.c (about) 1 #include <stdlib.h> 2 #include <stdint.h> 3 #include <string.h> 4 #include "org_bitcoin_NativeSecp256k1.h" 5 #include "include/secp256k1.h" 6 #include "include/secp256k1_ecdh.h" 7 #include "include/secp256k1_recovery.h" 8 9 10 SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone 11 (JNIEnv* env, jclass classObject, jlong ctx_l) 12 { 13 const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 14 15 jlong ctx_clone_l = (uintptr_t) secp256k1_context_clone(ctx); 16 17 (void)classObject;(void)env; 18 19 return ctx_clone_l; 20 21 } 22 23 SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize 24 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) 25 { 26 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 27 28 const unsigned char* seed = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); 29 30 (void)classObject; 31 32 return secp256k1_context_randomize(ctx, seed); 33 34 } 35 36 SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context 37 (JNIEnv* env, jclass classObject, jlong ctx_l) 38 { 39 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 40 41 secp256k1_context_destroy(ctx); 42 43 (void)classObject;(void)env; 44 } 45 46 SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify 47 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen) 48 { 49 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 50 51 unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); 52 const unsigned char* sigdata = { (unsigned char*) (data + 32) }; 53 const unsigned char* pubdata = { (unsigned char*) (data + siglen + 32) }; 54 55 secp256k1_ecdsa_signature sig; 56 secp256k1_pubkey pubkey; 57 58 int ret = secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigdata, siglen); 59 60 if( ret ) { 61 ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); 62 63 if( ret ) { 64 ret = secp256k1_ecdsa_verify(ctx, &sig, data, &pubkey); 65 } 66 } 67 68 (void)classObject; 69 70 return ret; 71 } 72 73 SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign 74 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) 75 { 76 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 77 unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); 78 unsigned char* secKey = (unsigned char*) (data + 32); 79 80 jobjectArray retArray; 81 jbyteArray sigArray, intsByteArray; 82 unsigned char intsarray[2]; 83 84 secp256k1_ecdsa_signature sig[72]; 85 86 int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL ); 87 88 unsigned char outputSer[72]; 89 size_t outputLen = 72; 90 91 if( ret ) { 92 int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2; 93 } 94 95 intsarray[0] = outputLen; 96 intsarray[1] = ret; 97 98 retArray = (*env)->NewObjectArray(env, 2, 99 (*env)->FindClass(env, "[B"), 100 (*env)->NewByteArray(env, 1)); 101 102 sigArray = (*env)->NewByteArray(env, outputLen); 103 (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer); 104 (*env)->SetObjectArrayElement(env, retArray, 0, sigArray); 105 106 intsByteArray = (*env)->NewByteArray(env, 2); 107 (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); 108 (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); 109 110 (void)classObject; 111 112 return retArray; 113 } 114 115 SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify 116 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) 117 { 118 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 119 unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); 120 121 (void)classObject; 122 123 return secp256k1_ec_seckey_verify(ctx, secKey); 124 } 125 126 SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create 127 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) 128 { 129 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 130 const unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); 131 132 secp256k1_pubkey pubkey; 133 134 jobjectArray retArray; 135 jbyteArray pubkeyArray, intsByteArray; 136 unsigned char intsarray[2]; 137 138 int ret = secp256k1_ec_pubkey_create(ctx, &pubkey, secKey); 139 140 unsigned char outputSer[65]; 141 size_t outputLen = 65; 142 143 if( ret ) { 144 int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; 145 } 146 147 intsarray[0] = outputLen; 148 intsarray[1] = ret; 149 150 retArray = (*env)->NewObjectArray(env, 2, 151 (*env)->FindClass(env, "[B"), 152 (*env)->NewByteArray(env, 1)); 153 154 pubkeyArray = (*env)->NewByteArray(env, outputLen); 155 (*env)->SetByteArrayRegion(env, pubkeyArray, 0, outputLen, (jbyte*)outputSer); 156 (*env)->SetObjectArrayElement(env, retArray, 0, pubkeyArray); 157 158 intsByteArray = (*env)->NewByteArray(env, 2); 159 (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); 160 (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); 161 162 (void)classObject; 163 164 return retArray; 165 166 } 167 168 SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add 169 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) 170 { 171 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 172 unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); 173 const unsigned char* tweak = (unsigned char*) (privkey + 32); 174 175 jobjectArray retArray; 176 jbyteArray privArray, intsByteArray; 177 unsigned char intsarray[2]; 178 179 int privkeylen = 32; 180 181 int ret = secp256k1_ec_privkey_tweak_add(ctx, privkey, tweak); 182 183 intsarray[0] = privkeylen; 184 intsarray[1] = ret; 185 186 retArray = (*env)->NewObjectArray(env, 2, 187 (*env)->FindClass(env, "[B"), 188 (*env)->NewByteArray(env, 1)); 189 190 privArray = (*env)->NewByteArray(env, privkeylen); 191 (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); 192 (*env)->SetObjectArrayElement(env, retArray, 0, privArray); 193 194 intsByteArray = (*env)->NewByteArray(env, 2); 195 (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); 196 (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); 197 198 (void)classObject; 199 200 return retArray; 201 } 202 203 SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul 204 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) 205 { 206 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 207 unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); 208 const unsigned char* tweak = (unsigned char*) (privkey + 32); 209 210 jobjectArray retArray; 211 jbyteArray privArray, intsByteArray; 212 unsigned char intsarray[2]; 213 214 int privkeylen = 32; 215 216 int ret = secp256k1_ec_privkey_tweak_mul(ctx, privkey, tweak); 217 218 intsarray[0] = privkeylen; 219 intsarray[1] = ret; 220 221 retArray = (*env)->NewObjectArray(env, 2, 222 (*env)->FindClass(env, "[B"), 223 (*env)->NewByteArray(env, 1)); 224 225 privArray = (*env)->NewByteArray(env, privkeylen); 226 (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); 227 (*env)->SetObjectArrayElement(env, retArray, 0, privArray); 228 229 intsByteArray = (*env)->NewByteArray(env, 2); 230 (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); 231 (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); 232 233 (void)classObject; 234 235 return retArray; 236 } 237 238 SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add 239 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) 240 { 241 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 242 /* secp256k1_pubkey* pubkey = (secp256k1_pubkey*) (*env)->GetDirectBufferAddress(env, byteBufferObject);*/ 243 unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); 244 const unsigned char* tweak = (unsigned char*) (pkey + publen); 245 246 jobjectArray retArray; 247 jbyteArray pubArray, intsByteArray; 248 unsigned char intsarray[2]; 249 unsigned char outputSer[65]; 250 size_t outputLen = 65; 251 252 secp256k1_pubkey pubkey; 253 int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); 254 255 if( ret ) { 256 ret = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, tweak); 257 } 258 259 if( ret ) { 260 int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; 261 } 262 263 intsarray[0] = outputLen; 264 intsarray[1] = ret; 265 266 retArray = (*env)->NewObjectArray(env, 2, 267 (*env)->FindClass(env, "[B"), 268 (*env)->NewByteArray(env, 1)); 269 270 pubArray = (*env)->NewByteArray(env, outputLen); 271 (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); 272 (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); 273 274 intsByteArray = (*env)->NewByteArray(env, 2); 275 (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); 276 (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); 277 278 (void)classObject; 279 280 return retArray; 281 } 282 283 SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul 284 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) 285 { 286 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 287 unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); 288 const unsigned char* tweak = (unsigned char*) (pkey + publen); 289 290 jobjectArray retArray; 291 jbyteArray pubArray, intsByteArray; 292 unsigned char intsarray[2]; 293 unsigned char outputSer[65]; 294 size_t outputLen = 65; 295 296 secp256k1_pubkey pubkey; 297 int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); 298 299 if ( ret ) { 300 ret = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, tweak); 301 } 302 303 if( ret ) { 304 int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; 305 } 306 307 intsarray[0] = outputLen; 308 intsarray[1] = ret; 309 310 retArray = (*env)->NewObjectArray(env, 2, 311 (*env)->FindClass(env, "[B"), 312 (*env)->NewByteArray(env, 1)); 313 314 pubArray = (*env)->NewByteArray(env, outputLen); 315 (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); 316 (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); 317 318 intsByteArray = (*env)->NewByteArray(env, 2); 319 (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); 320 (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); 321 322 (void)classObject; 323 324 return retArray; 325 } 326 327 SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1pubkey_1combine 328 (JNIEnv * env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint numkeys) 329 { 330 (void)classObject;(void)env;(void)byteBufferObject;(void)ctx_l;(void)numkeys; 331 332 return 0; 333 } 334 335 SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh 336 (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) 337 { 338 secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; 339 const unsigned char* secdata = (*env)->GetDirectBufferAddress(env, byteBufferObject); 340 const unsigned char* pubdata = (const unsigned char*) (secdata + 32); 341 342 jobjectArray retArray; 343 jbyteArray outArray, intsByteArray; 344 unsigned char intsarray[1]; 345 secp256k1_pubkey pubkey; 346 unsigned char nonce_res[32]; 347 size_t outputLen = 32; 348 349 int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); 350 351 if (ret) { 352 ret = secp256k1_ecdh( 353 ctx, 354 nonce_res, 355 &pubkey, 356 secdata 357 ); 358 } 359 360 intsarray[0] = ret; 361 362 retArray = (*env)->NewObjectArray(env, 2, 363 (*env)->FindClass(env, "[B"), 364 (*env)->NewByteArray(env, 1)); 365 366 outArray = (*env)->NewByteArray(env, outputLen); 367 (*env)->SetByteArrayRegion(env, outArray, 0, 32, (jbyte*)nonce_res); 368 (*env)->SetObjectArrayElement(env, retArray, 0, outArray); 369 370 intsByteArray = (*env)->NewByteArray(env, 1); 371 (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray); 372 (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); 373 374 (void)classObject; 375 376 return retArray; 377 }