When calling #check_key against an OpenSSL::PKey::EC instance representing an invalid point for the group, the method always returns true.
I believe this is because OpenSSL 3 deprecated EC_KEY_check_key, and the underlying call is swapped out for EVP_PKEY_public_check in the 3.x branch.
However, the EVP_PKEY_public_check does not serve the same purpose as EC_KEY_check_key.
EVP_PKEY_public_check validates only the resulting public component, and does not validate the private component. I believe EVP_PKEY_pairwise_check is closer to the behavior of EC_KEY_check_key, where both the public and private components are validated, though it seems to assume the presence of a private component.
Reproducer
# check.rb
ver = ARGV[0]
gem 'openssl', ver
require 'openssl'
# ECDSA secp384r1 encoded key where the point is not on the curve
pem = <<~INVALID_KEY
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDDA1Tm0m7YhkfeVpFuarAJYVlHp2tQj+1fOBiLa10t9E8TiQO/hVfxB
vGaVEQwOheWgBwYFK4EEACKhZANiAASyGqmryZGqdpsq5gEDIfNvgC3AwSJxiBCL
XKHBTFRp+tCezLDOK/6V8KK/vVGBJlGFW6/I7ahyXprxS7xs7hPA9iz5YiuqXlu+
lbrIpZOz7b73hyQQCkvbBO/Avg+hPAk=
-----END EC PRIVATE KEY-----
INVALID_KEY
begin
result = OpenSSL::PKey::EC.new(pem).check_key
rescue =e
result = e.message
end
puts format('%25s: %s','RUBY_VERSION', RUBY_VERSION)
puts format('%25s: %s','OPENSSL_LIBRARY_VERSION', OpenSSL::OPENSSL_LIBRARY_VERSION)
puts format('%25s: %s','OPENSSL_VERSION', OpenSSL::VERSION)
puts format('%25s: %s','result', result)
When calling
#check_key
against anOpenSSL::PKey::EC
instance representing an invalid point for the group, the method always returns true.I believe this is because OpenSSL 3 deprecated
EC_KEY_check_key
, and the underlying call is swapped out forEVP_PKEY_public_check
in the 3.x branch.However, the
EVP_PKEY_public_check
does not serve the same purpose asEC_KEY_check_key
.EVP_PKEY_public_check
validates only the resulting public component, and does not validate the private component. I believeEVP_PKEY_pairwise_check
is closer to the behavior ofEC_KEY_check_key
, where both the public and private components are validated, though it seems to assume the presence of a private component.Reproducer
OpenSSL 1.1.1
OpenSSL 3.0.2