Native EdDSA signature#30
Windows的wsl2 #28
新增了对EdDSA签名和验证的Native实现支持,优化了性能和功能。
初始化阶段: initImpl() → 设置curveName → 初始化EdDSAOperations
签名/验证阶段: engineSign()/engineVerify() │ ├─ canUseNative()? │ ├─ Yes → signNative()/verifyNative() │ │ │ │ │ ├─ 成功 → 返回结果 │ │ └─ 异常 → 回退到Java实现 │ │ │ └─ No → 直接使用Java实现
Native实现检查条件: • curveName != null • NativeSunEC.isNativeCryptoEnabled() == true • OpenSSL已加载 • suneccrypto库已加载 • 支持的曲线 (Ed25519/Ed448)
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"
纯Java结果
OpenSSL优化结果
根据上述结果可以看出,OpenSSL实现的吞吐量远超纯Java实现的吞吐量,性能非常优秀,且gc情况符合预期,内存分配情况也合理
显著的性能提升 Ed25519: OpenSSL实现比Java实现快 5-8倍 Ed448: OpenSSL实现比Java实现快 4-16倍 小数据Ed448签名: 性能提升最显著,达到 16倍
算法比较 Ed25519 总体性能明显优于 Ed448 OpenSSL Ed25519签名: ~13,000+ ops/s vs OpenSSL Ed448签名: ~2,000-8,000 ops/s 数据大小影响: 大数据对Ed25519影响较小,对Ed448影响较大
make test TEST="jtreg:test/jdk/sun/security/ec/ed/NativeEdDSASignature.java"
success,结果符合预期
签名操作: OpenSSL实现提供 4-16倍 的性能提升 验证操作: OpenSSL实现提供 4-6倍 的性能提升 Ed25519: 在所有场景下都表现优异 Ed448: 在小数据场景下优势更明显
内存分配减少: OpenSSL实现的内存分配比Java实现减少 95-99% GC压力降低: 几乎不产生额外的GC压力 更高效的内存使用: 特别是在高频调用场景下
高吞吐量场景: 如TLS握手、JWT签名等,性能提升非常显著 低延迟要求: 减少GC停顿,提供更稳定的延迟表现 资源节约: 显著降低CPU和内存使用
===================== 8.23更新 补充了EdDSAParameterSpec的prehash和context两个参数至相关的native方法,并调整其他相关文件,成功构建jdk并完成测试
如果Native实现失败了,这就是一个不被期望的结果。 还是应该直接抛异常。 而且这个异常信息也没有展示出来,出了问题也不知道。
好的,您继续review。我待会会进行一并修改
已经进行了最新的优化,且成功构建并通过相关测试@johnjiang(jiangsha)
需要考虑测试使用EdDSAParameterSpec的用例。
已完成
任务二已经结束,专注于任务三即可。
环境
Windows的wsl2
#28
完成主要任务
新增了对EdDSA签名和验证的Native实现支持,优化了性能和功能。
4.新增相应的JMH测试和jtreg测试,并符合预期
关键决策点
初始化阶段:
initImpl() → 设置curveName → 初始化EdDSAOperations
签名/验证阶段:
engineSign()/engineVerify()
│
├─ canUseNative()?
│ ├─ Yes → signNative()/verifyNative()
│ │ │
│ │ ├─ 成功 → 返回结果
│ │ └─ 异常 → 回退到Java实现
│ │
│ └─ No → 直接使用Java实现
Native实现检查条件:
• curveName != null
• NativeSunEC.isNativeCryptoEnabled() == true
• OpenSSL已加载
• suneccrypto库已加载
• 支持的曲线 (Ed25519/Ed448)
时序图
结果分析
JMH测试命令
JMH测试结果
纯Java结果


OpenSSL优化结果


JMH结果分析
根据上述结果可以看出,OpenSSL实现的吞吐量远超纯Java实现的吞吐量,性能非常优秀,且gc情况符合预期,内存分配情况也合理
显著的性能提升
Ed25519: OpenSSL实现比Java实现快 5-8倍
Ed448: OpenSSL实现比Java实现快 4-16倍
小数据Ed448签名: 性能提升最显著,达到 16倍
算法比较
Ed25519 总体性能明显优于 Ed448
OpenSSL Ed25519签名: ~13,000+ ops/s vs OpenSSL Ed448签名: ~2,000-8,000 ops/s
数据大小影响: 大数据对Ed25519影响较小,对Ed448影响较大
jtreg测试
测试命令
测试结果
success,结果符合预期

总结
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并完成测试