1 /******************************************************************************** 2 *InternetCafe is a software solution that helps the management of Cybercafes 3 * according with the ITALIAN DECREE LAW ON ANTI-TERROR MEASURES, 27 JULY 2005. 4 * Copyright (C) 2006 Guido Angelo Ingenito 5 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 2 9 * of the License, or (at your option) any later version. 10 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19 *******************************************************************************/ 20 package base.jdbs; 21 22 import java.io.File; 23 import java.io.IOException; 24 25 import org.apache.log4j.Logger; 26 27 import base.jdbs.cryptography.asymmetric.KeyPair; 28 import base.jdbs.cryptography.asymmetric.RSAAsymmetricCipher; 29 import base.jdbs.cryptography.symmetric.DESSymmetricCipher; 30 import base.jdbs.cryptography.symmetric.SymmetricKey; 31 import base.util.FileUtil; 32 import base.util.ZipUtil; 33 34 /*** 35 * This class provided methods and utils to disassembly a previously created backup artifact. 36 * @author Guido Angelo Ingenito 37 */ 38 public class BackupArtifactDisassembler { 39 40 private static final transient Logger logger = Logger.getLogger(BackupArtifactDisassembler.class.getName()); 41 42 public static void disassemblyBackupArtifact(SymmetricKey symmetricKey, KeyPair keyPair, BackupDescriptor backupDescriptor, File outputDirectory) throws IOException{ 43 44 String originalCRC32 = FileUtil.fileContent(backupDescriptor.getCrc32ChecksumFile()); 45 logger.debug("originalCRC32: "+originalCRC32); 46 boolean crc32Check = FileUtil.checkCRC32Checksum(backupDescriptor.getBackupFile(),new Long(originalCRC32)); 47 if(crc32Check)logger.debug("CRC32 Check - VALID"); 48 else logger.warn("CRC32 - INVALID"); 49 50 51 String originalMD5Digest = FileUtil.fileContent(backupDescriptor.getMd5DigestFile()); 52 logger.debug("originalMD5Digest: "+originalMD5Digest); 53 boolean md5Check = FileUtil.checkMD5Digest(backupDescriptor.getBackupFile(),originalMD5Digest); 54 if(md5Check)logger.debug("MD5 Check - VALID"); 55 else logger.warn("MD5 Check - INVALID"); 56 57 58 RSAAsymmetricCipher asymmetricCipher = new RSAAsymmetricCipher(); 59 60 boolean signatureCheck = asymmetricCipher.checkSignature(backupDescriptor.getMd5SignedFile(),backupDescriptor.getMd5DigestFile(), keyPair.getPublicKey()); 61 if(signatureCheck)logger.debug("Signature Check - VALID"); 62 else logger.warn("Signature Check - INVALID"); 63 64 final File encryptionDir = new File(backupDescriptor.getArtifactDirectory(),BackupArtifactAssembler.ENCRYPTION_DIRECTORY_NAME); 65 final File decryptionDir = new File(backupDescriptor.getArtifactDirectory(),BackupArtifactAssembler.DECRYPTION_DIRECTORY_NAME); 66 67 logger.debug("Backup Encryption Directory: "+ encryptionDir); 68 encryptionDir.mkdir(); 69 logger.debug("Backup Decryption Directory: "+ decryptionDir); 70 decryptionDir.mkdir(); 71 72 logger.debug("The Backup Security Level is : "+backupDescriptor.getBackup().getSecurityLevel()); 73 if(backupDescriptor.getBackup().getSecurityLevel().equals(SecurityLevel.PRIVATE)){ 74 logger.debug("Backup has PRIVATE content, unzipping the content under the encryption directory"); 75 ZipUtil.unZipFile(backupDescriptor.getBackupFile(),encryptionDir); 76 logger.debug("Backup successfully unzipped, starting the decryption."); 77 DESSymmetricCipher symmetricCipher = new DESSymmetricCipher(symmetricKey); 78 logger.debug("This is the list of file o be decrypted:"); 79 File[] toBeDecrypted = FileUtil.allFileContent(encryptionDir); 80 File[] outputFile = new File[toBeDecrypted.length]; 81 82 83 for(int i=0;i<toBeDecrypted.length;i++){ 84 logger.debug("To Be Decrypted: "+toBeDecrypted[i]); 85 int lastIndexOfBakcupName = toBeDecrypted[i].getAbsolutePath().lastIndexOf(backupDescriptor.getBackup().getName()); 86 int pathLength = toBeDecrypted[i].getAbsolutePath().length(); 87 logger.debug("lastIndexOfBakcupName: "+lastIndexOfBakcupName + "pathLength: "+pathLength); 88 String originalFileName = toBeDecrypted[i].getAbsolutePath().substring(lastIndexOfBakcupName,pathLength); 89 logger.debug("Original File Name: "+ originalFileName); 90 91 outputFile[i] = new File(outputDirectory,originalFileName); 92 outputFile[i].getParentFile().mkdirs(); 93 outputFile[i].createNewFile(); 94 95 symmetricCipher.decrypt(toBeDecrypted[i],outputFile[i]); 96 } 97 } 98 else{ 99 logger.debug("Backup has private content, unzipping the content under the decryption directory"); 100 ZipUtil.unZipFile(backupDescriptor.getBackupFile(),decryptionDir); 101 File[] toBeResotored = FileUtil.allFileContent(decryptionDir); 102 for(int i=0;i<toBeResotored.length;i++) 103 { 104 logger.debug("To Be Restored: "+toBeResotored[i]); 105 int lastIndexOfBakcupName = toBeResotored[i].getAbsolutePath().lastIndexOf(backupDescriptor.getBackup().getName()); 106 int pathLength = toBeResotored[i].getAbsolutePath().length(); 107 logger.debug("lastIndexOfBakcupName: "+lastIndexOfBakcupName + "pathLength: "+pathLength); 108 String originalFileName = toBeResotored[i].getAbsolutePath().substring(lastIndexOfBakcupName,pathLength); 109 logger.debug("Original File Name: "+ originalFileName); 110 111 File outputFile = new File(outputDirectory,originalFileName); 112 outputFile.getParentFile().mkdirs(); 113 outputFile.createNewFile(); 114 FileUtil.copyFile(toBeResotored[i],outputFile); 115 } 116 117 } 118 119 logger.debug("Encryption Directory Deletion Result: " + FileUtil.deleteDirectory(encryptionDir)); 120 logger.debug("Decryption Directory Deletion Result: " + FileUtil.deleteDirectory(decryptionDir)); 121 122 123 124 } 125 126 }