Skip to content

Commit 37fe1ef

Browse files
committed
[refactor] performance - do not encode/decode cert
1 parent af64ffd commit 37fe1ef

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

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

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ private X509Cert(Ruby runtime) {
133133

134134
private transient PKey public_key; // lazy initialized
135135

136-
private final List<X509Extension> extensions = new ArrayList<X509Extension>();
136+
private final List<X509Extension> extensions = new ArrayList<>(4);
137137

138138
private boolean changed = true;
139139

@@ -147,11 +147,16 @@ final X509AuxCertificate getAuxCert() {
147147

148148
public static IRubyObject wrap(Ruby runtime, Certificate cert)
149149
throws CertificateEncodingException {
150-
return wrap(runtime.getCurrentContext(), cert.getEncoded());
150+
return wrap(runtime.getCurrentContext(), cert);
151151
}
152152

153153
static X509Cert wrap(ThreadContext context, Certificate cert)
154154
throws CertificateEncodingException {
155+
if (cert instanceof X509Certificate) {
156+
final X509Cert c = new X509Cert(context.runtime);
157+
c.initialize(context, (X509Certificate) cert);
158+
return c;
159+
}
155160
return wrap(context, cert.getEncoded());
156161
}
157162

@@ -161,23 +166,14 @@ public static IRubyObject wrap(Ruby runtime, javax.security.cert.Certificate cer
161166
return wrap(runtime.getCurrentContext(), cert.getEncoded());
162167
}
163168

164-
static X509Cert wrap(ThreadContext context, javax.security.cert.Certificate cert)
165-
throws javax.security.cert.CertificateEncodingException {
166-
return wrap(context, cert.getEncoded());
167-
}
168-
169169
static X509Cert wrap(final ThreadContext context, final byte[] encoded) {
170-
//final Ruby runtime = context.runtime;
171-
//final RubyString enc = StringHelper.newString(runtime, encoded);
172-
//return _Certificate(runtime).callMethod(context, "new", enc);
173170
final X509Cert cert = new X509Cert(context.runtime);
174171
cert.initialize(context, encoded);
175172
return cert;
176173
}
177174

178175
@JRubyMethod(name="initialize", optional = 1, visibility = Visibility.PRIVATE)
179-
public IRubyObject initialize(final ThreadContext context,
180-
final IRubyObject[] args, final Block unusedBlock) {
176+
public IRubyObject initialize(final ThreadContext context, final IRubyObject[] args, final Block unusedBlock) {
181177

182178
if ( args.length == 0 ) {
183179
this.subject = X509Name.newName(context.runtime);
@@ -197,22 +193,28 @@ private void initialize(final ThreadContext context, final byte[] encoded) {
197193
}
198194

199195
private void initialize(final ThreadContext context, final byte[] encoded, final int offset, final int length) {
200-
final Ruby runtime = context.runtime;
201-
202196
byte[] bytes = StringHelper.readX509PEM(encoded, offset, length);
203-
197+
final X509Certificate cert;
204198
try {
205199
final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
206200
cert = (X509Certificate) SecurityHelper.getCertificateFactory("X.509").generateCertificate(bis);
207201
}
208202
catch (CertificateException e) {
209-
throw newCertificateError(runtime, e);
203+
throw newCertificateError(context.runtime, e);
210204
}
211205

206+
initialize(context, cert);
207+
}
208+
209+
private void initialize(final ThreadContext context, final X509Certificate cert) {
210+
final Ruby runtime = context.runtime;
211+
212212
if ( cert == null ) {
213213
throw newCertificateError(runtime, (String) null);
214214
}
215215

216+
this.cert = cert;
217+
216218
set_serial( RubyNumeric.str2inum(runtime, runtime.newString(cert.getSerialNumber().toString()), 10) );
217219
set_not_before( context, RubyTime.newTime( runtime, cert.getNotBefore().getTime() ) );
218220
set_not_after( context, RubyTime.newTime( runtime, cert.getNotAfter().getTime() ) );

0 commit comments

Comments
 (0)