lib/global_session/keystore.rb in global_session-3.2.10 vs lib/global_session/keystore.rb in global_session-3.3.0
- old
+ new
@@ -62,15 +62,27 @@
load
end
# Factory method to generate a new keypair for use with GlobalSession.
#
+ # @param [Integer,String] parameter keylength in bits (for RSA/DSA) or curve name (for EC)
# @raise [ArgumentError] if cryptosystem is unknown to OpenSSL
# @return [OpenSSL::PKey::PKey] a public/private keypair
- def self.create_keypair(cryptosystem=:RSA, keysize=1024)
+ def self.create_keypair(cryptosystem=:RSA, parameter=nil)
factory = OpenSSL::PKey.const_get(cryptosystem)
- factory.generate( 1024 )
+ if factory.respond_to?(:generate)
+ # parameter-free cryptosystem e.g. RSA, DSA. Default key length 1024,
+ # which is really too small, but whose signatures are quite large.
+ parameter ||= 1024
+ factory.generate( parameter )
+ else
+ # parameterized family of cryptosystems (e.g. EC). Default curve is
+ # compatible with JSON Web Signature (JWS) ES256 algorithm.
+ parameter ||= 'prime256v1'
+ alg = factory.new(parameter)
+ alg.generate_key
+ end
rescue NameError => e
raise ArgumentError, e.message
end
private
@@ -104,13 +116,21 @@
Dir.glob(File.join(path, '*')).each do |file|
load_public_key(file)
end
elsif File.file?(path)
name = File.basename(path, '.*')
- key = OpenSSL::PKey::RSA.new(File.read(path))
+ pem = File.read(path)
+
+ # Deal with modern ("BEGIN PUBLIC/PRIVATE KEY") and legacy ("BEGIN RSA PUBLIC KEY") formats
+ if pem =~ /BEGIN RSA/
+ key = OpenSSL::PKey::RSA.new(pem)
+ else
+ key = OpenSSL::PKey.read(pem)
+ end
+
# ignore private keys (which legacy config allowed to coexist with public keys)
- unless key.private?
+ unless (key.private? rescue nil) || (key.private_key? rescue nil)
if @public_keys.has_key?(name)
raise ConfigurationError, "Duplicate public key for authority: #{name}"
else
@public_keys[name] = key
end
@@ -133,11 +153,13 @@
end
if File.file?(path)
if @private_key.nil?
name = File.basename(path, '.*')
- private_key = OpenSSL::PKey::RSA.new(File.read(path))
- raise ConfigurationError, "Expected #{key_file} to contain an RSA private key" unless private_key.private?
+ pem = File.read(path)
+ private_key = OpenSSL::PKey.read(pem)
+
+ raise ConfigurationError, "Expected #{key_file} to contain an RSA private key" unless (private_key.private? rescue nil) || (private_key.private_key? rescue nil)
@private_key = private_key
@private_key_name = name
else
raise ConfigurationError, "Only one private key is allowed; already loaded #{@private_key_name}, cannot also load #{path}"
end