package de.persosim.simulator.perso.xstream; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.io.StringReader; import java.io.StringWriter; import java.security.KeyFactory; import java.security.KeyPair; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import org.globaltester.cryptoprovider.Crypto; import org.junit.Before; import org.junit.Test; import com.thoughtworks.xstream.converters.ConversionException; import de.persosim.simulator.perso.PersonalizationFactory; import de.persosim.simulator.test.PersoSimTestCase; import de.persosim.simulator.utils.HexString; public class KeyPairConverterTest extends PersoSimTestCase { KeyPair keyPair; @Before public void setUp() { PublicKey pk = null; PrivateKey sk = null; String byteValuePk = "308202050201003081EC06072A8648CE3D02013081E0020101302C06072A8648CE3D0101022100A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013" + "481D1F6E5377304404207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9042026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCD" + "C18FF8C07B60441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F04" + "6997022100A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A70201010482010F3082010B0201010420A07EB62E891DAA84643E0AFCC1AF006891B" + "669B8F51E379477DBEAB8C987A610A081E33081E0020101302C06072A8648CE3D0101022100A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E537730" + "4404207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9042026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6044" + "1048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997022100A9FB" + "57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7020101"; String byteValueSk = "308201333081EC06072A8648CE3D02013081E0020101302C06072A8648CE3D0101022100A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F" + "6E5377304404207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9042026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8" + "C07B60441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F04699702" + "2100A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A70201010342000419D4B7447788B0E1993DB35500999627E739A4E5E35F02D8FB07D6122E7" + "6567F17758D7A3AA6943EF23E5E2909B3E8B31BFAA4544C2CBF1FB487F31FF239C8F8"; String algorithmValue = "ECDH"; PKCS8EncodedKeySpec ks_sk = new PKCS8EncodedKeySpec (HexString.toByteArray(byteValuePk)); X509EncodedKeySpec ks_pk = new X509EncodedKeySpec (HexString.toByteArray(byteValueSk)); try { pk = KeyFactory.getInstance(algorithmValue, Crypto.getCryptoProvider()).generatePublic(ks_pk); sk = KeyFactory.getInstance(algorithmValue, Crypto.getCryptoProvider()).generatePrivate(ks_sk); } catch (InvalidKeySpecException | NoSuchAlgorithmException e) { e.printStackTrace(); } keyPair = new KeyPair(pk, sk); } /** * Marshals a KeyPair object and unmarshals it again. * * All attributes must be equal. */ @Test public void testKeyPairConverter_MarshalUnmarshal_KeyPair() { StringWriter writer = new StringWriter(); PersonalizationFactory.marshal(keyPair, writer); KeyPair keyPairUnmarshal = (KeyPair) PersonalizationFactory.unmarshal(new StringReader(writer.toString())); assertArrayEquals("ByteArray", keyPair.getPrivate().getEncoded(), keyPairUnmarshal.getPrivate().getEncoded()); assertEquals("EncodedBytes", HexString.encode(keyPair.getPrivate().getEncoded()), HexString.encode(keyPairUnmarshal.getPrivate().getEncoded())); assertEquals("Algorithm", keyPair.getPrivate().getAlgorithm(), keyPairUnmarshal.getPrivate().getAlgorithm()); assertArrayEquals("ByteArray", keyPair.getPublic().getEncoded(), keyPairUnmarshal.getPublic().getEncoded()); assertEquals("EncodedBytes", HexString.encode(keyPair.getPublic().getEncoded()), HexString.encode(keyPairUnmarshal.getPublic().getEncoded())); assertEquals("Algorithm", keyPair.getPublic().getAlgorithm(), keyPairUnmarshal.getPublic().getAlgorithm()); } /** * Marshals a KeyPair object, unmarshals it and marshals it again. * * All unmarshalled object content (from both objects) must be identical. */ @Test public void testKeyPairConverter_MarshalUnmarshalMarshal_KeyPair() { StringWriter writer = new StringWriter(); PersonalizationFactory.marshal(keyPair, writer); KeyPair keyPairUnmarshal = (KeyPair) PersonalizationFactory.unmarshal(new StringReader(writer.toString())); StringWriter writer2 = new StringWriter(); PersonalizationFactory.marshal(keyPairUnmarshal, writer2); assertEquals("KeyPairXml", writer.toString(), writer2.toString()); } /** * Try to to unmarshal KeyPair, but the algorithm inside the keys is null. * * @throws ConversionException */ @Test(expected = ConversionException.class) public void testKeyPairConverter_UnmarshalKeyPair_AlgorithmIsNull() throws ConversionException { StringWriter writer = new StringWriter(); PersonalizationFactory.marshal(keyPair, writer); String xmlKeyPair = writer.toString(); xmlKeyPair = xmlKeyPair.replace("<algorithm>ECDH</algorithm>", ""); assertNull(PersonalizationFactory.unmarshal(new StringReader(xmlKeyPair))); } /** * Try to to unmarshal KeyPair, but the value inside the keys is null. * * @throws ConversionException */ @Test(expected = ConversionException.class) public void testKeyPairConverter_UnmarshalKeyPair_PrivKeyValueIsNull() throws ConversionException { StringWriter writer = new StringWriter(); PersonalizationFactory.marshal(keyPair, writer); String xmlKeyPair = writer.toString(); xmlKeyPair = xmlKeyPair.replace("<value>308202050201003081EC06072A8648CE3D02013081E0020101302C06072A8648CE3D0101022100A9FB57DBA1EEA9BC" + "3E660A909D838D726E3BF623D52620282013481D1F6E5377304404207D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9042" + "026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B60441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A44" + "53BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997022100A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B" + "561A6F7901E0E82974856A70201010482010F3082010B0201010420A07EB62E891DAA84643E0AFCC1AF006891B669B8F51E379477DBEAB8C987A610A081" + "E33081E0020101302C06072A8648CE3D0101022100A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377304404207D5A0975F" + "C2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9042026DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6" + "0441048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D5" + "4C72F046997022100A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7020101</value>", ""); assertNull(PersonalizationFactory.unmarshal(new StringReader(xmlKeyPair))); } }