package com.sun.midp.crypto; import gnu.testlet.TestHarness; import gnu.testlet.Testlet; public class TestRSA implements Testlet { public int getExpectedPass() { return 16; } public int getExpectedFail() { return 0; } public int getExpectedKnownFail() { return 0; } public static byte[] hexToBytes(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } public void testRSA(TestHarness th, byte[] n, byte[] e, byte[] d, byte[] message) throws NoSuchAlgorithmException, InvalidKeyException, ShortBufferException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException { RSAPublicKey pubKey = new RSAPublicKey(n, e); RSAPrivateKey privKey = new RSAPrivateKey(n, d); Cipher rsa = Cipher.getInstance("RSA"); rsa.init(Cipher.ENCRYPT_MODE, privKey); byte[] encMessage = new byte[privKey.getModulusLen()]; rsa.doFinal(message, 0, message.length, encMessage, 0); Cipher rsa2 = Cipher.getInstance("RSA"); rsa2.init(Cipher.DECRYPT_MODE, pubKey); byte[] decMessage = new byte[pubKey.getModulusLen()]; rsa2.doFinal(encMessage, 0, encMessage.length, decMessage, 0); for (int i = 0; i < message.length; i++) { th.check(decMessage[i], message[i]); } } public void test(TestHarness th) { String message = "Marco"; // Generate the keys using: // openssl genrsa -out private_key.pem 128 // openssl rsa -text -in private_key.pem try { testRSA(th, hexToBytes("752246f60de21d71d98f2aa996add76f"), hexToBytes("010001"), hexToBytes("15fb5fcbcf612edb2c73f528be8c6ad1"), message.getBytes()); } catch (Exception e) { th.fail("Unexpected exception: " + e); e.printStackTrace(); } try { testRSA(th, hexToBytes("c2b44ceb71a7db5fd4eafe0cc519c1eb"), hexToBytes("010001"), hexToBytes("121e9b65f1ded030725bb1fbccbcc369"), message.getBytes()); } catch (Exception e) { th.fail("Unexpected exception: " + e); e.printStackTrace(); } try { testRSA(th, hexToBytes("7877819a103272312a16c9dac9168a1a106410e061e0c8935a96300a00036cc4694e8bda5924bb0cce70e191e28b5fd4ae37483025e850a0599c70a079515287fb0360c65293144a5e8f952607c8721eda13fb61ec43567c81f9cf27af789bb8e39e0936370f72f4746b8c5eb76fe3dfe083a813d49b2aea7b1f11d57dd8be0f25c1e1115582baec3930807a85c7f809e4b74d2760777b20c895f57c42225710dd0021ac1b735057e4f4da6894d4cf69fd1c6a3ebb69612900b61eca673405e3c8fc88ceac8e2f7e98b93ac4d74646b89491ac2ad28497d6878dedd8e6c979edc96878699c03e411841ffc4fd56a98b804ce2f43a224186d4a695b2856198d43"), hexToBytes("010001"), hexToBytes("2c442db9810e286bec7d673b1ffd4a4dfd8be7afac07bf6c76330dfffeb543788101bdde44377d0c5da7991bd45546a78e44fe1fc32e34c2576b66ef70e4f320c89a1b2b85184ab27140ed9b85eca012ba2bf189b019a6642616b78a6bae33faa29965e52822632974c638546daf8ddaac5374a5a4d047dad5d73ae46a5404b2670f6740ed51eb77d0059d364af99561d8628bc189a43aa78cabaec3b1287ee75df035685cdcdb44377d17941e5592e02894ed95be2b4b04fa06235afb02f6713d7205e3afda3cbf496b4a1c5daffc323f8f36b685afe2d48402dead25bc69d0bbd35bd05456ebfabf34c04f64f8fe2ae029b5c5b9a0b5d0e78d64ffabbd1751"), message.getBytes()); } catch (Exception e) { th.fail("Unexpected exception: " + e); e.printStackTrace(); } try { String longMessage = "MykMyk"; testRSA(th, hexToBytes("752246f60de21d71d98f2aa996add76f"), hexToBytes("010001"), hexToBytes("15fb5fcbcf612edb2c73f528be8c6ad1"), longMessage.getBytes()); th.fail("Exception expected"); } catch (IllegalArgumentException e) { th.check(true, "Exception expected"); } catch (Exception e) { th.fail("Unexpected exception: " + e); e.printStackTrace(); } } }