Skip to content

Commit 4e1cbbd

Browse files
committed
[compat] implement OpenSSL::PKey#compare?
1 parent 803970b commit 4e1cbbd

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,25 @@ public IRubyObject verify(IRubyObject digest, IRubyObject sign, IRubyObject data
303303
}
304304
}
305305

306+
// Used primarily to check if an OpenSSL::X509::Certificate#public_key compares to its private key.
307+
@JRubyMethod(name = "compare?")
308+
public IRubyObject compare_p(ThreadContext context, IRubyObject arg) {
309+
final Ruby runtime = context.runtime;
310+
if (!(arg instanceof PKey)) {
311+
throw runtime.newTypeError("OpenSSL::PKey::PKey expected but got " + arg.getMetaClass().getRealClass().getName());
312+
}
313+
final PKey other = (PKey) arg;
314+
if (!getKeyType().equals(other.getKeyType())) {
315+
throw runtime.newTypeError("Cannot compare different key types");
316+
}
317+
final PublicKey myPub = getPublicKey();
318+
final PublicKey otherPub = other.getPublicKey();
319+
if (myPub == null || otherPub == null) {
320+
return runtime.getFalse();
321+
}
322+
return runtime.newBoolean(java.util.Arrays.equals(myPub.getEncoded(), otherPub.getEncoded()));
323+
}
324+
306325
static String getDigestAlgName(IRubyObject digest) {
307326
if (digest.isNil()) return "SHA256";
308327
if (digest instanceof Digest) return ((Digest) digest).getShortAlgorithm();
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
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
51+
-----END RSA PRIVATE KEY-----

src/test/ruby/test_pkey.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,34 @@ def test_pkey_dh
9797
assert_equal nil, dh.q
9898
end
9999

100+
def test_compare?
101+
key1 = Fixtures.pkey("rsa-1.pem")
102+
key2 = Fixtures.pkey("rsa-1.pem")
103+
key3 = Fixtures.pkey("rsa-2.pem")
104+
key4 = Fixtures.pkey("p256")
105+
106+
assert_equal(true, key1.compare?(key2))
107+
assert_equal(true, key1.public_key.compare?(key2))
108+
assert_equal(true, key2.compare?(key1))
109+
assert_equal(true, key2.public_key.compare?(key1))
110+
111+
assert_equal(false, key1.compare?(key3))
112+
113+
assert_raise(TypeError) do
114+
key1.compare?(key4)
115+
end
116+
end
117+
118+
def test_compare_with_certificate_public_key
119+
fixtures = File.dirname(__FILE__)
120+
cert = OpenSSL::X509::Certificate.new(File.read(File.join(fixtures, 'pkey-cert.pem')))
121+
matching_key = OpenSSL::PKey.read(File.read(File.join(fixtures, 'pkey-pkcs8.pem')))
122+
other_key = Fixtures.pkey("rsa-1.pem")
123+
124+
assert_equal true, matching_key.compare?(cert.public_key)
125+
assert_equal false, other_key.compare?(cert.public_key)
126+
end
127+
100128
def test_to_java
101129
pkey = OpenSSL::PKey.read(KEY)
102130
assert_kind_of java.security.PublicKey, pkey.to_java

0 commit comments

Comments
 (0)