Skip to content

Commit 94aa9f4

Browse files
[fix] OpenSSL::X509::Certificate#public_key raises for EC keys (#273)
1 parent eb474fa commit 94aa9f4

File tree

6 files changed

+89
-1
lines changed

6 files changed

+89
-1
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ public final class PKeyEC extends PKey {
8888
public PKeyEC allocate(Ruby runtime, RubyClass klass) { return new PKeyEC(runtime, klass); }
8989
};
9090

91+
static PKeyEC newInstance(final Ruby runtime, final PublicKey publicKey) {
92+
return new PKeyEC(runtime, publicKey);
93+
}
94+
9195
static void createPKeyEC(final Ruby runtime, final RubyModule PKey, final RubyClass PKeyPKey, final RubyClass OpenSSLError) {
9296
RubyClass EC = PKey.defineClassUnder("EC", PKeyPKey, ALLOCATOR);
9397

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ DateTime getNotAfter() {
512512
@JRubyMethod
513513
public IRubyObject public_key(final ThreadContext context) {
514514
if ( public_key == null ) initializePublicKey();
515-
return public_key.callMethod(context, "public_key");
515+
return public_key;
516516
}
517517

518518
@JRubyMethod(name = "public_key=")
@@ -556,6 +556,9 @@ else if ( "DSA".equalsIgnoreCase(algorithm) ) {
556556
//}
557557
set_public_key( PKeyDSA.newInstance(runtime, publicKey) );
558558
}
559+
else if ( "EC".equalsIgnoreCase(algorithm) ) {
560+
set_public_key( PKeyEC.newInstance(runtime, publicKey) );
561+
}
559562
else {
560563
String message = "unsupported algorithm";
561564
if ( algorithm != null ) message += " '" + algorithm + "'";

src/test/ruby/x509/dsa.crt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-----BEGIN CERTIFICATE-----
2+
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
32+
-----END CERTIFICATE-----

src/test/ruby/x509/ec.crt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBLDCB0gIJAJRzFaGbFWl5MAoGCCqGSM49BAMCMB4xCzAJBgNVBAYTAkRFMQ8w
3+
DQYDVQQHDAZCZXJsaW4wHhcNMjMwMzAzMTIxMzU4WhcNMjMwNDAyMTIxMzU4WjAe
4+
MQswCQYDVQQGEwJERTEPMA0GA1UEBwwGQmVybGluMFkwEwYHKoZIzj0CAQYIKoZI
5+
zj0DAQcDQgAEtyX3CxW6sRambalSi0XwFLK4sIV7eJekaOX3hV05oGDl1umT84OL
6+
HHctC4+VcJ5R98gsDA9x8c8jT3o09yqarjAKBggqhkjOPQQDAgNJADBGAiEA9ALb
7+
jJ4w2bQ3QsxdneNYo1T3yUKjpPk4C2/wWpiU354CIQCAtuLX7Fwb2xfGXFzpOgK7
8+
OcwGN+Mb5xA9eR17/uq07Q==
9+
-----END CERTIFICATE-----

src/test/ruby/x509/rsa.crt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDjzCCAnegAwIBAgIUMbWvdUeWTEuSK5ppK5B6S+7LzO0wDQYJKoZIhvcNAQEL
3+
BQAwVzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
4+
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEQMA4GA1UEAwwHZGVtby5jYTAeFw0y
5+
MDAxMjkxNTQzNTZaFw0yMzAxMjgxNTQzNTZaMFcxCzAJBgNVBAYTAkFVMRMwEQYD
6+
VQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBM
7+
dGQxEDAOBgNVBAMMB2RlbW8uY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
8+
AoIBAQDOenkwnxjXDl7yD3Io23c+t777WOBNT+/XkElOCNCfp8ogbB6JVfZz2MW6
9+
MeNqfemnotsMM12OvnebL3QGHDVFFdsQ9Gnt3LaEttHhC/Xg8FSHk41g0D/guaJc
10+
XVhhgJBTW7hHl/vwCT8H/07z4ItGvILjttKCy89PqzxbodEoYNwNc/VSsQy9Eox/
11+
y2Z01EuiemcdvTMhZd6u8O5d5d0C52gbLmLeIkVmwOzOO7+9tJhEGcNJFGna4U5e
12+
Phu2Hk8PiI4B4VpvlXMIxpOJQWXrxnhwNRf6SSKWCEZOopH82YUPmILMPAiIubjI
13+
s2y2XwQXtt1Kj16RJriHngOn68gNAgMBAAGjUzBRMB0GA1UdDgQWBBS2JI9T0SRm
14+
8h3qTzcr8Do6eLpdRTAfBgNVHSMEGDAWgBS2JI9T0SRm8h3qTzcr8Do6eLpdRTAP
15+
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAojDNYMlZaZvjr2CQX
16+
OBVSY6ZJjiKkI1c4Ihx1Dx7RqJeGYUnqwrzRU5HTlvAvLUHfFMIV9ahXeuRlpsJ5
17+
DY2kjTwtyTozF8IPPEwc8DQrFhuO2qaZOzvCbYWqO5uqx0TKxXN227xv85pHT2if
18+
7IwhJwKInQg1d56heZ6Isz0tFysXeY7NJZ3iYgBg7PsBTeDiAPAW3XvXY2naSXui
19+
vp12fnfcH7GF8QrcuCiqrgDfNASsfkONfCDBmOPJdLmxoGHcXxwORrGM2XQkPeAU
20+
c/exZclzK5ke4rWkm0DoC/soHkCPkwE7LFcS0Uzvmyb5ORPSycBVS5mS13cz7YAy
21+
L/wk
22+
-----END CERTIFICATE-----

src/test/ruby/x509/test_x509cert.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,4 +508,22 @@ def test_cert_subject_hash
508508
EOF
509509
assert_equal '5ad8a5d6', cert.subject.hash.to_s(16)
510510
end
511+
512+
def test_ec_public_key
513+
cert_string = File.read(File.expand_path('ec.crt', File.dirname(__FILE__)))
514+
cert = OpenSSL::X509::Certificate.new(cert_string)
515+
assert_same OpenSSL::PKey::EC, cert.public_key.class
516+
end
517+
518+
def test_rsa_public_key
519+
cert_string = File.read(File.expand_path('rsa.crt', File.dirname(__FILE__)))
520+
cert = OpenSSL::X509::Certificate.new(cert_string)
521+
assert_same OpenSSL::PKey::RSA, cert.public_key.class
522+
end
523+
524+
def test_dsa_public_key
525+
cert_string = File.read(File.expand_path('dsa.crt', File.dirname(__FILE__)))
526+
cert = OpenSSL::X509::Certificate.new(cert_string)
527+
assert_same OpenSSL::PKey::DSA, cert.public_key.class
528+
end
511529
end

0 commit comments

Comments
 (0)