Skip to content

Commit 2584c40

Browse files
authored
[fix] for CRL verify when signed with EC key (#276)
* Fix for CRL verify when signed with EC key Signed-off-by: Tero Saarni <[email protected]> * Added test case for CRL validation Signed-off-by: Tero Saarni <[email protected]>
1 parent 94aa9f4 commit 2584c40

File tree

4 files changed

+31
-1
lines changed

4 files changed

+31
-1
lines changed

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

+7
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import java.security.cert.X509CRL;
5858
import java.security.interfaces.DSAParams;
5959
import java.security.interfaces.DSAPublicKey;
60+
import java.security.interfaces.ECPublicKey;
6061
import java.security.interfaces.RSAPublicKey;
6162
import java.util.Locale;
6263
import java.util.Map;
@@ -85,11 +86,13 @@
8586
import org.bouncycastle.crypto.params.DSAPublicKeyParameters;
8687
import org.bouncycastle.crypto.params.RSAKeyParameters;
8788
import org.bouncycastle.jce.provider.X509CRLObject;
89+
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
8890
import org.bouncycastle.operator.ContentVerifierProvider;
8991
import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder;
9092
import org.bouncycastle.operator.DigestAlgorithmIdentifierFinder;
9193
import org.bouncycastle.operator.OperatorException;
9294
import org.bouncycastle.operator.bc.BcDSAContentVerifierProviderBuilder;
95+
import org.bouncycastle.operator.bc.BcECContentVerifierProviderBuilder;
9396
import org.bouncycastle.operator.bc.BcRSAContentVerifierProviderBuilder;
9497
import org.jruby.util.SafePropertyAccessor;
9598

@@ -610,6 +613,10 @@ static boolean verify(final X509CRL crl, final PublicKey publicKey, final boolea
610613
AsymmetricKeyParameter dsaKey = new DSAPublicKeyParameters(y, parameters);
611614
verifierProvider = new BcDSAContentVerifierProviderBuilder(digestAlgFinder).build(dsaKey);
612615
}
616+
else if ( "EC".equalsIgnoreCase( publicKey.getAlgorithm() )) {
617+
AsymmetricKeyParameter ecKey = ECUtil.generatePublicKeyParameter(publicKey);
618+
verifierProvider = new BcECContentVerifierProviderBuilder(digestAlgFinder).build(ecKey);
619+
}
613620
else {
614621
BigInteger mod = ((RSAPublicKey) publicKey).getModulus();
615622
BigInteger exp = ((RSAPublicKey) publicKey).getPublicExponent();

src/test/ruby/x509/ec-ca.crl

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-----BEGIN X509 CRL-----
2+
MIHcMIGDAgEBMAoGCCqGSM49BAMCMBAxDjAMBgNVBAMTBWVjLWNhFw0yMzA1MDIx
3+
NDIwNTFaGA8yMDczMDIyODE0MjA1MVowGzAZAggXW1l2cygQyxcNMjMwNTAyMTQy
4+
MDUxWqAjMCEwHwYDVR0jBBgwFoAUttNRPFixOdwcEEs8Zc/AP+XGM8IwCgYIKoZI
5+
zj0EAwIDSAAwRQIhAIY/kYfZbkAJUOQkXcJrGfeZLUYpt2mofamD2aHGhaE8AiAh
6+
rW6t9BQ3xUCKHTODJHJHe+otaiwSCXoVI2jlJBcDWg==
7+
-----END X509 CRL-----

src/test/ruby/x509/ec-ca.crt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIBWzCCAQCgAwIBAgIIF1tZdnMbfdcwCgYIKoZIzj0EAwIwEDEOMAwGA1UEAxMF
3+
ZWMtY2EwIBcNMjMwNTAyMTQyMDUxWhgPMjA3MzA0MTkxNDIwNTFaMBAxDjAMBgNV
4+
BAMTBWVjLWNhMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3xYZYfagw6booMq2
5+
L/4x2RKVgwWM4UbAbycJHuubBESVic8AApX1WcjOEKjQt+9GqVFAJxKzjlxGA+Hc
6+
SVlpIaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
7+
BBYEFLbTUTxYsTncHBBLPGXPwD/lxjPCMAoGCCqGSM49BAMCA0kAMEYCIQD5QgDE
8+
1AijBncz7ItMv+q2vED1/AqNNY/whm71/wGK+QIhANkGiD6DdrydjEgVuFTvW/Kg
9+
S122sk5XXx5zlCmZVZQA
10+
-----END CERTIFICATE-----

src/test/ruby/x509/test_x509crl.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,12 @@ def test_to_java
170170
assert_same crl.to_java, crl.to_java(java.security.cert.X509CRL)
171171
end
172172

173+
def test_verify_crl_signature
174+
crl = OpenSSL::X509::CRL.new(File.read(File.expand_path('../ec-ca.crl', __FILE__)))
175+
ca = OpenSSL::X509::Certificate.new(File.read(File.expand_path('../ec-ca.crt', __FILE__)))
176+
assert crl.verify(ca.public_key)
177+
end
178+
173179
private
174180

175181
def get_subject_key_id(cert)
@@ -211,4 +217,4 @@ def get_subject_key_id(cert)
211217
-----END RSA PRIVATE KEY-----
212218
_end_of_pem_
213219

214-
end
220+
end

0 commit comments

Comments
 (0)