Feature #4424: [ext/openssl] Allow public/private key creation from arbit=
rary data
http://redmine.ruby-lang.org/issues/show/4424

Author: Martin Bosslet
Status: Open, Priority: Normal
Category: ext, Target version: 1.9.3

There is a public funtion in PKey that allowed to read arbitrary
private keys from a file regardless of the actual key type, but it
was not exposed in Ruby, only in C. =

In Ruby, the only way to instantiate public/private keys is by =

calling initialize on the correct PKey subclass, implying that =

you need to know what kind of key you're actually dealing with. =

There are situations where the key type is not known in advance, =

e.g. if a certificate SubjectPublicKeyInfo shall be turned into =

a public key. In that case you only know that you're dealing with
a public key, but not necessarily with what kind of key. In =

situations like these it would come in handy to have methods that
create a PKey instance regardless of the underlying data.

The attached patch provides this by adding two module functions to =

PKey, read_public and read_private. They allow reading generic =

public/private keys from a String or a File, optionally providing
a password in the case of encrypted PEM encodings. RDoc has also
been supplemented.

Please note that the included tests partly rely on the patches =

proposed in

http://redmine.ruby-lang.org/issues/show/4421,
http://redmine.ruby-lang.org/issues/show/4422 and
http://redmine.ruby-lang.org/issues/show/4423

If those were applied, the combination with this patch would =

provide consistent behavior among all three public key systems
supported in Ruby.

Regards,
Martin


----------------------------------------
http://redmine.ruby-lang.org
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