/** * Genera una cadena representativa del árbol que recibe. * * @param tree Árbol que se desea representar. * @param linePrefx Prefijo de cada línea de firma (por defecto, cadena vacía). * @param identationString Cadena para la identación de los nodos de firma (por defecto, * tabulador). * @return Cadena de texto. */ public static String showTreeAsString( final AOTreeModel tree, final String linePrefx, final String identationString) { if (tree == null || tree.getRoot() == null) { LOGGER.severe("Se ha proporcionado un arbol de firmas vacio"); // $NON-NLS-1$ return null; } if (!(tree.getRoot() instanceof AOTreeNode)) { LOGGER.severe( "La raiz del arbol de firmas no es de tipo DafaultMutableTreeNode"); //$NON-NLS-1$ return null; } final StringBuilder buffer = new StringBuilder(); // Transformamos en cadenas de texto cada rama que surja del nodo raiz // del arbol final AOTreeNode root = (AOTreeNode) tree.getRoot(); for (int i = 0; i < root.getChildCount(); i++) { archiveTreeNode( root.getChildAt(i), 0, linePrefx != null ? linePrefx : "", identationString != null ? identationString : "\t", buffer); //$NON-NLS-1$//$NON-NLS-2$ } return buffer.toString(); }
/** * Prueba de firma convencional. * * @throws Exception en cualquier error */ @SuppressWarnings("static-method") @Test public void testSignature() throws Exception { Assert.assertEquals( "file.signed.pdf", AOPDFSigner.getSignedName("file.pdf")); // $NON-NLS-1$ //$NON-NLS-2$ Logger.getLogger("es.gob.afirma").setLevel(Level.WARNING); // $NON-NLS-1$ final PrivateKeyEntry pke; final X509Certificate cert; final KeyStore ks = KeyStore.getInstance("PKCS12"); // $NON-NLS-1$ ks.load(ClassLoader.getSystemResourceAsStream(CERT_PATH), CERT_PASS.toCharArray()); pke = (PrivateKeyEntry) ks.getEntry(CERT_ALIAS, new KeyStore.PasswordProtection(CERT_PASS.toCharArray())); cert = (X509Certificate) ks.getCertificate(CERT_ALIAS); final AOSigner signer = new AOPDFSigner(); String prueba; for (final Properties extraParams : PADES_MODES) { for (final String algo : ALGOS) { for (final String file : TEST_FILES) { final byte[] testPdf = AOUtil.getDataFromInputStream(ClassLoader.getSystemResourceAsStream(file)); Assert.assertTrue( "No se ha reconocido como un PDF", signer.isValidDataFile(testPdf)); // $NON-NLS-1$ prueba = "Firma PAdES en modo '" + //$NON-NLS-1$ extraParams.getProperty("mode") + //$NON-NLS-1$ "' con el algoritmo ': " + //$NON-NLS-1$ algo + "' y el fichero '" + //$NON-NLS-1$ file + "'"; //$NON-NLS-1$ System.out.println(prueba); final byte[] result = signer.sign( testPdf, algo, pke.getPrivateKey(), pke.getCertificateChain(), extraParams); Assert.assertNotNull(prueba, result); Assert.assertTrue(signer.isSign(result)); AOTreeModel tree = signer.getSignersStructure(result, false); Assert.assertEquals( "Datos", ((AOTreeNode) tree.getRoot()).getUserObject()); // $NON-NLS-1$ Assert.assertEquals( "ANF Usuario Activo", ((AOTreeNode) tree.getRoot()).getChildAt(0).getUserObject()); // $NON-NLS-1$ tree = signer.getSignersStructure(result, true); Assert.assertEquals( "Datos", ((AOTreeNode) tree.getRoot()).getUserObject()); // $NON-NLS-1$ final AOSimpleSignInfo simpleSignInfo = (AOSimpleSignInfo) ((AOTreeNode) tree.getRoot()).getChildAt(0).getUserObject(); // Assert.assertNotNull(simpleSignInfo.getSigningTime()); Assert.assertEquals(cert, simpleSignInfo.getCerts()[0]); Assert.assertEquals(result, signer.getData(result)); Assert.assertEquals( AOSignConstants.SIGN_FORMAT_PDF, signer.getSignInfo(result).getFormat()); final File saveFile = File.createTempFile(algo, ".pdf"); // $NON-NLS-1$ final OutputStream os = new FileOutputStream(saveFile); os.write(result); os.flush(); os.close(); System.out.println( "Temporal para comprobacion manual: " + saveFile.getAbsolutePath()); // $NON-NLS-1$ } } } }