Skip to content

Commit d692376

Browse files
committed
[compat] implement PKey::DSA public_to_der and public_to_pem
1 parent 7dbac3c commit d692376

File tree

2 files changed

+65
-28
lines changed

2 files changed

+65
-28
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import static org.jruby.ext.openssl.impl.PKey.readDSAPublicKey;
6868
import static org.jruby.ext.openssl.impl.PKey.toASN1Primitive;
6969
import static org.jruby.ext.openssl.impl.PKey.toDerDSAKey;
70+
import static org.jruby.ext.openssl.impl.PKey.toDerDSAPublicKey;
7071

7172
/**
7273
* @author <a href="mailto:[email protected]">Ola Bini</a>
@@ -298,6 +299,21 @@ public RubyBoolean private_p() {
298299
return privateKey != null ? getRuntime().getTrue() : getRuntime().getFalse();
299300
}
300301

302+
@JRubyMethod(name = "public_to_der")
303+
public RubyString public_to_der(ThreadContext context) {
304+
final byte[] bytes;
305+
try {
306+
bytes = toDerDSAPublicKey(publicKey);
307+
}
308+
catch (NoClassDefFoundError e) {
309+
throw newDSAError(getRuntime(), bcExceptionMessage(e));
310+
}
311+
catch (IOException e) {
312+
throw newDSAError(getRuntime(), e.getMessage(), e);
313+
}
314+
return StringHelper.newString(context.runtime, bytes);
315+
}
316+
301317
@Override
302318
@JRubyMethod(name = "to_der")
303319
public RubyString to_der() {
@@ -398,6 +414,21 @@ public RubyString to_pem(final ThreadContext context, final IRubyObject[] args)
398414
}
399415
}
400416

417+
@JRubyMethod
418+
public RubyString public_to_pem(ThreadContext context) {
419+
try {
420+
final StringWriter writer = new StringWriter();
421+
PEMInputOutput.writeDSAPublicKey(writer, publicKey);
422+
return RubyString.newString(context.runtime, writer.getBuffer());
423+
}
424+
catch (NoClassDefFoundError ncdfe) {
425+
throw newDSAError(context.runtime, bcExceptionMessage(ncdfe));
426+
}
427+
catch (IOException e) {
428+
throw newDSAError(context.runtime, e.getMessage(), e);
429+
}
430+
}
431+
401432
@JRubyMethod // ossl_dsa_sign
402433
public IRubyObject syssign(IRubyObject data) {
403434
final Ruby runtime = getRuntime();

src/test/ruby/dsa/test_dsa.rb

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -102,26 +102,26 @@ def test_DSAPrivateKey
102102
# OpenSSL DSAPrivateKey format; similar to RSAPrivateKey
103103
dsa512 = Fixtures.pkey("dsa512")
104104
asn1 = OpenSSL::ASN1::Sequence([
105-
OpenSSL::ASN1::Integer(0),
106-
OpenSSL::ASN1::Integer(dsa512.p),
107-
OpenSSL::ASN1::Integer(dsa512.q),
108-
OpenSSL::ASN1::Integer(dsa512.g),
109-
OpenSSL::ASN1::Integer(dsa512.pub_key),
110-
OpenSSL::ASN1::Integer(dsa512.priv_key)
111-
])
105+
OpenSSL::ASN1::Integer(0),
106+
OpenSSL::ASN1::Integer(dsa512.p),
107+
OpenSSL::ASN1::Integer(dsa512.q),
108+
OpenSSL::ASN1::Integer(dsa512.g),
109+
OpenSSL::ASN1::Integer(dsa512.pub_key),
110+
OpenSSL::ASN1::Integer(dsa512.priv_key)
111+
])
112112
key = OpenSSL::PKey::DSA.new(asn1.to_der)
113113
assert_predicate key, :private?
114114
assert_same_dsa dsa512, key
115115

116-
pem = <<-EOF
117-
-----BEGIN DSA PRIVATE KEY-----
118-
MIH4AgEAAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgTYiEEHaOYhkIxv0Ok
119-
RZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB4DZGH7UyarcaGy6D
120-
AkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqoji3/lHdKoVdTQNuR
121-
S/m6DlCwhjRjiQ/lBRgCLCcaAkEAjN891JBjzpMj4bWgsACmMggFf57DS0Ti+5++
122-
Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxXoXi9OAIUBG98h4tilg6S
123-
55jreJD3Se3slps=
124-
-----END DSA PRIVATE KEY-----
116+
pem = <<~EOF
117+
-----BEGIN DSA PRIVATE KEY-----
118+
MIH4AgEAAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgTYiEEHaOYhkIxv0Ok
119+
RZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB4DZGH7UyarcaGy6D
120+
AkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqoji3/lHdKoVdTQNuR
121+
S/m6DlCwhjRjiQ/lBRgCLCcaAkEAjN891JBjzpMj4bWgsACmMggFf57DS0Ti+5++
122+
Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxXoXi9OAIUBG98h4tilg6S
123+
55jreJD3Se3slps=
124+
-----END DSA PRIVATE KEY-----
125125
EOF
126126
key = OpenSSL::PKey::DSA.new(pem)
127127
assert_same_dsa dsa512, key
@@ -133,18 +133,18 @@ def test_DSAPrivateKey
133133
def test_DSAPrivateKey_encrypted
134134
# key = abcdef
135135
dsa512 = Fixtures.pkey("dsa512")
136-
pem = <<-EOF
137-
-----BEGIN DSA PRIVATE KEY-----
138-
Proc-Type: 4,ENCRYPTED
139-
DEK-Info: AES-128-CBC,F8BB7BFC7EAB9118AC2E3DA16C8DB1D9
140-
141-
D2sIzsM9MLXBtlF4RW42u2GB9gX3HQ3prtVIjWPLaKBYoToRUiv8WKsjptfZuLSB
142-
74ZPdMS7VITM+W1HIxo/tjS80348Cwc9ou8H/E6WGat8ZUk/igLOUEII+coQS6qw
143-
QpuLMcCIavevX0gjdjEIkojBB81TYDofA1Bp1z1zDI/2Zhw822xapI79ZF7Rmywt
144-
OSyWzFaGipgDpdFsGzvT6//z0jMr0AuJVcZ0VJ5lyPGQZAeVBlbYEI4T72cC5Cz7
145-
XvLiaUtum6/sASD2PQqdDNpgx/WA6Vs1Po2kIUQIM5TIwyJI0GdykZcYm6xIK/ta
146-
Wgx6c8K+qBAIVrilw3EWxw==
147-
-----END DSA PRIVATE KEY-----
136+
pem = <<~EOF
137+
-----BEGIN DSA PRIVATE KEY-----
138+
Proc-Type: 4,ENCRYPTED
139+
DEK-Info: AES-128-CBC,F8BB7BFC7EAB9118AC2E3DA16C8DB1D9
140+
141+
D2sIzsM9MLXBtlF4RW42u2GB9gX3HQ3prtVIjWPLaKBYoToRUiv8WKsjptfZuLSB
142+
74ZPdMS7VITM+W1HIxo/tjS80348Cwc9ou8H/E6WGat8ZUk/igLOUEII+coQS6qw
143+
QpuLMcCIavevX0gjdjEIkojBB81TYDofA1Bp1z1zDI/2Zhw822xapI79ZF7Rmywt
144+
OSyWzFaGipgDpdFsGzvT6//z0jMr0AuJVcZ0VJ5lyPGQZAeVBlbYEI4T72cC5Cz7
145+
XvLiaUtum6/sASD2PQqdDNpgx/WA6Vs1Po2kIUQIM5TIwyJI0GdykZcYm6xIK/ta
146+
Wgx6c8K+qBAIVrilw3EWxw==
147+
-----END DSA PRIVATE KEY-----
148148
EOF
149149
key = OpenSSL::PKey::DSA.new(pem, "abcdef")
150150
assert_same_dsa dsa512, key
@@ -196,6 +196,12 @@ def test_PUBKEY
196196

197197
##
198198
assert_equal der, key.to_der
199+
assert_equal pem, key.export
200+
201+
assert_equal der, dsa512.public_to_der
202+
assert_equal der, key.public_to_der
203+
assert_equal pem, dsa512.public_to_pem
204+
assert_equal pem, key.public_to_pem
199205

200206
dup_der = dup_public(dsa512).to_der
201207
# pp OpenSSL::ASN1.decode(dup_der)

0 commit comments

Comments
 (0)