diff options
author | Bart de Water <bartdewater@gmail.com> | 2020-04-19 17:00:01 -0400 |
---|---|---|
committer | Bart de Water <bartdewater@gmail.com> | 2020-04-19 17:21:16 -0400 |
commit | c4374ff041440fd07d884711ab9d743baae8ebde (patch) | |
tree | 8469016ca97290197af6509744abf3924848007d | |
parent | 1f1641d71f8f84eeb410a8c8c1b5010ab5c49dd6 (diff) | |
download | ruby-openssl-c4374ff041440fd07d884711ab9d743baae8ebde.tar.gz |
Add Marshal support to PKey objects
-rw-r--r-- | History.md | 3 | ||||
-rw-r--r-- | lib/openssl/marshal.rb | 30 | ||||
-rw-r--r-- | lib/openssl/pkey.rb | 17 | ||||
-rw-r--r-- | lib/openssl/x509.rb | 30 | ||||
-rw-r--r-- | test/openssl/test_pkey_dh.rb | 7 | ||||
-rw-r--r-- | test/openssl/test_pkey_dsa.rb | 7 | ||||
-rw-r--r-- | test/openssl/test_pkey_ec.rb | 7 | ||||
-rw-r--r-- | test/openssl/test_pkey_rsa.rb | 7 |
8 files changed, 85 insertions, 23 deletions
@@ -24,8 +24,9 @@ Notable changes * Add `OpenSSL::SSL::SSLSocket.open` for opening a `TCPSocket` and returning an `OpenSSL::SSL::SSLSocket` for it. [[GitHub #225]](https://github.com/ruby/openssl/issues/225) -* Support marshalling of `OpenSSL::X509` objects. +* Support marshalling of `OpenSSL::X509` and `OpenSSL::PKey` objects. [[GitHub #281]](https://github.com/ruby/openssl/pull/281) + [[GitHub #363]](https://github.com/ruby/openssl/pull/363) * Add `OpenSSL.secure_compare` for timing safe string comparison for strings of possibly unequal length. [[GitHub #280]](https://github.com/ruby/openssl/pull/280) diff --git a/lib/openssl/marshal.rb b/lib/openssl/marshal.rb new file mode 100644 index 00000000..af564719 --- /dev/null +++ b/lib/openssl/marshal.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true +#-- +# = Ruby-space definitions to add DER (de)serialization to classes +# +# = Info +# 'OpenSSL for Ruby 2' project +# Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz> +# All rights reserved. +# +# = Licence +# This program is licensed under the same licence as Ruby. +# (See the file 'LICENCE'.) +#++ +module OpenSSL + module Marshal + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def _load(string) + new(string) + end + end + + def _dump(_level) + to_der + end + end +end diff --git a/lib/openssl/pkey.rb b/lib/openssl/pkey.rb index ecb112f7..9cc32763 100644 --- a/lib/openssl/pkey.rb +++ b/lib/openssl/pkey.rb @@ -4,8 +4,21 @@ # Copyright (C) 2017 Ruby/OpenSSL Project Authors #++ +require_relative 'marshal' + module OpenSSL::PKey + class DH + include OpenSSL::Marshal + end + + class DSA + include OpenSSL::Marshal + end + if defined?(EC) + class EC + include OpenSSL::Marshal + end class EC::Point # :call-seq: # point.to_bn([conversion_form]) -> OpenSSL::BN @@ -22,4 +35,8 @@ module OpenSSL::PKey end end end + + class RSA + include OpenSSL::Marshal + end end diff --git a/lib/openssl/x509.rb b/lib/openssl/x509.rb index 1d2a5aac..6771b90c 100644 --- a/lib/openssl/x509.rb +++ b/lib/openssl/x509.rb @@ -12,24 +12,10 @@ # (See the file 'LICENCE'.) #++ +require_relative 'marshal' + module OpenSSL module X509 - module Marshal - def self.included(base) - base.extend(ClassMethods) - end - - module ClassMethods - def _load(string) - new(string) - end - end - - def _dump(_level) - to_der - end - end - class ExtensionFactory def create_extension(*arg) if arg.size > 1 @@ -57,7 +43,7 @@ module OpenSSL end class Extension - include Marshal + include OpenSSL::Marshal def ==(other) return false unless Extension === other @@ -216,7 +202,7 @@ module OpenSSL end class Name - include Marshal + include OpenSSL::Marshal module RFC2253DN Special = ',=+<>#;' @@ -321,7 +307,7 @@ module OpenSSL end class Attribute - include Marshal + include OpenSSL::Marshal def ==(other) return false unless Attribute === other @@ -336,7 +322,7 @@ module OpenSSL end class Certificate - include Marshal + include OpenSSL::Marshal include Extension::SubjectKeyIdentifier include Extension::AuthorityKeyIdentifier include Extension::CRLDistributionPoints @@ -355,7 +341,7 @@ module OpenSSL end class CRL - include Marshal + include OpenSSL::Marshal include Extension::AuthorityKeyIdentifier def ==(other) @@ -372,7 +358,7 @@ module OpenSSL end class Request - include Marshal + include OpenSSL::Marshal def ==(other) return false unless Request === other diff --git a/test/openssl/test_pkey_dh.rb b/test/openssl/test_pkey_dh.rb index 6397e76d..fd2c7a66 100644 --- a/test/openssl/test_pkey_dh.rb +++ b/test/openssl/test_pkey_dh.rb @@ -74,6 +74,13 @@ class OpenSSL::TestPKeyDH < OpenSSL::PKeyTestCase assert_equal dh2.g, dh.g end + def test_marshal + dh = Fixtures.pkey("dh1024") + deserialized = Marshal.load(Marshal.dump(dh)) + + assert_equal dh.to_der, deserialized.to_der + end + private def assert_equal_params(dh1, dh2) diff --git a/test/openssl/test_pkey_dsa.rb b/test/openssl/test_pkey_dsa.rb index 2c839b7d..9c9da893 100644 --- a/test/openssl/test_pkey_dsa.rb +++ b/test/openssl/test_pkey_dsa.rb @@ -191,6 +191,13 @@ fWLOqqkzFeRrYMDzUpl36XktY6Yq8EJYlW9pCMmBVNy/dQ== assert_not_equal key.params, key2.params end + def test_marshal + key = Fixtures.pkey("dsa1024") + deserialized = Marshal.load(Marshal.dump(key)) + + assert_equal key.to_der, deserialized.to_der + end + private def assert_same_dsa(expected, key) check_component(expected, key, [:p, :q, :g, :pub_key, :priv_key]) diff --git a/test/openssl/test_pkey_ec.rb b/test/openssl/test_pkey_ec.rb index 6b83ed76..a0e6a23f 100644 --- a/test/openssl/test_pkey_ec.rb +++ b/test/openssl/test_pkey_ec.rb @@ -52,6 +52,13 @@ class OpenSSL::TestEC < OpenSSL::PKeyTestCase assert_equal(true, ec.private?) end + def test_marshal + key = Fixtures.pkey("p256") + deserialized = Marshal.load(Marshal.dump(key)) + + assert_equal key.to_der, deserialized.to_der + end + def test_check_key key = OpenSSL::PKey::EC.new("prime256v1").generate_key! assert_equal(true, key.check_key) diff --git a/test/openssl/test_pkey_rsa.rb b/test/openssl/test_pkey_rsa.rb index a9587aa1..36a2a97d 100644 --- a/test/openssl/test_pkey_rsa.rb +++ b/test/openssl/test_pkey_rsa.rb @@ -443,6 +443,13 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase assert_not_equal key.params, key2.params end + def test_marshal + key = Fixtures.pkey("rsa2048") + deserialized = Marshal.load(Marshal.dump(key)) + + assert_equal key.to_der, deserialized.to_der + end + private def assert_same_rsa(expected, key) check_component(expected, key, [:n, :e, :d, :p, :q, :dmp1, :dmq1, :iqmp]) |