Skip to content

Commit f1b253c

Browse files
committed
[fix] make sure PKey::EC#dup (copying) works
1 parent e104b59 commit f1b253c

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

src/main/java/org/jruby/ext/openssl/PKeyEC.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,20 @@ private void setGroup(final Group group) {
399399
this.curveName = this.group.getCurveName();
400400
}
401401

402+
@Override
403+
public IRubyObject initialize_copy(final IRubyObject original) {
404+
if (this == original) return this;
405+
checkFrozen();
406+
407+
final PKeyEC that = (PKeyEC) original;
408+
this.publicKey = that.publicKey;
409+
this.privateKey = that.privateKey;
410+
this.curveName = that.curveName;
411+
this.group = that.group;
412+
413+
return this;
414+
}
415+
402416
//private static ECNamedCurveParameterSpec readECParameters(final byte[] input) throws IOException {
403417
// ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(input);
404418
// return ECNamedCurveTable.getParameterSpec(oid.getId());

src/test/ruby/ec/test_ec.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,50 @@
33

44
class TestEC < TestCase
55

6+
def test_ec_key
7+
builtin_curves = OpenSSL::PKey::EC.builtin_curves
8+
assert_not_empty builtin_curves
9+
10+
builtin_curves.each do |curve_name, comment|
11+
# Oakley curves and X25519 are not suitable for signing and causes
12+
# FIPS-selftest failure on some environment, so skip for now.
13+
next if ["Oakley", "X25519"].any? { |n| curve_name.start_with?(n) }
14+
15+
key = OpenSSL::PKey::EC.generate(curve_name)
16+
assert_predicate key, :private?
17+
assert_predicate key, :public?
18+
assert_nothing_raised { key.check_key }
19+
end
20+
21+
key1 = OpenSSL::PKey::EC.generate("prime256v1")
22+
23+
# PKey is immutable in OpenSSL >= 3.0; constructing an empty EC object is deprecated
24+
#if !openssl?(3, 0, 0)
25+
# key2 = OpenSSL::PKey::EC.new
26+
# key2.group = key1.group
27+
# key2.private_key = key1.private_key
28+
# key2.public_key = key1.public_key
29+
# assert_equal key1.to_der, key2.to_der
30+
#end
31+
32+
key3 = OpenSSL::PKey::EC.new(key1)
33+
assert_equal key1.to_der, key3.to_der
34+
35+
key4 = OpenSSL::PKey::EC.new(key1.to_der)
36+
assert_equal key1.to_der, key4.to_der
37+
38+
key5 = key1.dup
39+
assert_equal key1.to_der, key5.to_der
40+
41+
# PKey is immutable in OpenSSL >= 3.0; EC object should not be modified
42+
#if !openssl?(3, 0, 0)
43+
key_tmp = OpenSSL::PKey::EC.generate("prime256v1")
44+
key5.private_key = key_tmp.private_key
45+
key5.public_key = key_tmp.public_key
46+
assert_not_equal key1.to_der, key5.to_der
47+
#end
48+
end
49+
650
def test_generate
751
assert_raise(OpenSSL::PKey::ECError) { OpenSSL::PKey::EC.generate("non-existent") }
852
g = OpenSSL::PKey::EC::Group.new("prime256v1")

0 commit comments

Comments
 (0)