Skip to content

Commit 0d21000

Browse files
committed
[fix] keep curve name when group is set into another key
1 parent f1b253c commit 0d21000

File tree

2 files changed

+36
-29
lines changed

2 files changed

+36
-29
lines changed

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

+31-24
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,14 @@ public PKeyEC(Ruby runtime, RubyClass type) {
227227

228228
private String curveName;
229229

230-
private String getCurveName() { return curveName; }
230+
private String getCurveName() {
231+
if (curveName == null && group != null) {
232+
curveName = group.getCurveName();
233+
}
234+
return curveName;
235+
}
231236

232237
private ECNamedCurveParameterSpec getParameterSpec() {
233-
assert curveName != null;
234238
return ECNamedCurveTable.getParameterSpec(getCurveName());
235239
}
236240

@@ -836,20 +840,20 @@ static void createGroup(final Ruby runtime, final RubyClass EC, final RubyClass
836840
Group.defineAnnotatedMethods(Group.class);
837841
}
838842

839-
private transient PKeyEC key;
840843
private transient ECParameterSpec paramSpec;
841844

842845
private PointConversion conversionForm = PointConversion.UNCOMPRESSED;
843846

844-
private RubyString curve_name;
847+
private String curveName;
848+
private RubyString impl_curve_name;
845849

846850
public Group(Ruby runtime, RubyClass type) {
847851
super(runtime, type);
848852
}
849853

850854
Group(Ruby runtime, PKeyEC key) {
851855
this(runtime, _EC(runtime).getClass("Group"));
852-
this.key = key;
856+
setCurveName(runtime, key.getCurveName());
853857
}
854858

855859
@JRubyMethod(rest = true, visibility = Visibility.PRIVATE)
@@ -860,19 +864,21 @@ public IRubyObject initialize(final ThreadContext context, final IRubyObject[] a
860864
IRubyObject arg = args[0];
861865

862866
if ( arg instanceof Group ) {
863-
this.curve_name = ((Group) arg).implCurveName(runtime);
867+
this.curveName = ((Group) arg).curveName;
864868
return this;
865869
}
866870

867-
this.curve_name = arg.convertToString();
871+
this.impl_curve_name = arg.convertToString();
868872
}
869873
return this;
870874
}
871875

872876
private String getCurveName() {
873-
if (key != null) return key.getCurveName();
874-
assert curve_name != null;
875-
return curve_name.toString();
877+
if (curveName == null) {
878+
assert impl_curve_name != null;
879+
return impl_curve_name.asJavaString();
880+
}
881+
return curveName;
876882
}
877883

878884
@Override
@@ -892,16 +898,21 @@ public IRubyObject curve_name(final ThreadContext context) {
892898
}
893899

894900
private RubyString implCurveName(final Ruby runtime) {
895-
if (curve_name == null) {
896-
assert key != null;
897-
String prefix, curveName = key.getCurveName();
898-
// BC 1.54: "brainpoolP512t1" 1.55: "brainpoolp512t1"
899-
if (curveName.startsWith(prefix = "brainpoolp")) {
900-
curveName = "brainpoolP" + curveName.substring(prefix.length());
901-
}
902-
curve_name = RubyString.newString(runtime, curveName);
901+
if (impl_curve_name == null && curveName != null) {
902+
setCurveName(runtime, curveName);
903903
}
904-
return curve_name;
904+
return impl_curve_name;
905+
}
906+
907+
private void setCurveName(final Ruby runtime, String curveName) {
908+
assert curveName != null;
909+
this.curveName = curveName;
910+
String prefix;
911+
// BC 1.54: "brainpoolP512t1" 1.55: "brainpoolp512t1"
912+
if (curveName.startsWith(prefix = "brainpoolp")) {
913+
curveName = "brainpoolP" + curveName.substring(prefix.length());
914+
}
915+
impl_curve_name = RubyString.newString(runtime, curveName);
905916
}
906917

907918
@JRubyMethod
@@ -956,11 +967,7 @@ public RubyString to_pem(final ThreadContext context, final IRubyObject[] args)
956967

957968
private ECParameterSpec getParamSpec() {
958969
if (paramSpec == null) {
959-
if (key != null) {
960-
return paramSpec = key.getParamSpec();
961-
}
962-
assert curve_name != null;
963-
return paramSpec = PKeyEC.getParamSpec(getCurveName());
970+
paramSpec = PKeyEC.getParamSpec(getCurveName());
964971
}
965972
return paramSpec;
966973
}

src/test/ruby/ec/test_ec.rb

+5-5
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ def test_ec_key
2222

2323
# PKey is immutable in OpenSSL >= 3.0; constructing an empty EC object is deprecated
2424
#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
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
3030
#end
3131

3232
key3 = OpenSSL::PKey::EC.new(key1)

0 commit comments

Comments
 (0)