logo
25
3
WeChat Login

Native EdDSA signature#30

Closed
created 2025-08-22
RhinoBird2025-P2
maple-bird2025/TencentKona-17:250808
Edit
OverviewCommits
6
Files changed
6
Attachments

环境

Windows的wsl2
#28

完成主要任务

新增了对EdDSA签名和验证的Native实现支持,优化了性能和功能。

  1. 在NativeSunEC类中新增了EdDSA相关的常量、方法和JNI接口
  2. 修改EdDSASignature类以支持本地实现的调用和回退纯Java实现
  3. 新增了sunec_ed.c文件以实现EdDSA的本地签名和验证功能
    4.新增相应的JMH测试和jtreg测试,并符合预期

关键决策点

  1. 初始化阶段:
    initImpl() → 设置curveName → 初始化EdDSAOperations

  2. 签名/验证阶段:
    engineSign()/engineVerify()

    ├─ canUseNative()?
    │ ├─ Yes → signNative()/verifyNative()
    │ │ │
    │ │ ├─ 成功 → 返回结果
    │ │ └─ 异常 → 回退到Java实现
    │ │
    │ └─ No → 直接使用Java实现

  3. Native实现检查条件:
    • curveName != null
    • NativeSunEC.isNativeCryptoEnabled() == true
    • OpenSSL已加载
    • suneccrypto库已加载
    • 支持的曲线 (Ed25519/Ed448)

    93ae3825-f01e-409d-814a-4ab56f9be155.png

时序图

307aa7fe-02bf-4489-9624-65e500e2f20d.png

结果分析

JMH测试命令

make test TEST="micro:javax.crypto.full.EdDSABench" \
  MICRO="OPTIONS=-prof gc -f 1 -wi 5 -i 5 -r 10s -w 5s; \
         JAVA_OPTIONS=-Djdk.sunec.enableNativeCrypto=true -Djdk.openssl.cryptoLibPath=/usr/lib/x86_64-linux-gnu/libcrypto.so.3"
 
 
# Java实现 + GC性能分析 (对比基线)
make test TEST="micro:javax.crypto.full.EdDSABench" \
  MICRO="OPTIONS=-prof gc -f 1 -wi 5 -i 5 -r 10s -w 5s; \
         JAVA_OPTIONS=-Djdk.sunec.enableNativeCrypto=false"

JMH测试结果

纯Java结果
f916a2bc-f858-49dd-a457-fc4e42cc169f.png
cd07f653-5f9a-4626-ae4e-98cb81d24996.png

OpenSSL优化结果
b09f4253-dfa8-49dd-bb48-eafad9783107.png
27e92e1f-cda5-4edc-bcfd-f8fda1ceb635.png

JMH结果分析

根据上述结果可以看出,OpenSSL实现的吞吐量远超纯Java实现的吞吐量,性能非常优秀,且gc情况符合预期,内存分配情况也合理

  1. 显著的性能提升
    Ed25519: OpenSSL实现比Java实现快 5-8倍
    Ed448: OpenSSL实现比Java实现快 4-16倍
    小数据Ed448签名: 性能提升最显著,达到 16倍

  2. 算法比较
    Ed25519 总体性能明显优于 Ed448
    OpenSSL Ed25519签名: ~13,000+ ops/s vs OpenSSL Ed448签名: ~2,000-8,000 ops/s
    数据大小影响: 大数据对Ed25519影响较小,对Ed448影响较大

e5f80512-1a9f-4e12-a083-1e9ece877064.png

jtreg测试

测试命令

make test TEST="jtreg:test/jdk/sun/security/ec/ed/NativeEdDSASignature.java"

测试结果

success,结果符合预期
ae118a69-c0c6-441b-91cf-6877f210faeb.png

总结

1. 性能优势

签名操作: OpenSSL实现提供 4-16倍 的性能提升
验证操作: OpenSSL实现提供 4-6倍 的性能提升
Ed25519: 在所有场景下都表现优异
Ed448: 在小数据场景下优势更明显

2. 内存优势

内存分配减少: OpenSSL实现的内存分配比Java实现减少 95-99%
GC压力降低: 几乎不产生额外的GC压力
更高效的内存使用: 特别是在高频调用场景下

3. 实际应用价值

高吞吐量场景: 如TLS握手、JWT签名等,性能提升非常显著
低延迟要求: 减少GC停顿,提供更稳定的延迟表现
资源节约: 显著降低CPU和内存使用

=====================
8.23更新
补充了EdDSAParameterSpec的prehash和context两个参数至相关的native方法,并调整其他相关文件,成功构建jdk并完成测试

reviewed
src/jdk.crypto.ec/share/classes/sun/security/ec/ed/EdDSASignature.java
jiangsha

如果Native实现失败了,这就是一个不被期望的结果。
还是应该直接抛异常。
而且这个异常信息也没有展示出来,出了问题也不知道。

maple

好的,您继续review。我待会会进行一并修改

createor

已经进行了最新的优化,且成功构建并通过相关测试@johnjiang(jiangsha)

reviewed
test/jdk/sun/security/ec/ed/NativeEdDSASignature.java
jiangsha

需要考虑测试使用EdDSAParameterSpec的用例。

maple

已完成

administrator

任务二已经结束,专注于任务三即可。

closed the pull request
No conflicts between the source branch and the target branch
Reviewer
(jiangsha)
Assignee
None yet
Label
None yet
Participant