Skip to content

Commit 47c9f42

Browse files
committed
fix NPE when reading private keys (with passwd)
resolves jruby/jruby#1784
1 parent 3cbd503 commit 47c9f42

File tree

4 files changed

+75
-8
lines changed

4 files changed

+75
-8
lines changed

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

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,21 @@ public static IRubyObject read(final ThreadContext context, IRubyObject recv, IR
125125
}
126126
}
127127
if (key != null) {
128-
if (key.getPublic().getAlgorithm().equals("RSA")) {
129-
return new PKeyRSA(runtime, _PKey(runtime).getClass("RSA"), (RSAPrivateCrtKey) key.getPrivate(),
130-
(RSAPublicKey) key.getPublic());
131-
} else if (key.getPublic().getAlgorithm().equals("DSA")) {
132-
return new PKeyDSA(runtime, _PKey(runtime).getClass("DSA"), (DSAPrivateKey) key.getPrivate(),
133-
(DSAPublicKey) key.getPublic());
128+
final String alg = getAlgorithm(key);
129+
if ( "RSA".equals(alg) ) {
130+
return new PKeyRSA(runtime, _PKey(runtime).getClass("RSA"),
131+
(RSAPrivateCrtKey) key.getPrivate(), (RSAPublicKey) key.getPublic()
132+
);
133+
}
134+
if ( "DSA".equals(alg) ) {
135+
return new PKeyDSA(runtime, _PKey(runtime).getClass("DSA"),
136+
(DSAPrivateKey) key.getPrivate(), (DSAPublicKey) key.getPublic()
137+
);
138+
}
139+
if ( "ECDSA".equals(alg) ) {
140+
return new PKeyEC(runtime, _PKey(runtime).getClass("EC"),
141+
(PrivateKey) key.getPrivate(), (PublicKey) key.getPublic()
142+
);
134143
}
135144
}
136145

@@ -153,15 +162,26 @@ public static IRubyObject read(final ThreadContext context, IRubyObject recv, IR
153162
}
154163

155164
if (pubKey != null) {
156-
if (pubKey.getAlgorithm().equals("RSA")) {
165+
if ( "RSA".equals(pubKey.getAlgorithm()) ) {
157166
return new PKeyRSA(runtime, (RSAPublicKey) pubKey);
158-
} else if (key.getPublic().getAlgorithm().equals("DSA")) {
167+
}
168+
if ( "DSA".equals(pubKey.getAlgorithm()) ) {
159169
return new PKeyDSA(runtime, (DSAPublicKey) pubKey);
160170
}
171+
if ( "ECDSA".equals(pubKey.getAlgorithm()) ) {
172+
return new PKeyEC(runtime, pubKey);
173+
}
161174
}
162175

163176
throw runtime.newArgumentError("Could not parse PKey");
164177
}
178+
179+
private static String getAlgorithm(final KeyPair key) {
180+
if ( key.getPrivate() != null ) return key.getPrivate().getAlgorithm();
181+
if ( key.getPublic() != null ) return key.getPublic().getAlgorithm();
182+
return null;
183+
}
184+
165185
}
166186

167187
public PKey(Ruby runtime, RubyClass type) {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ public PKeyEC(Ruby runtime, RubyClass type) {
189189
super(runtime, type);
190190
}
191191

192+
PKeyEC(Ruby runtime, PublicKey pubKey) {
193+
this(runtime, _EC(runtime), null, pubKey);
194+
}
195+
192196
PKeyEC(Ruby runtime, RubyClass type, PrivateKey privKey, PublicKey pubKey) {
193197
super(runtime, type);
194198
this.privateKey = privKey;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
-----BEGIN ENCRYPTED PRIVATE KEY-----
2+
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIi+Fi+FH7OtACAggA
3+
MBQGCCqGSIb3DQMHBAivzaRTYRNk4QSCBMhnQ7/NN0ljkAwADHknQi4dgbBU+FV+
4+
vY+ypRCTLp7UongPMDS+pC6TyOFGeHz4Yri3UvmEIN5DlBlAfjPI6+lBswjOIrpw
5+
6CaZXrX4oefjh73c2OcQlYKw9w03ppfmfO0v1t6oPLiK6M8sNQ5lgb8d9eG3r6Dp
6+
LqIp4I6WeGcoXIpVYE35sz6wmLQ2Q626KY/5BPVAgMVG3K1g1haxZIAQBQE63cqz
7+
JK3IUiG2r6Q6vOyZ+Iz9KolEf3RVvW/RgOrb0dLbbLkDOL8G6dXDgWEeYtqGZpPR
8+
BktU2Kf7lr0BAgbI3eLubmIufhonoV4VkHVYu1ZSACwSl2HEqDl5aF5hP3wOtfS5
9+
Ls62Z1ATO/24dG1oI8xL3YCeTzoa1Lmyeh+HFRncoVU5CdQgyzY9d5yr1x70AwN+
10+
MpVwd0+WGyESiRVd4dN8n99SY/bTaYJxv8P+wOrbjld9Q3mF3vxx6Nkkfboai1wD
11+
bY9i/B5/TZip5FBnZbJiYakc+yoB6Bf1UuIZA9T9EIY2K7VhTeuEjTTqJVf7dp/C
12+
ZqVSNCHO3eAUMByrshznw2YCia8Q1VAXgIbnZ8RvUxxIZVUDTxuWPkBJkcrmMgKt
13+
GvD2YYIOIuFwTLCFBTlcXNl8kNYc9VRAnK7efi9xrzINod0VSV5hj1PYT4e2khnS
14+
4cngMTbbNwWP8Rg7pSxzwWIwc8Zkytde5gnfkBFv+g8o+JRM2ZB3wkiUhEkf0Vht
15+
gl3K9LFqdqN+EsRjXR/a16sVK3Uer7zcy/NLzvo/rF0YKRmb+apDIFO/vtCX9qyH
16+
+pBofVO+RNb2T2ZY1iSvyjv/d7nNXRnLArecralQjekh+AKIBsl5R0nsSnQu6ydn
17+
yDteKDuOPnVl4qQowVbmGg7juHW9j4u98H7cW4RN/txegG1J7gbFFdl2bjYQ/PGZ
18+
iAG53QvjmvRRaiPCNOB3PYm1yO/1vCPAKlOeBYywF53BSxCDx9OjP0eXROdQGiZV
19+
XEkDqf742R9/8Fy1ETcriEzRVWv4nSRmB+yfMfHcTZZiJnEF9RUYQVxBVfpwBi8t
20+
I8N46L2iNeY4itbN8Ke3U3EfntdoZMNI1uN/haDmLFuRuzZIBkSl3YsnsDJXaT5P
21+
KjPPiZWkxsC3KUYeisefjNHonkM6JXqAy9ElyWrjSPhioMLTy3Qwus8NPGLWkMfI
22+
bpy7Z63xRf9tifXoANLOqC/VVXOCn4m/eEUAMi0EQZ7QbysopFigiri/MFidXf90
23+
aIUMiPmCTzLDBJfHozyalMVf3aJFbDJdlAmFtasAP1aPgqReAb9s+6U3wkE8VtGB
24+
rneBPhejj9FzrWMludgPLDRvfzr6/0nG2GC7XbOnKPd0RbKFtZaJuT18Jhil5Bwb
25+
S2MBrUnxMmOge9N5ZIyzXk+lPFRMkHmY64h+P/Op9w8tVYCFlj4HjAboVpJAGIq4
26+
gPgT3Q/0ghRyyBjBrmSDuk+/1s7qc/lWUONFAJaSCRdhpM9I8il5QYHPM6Z9JCg+
27+
PrfHftP+bU0xht7mVI5ew1OjWTZEym0/ALEyqddLz0qFYejKSemx8EMze8cN2wEE
28+
OTAqyVBLo+7HJ2FbIXMgRNSc4P77jmeEG0/4WsreMOeI1/6nOiwqvipuLY9ojc9v
29+
TGQ=
30+
-----END ENCRYPTED PRIVATE KEY-----

src/test/ruby/rsa/test_rsa.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,17 @@ def test_rsa_from_params_private_first
9090
end
9191
end
9292

93+
def test_read_private_key
94+
cert = File.join(File.dirname(__FILE__), 'private_key.pem')
95+
assert key = OpenSSL::PKey.read(File.read(cert))
96+
assert key.is_a?(OpenSSL::PKey::RSA)
97+
end
98+
99+
def test_read_private_key_with_password
100+
cert = File.join(File.dirname(__FILE__), 'private_key_with_pass.pem')
101+
pass = "secure-password!42"
102+
assert key = OpenSSL::PKey.read(File.read(cert), pass)
103+
assert key.is_a?(OpenSSL::PKey::RSA)
104+
end
105+
93106
end

0 commit comments

Comments
 (0)