package es.gob.jmulticard; import java.security.KeyStore; import java.security.KeyStore.LoadStoreParameter; import java.security.KeyStore.ProtectionParameter; import java.security.PrivateKey; import java.security.Provider; import java.security.Security; import java.security.Signature; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.util.Enumeration; import javax.security.auth.callback.CallbackHandler; import org.junit.Test; import es.gob.jmulticard.jse.provider.DnieProvider; import es.gob.jmulticard.jse.smartcardio.SmartcardIoConnection; /** Pruebas del proveedor JSE para DNIe 100% Java. * @author Tomás García-Merás */ public final class TestJseProvider { private static final char[] PASSWORD = "password".toCharArray(); //$NON-NLS-1$ /** Main. * @param args No se usa. * @throws Exception En cualquier error. */ public static void main(final String[] args) throws Exception { TestJseProvider.testProviderWithCustomConnection(); //TestJseProvider.testProviderWithDefaultConnection(); } static void testProviderWithCustomConnection() throws Exception { final Provider p = new DnieProvider(new SmartcardIoConnection()); Security.addProvider(p); final KeyStore ks = KeyStore.getInstance("DNI"); //$NON-NLS-1$ final CallbackHandler callbackHandler; callbackHandler = (CallbackHandler) Class.forName("es.gob.jmulticard.ui.passwordcallback.gui.DnieCallbackHandler").getConstructor().newInstance(); //$NON-NLS-1$ final LoadStoreParameter lsp = new LoadStoreParameter() { @Override public ProtectionParameter getProtectionParameter() { return new KeyStore.CallbackHandlerProtection(callbackHandler); } }; ks.load(lsp); final Enumeration<String> aliases = ks.aliases(); while (aliases.hasMoreElements()) { System.out.println(aliases.nextElement()); } final Signature signature = Signature.getInstance("SHA1withRSA"); //$NON-NLS-1$ signature.initSign((PrivateKey) ks.getKey("CertFirmaDigital", PASSWORD)); //$NON-NLS-1$ signature.update("Hola Mundo!!".getBytes()); //$NON-NLS-1$ signature.sign(); System.out.println("Firma generada correctamente"); //$NON-NLS-1$ } static void testProviderWithDefaultConnection() throws Exception { final Provider p = new DnieProvider(); Security.addProvider(p); final KeyStore ks = KeyStore.getInstance("DNI"); //$NON-NLS-1$ ks.load(null, PASSWORD); final Enumeration<String> aliases = ks.aliases(); while (aliases.hasMoreElements()) { System.out.println(aliases.nextElement()); } final Signature signature = Signature.getInstance("SHA1withRSA"); //$NON-NLS-1$ signature.initSign((PrivateKey) ks.getKey("CertFirmaDigital", PASSWORD)); //$NON-NLS-1$ signature.update("Hola Mundo!!".getBytes()); //$NON-NLS-1$ signature.sign(); System.out.println("Firma generada correctamente"); //$NON-NLS-1$ System.out.println( ((X509Certificate)ks.getCertificate("CertFirmaDigital")).getIssuerX500Principal().toString() //$NON-NLS-1$ ); } /** prueba de obtención de la cadena de certificados. * @throws Exception En cualquier error. */ @SuppressWarnings("static-method") @Test public void testGetCertificateChain() throws Exception { final Provider p = new DnieProvider(); Security.addProvider(p); final KeyStore ks = KeyStore.getInstance("DNI"); //$NON-NLS-1$ ks.load(null, PASSWORD); final Enumeration<String> aliases = ks.aliases(); while (aliases.hasMoreElements()) { final String alias = aliases.nextElement(); for (final Certificate cert : ks.getCertificateChain(alias)) { System.out.println( "XXX: " + ((X509Certificate)cert).getSubjectX500Principal() //$NON-NLS-1$ ); } } } }