package org.jboss.resteasy.test.crypto; import org.jboss.resteasy.util.Base64; import org.jboss.resteasy.utils.TestUtil; import org.junit.Assert; import org.junit.Test; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; /** * @tpSubChapter Crypto * @tpChapter Unit tests * @tpTestCaseDetails Test for sign by PKCS8EncodedKeySpec and X509EncodedKeySpec. * @tpSince RESTEasy 3.0.16 */ public class ExampleSignTest { static final String publicFileS = TestUtil.getResourcePath(ExampleSignTest.class, "ExampleSignPublicDkimKey.pem"); static final String privateFileS = TestUtil.getResourcePath(ExampleSignTest.class, "ExampleSignPrivateDkimKey.der"); public static PrivateKey getPrivate(InputStream is) throws Exception { DataInputStream dis = new DataInputStream(is); byte[] keyBytes = new byte[dis.available()]; dis.readFully(keyBytes); dis.close(); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePrivate(spec); } public PublicKey getPublic(InputStream is) throws Exception { DataInputStream dis = new DataInputStream(is); byte[] pemFile = new byte[dis.available()]; dis.readFully(pemFile); String pem = new String(pemFile); pem = pem.replace("-----BEGIN PUBLIC KEY-----", ""); pem = pem.replace("-----END PUBLIC KEY-----", ""); pem = pem.trim(); byte[] der = Base64.decode(pem); X509EncodedKeySpec spec = new X509EncodedKeySpec(der); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePublic(spec); } /** * @tpTestDetails Check pem file * @tpSince RESTEasy 3.0.16 */ @Test public void testPemFiles() throws Exception { File publicFile = new File(publicFileS); File privateFile = new File(privateFileS); InputStream publicIs = new FileInputStream(publicFile); InputStream privateIs = new FileInputStream(privateFile); PublicKey publicKey = getPublic(publicIs); PrivateKey privateKey = getPrivate(privateIs); Signature instance = Signature.getInstance("SHA256withRSA"); instance.initSign(privateKey); instance.update("from-java".getBytes()); byte[] signatureBytes = instance.sign(); Signature verify = Signature.getInstance("SHA256withRSA"); verify.initVerify(publicKey); verify.update("from-java".getBytes()); Assert.assertTrue("Sign was unsuccessful", verify.verify(signatureBytes)); } }