Skip to content

Commit 5774307

Browse files
committed
[compat] implement X509::Certificate#==
1 parent 351fdb7 commit 5774307

2 files changed

Lines changed: 56 additions & 0 deletions

File tree

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import java.security.interfaces.DSAPublicKey;
4646
import java.security.interfaces.RSAPublicKey;
4747
import java.util.ArrayList;
48+
import java.util.Arrays;
4849
import java.util.Collection;
4950
import java.util.LinkedHashMap;
5051
import java.util.List;
@@ -316,6 +317,36 @@ public IRubyObject tbs_bytes() {
316317
}
317318
}
318319

320+
@Override
321+
@JRubyMethod(name = "==")
322+
public IRubyObject op_equal(ThreadContext context, IRubyObject obj) {
323+
return equalImpl(context.runtime, obj);
324+
}
325+
326+
private IRubyObject equalImpl(final Ruby runtime, IRubyObject obj) {
327+
if ( this == obj ) return runtime.getTrue();
328+
if ( obj instanceof X509Cert ) {
329+
final X509Certificate cert = this.cert;
330+
final X509Certificate otherCert = ((X509Cert) obj).cert;
331+
if ( cert == null || otherCert == null ) return runtime.getFalse();
332+
333+
final boolean equal;
334+
try {
335+
equal = Arrays.equals(cert.getEncoded(), otherCert.getEncoded());
336+
}
337+
catch (CertificateEncodingException e) {
338+
throw newCertificateError(runtime, e);
339+
}
340+
return runtime.newBoolean(equal);
341+
}
342+
return runtime.getFalse();
343+
}
344+
345+
@Override
346+
public IRubyObject eql_p(IRubyObject obj) {
347+
return equalImpl(getRuntime(), obj);
348+
}
349+
319350
@JRubyMethod(name = {"to_pem", "to_s"})
320351
public IRubyObject to_pem() {
321352
final StringWriter str = new StringWriter();

src/test/ruby/x509/test_x509cert.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,31 @@ def test_tbs_precert_bytes
434434
assert_equal 7, seq.value.size
435435
end
436436

437+
def test_eq
438+
now = Time.now
439+
ca = OpenSSL::X509::Name.parse('/DC=org/DC=ruby-lang/CN=CA')
440+
ee = OpenSSL::X509::Name.parse('/DC=org/DC=example/CN=ServerCert')
441+
ca_key = OpenSSL::PKey::RSA.new(TEST_KEY_RSA1024)
442+
ee_key = OpenSSL::PKey::RSA.new(TEST_KEY_RSA1024)
443+
444+
cacert = issue_cert(ca, ca_key, 1, [], nil, nil,
445+
not_before: now, not_after: now + 3600)
446+
cert1 = issue_cert(ee, ee_key, 2, [], cacert, ca_key,
447+
not_before: now, not_after: now + 3600)
448+
cert2 = issue_cert(ee, ee_key, 2, [], cacert, ca_key,
449+
not_before: now, not_after: now + 3600)
450+
cert3 = issue_cert(ee, ee_key, 3, [], cacert, ca_key,
451+
not_before: now, not_after: now + 3600)
452+
cert4 = issue_cert(ee, ee_key, 2, [], cacert, ca_key,
453+
digest: 'sha512', not_before: now, not_after: now + 3600)
454+
455+
assert_equal false, cert1 == 12345
456+
assert_equal true, cert1 == cert2
457+
assert_equal false, cert1 == cert3
458+
assert_equal false, cert1 == cert4
459+
assert_equal false, cert3 == cert4
460+
end
461+
437462
def test_cert_loading_regression
438463
cert_text = "0\x82\x01\xAD0\x82\x01\xA1\xA0\x03\x02\x01\x02\x02\x01\x010\x03\x06\x01\x000g1\v0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\b\f\nCalifornia1\x150\x13\x06\x03U\x04\a\f\fSanta Monica1\x110\x0F\x06\x03U\x04\n\f\bOneLogin1\x190\x17\x06\x03U\x04\x03\f\x10app.onelogin.com0\x1E\x17\r100309095845Z\x17\r150309095845Z0g1\v0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\b\f\nCalifornia1\x150\x13\x06\x03U\x04\a\f\fSanta Monica1\x110\x0F\x06\x03U\x04\n\f\bOneLogin1\x190\x17\x06\x03U\x04\x03\f\x10app.onelogin.com0\x81\x9F0\r\x06\t*\x86H\x86\xF7\r\x01\x01\x01\x05\x00\x03\x81\x8D\x000\x81\x89\x02\x81\x81\x00\xE8\xD2\xBBW\xE3?/\x1D\xE7\x0E\x10\xC8\xBD~\xCD\xDE!#\rL\x92G\xDF\xE1f?L\xB1\xBC9\x99\x14\xE5\x84\xD2Zi\x87<>d\xBD\x81\xF9\xBA\x85\xD2\xFF\xAA\x90\xF3Z\x97\xA5\x1D\xB0W\xC0\x93\xA3\x06IP\xB84\xF5\xD7Qu\x19\xFCB\xCA\xA3\xD4\\\x8E\v\x9B%\x13|\xB6m\x9D\xA8\x16\xE6\xBB\xDA\x87\xFF\xE3\xD7\xE9\xBA9\xC5O\xA2\xA7C\xADB\x04\xCA\xA5\x0E\x84\xD0\xA8\xE4\xFA\xDA\xF1\x89\xF2s\xFA1\x95\xAF\x03\xAB1\xAA\xE7y\x02\x03\x01\x00\x010\x03\x06\x01\x00\x03\x01\x00"
439464
assert cert = OpenSSL::X509::Certificate.new(cert_text)

0 commit comments

Comments
 (0)