根据FIPS 186-4§D.1.1.5基点的选择,我应该能够在P-256 (secp256r1)上创建带有自定义基点的ECDSA签名。
标准PKCS#11支持这个特性吗?
这就是基于org.xipki:ipkcs11wrapper:1.0.4和SoftHSM 2.6.1构建示例代码的程度:
import org.xipki.pkcs11.wrapper.*
import org.xipki.pkcs11.wrapper.PKCS11Constants.*
import org.xipki.pkcs11.wrapper.attrs.Attribute
import java.math.BigInteger
import java.util.*
const val PATH = "/opt/homebrew/lib/softhsm/libsofthsm2.so"
val PIN = "1234".toCharArray()
val MESSAGE = "hello world".toByteArray()
val KEY_ID = AttributeVector(
Attribute.getInstance(CKA_ID, BigInteger.valueOf(1))
)
fun main() {
val module = PKCS11Module.getInstance(PATH).apply { initialize() }
val slot = module.getSlotList(true).first()
val token = PKCS11Token(slot.token, true, PIN).apply {
require(supportsMechanism(CKM_ECDSA, CKF_EC_F_P))
require(!supportsMechanism(CKM_ECDSA, CKF_EC_ECPARAMETERS))
}
val key = token.getKey(KEY_ID)
val params = null // I would expect to be able to set a base point here
val mechanism = Mechanism(CKM_ECDSA, params)
val value = token.sign(mechanism, key.id().handle, MESSAGE)
println(Base64.getEncoder().encodeToString(value))
}代码成功运行,包括require断言。但它仍然使用P-256的标准基点。我怀疑Mechanism参数是可配置的,但在库或标准中找不到合理的值。
发布于 2023-04-29 09:36:16
ECDSA使用标准曲线进行签名,但某些标准理论上允许使用自定义基点,但这并不常见,而且我不知道任何支持它的API。PKCS#11、版本2.40和3.0版都不支持它:在这两种情况下,ECDSA机制都没有参数。
从软码码的角度来看,它支持ECDSA,无论是使用博坦后端还是OpenSSL后端,这两个扩展都不实现选择自定义基点的扩展。这是有意义的,因为SoftHSM打算成为HSM的功能替代品,而大多数HSM没有这个特性。
在创建关键对象时,您可以通过配置不同的曲线来使用secp256r1进行ECDSA,但这是一个自定义的基点。原则上,您可以在自定义曲线上创建私有或公共的键对象:CKA_EC_PARAMS参数可以指定命名曲线,也可以指定所有曲线参数。但是很少有库或HSM支持除了命名曲线之外的任何东西。自定义曲线是有风险的(如果你不知道你在做什么,你可以很容易地选择不安全的参数),而且很难实现(很多优化需要精确的参数知识),所以它们永远不会流行。
https://crypto.stackexchange.com/questions/106322
复制相似问题