开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 3

睿凡/sharecode

forked from dwing/sharecode
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
main
分支 (1)
main
main
分支 (1)
main
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
main
分支 (1)
main
sharecode
/
java
/
src
/
TestEcdsa.java
sharecode
/
java
/
src
/
TestEcdsa.java
TestEcdsa.java 6.87 KB
一键复制 编辑 原始数据 按行查看 历史
dwing 提交于 2024年07月12日 17:41 +08:00 . java: move Unsafe calls to UnsafeUtil; fix warnings
import java.lang.foreign.Arena;
import java.lang.foreign.FunctionDescriptor;
import java.lang.foreign.Linker;
import java.lang.foreign.MemorySegment;
import java.lang.foreign.SymbolLookup;
import java.lang.invoke.MethodHandle;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import static java.lang.foreign.ValueLayout.ADDRESS;
import static java.lang.foreign.ValueLayout.JAVA_INT;
/**
* <p>compile with: -J-Duser.language=en
* <p>run with: --enable-native-access=ALL-UNNAMED
*
* @see <a href="https://openjdk.org/jeps/434">FFI reference</a>
*/
@SuppressWarnings("OptionalGetWithoutIsPresent")
public class TestEcdsa {
public static final int SECP256K1_FLAGS_TYPE_CONTEXT = 1;
public static final int SECP256K1_CONTEXT_NONE = SECP256K1_FLAGS_TYPE_CONTEXT;
public static final MethodHandle mh_secp256k1_context_create;
public static final MethodHandle mh_secp256k1_context_randomize;
public static final MethodHandle mh_secp256k1_context_destroy;
public static final MethodHandle mh_secp256k1_ec_seckey_verify; // 验证随机数据是否可以作为私钥
public static final MethodHandle mh_secp256k1_ec_pubkey_create; // 用私钥创建公钥
public static final MethodHandle mh_secp256k1_ecdsa_sign_recoverable; // 用私钥为hash256生成签名
public static final MethodHandle mh_secp256k1_ecdsa_recover; // 用签名和hash256还原公钥
static {
// https://github.com/bitcoin-core/secp256k1
// x86_64-w64-mingw32-gcc.exe -DENABLE_MODULE_ECDH=1 -DENABLE_MODULE_RECOVERY=1 -DENABLE_MODULE_SCHNORRSIG=1 -DENABLE_MODULE_EXTRAKEYS=1 -DDLL_EXPORT -DUSE_FORCE_WIDEMUL_INT128=1 -DUSE_ASM_X86_64=1 -m64 -O3 -shared -o libsecp256k1.dll src/secp256k1.c src/precomputed_ecmult.c src/precomputed_ecmult_gen.c
// cl /O2 /LD /MT -I. -DENABLE_MODULE_ECDH=1 -DENABLE_MODULE_RECOVERY=1 -DENABLE_MODULE_SCHNORRSIG=1 -DENABLE_MODULE_EXTRAKEYS=1 -DDLL_EXPORT src/secp256k1.c src/precomputed_ecmult.c src/precomputed_ecmult_gen.c
var libSecp256k1 = SymbolLookup.libraryLookup("libsecp256k1.dll", Arena.global());
var linker = Linker.nativeLinker();
// secp256k1_context*(unsigned int flags)
mh_secp256k1_context_create = linker.downcallHandle(
libSecp256k1.find("secp256k1_context_create").get(),
FunctionDescriptor.of(ADDRESS, JAVA_INT));
// int(secp256k1_context* ctx, const unsigned char* seed32)
mh_secp256k1_context_randomize = linker.downcallHandle(
libSecp256k1.find("secp256k1_context_randomize").get(),
FunctionDescriptor.of(JAVA_INT, ADDRESS, ADDRESS));
// void(secp256k1_context* ctx)
mh_secp256k1_context_destroy = linker.downcallHandle(
libSecp256k1.find("secp256k1_context_destroy").get(),
FunctionDescriptor.ofVoid(ADDRESS));
// int(const secp256k1_context* ctx, const unsigned char* seckey)
mh_secp256k1_ec_seckey_verify = linker.downcallHandle(
libSecp256k1.find("secp256k1_ec_seckey_verify").get(),
FunctionDescriptor.of(JAVA_INT, ADDRESS, ADDRESS));
// int(const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char* seckey)
mh_secp256k1_ec_pubkey_create = linker.downcallHandle(
libSecp256k1.find("secp256k1_ec_pubkey_create").get(),
FunctionDescriptor.of(JAVA_INT, ADDRESS, ADDRESS, ADDRESS));
// int(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature* signature,
// const unsigned char* msghash32, const unsigned char* seckey,
// secp256k1_nonce_function noncefp, const void* noncedata)
mh_secp256k1_ecdsa_sign_recoverable = linker.downcallHandle(
libSecp256k1.find("secp256k1_ecdsa_sign_recoverable").get(),
FunctionDescriptor.of(JAVA_INT, ADDRESS, ADDRESS, ADDRESS, ADDRESS, ADDRESS, ADDRESS));
// int(const secp256k1_context* ctx, secp256k1_pubkey* pubkey,
// const secp256k1_ecdsa_recoverable_signature* signature, const unsigned char* msghash32)
mh_secp256k1_ecdsa_recover = linker.downcallHandle(
libSecp256k1.find("secp256k1_ecdsa_recover").get(),
FunctionDescriptor.of(JAVA_INT, ADDRESS, ADDRESS, ADDRESS, ADDRESS));
}
public static int num2Hex(int n) {
return n + '0' + (((9 - n) >> 31) & ('A' - '9' - 1));
}
public static String toString(ByteBuffer bb) {
int len = bb.limit();
if (len <= 0)
return "";
var str = new byte[len * 3 - 1];
for (int i = 0, j = 0; i < len; i++) {
if (i > 0)
str[j++] = '-';
int b = bb.get(i);
str[j++] = (byte)num2Hex((b >> 4) & 0xf);
str[j++] = (byte)num2Hex(b & 0xf);
}
return new String(str, StandardCharsets.ISO_8859_1);
}
private static final SecureRandom secRand = new SecureRandom();
public static void rand(ByteBuffer bb) {
byte[] buf = new byte[bb.limit()];
secRand.nextBytes(buf);
bb.put(0, buf);
}
public static void main(String[] args) throws Throwable {
try (Arena arena = Arena.ofConfined()) {
var priKey = arena.allocate(32);
var pubKey = arena.allocate(64);
var msgHash = arena.allocate(32);
var sigData = arena.allocate(65);
var pubKey2 = arena.allocate(64);
var priKeyBB = priKey.asByteBuffer();
var pubKeyBB = pubKey.asByteBuffer();
var msgHashBB = msgHash.asByteBuffer();
var sigDataBB = sigData.asByteBuffer();
var pubKey2BB = pubKey2.asByteBuffer();
var ctx = (MemorySegment)mh_secp256k1_context_create.invokeExact(SECP256K1_CONTEXT_NONE);
rand(priKeyBB);
int r = (int)mh_secp256k1_context_randomize.invokeExact(ctx, priKey);
System.out.println("secp256k1_context_randomize: " + r);
do {
rand(priKeyBB);
r = (int)mh_secp256k1_ec_seckey_verify.invokeExact(ctx, priKey);
System.out.println("secp256k1_ec_seckey_verify: " + r);
} while (r != 1);
System.out.println("priKey : [" + priKey.byteSize() + "] " + toString(priKeyBB));
r = (int)mh_secp256k1_ec_pubkey_create.invokeExact(ctx, pubKey, priKey);
System.out.println("secp256k1_ec_pubkey_create: " + r);
System.out.println("pubKey : [" + pubKey.byteSize() + "] " + toString(pubKeyBB));
rand(msgHashBB);
r = (int)mh_secp256k1_ecdsa_sign_recoverable.invokeExact(ctx, sigData, msgHash, priKey,
MemorySegment.NULL, MemorySegment.NULL);
System.out.println("secp256k1_ecdsa_sign_recoverable: " + r);
System.out.println("sigData: [" + sigData.byteSize() + "] " + toString(sigDataBB));
r = (int)mh_secp256k1_ecdsa_recover.invokeExact(ctx, pubKey2, sigData, msgHash);
System.out.println("mh_secp256k1_ecdsa_recover: " + r);
System.out.println("pubKey2: [" + pubKey2.byteSize() + "] " + toString(pubKey2BB));
System.out.println("checkPubKey: " + pubKeyBB.equals(pubKey2BB));
mh_secp256k1_context_destroy.invokeExact(ctx);
System.out.println("TEST OK!");
for (int j = 0; j < 5; j++) {
var t = System.nanoTime();
for (int i = 0; i < 10000; i++) {
r = (int)mh_secp256k1_ecdsa_recover.invokeExact(ctx, pubKey2, sigData, msgHash);
if (r != 1 || !pubKeyBB.equals(pubKey2BB))
throw new AssertionError();
}
System.out.println((System.nanoTime() - t) / 1_000_000 + " ms");
}
}
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

分享个人编写的各种编程语言的短代码
暂无标签
MIT
使用 MIT 开源许可协议
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
其他
1
https://gitee.com/lcpsky/sharecode.git
git@gitee.com:lcpsky/sharecode.git
lcpsky
sharecode
sharecode
main
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /