ruby-changes:61239
From: Bart <ko1@a...>
Date: Wed, 13 May 2020 15:48:21 +0900 (JST)
Subject: [ruby-changes:61239] 3f8665fe0e (master): [ruby/openssl] Add Marshal support to PKey objects
https://git.ruby-lang.org/ruby.git/commit/?id=3f8665fe0e From 3f8665fe0ed5331aa723ddecbf6ad3728931c08d Mon Sep 17 00:00:00 2001 From: Bart de Water <bartdewater@g...> Date: Sun, 19 Apr 2020 17:00:01 -0400 Subject: [ruby/openssl] Add Marshal support to PKey objects https://github.com/ruby/openssl/commit/c4374ff041 diff --git a/ext/openssl/History.md b/ext/openssl/History.md index 929d919..9e42944 100644 --- a/ext/openssl/History.md +++ b/ext/openssl/History.md @@ -24,8 +24,9 @@ Notable changes https://github.com/ruby/ruby/blob/trunk/ext/openssl/History.md#L24 * 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/ext/openssl/lib/openssl/marshal.rb b/ext/openssl/lib/openssl/marshal.rb new file mode 100644 index 0000000..af56471 --- /dev/null +++ b/ext/openssl/lib/openssl/marshal.rb @@ -0,0 +1,30 @@ https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/marshal.rb#L1 +# 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@s...> +# 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/ext/openssl/lib/openssl/pkey.rb b/ext/openssl/lib/openssl/pkey.rb index ecb112f..9cc3276 100644 --- a/ext/openssl/lib/openssl/pkey.rb +++ b/ext/openssl/lib/openssl/pkey.rb @@ -4,8 +4,21 @@ https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/pkey.rb#L4 # 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 https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/pkey.rb#L35 end end end + + class RSA + include OpenSSL::Marshal + end end diff --git a/ext/openssl/lib/openssl/x509.rb b/ext/openssl/lib/openssl/x509.rb index 1d2a5aa..6771b90 100644 --- a/ext/openssl/lib/openssl/x509.rb +++ b/ext/openssl/lib/openssl/x509.rb @@ -12,24 +12,10 @@ https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/x509.rb#L12 # (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 https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/x509.rb#L43 end class Extension - include Marshal + include OpenSSL::Marshal def ==(other) return false unless Extension === other @@ -216,7 +202,7 @@ module OpenSSL https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/x509.rb#L202 end class Name - include Marshal + include OpenSSL::Marshal module RFC2253DN Special = ',=+<>#;' @@ -321,7 +307,7 @@ module OpenSSL https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/x509.rb#L307 end class Attribute - include Marshal + include OpenSSL::Marshal def ==(other) return false unless Attribute === other @@ -336,7 +322,7 @@ module OpenSSL https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/x509.rb#L322 end class Certificate - include Marshal + include OpenSSL::Marshal include Extension::SubjectKeyIdentifier include Extension::AuthorityKeyIdentifier include Extension::CRLDistributionPoints @@ -355,7 +341,7 @@ module OpenSSL https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/x509.rb#L341 end class CRL - include Marshal + include OpenSSL::Marshal include Extension::AuthorityKeyIdentifier def ==(other) @@ -372,7 +358,7 @@ module OpenSSL https://github.com/ruby/ruby/blob/trunk/ext/openssl/lib/openssl/x509.rb#L358 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 6397e76..fd2c7a6 100644 --- a/test/openssl/test_pkey_dh.rb +++ b/test/openssl/test_pkey_dh.rb @@ -74,6 +74,13 @@ class OpenSSL::TestPKeyDH < OpenSSL::PKeyTestCase https://github.com/ruby/ruby/blob/trunk/test/openssl/test_pkey_dh.rb#L74 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 2c839b7..9c9da89 100644 --- a/test/openssl/test_pkey_dsa.rb +++ b/test/openssl/test_pkey_dsa.rb @@ -191,6 +191,13 @@ fWLOqqkzFeRrYMDzUpl36XktY6Yq8EJYlW9pCMmBVNy/dQ== https://github.com/ruby/ruby/blob/trunk/test/openssl/test_pkey_dsa.rb#L191 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 6b83ed7..a0e6a23 100644 --- a/test/openssl/test_pkey_ec.rb +++ b/test/openssl/test_pkey_ec.rb @@ -52,6 +52,13 @@ class OpenSSL::TestEC < OpenSSL::PKeyTestCase https://github.com/ruby/ruby/blob/trunk/test/openssl/test_pkey_ec.rb#L52 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 a9587aa..36a2a97 100644 --- a/test/openssl/test_pkey_rsa.rb +++ b/test/openssl/test_pkey_rsa.rb @@ -443,6 +443,13 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase https://github.com/ruby/ruby/blob/trunk/test/openssl/test_pkey_rsa.rb#L443 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]) -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/