=begin
Hi Martin,
It's only a one liner aliasing public_key? to public? but I did it partly to check that nothing disastrous happened if that change were made.
RE: the PKey interface I agree that the present situation does seem problematic. Looking at the issues you have collected there it definitely seems like there are a lot of inconsistancies One particular area I've experienced is the public key interface several methods assume that a public key will have the same class as private keys. I particularly encountered this when writing a unit test for pkcs7 signing with EC keys after applying the patch above.
The current pkcs7 unit tests dynamically construct x509 certificates from precomputed keys feeding the keys and desired attributes to a create_cert utility function in test/openssl/utils.rb. However substituting in an EC key for an RSA/DSA key does not work because the function expects the response to key.public_key to conform to the PKey specification. Particularly it expects that the output of key.public_key can be used as a valid argument to key.public_key= which is not true in the case of EC keys. In order to create a working test the most expedient solution was to add an explicit test to the certificate issuing function.
This had the effect of changing this simple statement:
cert.public_key = key.public_key
To this:
...
EC keys need special handeling¶
case key.is_a?(OpenSSL::PKey::EC)
when true
ec_pub_key = OpenSSL::PKey::EC.new(key.group)
ec_pub_key.public_key = key.public_key
cert.public_key = ec_pub_key
else
cert.public_key = key.public_key
end
end
A branch containing a prototype test and the required alterations in the test utility function are available here: https://github.com/Jacob640/ruby/commit/afc1582a0000a021f4ee24d3cd3520f010f7f666
One aspect of the above code that particularly grates is the requirement for EC group parameter to be set before the public key info can be set.