/*
* Copyright 2013 Google Inc.
* Copyright 2014-2016 the libsecp256k1 contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.YinchengCoin;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.math.BigInteger;
import com.google.common.base.Preconditions;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import static org.YinchengCoin.NativeSecp256k1Util.*;
/**
* <p>This class holds native methods to handle ECDSA verification.</p>
*
* <p>You can find an example library that can be used for this at https://github.com/YinchengCoin/secp256k1</p>
*
* <p>To build secp256k1 for use with YinchengCoinj, run
* `./configure --enable-jni --enable-experimental --enable-module-ecdh`
* and `make` then copy `.libs/libsecp256k1.so` to your system library path
* or point the JVM to the folder containing it with -Djava.library.path
* </p>
*/
public class NativeSecp256k1 {
private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private static final Lock r = rwl.readLock();
private static final Lock w = rwl.writeLock();
private static ThreadLocal<ByteBuffer> nativeECDSABuffer = new ThreadLocal<ByteBuffer>();
/**
* Verifies the given secp256k1 signature in native code.
* Calling when enabled == false is undefined (probably library not loaded)
*
* @param data The data which was signed, must be exactly 32 bytes
* @param signature The signature
* @param pub The public key which did the signing
*/
public static boolean verify(byte[] data, byte[] signature, byte[] pub) throws AssertFailException{
Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520);
ByteBuffer byteBuff = nativeECDSABuffer.get();
if (byteBuff == null || byteBuff.capacity() < 520) {
byteBuff = ByteBuffer.allocateDirect(520);
byteBuff.order(ByteOrder.nativeOrder());
nativeECDSABuffer.set(byteBuff);
}
byteBuff.rewind();
byteBuff.put(data);
byteBuff.put(signature);
byteBuff.put(pub);
byte[][] retByteArray;
r.lock();
try {
return secp256k1_ecdsa_verify(byteBuff, Secp256k1Context.getContext(), signature.length, pub.length) == 1;
} finally {
r.unlock();
}
}
/**
* libsecp256k1 Create an ECDSA signature.
*
* @param data Message hash, 32 bytes
* @param key Secret key, 32 bytes
*
* Return values
* @param sig byte array of signature
*/
public static byte[] sign(byte[] data, byte[] sec) throws AssertFailException{
Preconditions.checkArgument(data.length == 32 && sec.length <= 32);
ByteBuffer byteBuff = nativeECDSABuffer.get();
if (byteBuff == null || byteBuff.capacity() < 32 + 32) {
byteBuff = ByteBuffer.allocateDirect(32 + 32);
byteBuff.order(ByteOrder.nativeOrder());
nativeECDSABuffer.set(byteBuff);
}
byteBuff.rewind();
byteBuff.put(data);
byteBuff.put(sec);
byte[][] retByteArray;
r.lock();
try {
retByteArray = secp256k1_ecdsa_sign(byteBuff, Secp256k1Context.getContext());
} finally {
r.unlock();
}
byte[] sigArr = retByteArray[0];
int sigLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();
int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();
assertEquals(sigArr.length, sigLen, "Got bad signature length.");
return retVal == 0 ? new byte[0] : sigArr;
}
/**
* libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid
*
* @param seckey ECDSA Secret key, 32 bytes
*/
public static boolean secKeyVerify(byte[] seckey) {
Preconditions.checkArgument(seckey.length == 32);
ByteBuffer byteBuff = nativeECDSABuffer.get();
if (byteBuff == null || byteBuff.capacity() < seckey.length) {
byteBuff = ByteBuffer.allocateDirect(seckey.length);
byteBuff.order(ByteOrder.nativeOrder());
nativeECDSABuffer.set(byteBuff);
}
byteBuff.rewind();
byteBuff.put(seckey);
r.lock();
try {
return secp256k1_ec_seckey_verify(byteBuff,Secp256k1Context.getContext()) == 1;
} finally {
r.unlock();
}
}
/**
* libsecp256k1 Compute Pubkey - computes public key from secret key
*
* @param seckey ECDSA Secret key, 32 bytes
*
* Return values
* @param pubkey ECDSA Public key, 33 or 65 bytes
*/
//TODO add a 'compressed' arg
public static byte[] computePubkey(byte[] seckey) throws AssertFailException{
Preconditions.checkArgument(seckey.length == 32);
ByteBuffer byteBuff = nativeECDSABuffer.get();
if (byteBuff == null || byteBuff.capacity() < seckey.length) {
byteBuff = ByteBuffer.allocateDirect(seckey.length);
byteBuff.order(ByteOrder.nativeOrder());
nativeECDSABuffer.set(byteBuff);
}
byteBuff.rewind();
byteBuff.put(seckey);
byte[][] retByteArray;
r.lock();
try {
retByteArray = secp256k1_ec_pubkey_create(byteBuff, Secp256k1Context.getContext());
} finally {
r.unlock();
}
byte[] pubArr = retByteArray[0];
int pubLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();
int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();
assertEquals(pubArr.length, pubLen, "Got bad pubkey length.");
return retVal == 0 ? new byte[0]: pubArr;
}
/**
* libsecp256k1 Cleanup - This destroys the secp256k1 context object
* This should be called at the end of the program for proper cleanup of the context.
*/
public static synchronized void cleanup() {
w.lock();
try {
secp256k1_destroy_context(Secp256k1Context.getContext());
} finally {
w.unlock();
}
}
public static long cloneContext() {
r.lock();
try {
return secp256k1_ctx_clone(Secp256k1Context.getContext());
} finally { r.unlock(); }
}
/**
* libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it
*
* @param tweak some bytes to tweak with
* @param seckey 32-byte seckey
*/
public static byte[] privKeyTweakMul(byte[] privkey, byte[] tweak) throws AssertFailException{
Preconditions.checkArgument(privkey.length == 32);
ByteBuffer byteBuff = nativeECDSABuffer.get();
if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) {
byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length);
byteBuff.order(ByteOrder.nativeOrder());
nativeECDSABuffer.set(byteBuff);
}
byteBuff.rewind();
byteBuff.put(privkey);
byteBuff.put(tweak);
byte[][] retByteArray;
r.lock();
try {
retByteArray = secp256k1_privkey_tweak_mul(byteBuff,Secp256k1Context.getContext());
} finally {
r.unlock();
}
byte[] privArr = retByteArray[0];
int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~
资源推荐
资源详情
资源评论
收起资源包目录
《人工智能》--openAI 人工智能区块链平台工具,数据采集,模型调用.zip (2000个子文件)
configure.ac 15KB
configure.ac 2KB
Makefile.am 15KB
Makefile.am 5KB
Makefile.am 3KB
OpenAIChainDataCollect.aps 322KB
OpenAIChainDataUse.aps 287KB
chess.aps 127KB
renju.aps 41KB
AUTHORS 293B
chess.dsp.bak 5KB
renju.dsp.bak 5KB
bitmap1.bmp 77KB
wuyanzu.bmp 50KB
filelarge.bmp 36KB
filelarge.bmp 36KB
nav_large_hc.bmp 33KB
nav_large_hc.bmp 33KB
writelarge.bmp 16KB
writelarge.bmp 16KB
filesmall.bmp 11KB
filesmall.bmp 11KB
writesmall.bmp 9KB
writesmall.bmp 9KB
bmp00001.bmp 9KB
pages_hc.bmp 7KB
pages_hc.bmp 7KB
menuimages_hc.bmp 6KB
Toolbar256.bmp 6KB
Toolbar256.bmp 6KB
nav_large.bmp 6KB
nav_large.bmp 6KB
buttons.bmp 5KB
buttons.bmp 5KB
classview_hc.bmp 5KB
pages_small_hc.bmp 3KB
pages_small_hc.bmp 3KB
main.bmp 3KB
main.bmp 3KB
fileview_hc.bmp 2KB
info.bmp 2KB
info.bmp 2KB
sort_hc.bmp 1KB
pages.bmp 1KB
pages.bmp 1KB
menuimages.bmp 1KB
Toolbar.bmp 1KB
Toolbar.bmp 1KB
classview.bmp 958B
explorer_hc.bmp 776B
pages_small.bmp 630B
pages_small.bmp 630B
fileview.bmp 478B
sort.bmp 358B
explorer.bmp 238B
build_detect_platform 9KB
tests.c 191KB
secp256k1.c 19KB
tests_exhaustive.c 19KB
ctaes.c 18KB
bench_internal.c 13KB
org_YinchengCoin_NativeSecp256k1.c 12KB
c_test.c 11KB
OpenAIChainDataCollectHandlers_p.c 9KB
OpenAIChainDataUseHandlers_p.c 9KB
test.c 5KB
lax_der_privatekey_parsing.c 5KB
bench.c 5KB
bench_verify.c 4KB
lax_der_parsing.c 4KB
gen_context.c 2KB
OpenAIChainDataCollectHandlers_i.c 2KB
OpenAIChainDataUseHandlers_i.c 2KB
bench_recover.c 2KB
OpenAIChainDataCollect_i.c 2KB
OpenAIChainDataUse_i.c 2KB
bench_ecdh.c 2KB
bench_sign.c 2KB
dlldata.c 818B
dlldata.c 810B
xdlldata.c 600B
xdlldata.c 592B
org_YinchengCoin_Secp256k1Context.c 414B
db_test.cc 62KB
version_set.cc 48KB
db_impl.cc 46KB
db_bench.cc 30KB
table_test.cc 24KB
env_win.cc 22KB
db_bench_sqlite3.cc 22KB
env_posix.cc 18KB
c.cc 16KB
db_bench_tree_db.cc 16KB
log_test.cc 16KB
fault_injection_test.cc 15KB
crc32c.cc 15KB
repair.cc 13KB
cache.cc 12KB
corruption_test.cc 10KB
memenv.cc 10KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
季风泯灭的季节
- 粉丝: 1671
- 资源: 3371
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- AILabel开发文档代码上传
- 四位数密码锁仿真 设计平台:Multisim14 实现功能:先用密码编码器来设置密码,对应的按键表示数字,如果按下的四位数字正好
- Delphi 压缩解压缩zip文件源代码,支持密码
- 一款超强文件快速拷贝工具-FastCopy Pro,v5.8.0新版本,大文件不闪退,绿色便携版~
- 基于SpringBoot+MySQL的在线考试系统源码+数据库脚本-毕业设计
- QGC地面站教学无人机使用教程.pdf
- 维护标准口径耕地细化代码和标准口径耕地细化名称.py
- FPGA XDMA 中断模式 PCIE视频采集 HDMI 本设计使用Xilinx官方的XDMA方案搭建基于Xilinx系列FPG
- STM32库开发实战指南基于STM32F103(第2版).pdf
- 自动驾驶横纵向控制,纵向采用pid控制,横向采用mpc控制,根据的是车辆二自由度车辆动力学模型,得到各矩阵之后在S函数里面进行编
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功