List of usage examples for org.bouncycastle.openpgp PGPLiteralData BINARY
char BINARY
To view the source code for org.bouncycastle.openpgp PGPLiteralData BINARY.
Click Source Link
From source file:org.opentestsystem.delivery.testreg.transformer.GPGEncryptor.java
License:Open Source License
/** * Uses the Legion of the Bouncy Castle (aka BouncyCastle) PGP API to encrypt, compress, and sign the input. * /*from w w w.jav a 2 s . c o m*/ * The configured landing zone public key is used to encrypt the input. Only the landing zone private key will be * able to decrypt. * * The configured test registration private key is used to sign the input. This can be verified by the landing zone * to prove that this specific test registration instance created the data. * * @param input * A byte array * @return A byte array comprised of a PGP/GPG compatible binary encrypted and signed output */ @Transformer public Message<File> encryptStream(final File input, final @Header("dwBatchUuid") String dwBatchUuid, final @Header("fileSuffix") String fileSuffix, final @Header("recordsSent") int recordsSent, final @Header("tempPaths") List<Path> tempPaths, final @Header("dwConfigType") DwConfigType dwConfigType) { String debugPrefix = dwConfigType + " DW Config: "; long curTime = System.currentTimeMillis(); File tmpEncFile; try { PGPPublicKey landingZonePubKey = findLandingZonePublicKey(dwConfigType); PGPSecretKey testRegSecretKey = findTestRegSecretKey(); PGPPrivateKey testRegPrivateKey = testRegSecretKey.extractPrivateKey( new JcePBESecretKeyDecryptorBuilder().setProvider("BC").build(getPassphrase())); // //////////////////// // setup encryptor PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator( new JcePGPDataEncryptorBuilder(PGPEncryptedData.AES_256).setWithIntegrityPacket(true) .setSecureRandom(new SecureRandom()).setProvider("BC")); encGen.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(landingZonePubKey).setProvider("BC")); // This outputstream, encryptedSignedOutputStream is the ultimate target that will contain the encrypted and // signed output Path tempEncPath = Files.createTempFile(DwBatchHandler.DW_ENC_TMP_PREFIX, (dwConfigType == DwConfigType.SBAC ? DwBatchHandler.SBAC_DW_NAME : DwBatchHandler.LOCAL_DW_NAME) + fileSuffix); tempPaths.add(tempEncPath); tmpEncFile = tempEncPath.toFile(); FileOutputStream encryptedSignedOutputStream = new FileOutputStream(tmpEncFile); LOGGER.debug(debugPrefix + "Created temp encrypted output file " + tmpEncFile.getAbsolutePath()); OutputStream encryptOutStream = encGen.open(encryptedSignedOutputStream, new byte[BUFFER_SIZE]); // //////////////////////////// // setup data compression PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(CompressionAlgorithmTags.ZIP); OutputStream compressOutStream = comData.open(encryptOutStream); // ///////////////////// // sign encrypted file with test reg private key // create a signature generator PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator( new JcaPGPContentSignerBuilder(testRegSecretKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1) .setProvider("BC")); signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, testRegPrivateKey); @SuppressWarnings("unchecked") Iterator<String> it = testRegSecretKey.getPublicKey().getUserIDs(); if (it.hasNext()) { PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator(); spGen.setSignerUserID(false, it.next()); signatureGenerator.setHashedSubpackets(spGen.generate()); } // setup signature generator to encode the contents of the compressed output stream signatureGenerator.generateOnePassVersion(false).encode(compressOutStream); // create a PGP Literal Data Generator and open it to wrap the compression output stream PGPLiteralDataGenerator lGen = new PGPLiteralDataGenerator(); OutputStream signedOutStream = lGen.open(compressOutStream, PGPLiteralData.BINARY, "", new java.util.Date(), new byte[BUFFER_SIZE]); // create an input stream out of the input bytes FileInputStream clearInputStream = new FileInputStream(input); // read the input and write all data to the signing output stream, also update the signature // generator with the same input data byte[] buf = new byte[BUFFER_SIZE]; int len; while ((len = clearInputStream.read(buf)) > 0) { signedOutStream.write(buf, 0, len); signatureGenerator.update(buf, 0, len); } // close everything and generate the final signature signedOutStream.close(); lGen.close(); signatureGenerator.generate().encode(compressOutStream); compressOutStream.close(); comData.close(); encryptOutStream.close(); encGen.close(); clearInputStream.close(); encryptedSignedOutputStream.close(); } catch (IOException | PGPException | SignatureException e) { throw new GPGEncryptionException(debugPrefix + "Failure to encrypt and sign input", e); } LOGGER.debug(debugPrefix + "Generated encrypted data in " + (System.currentTimeMillis() - curTime)); return MessageBuilder.withPayload(tmpEncFile).setHeader("dwBatchUuid", dwBatchUuid) .setHeader("fileSuffix", fileSuffix).setHeader("recordsSent", recordsSent) .setHeader("tempPaths", tempPaths).setHeader("dwConfigType", dwConfigType).build(); }
From source file:org.pgptool.gui.encryption.implpgp.EncryptionServicePgpImpl.java
License:Open Source License
@Override public String encryptText(String sourceText, Collection<Key> recipients) { try {/* w w w . j av a 2 s. com*/ PGPEncryptedDataGenerator dataGenerator = buildEncryptedDataGenerator( buildKeysListForEncryption(recipients)); SourceInfo encryptionSourceInfo = new SourceInfo("text.asc", sourceText.length(), System.currentTimeMillis()); ByteArrayOutputStream pOut = new ByteArrayOutputStream(); ByteArrayInputStream pIn = new ByteArrayInputStream(sourceText.getBytes("UTF-8")); ArmoredOutputStream armoredOut = new ArmoredOutputStream(pOut); doEncryptFile(pIn, encryptionSourceInfo, armoredOut, dataGenerator, null, PGPLiteralData.BINARY); pIn.close(); armoredOut.flush(); armoredOut.close(); return pOut.toString(); } catch (Throwable t) { throw new RuntimeException("Encryption failed", t); } }
From source file:org.pgptool.gui.encryption.implpgp.EncryptionServicePgpImpl.java
License:Open Source License
@Override public void encrypt(String sourceFile, String targetFile, Collection<Key> recipients, ProgressHandler optionalProgressHandler, InputStreamSupervisor optionalInputStreamSupervisor, OutputStreamSupervisor optionalOutputStreamSupervisor) throws UserRequestedCancellationException { try {// w w w .j a v a 2 s . com InputStreamSupervisor inputStreamSupervisor = optionalInputStreamSupervisor != null ? optionalInputStreamSupervisor : new InputStreamSupervisorImpl(); OutputStreamSupervisor outputStreamSupervisor = optionalOutputStreamSupervisor != null ? optionalOutputStreamSupervisor : new OutputStreamSupervisorImpl(); Updater progress = null; if (optionalProgressHandler != null) { progress = Progress.create("action.encrypt", optionalProgressHandler); progress.updateStepInfo("progress.preparingKeys", FilenameUtils.getName(sourceFile)); } PGPEncryptedDataGenerator dataGenerator = buildEncryptedDataGenerator( buildKeysListForEncryption(recipients)); OutputStream out = new BufferedOutputStream(outputStreamSupervisor.get(targetFile)); InputStream in = inputStreamSupervisor.get(sourceFile); doEncryptFile(in, SourceInfo.fromFile(sourceFile), out, dataGenerator, progress, PGPLiteralData.BINARY); out.close(); in.close(); } catch (Throwable t) { File fileToDelete = new File(targetFile); if (fileToDelete.exists() && !fileToDelete.delete()) { log.warn("Failed to delete file after failed encryption: " + targetFile); } Throwables.throwIfInstanceOf(t, UserRequestedCancellationException.class); throw new RuntimeException("Encryption failed", t); } }
From source file:org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation.java
License:Open Source License
/** * Signs and/or encrypts data based on parameters of class *//*from w ww .j a va2s. c o m*/ private PgpSignEncryptResult executeInternal(PgpSignEncryptInputParcel input, CryptoInputParcel cryptoInput, InputData inputData, OutputStream outputStream) { int indent = 0; OperationLog log = new OperationLog(); log.add(LogType.MSG_PSE, indent); indent += 1; PgpSignEncryptData data = input.getData(); boolean enableSignature = data.getSignatureMasterKeyId() != Constants.key.none; boolean enableEncryption = ((data.getEncryptionMasterKeyIds() != null && data.getEncryptionMasterKeyIds().length > 0) || data.getSymmetricPassphrase() != null); boolean enableCompression = (data.getCompressionAlgorithm() != CompressionAlgorithmTags.UNCOMPRESSED); Log.d(Constants.TAG, "enableSignature:" + enableSignature + "\nenableEncryption:" + enableEncryption + "\nenableCompression:" + enableCompression + "\nenableAsciiArmorOutput:" + data.isEnableAsciiArmorOutput() + "\nisHiddenRecipients:" + data.isHiddenRecipients()); // add additional key id to encryption ids (mostly to do self-encryption) if (enableEncryption && data.getAdditionalEncryptId() != Constants.key.none) { data.setEncryptionMasterKeyIds( Arrays.copyOf(data.getEncryptionMasterKeyIds(), data.getEncryptionMasterKeyIds().length + 1)); data.getEncryptionMasterKeyIds()[data.getEncryptionMasterKeyIds().length - 1] = data .getAdditionalEncryptId(); } ArmoredOutputStream armorOut = null; OutputStream out; if (data.isEnableAsciiArmorOutput()) { armorOut = new ArmoredOutputStream(new BufferedOutputStream(outputStream, 1 << 16)); if (data.getVersionHeader() != null) { armorOut.setHeader("Version", data.getVersionHeader()); } // if we have a charset, put it in the header if (data.getCharset() != null) { armorOut.setHeader("Charset", data.getCharset()); } // add proprietary header to indicate that this is a key backup if (data.isAddBackupHeader()) { armorOut.setHeader("BackupVersion", "2"); } out = armorOut; } else { out = outputStream; } /* Get keys for signature generation for later usage */ CanonicalizedSecretKey signingKey = null; if (enableSignature) { updateProgress(R.string.progress_extracting_signature_key, 0, 100); try { long signingMasterKeyId = data.getSignatureMasterKeyId(); long signingSubKeyId = data.getSignatureSubKeyId(); CanonicalizedSecretKeyRing signingKeyRing = mProviderHelper .getCanonicalizedSecretKeyRing(signingMasterKeyId); signingKey = signingKeyRing.getSecretKey(data.getSignatureSubKeyId()); // Make sure key is not expired or revoked if (signingKeyRing.isExpired() || signingKeyRing.isRevoked() || signingKey.isExpired() || signingKey.isRevoked()) { log.add(LogType.MSG_PSE_ERROR_REVOKED_OR_EXPIRED, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } // Make sure we are allowed to sign here! if (!signingKey.canSign()) { log.add(LogType.MSG_PSE_ERROR_KEY_SIGN, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } switch (mProviderHelper.getCachedPublicKeyRing(signingMasterKeyId) .getSecretKeyType(signingSubKeyId)) { case DIVERT_TO_CARD: case PASSPHRASE_EMPTY: { if (!signingKey.unlock(new Passphrase())) { throw new AssertionError( "PASSPHRASE_EMPTY/DIVERT_TO_CARD keyphrase not unlocked with empty passphrase." + " This is a programming error!"); } break; } case PIN: case PATTERN: case PASSPHRASE: { Passphrase localPassphrase = cryptoInput.getPassphrase(); if (localPassphrase == null) { try { localPassphrase = getCachedPassphrase(signingMasterKeyId, signingKey.getKeyId()); } catch (PassphraseCacheInterface.NoSecretKeyException ignored) { } } if (localPassphrase == null) { log.add(LogType.MSG_PSE_PENDING_PASSPHRASE, indent + 1); return new PgpSignEncryptResult(log, RequiredInputParcel.createRequiredSignPassphrase(signingMasterKeyId, signingKey.getKeyId(), cryptoInput.getSignatureTime()), cryptoInput); } if (!signingKey.unlock(localPassphrase)) { log.add(LogType.MSG_PSE_ERROR_BAD_PASSPHRASE, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } break; } case GNU_DUMMY: { log.add(LogType.MSG_PSE_ERROR_UNLOCK, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } default: { throw new AssertionError("Unhandled SecretKeyType! (should not happen)"); } } } catch (ProviderHelper.NotFoundException e) { log.add(LogType.MSG_PSE_ERROR_SIGN_KEY, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } catch (PgpGeneralException e) { log.add(LogType.MSG_PSE_ERROR_UNLOCK, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } // Use requested hash algo int requestedAlgorithm = data.getSignatureHashAlgorithm(); if (requestedAlgorithm == PgpSecurityConstants.OpenKeychainHashAlgorithmTags.USE_DEFAULT) { data.setSignatureHashAlgorithm(PgpSecurityConstants.DEFAULT_HASH_ALGORITHM); } } updateProgress(R.string.progress_preparing_streams, 2, 100); /* Initialize PGPEncryptedDataGenerator for later usage */ PGPEncryptedDataGenerator cPk = null; if (enableEncryption) { // Use requested encryption algo int algo = data.getSymmetricEncryptionAlgorithm(); if (algo == PgpSecurityConstants.OpenKeychainSymmetricKeyAlgorithmTags.USE_DEFAULT) { algo = PgpSecurityConstants.DEFAULT_SYMMETRIC_ALGORITHM; } JcePGPDataEncryptorBuilder encryptorBuilder = new JcePGPDataEncryptorBuilder(algo) .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME) .setWithIntegrityPacket(data.isIntegrityProtected()); cPk = new PGPEncryptedDataGenerator(encryptorBuilder); if (data.getSymmetricPassphrase() != null) { // Symmetric encryption log.add(LogType.MSG_PSE_SYMMETRIC, indent); JcePBEKeyEncryptionMethodGenerator symmetricEncryptionGenerator = new JcePBEKeyEncryptionMethodGenerator( data.getSymmetricPassphrase().getCharArray()); cPk.addMethod(symmetricEncryptionGenerator); } else { log.add(LogType.MSG_PSE_ASYMMETRIC, indent); // Asymmetric encryption for (long id : data.getEncryptionMasterKeyIds()) { try { CanonicalizedPublicKeyRing keyRing = mProviderHelper .getCanonicalizedPublicKeyRing(KeyRings.buildUnifiedKeyRingUri(id)); Set<Long> encryptSubKeyIds = keyRing.getEncryptIds(); for (Long subKeyId : encryptSubKeyIds) { CanonicalizedPublicKey key = keyRing.getPublicKey(subKeyId); cPk.addMethod(key.getPubKeyEncryptionGenerator(data.isHiddenRecipients())); log.add(LogType.MSG_PSE_KEY_OK, indent + 1, KeyFormattingUtils.convertKeyIdToHex(subKeyId)); } if (encryptSubKeyIds.isEmpty()) { log.add(LogType.MSG_PSE_KEY_WARN, indent + 1, KeyFormattingUtils.convertKeyIdToHex(id)); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } // Make sure key is not expired or revoked if (keyRing.isExpired() || keyRing.isRevoked()) { log.add(LogType.MSG_PSE_ERROR_REVOKED_OR_EXPIRED, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } } catch (ProviderHelper.NotFoundException e) { log.add(LogType.MSG_PSE_KEY_UNKNOWN, indent + 1, KeyFormattingUtils.convertKeyIdToHex(id)); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } } } } /* Initialize signature generator object for later usage */ PGPSignatureGenerator signatureGenerator = null; if (enableSignature) { updateProgress(R.string.progress_preparing_signature, 4, 100); try { boolean cleartext = data.isCleartextSignature() && data.isEnableAsciiArmorOutput() && !enableEncryption; signatureGenerator = signingKey.getDataSignatureGenerator(data.getSignatureHashAlgorithm(), cleartext, cryptoInput.getCryptoData(), cryptoInput.getSignatureTime()); } catch (PgpGeneralException e) { log.add(LogType.MSG_PSE_ERROR_NFC, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } } ProgressScaler progressScaler = new ProgressScaler(mProgressable, 8, 95, 100); PGPCompressedDataGenerator compressGen = null; OutputStream pOut; OutputStream encryptionOut = null; BCPGOutputStream bcpgOut; ByteArrayOutputStream detachedByteOut = null; ArmoredOutputStream detachedArmorOut = null; BCPGOutputStream detachedBcpgOut = null; long opTime, startTime = System.currentTimeMillis(); try { if (enableEncryption) { /* actual encryption */ updateProgress(R.string.progress_encrypting, 8, 100); log.add(enableSignature ? LogType.MSG_PSE_SIGCRYPTING : LogType.MSG_PSE_ENCRYPTING, indent); indent += 1; encryptionOut = cPk.open(out, new byte[1 << 16]); if (enableCompression) { log.add(LogType.MSG_PSE_COMPRESSING, indent); // Use preferred compression algo int algo = data.getCompressionAlgorithm(); if (algo == PgpSecurityConstants.OpenKeychainCompressionAlgorithmTags.USE_DEFAULT) { algo = PgpSecurityConstants.DEFAULT_COMPRESSION_ALGORITHM; } compressGen = new PGPCompressedDataGenerator(algo); bcpgOut = new BCPGOutputStream(compressGen.open(encryptionOut)); } else { bcpgOut = new BCPGOutputStream(encryptionOut); } if (enableSignature) { signatureGenerator.generateOnePassVersion(false).encode(bcpgOut); } PGPLiteralDataGenerator literalGen = new PGPLiteralDataGenerator(); char literalDataFormatTag; if (data.isCleartextSignature()) { literalDataFormatTag = PGPLiteralData.UTF8; } else { literalDataFormatTag = PGPLiteralData.BINARY; } pOut = literalGen.open(bcpgOut, literalDataFormatTag, inputData.getOriginalFilename(), new Date(), new byte[1 << 16]); long alreadyWritten = 0; int length; byte[] buffer = new byte[1 << 16]; InputStream in = new BufferedInputStream(inputData.getInputStream()); while ((length = in.read(buffer)) > 0) { pOut.write(buffer, 0, length); // update signature buffer if signature is requested if (enableSignature) { signatureGenerator.update(buffer, 0, length); } alreadyWritten += length; if (inputData.getSize() > 0) { long progress = 100 * alreadyWritten / inputData.getSize(); progressScaler.setProgress((int) progress, 100); } } literalGen.close(); indent -= 1; } else if (enableSignature && data.isCleartextSignature() && data.isEnableAsciiArmorOutput()) { /* cleartext signature: sign-only of ascii text */ updateProgress(R.string.progress_signing, 8, 100); log.add(LogType.MSG_PSE_SIGNING_CLEARTEXT, indent); // write -----BEGIN PGP SIGNED MESSAGE----- armorOut.beginClearText(data.getSignatureHashAlgorithm()); InputStream in = new BufferedInputStream(inputData.getInputStream()); final BufferedReader reader = new BufferedReader(new InputStreamReader(in)); // update signature buffer with first line processLine(reader.readLine(), armorOut, signatureGenerator); // TODO: progress: fake annealing? while (true) { String line = reader.readLine(); // end cleartext signature with newline, see http://tools.ietf.org/html/rfc4880#section-7 if (line == null) { armorOut.write(NEW_LINE); break; } armorOut.write(NEW_LINE); // update signature buffer with input line signatureGenerator.update(NEW_LINE); processLine(line, armorOut, signatureGenerator); } armorOut.endClearText(); pOut = new BCPGOutputStream(armorOut); } else if (enableSignature && data.isDetachedSignature()) { /* detached signature */ updateProgress(R.string.progress_signing, 8, 100); log.add(LogType.MSG_PSE_SIGNING_DETACHED, indent); InputStream in = new BufferedInputStream(inputData.getInputStream()); // handle output stream separately for detached signatures detachedByteOut = new ByteArrayOutputStream(); OutputStream detachedOut = detachedByteOut; if (data.isEnableAsciiArmorOutput()) { detachedArmorOut = new ArmoredOutputStream(new BufferedOutputStream(detachedOut, 1 << 16)); if (data.getVersionHeader() != null) { detachedArmorOut.setHeader("Version", data.getVersionHeader()); } detachedOut = detachedArmorOut; } detachedBcpgOut = new BCPGOutputStream(detachedOut); long alreadyWritten = 0; int length; byte[] buffer = new byte[1 << 16]; while ((length = in.read(buffer)) > 0) { // no output stream is written, no changed to original data! signatureGenerator.update(buffer, 0, length); alreadyWritten += length; if (inputData.getSize() > 0) { long progress = 100 * alreadyWritten / inputData.getSize(); progressScaler.setProgress((int) progress, 100); } } pOut = null; } else if (enableSignature && !data.isCleartextSignature() && !data.isDetachedSignature()) { /* sign-only binary (files/data stream) */ updateProgress(R.string.progress_signing, 8, 100); log.add(LogType.MSG_PSE_SIGNING, indent); InputStream in = new BufferedInputStream(inputData.getInputStream()); if (enableCompression) { // Use preferred compression algo int algo = data.getCompressionAlgorithm(); if (algo == PgpSecurityConstants.OpenKeychainCompressionAlgorithmTags.USE_DEFAULT) { algo = PgpSecurityConstants.DEFAULT_COMPRESSION_ALGORITHM; } compressGen = new PGPCompressedDataGenerator(algo); bcpgOut = new BCPGOutputStream(compressGen.open(out)); } else { bcpgOut = new BCPGOutputStream(out); } signatureGenerator.generateOnePassVersion(false).encode(bcpgOut); PGPLiteralDataGenerator literalGen = new PGPLiteralDataGenerator(); pOut = literalGen.open(bcpgOut, PGPLiteralData.BINARY, inputData.getOriginalFilename(), new Date(), new byte[1 << 16]); long alreadyWritten = 0; int length; byte[] buffer = new byte[1 << 16]; while ((length = in.read(buffer)) > 0) { pOut.write(buffer, 0, length); signatureGenerator.update(buffer, 0, length); alreadyWritten += length; if (inputData.getSize() > 0) { long progress = 100 * alreadyWritten / inputData.getSize(); progressScaler.setProgress((int) progress, 100); } } literalGen.close(); } else { throw new AssertionError("cannot clearsign in non-ascii armored text, this is a bug!"); } if (enableSignature) { updateProgress(R.string.progress_generating_signature, 95, 100); try { if (detachedBcpgOut != null) { signatureGenerator.generate().encode(detachedBcpgOut); } else { signatureGenerator.generate().encode(pOut); } } catch (NfcSyncPGPContentSignerBuilder.NfcInteractionNeeded e) { // this secret key diverts to a OpenPGP card, throw exception with hash that will be signed log.add(LogType.MSG_PSE_PENDING_NFC, indent); return new PgpSignEncryptResult(log, RequiredInputParcel.createSecurityTokenSignOperation( signingKey.getRing().getMasterKeyId(), signingKey.getKeyId(), e.hashToSign, e.hashAlgo, cryptoInput.getSignatureTime()), cryptoInput); } } opTime = System.currentTimeMillis() - startTime; Log.d(Constants.TAG, "sign/encrypt time taken: " + String.format("%.2f", opTime / 1000.0) + "s"); // closing outputs // NOTE: closing needs to be done in the correct order! if (encryptionOut != null) { if (compressGen != null) { compressGen.close(); } encryptionOut.close(); } // Note: Closing ArmoredOutputStream does not close the underlying stream if (armorOut != null) { armorOut.close(); } // Note: Closing ArmoredOutputStream does not close the underlying stream if (detachedArmorOut != null) { detachedArmorOut.close(); } // Also closes detachedBcpgOut if (detachedByteOut != null) { detachedByteOut.close(); } if (out != null) { out.close(); } if (outputStream != null) { outputStream.close(); } } catch (SignatureException e) { log.add(LogType.MSG_PSE_ERROR_SIG, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } catch (PGPException e) { log.add(LogType.MSG_PSE_ERROR_PGP, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } catch (IOException e) { log.add(LogType.MSG_PSE_ERROR_IO, indent); return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_ERROR, log); } updateProgress(R.string.progress_done, 100, 100); log.add(LogType.MSG_PSE_OK, indent); PgpSignEncryptResult result = new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_OK, log); result.mOperationTime = opTime; if (detachedByteOut != null) { try { detachedByteOut.flush(); detachedByteOut.close(); } catch (IOException e) { // silently catch } result.setDetachedSignature(detachedByteOut.toByteArray()); try { String digestName = PGPUtil.getDigestName(data.getSignatureHashAlgorithm()); // construct micalg parameter according to https://tools.ietf.org/html/rfc3156#section-5 result.setMicAlgDigestName("pgp-" + digestName.toLowerCase()); } catch (PGPException e) { Log.e(Constants.TAG, "error setting micalg parameter!", e); } } return result; }
From source file:org.tramaci.onionmail.PGP.java
License:Open Source License
@SuppressWarnings({ "deprecation" }) public static byte[] encrypt(byte[] clearData, PGPPublicKey encKey, String fileName, boolean withIntegrityCheck, boolean armor, Date At, int PGPEncryptedDataAlgo) throws Exception { if (fileName == null) fileName = PGPLiteralData.CONSOLE; ByteArrayOutputStream encOut = new ByteArrayOutputStream(); OutputStream out = encOut;/*from w w w. j a va2 s . c o m*/ if (armor) out = new ArmoredOutputStream(out); ByteArrayOutputStream bOut = new ByteArrayOutputStream(); PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(PGPCompressedDataGenerator.ZIP); OutputStream cos = comData.open(bOut); PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator(); OutputStream pOut = lData.open(cos, PGPLiteralData.BINARY, fileName, clearData.length, At); pOut.write(clearData); lData.close(); comData.close(); if (PGPEncryptedDataAlgo == 0) PGPEncryptedDataAlgo = PGPEncryptedData.CAST5; PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(PGPEncryptedDataAlgo, withIntegrityCheck, new SecureRandom(), "BC"); cPk.addMethod(encKey); byte[] bytes = bOut.toByteArray(); OutputStream cOut = cPk.open(out, bytes.length); cOut.write(bytes); cOut.close(); out.close(); return encOut.toByteArray(); }
From source file:uk.ac.ebi.enaega.uploadclient.NewMain.java
License:Open Source License
private static String[] convert(String fileName, InputStream inputStream, long restartAt, long streamOffset, long offset, PGPPublicKey pgKey) { String result = "Error", result1 = "Error"; String[] results = null;/*from w w w . j av a 2s . c o m*/ // If public Key provided - use it to encrypt file (provider already added) ByteArrayOutputStream baos = null; // PGP MessageDigest crypt_digest = null; // PGP OutputStream literalOut = null, encOut = null, compressedOut = null; // PGP int DEFAULT_BUFFER_SIZE = 65 * 1024; // PGP PGPEncryptedDataGenerator encryptedDataGenerator = null; // PGP PGPCompressedDataGenerator compressedDataGenerator = null; // PGP PGPLiteralDataGenerator literalDataGenerator = null; // PGP if (pgKey != null) { try { Security.addProvider(new BouncyCastleProvider()); baos = new ByteArrayOutputStream(2 * DEFAULT_BUFFER_SIZE); // Write to memory! try { crypt_digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); System.out.println("MD5 Algorithm not installed with Java. Contact Systems."); System.out.print(ex.getLocalizedMessage()); } // Encrypted Data Generator -- needs unlimited Security Policy encryptedDataGenerator = new PGPEncryptedDataGenerator(PGPEncryptedData.CAST5, true, new SecureRandom(), "BC"); try { encryptedDataGenerator.addMethod(pgKey); encOut = encryptedDataGenerator.open(baos, new byte[DEFAULT_BUFFER_SIZE]); } catch (NoSuchProviderException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); System.out.println("No Such Service Provider Error: " + ex.getLocalizedMessage()); } catch (PGPException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); System.out.println("PGP Error: " + ex.getLocalizedMessage()); System.out.println("Ensure that Unlimited Strength Policy files are installed for this JRE:"); Process java = Runtime.getRuntime().exec("cmd /C java -version"); BufferedReader in_ = new BufferedReader(new InputStreamReader(java.getInputStream())); String line; while ((line = in_.readLine()) != null) { System.out.print(line); } } // Compression compressedDataGenerator = new PGPCompressedDataGenerator(PGPCompressedDataGenerator.ZIP); compressedOut = compressedOut = new BufferedOutputStream(compressedDataGenerator.open(encOut)); // Literal Data Generator and Output Stream literalDataGenerator = new PGPLiteralDataGenerator(); literalOut = literalDataGenerator.open(compressedOut, PGPLiteralData.BINARY, fileName, new Date(), new byte[DEFAULT_BUFFER_SIZE]); // 1<<16 } catch (IOException t) { String[] failure = { "Cipher Issues" }; return failure; } } // Convert the stream. if (literalOut == null) return null; if (baos == null) return null; try { // Skips. inputStream.skip(streamOffset); OutputStream dataTransferOutputStream = new BufferedOutputStream(new FileOutputStream(fileName)); // Let's do it! byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; int l = 0; MessageDigest digest = null; // calculate checksum of incoming data stream try { digest = MessageDigest.getInstance("MD5"); // get the hash algorithm } catch (NoSuchAlgorithmException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); System.out.println("MD5 Algorithm not installed with Java. Contact Systems."); System.out.print(ex.getLocalizedMessage()); } while ((l = inputStream.read(buffer)) != -1) { // The actual data transfer loop ------------------- if (pgKey != null) { literalOut.write(buffer, 0, l); // Write to mem buffer literalOut.flush(); byte[] buffer_ = baos.toByteArray(); // retrieve that buffer if (crypt_digest != null) crypt_digest.update(buffer_); // update crypto MD5 dataTransferOutputStream.write(buffer_); // Write cipher data to file baos.reset(); // empty mem buffer } else { dataTransferOutputStream.write(buffer, 0, l); // no cipher -- write directly to socket } //dataTransferOutputStream.flush(); if (digest != null) digest.update(buffer, 0, l); // Calculate plain text MD5 for TCP stream } // Get a representation of the MD5 digest (checksum) plain file byte[] md5sum = digest == null ? null : digest.digest(); result = ""; if (md5sum != null) for (int i = 0; i < md5sum.length; i++) result += Integer.toString((md5sum[i] & 0xff) + 0x100, 16).substring(1); // Upload loop complete. Close PGP streams, if used if (pgKey != null) { literalOut.close(); if (literalDataGenerator != null) literalDataGenerator.close(); // Close all other streams if (compressedOut != null) compressedOut.close(); if (compressedDataGenerator != null) compressedDataGenerator.close(); if (encOut != null) encOut.close(); if (encryptedDataGenerator != null) encryptedDataGenerator.close(); byte[] buffer_ = baos.toByteArray(); // retrieve that buffer if (crypt_digest != null) crypt_digest.update(buffer_); // update crypto MD5 dataTransferOutputStream.write(buffer_); // Write cipher data to socket dataTransferOutputStream.flush(); baos.close(); // Get a representation of the MD5 digest (checksum) cipher file byte[] md5sum_ = crypt_digest == null ? null : crypt_digest.digest(); result1 = ""; if (md5sum_ != null) for (int i = 0; i < md5sum_.length; i++) result1 += Integer.toString((md5sum_[i] & 0xff) + 0x100, 16).substring(1); } } catch (IOException e) { ; } if (pgKey != null) { results = new String[2]; results[0] = result; results[1] = result1; } else { results = new String[1]; results[0] = result; } return results; }
From source file:uk.ac.ebi.enaega.uploadclient.UploadClient.java
@Override public void run() { completed = false;// w w w. ja va 2 s .c om System.setProperty("java.net.preferIPv4Stack", "true"); ByteArrayOutputStream baos = null; // PGP MessageDigest crypt_digest = null; // PGP OutputStream literalOut = null, encOut = null, compressedOut = null; // PGP int DEFAULT_BUFFER_SIZE = 65 * 1024; // PGP PGPEncryptedDataGenerator encryptedDataGenerator = null; // PGP PGPCompressedDataGenerator compressedDataGenerator = null; // PGP PGPLiteralDataGenerator literalDataGenerator = null; // PGP if (this.pgKey != null) { // EGA: Encrypt file try { Security.addProvider(new BouncyCastleProvider()); baos = new ByteArrayOutputStream(2 * DEFAULT_BUFFER_SIZE); // Write to memory! try { crypt_digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); } // Encrypted Data Generator -- needs unlimited Security Policy encryptedDataGenerator = new PGPEncryptedDataGenerator(PGPEncryptedData.CAST5, true, new SecureRandom(), "BC"); try { encryptedDataGenerator.addMethod(this.pgKey); encOut = encryptedDataGenerator.open(baos, new byte[DEFAULT_BUFFER_SIZE]); } catch (NoSuchProviderException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); } catch (PGPException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); } // Compression compressedDataGenerator = new PGPCompressedDataGenerator(PGPCompressedDataGenerator.ZIP); compressedOut = compressedOut = new BufferedOutputStream(compressedDataGenerator.open(encOut)); // Literal Data Generator and Output Stream literalDataGenerator = new PGPLiteralDataGenerator(); literalOut = literalDataGenerator.open(compressedOut, PGPLiteralData.BINARY, fileName, new Date(), new byte[DEFAULT_BUFFER_SIZE]); // 1<<16 } catch (Throwable t) { JOptionPane.showMessageDialog(new JFrame(), "Can't instantiate cipher key.\nBe sure to have JCE Unlimited Strength Security Policy installed.", "Cipher Key Problem", JOptionPane.ERROR_MESSAGE); String[] failure = { "Cipher Issues" }; return; //return failure; } } // Upload the stream. try { // Skips. inputStream.skip(streamOffset); // Opens the data transfer connection. dataTransferOutputStream = dtConnection.getOutputStream(); // TCP or UDT - automatically // MODE Z enabled? if (modezEnabled) { // don't use with PGP stream dataTransferOutputStream = new DeflaterOutputStream(dataTransferOutputStream); } // Listeners. Initialize to offset! if (listener != null) { listener.started(); int large = 0, small = 0; large = (int) (offset / Integer.MAX_VALUE); // times the size of largest int small = (int) (offset % Integer.MAX_VALUE); // remainder for (int iu = 0; iu < large; iu++) listener.transferred(Integer.MAX_VALUE); listener.transferred(small); } long tot = 0; int idx = 0; // Update the table model if (mm != null) { // For Table Updates idx = mm.getCur(); mm.setValueAt("0%", idx, 5); tot = mm.getSize(); } // Let's do it! if (tp == TYPE_TEXTUAL) { // ------------------------------------- TEXT DATA ------------------ char[] buffer = new char[SEND_AND_RECEIVE_BUFFER_SIZE]; byte[] bbuffer = new byte[SEND_AND_RECEIVE_BUFFER_SIZE]; int l, l_tot = 0; Reader reader = new InputStreamReader(inputStream); Writer writer = new OutputStreamWriter(dataTransferOutputStream, charSet); MessageDigest digest = null; // calculate checksum of incoming data stream try { digest = MessageDigest.getInstance("MD5"); // get the hash algorithm } catch (NoSuchAlgorithmException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); } long dt_file = System.currentTimeMillis(), dt_upd = System.currentTimeMillis(); // time before upload while ((l = reader.read(buffer)) != -1) { // The actual data transfer loop ------------------- System.arraycopy(buffer, 0, bbuffer, 0, l); digest.update(bbuffer, 0, l); // Calculate MD5 for TCP stream if (this.pgKey != null) { // Cipher - write to mem buffer first, to enable MD5 literalOut.write(bbuffer, 0, l); literalOut.flush(); byte[] buffer_ = baos.toByteArray(); crypt_digest.update(buffer_); char[] buffer__ = new char[buffer_.length]; System.arraycopy(buffer_, l_tot, buffer__, 0, buffer_.length); writer.write(buffer__); baos.reset(); } else { // Write directly to socket writer.write(buffer, 0, l); } writer.flush(); if (listener != null) { listener.transferred(l); if (l > 0) { // l = bytes, dt_file = milliseconds dt_upd = System.currentTimeMillis() - dt_upd; double rate = (((double) (l)) / (((double) (dt_upd)))) * 1000.0; // bytes/s if (rate > 0) { String sd = size_display((long) (rate)); if (sd != null && sd.length() > 0) listener.setText(size_display((long) (rate)) + "/s"); } dt_upd = System.currentTimeMillis(); } } if (mm != null && tot != 0) { l_tot += l; double pct = (double) l_tot / (double) tot; int i_pct = (int) Math.floor(pct * 100); String s_pct = String.valueOf(i_pct) + "%"; mm.setValueAt(s_pct, idx, 5); } } // Get a representation of the MD5 digest (checksum) byte[] md5sum = digest.digest(); result = ""; if (md5sum != null) for (int i = 0; i < md5sum.length; i++) result += Integer.toString((md5sum[i] & 0xff) + 0x100, 16).substring(1); } else if (tp == TYPE_BINARY) { // ------------------------------ BINARY DATA --------------------- byte[] buffer = new byte[SEND_AND_RECEIVE_BUFFER_SIZE]; int l; long l_tot = 0; MessageDigest digest = null; // calculate checksum of incoming data stream try { digest = MessageDigest.getInstance("MD5"); // get the hash algorithm } catch (NoSuchAlgorithmException ex) { Logger.getLogger(FTPClient_alternative.class.getName()).log(Level.SEVERE, null, ex); } // Actual transfer identical between TCP and UDT long dt_file = System.currentTimeMillis(), dt_upd = System.currentTimeMillis(); // time before upload while ((l = inputStream.read(buffer)) != -1) { // The actual data transfer loop ------------------- if (this.pgKey != null) { literalOut.write(buffer, 0, l); // Write to mem buffer literalOut.flush(); byte[] buffer_ = baos.toByteArray(); // retrieve that buffer crypt_digest.update(buffer_); // update crypto MD5 dataTransferOutputStream.write(buffer_); // Write cipher data to socket c += buffer_.length; baos.reset(); // empty mem buffer } else { dataTransferOutputStream.write(buffer, 0, l); // no cipher -- write directly to socket c += buffer.length; } dataTransferOutputStream.flush(); digest.update(buffer, 0, l); // Calculate plain text MD5 for TCP stream if (listener != null) { listener.transferred(l); // Update total-progress bar if (l > 0) { // l = bytes, dt_file = milliseconds dt_upd = System.currentTimeMillis() - dt_upd; double rate = (((double) (l)) / (((double) (dt_upd)))) * 1000.0; // bytes/s if (rate > 0) { String sd = size_display((long) (rate)); if (sd != null && sd.length() > 0) listener.setText(size_display((long) (rate)) + "/s"); } dt_upd = System.currentTimeMillis(); } } if (mm != null && tot != 0) { // Update in-table progress bar l_tot += l; double pct = (double) l_tot / (double) tot; int i_pct = (int) Math.floor(pct * 100); String s_pct = String.valueOf(i_pct) + "%"; mm.setValueAt(s_pct, idx, 5); } } // Get a representation of the MD5 digest (checksum) plain file byte[] md5sum = digest.digest(); result = ""; if (md5sum != null) for (int i = 0; i < md5sum.length; i++) result += Integer.toString((md5sum[i] & 0xff) + 0x100, 16).substring(1); } // Upload loop complete. Close PGP streams, if used if (this.pgKey != null) { literalOut.close(); literalDataGenerator.close(); // Close all other streams compressedOut.close(); compressedDataGenerator.close(); encOut.close(); encryptedDataGenerator.close(); byte[] buffer_ = baos.toByteArray(); // retrieve that buffer crypt_digest.update(buffer_); // update crypto MD5 dataTransferOutputStream.write(buffer_); // Write cipher data to socket dataTransferOutputStream.flush(); baos.close(); // Get a representation of the MD5 digest (checksum) cipher file byte[] md5sum = crypt_digest.digest(); result1 = ""; for (int i = 0; i < md5sum.length; i++) result1 += Integer.toString((md5sum[i] & 0xff) + 0x100, 16).substring(1); complete = true; } } catch (Throwable e) { if (listener != null) { listener.aborted(); } complete = false; try { throw new FTPDataTransferException("I/O error in data transfer", e); } catch (FTPDataTransferException ex) { Logger.getLogger(UploadClient.class.getName()).log(Level.SEVERE, null, ex); } } completed = true; }
From source file:uk.ac.ebi.enaega.uploadclient.UploadClientUDT.java
@Override public void run() { System.setProperty("java.net.preferIPv4Stack", "true"); ByteArrayOutputStream baos = null; // PGP MessageDigest crypt_digest = null; // PGP OutputStream literalOut = null, encOut = null, compressedOut = null; // PGP int DEFAULT_BUFFER_SIZE = 65 * 1024; // PGP PGPEncryptedDataGenerator encryptedDataGenerator = null; // PGP PGPCompressedDataGenerator compressedDataGenerator = null; // PGP PGPLiteralDataGenerator literalDataGenerator = null; // PGP if (this.pgKey != null) { // EGA: Encrypt file try {// w w w . ja va 2 s .co m Security.addProvider(new BouncyCastleProvider()); baos = new ByteArrayOutputStream(2 * DEFAULT_BUFFER_SIZE); // Write to memory! try { crypt_digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(UploadClientUDT.class.getName()).log(Level.SEVERE, null, ex); } // Encrypted Data Generator -- needs unlimited Security Policy encryptedDataGenerator = new PGPEncryptedDataGenerator(PGPEncryptedData.CAST5, true, new SecureRandom(), "BC"); try { encryptedDataGenerator.addMethod(this.pgKey); encOut = encryptedDataGenerator.open(baos, new byte[DEFAULT_BUFFER_SIZE]); } catch (NoSuchProviderException ex) { Logger.getLogger(UploadClientUDT.class.getName()).log(Level.SEVERE, null, ex); } catch (PGPException ex) { Logger.getLogger(UploadClientUDT.class.getName()).log(Level.SEVERE, null, ex); } // Compression compressedDataGenerator = new PGPCompressedDataGenerator(PGPCompressedDataGenerator.ZIP); compressedOut = compressedOut = new BufferedOutputStream(compressedDataGenerator.open(encOut)); // Literal Data Generator and Output Stream literalDataGenerator = new PGPLiteralDataGenerator(); literalOut = literalDataGenerator.open(compressedOut, PGPLiteralData.BINARY, fileName, new Date(), new byte[DEFAULT_BUFFER_SIZE]); // 1<<16 } catch (Throwable t) { JOptionPane.showMessageDialog(new JFrame(), "Can't instantiate cipher key.\nBe sure to have JCE Unlimited Strength Security Policy installed.", "Cipher Key Problem", JOptionPane.ERROR_MESSAGE); String[] failure = { "Cipher Issues" }; return; //return failure; } } // Upload the stream. // Transfer! Start by accepting aconnection initiated by the server UnifiedSocket dataSocket = null; // Upload the stream. long c = 0; System.out.println("1 getting " + dataHost.toString() + " " + hostPort); try { // dataSocket = pasvServer.getMatching( dataHost, hostPort ); dataSocket = getSocket_timeout(); //getSocket(); //if (dataSocket == null) dataSocket = getSocket_timeout(); if (dataSocket == null) throw new ConnectException(); System.out.println("2"); // Skips. inputStream.skip(streamOffset); // Opens the data transfer connection. dataTransferOutputStream = dataSocket.getOutputStream(); // TCP or UDT - automatically // Listeners. Initialize to offset! if (listener != null) { listener.started(); int large = 0, small = 0; large = (int) (offset / Integer.MAX_VALUE); // times the size of largest int small = (int) (offset % Integer.MAX_VALUE); // remainder for (int iu = 0; iu < large; iu++) listener.transferred(Integer.MAX_VALUE); listener.transferred(small); } long tot = 0; int idx = 0; // Update the table model if (mm != null) { // For Table Updates idx = mm.getCur(); mm.setValueAt("0%", idx, 5); tot = mm.getSize(); } String line = communication.readFTPReply().toString(); System.out.println("Server Reply (STOR test.txt): " + line); // Let's do it! if (tp == TYPE_TEXTUAL) { // ------------------------------------- TEXT DATA ------------------ char[] buffer = new char[SEND_AND_RECEIVE_BUFFER_SIZE]; byte[] bbuffer = new byte[SEND_AND_RECEIVE_BUFFER_SIZE]; int l, l_tot = 0; long cnt = 0, cnt_ = 0; long block_cnt = 0, block_cnt_pre = 0; long flush_point = 1048576L * 10L; long pre_flush_point = 1048576L * 9L; Reader reader = new InputStreamReader(inputStream); Writer writer = new OutputStreamWriter(dataTransferOutputStream, charSet); MessageDigest digest = null; // calculate checksum of incoming data stream try { digest = MessageDigest.getInstance("MD5"); // get the hash algorithm } catch (NoSuchAlgorithmException ex) { Logger.getLogger(UploadClientUDT.class.getName()).log(Level.SEVERE, null, ex); } long dt_file = System.currentTimeMillis(), dt_upd = System.currentTimeMillis(); // time before upload while ((l = reader.read(buffer)) != -1) { // The actual data transfer loop ------------------- System.arraycopy(buffer, 0, bbuffer, 0, l); digest.update(bbuffer, 0, l); // Calculate MD5 for TCP stream if (this.pgKey != null) { // Cipher - write to mem buffer first, to enable MD5 literalOut.write(bbuffer, 0, l); literalOut.flush(); byte[] buffer_ = baos.toByteArray(); crypt_digest.update(buffer_); char[] buffer__ = new char[buffer_.length]; System.arraycopy(buffer_, l_tot, buffer__, 0, buffer_.length); cnt += buffer_.length; cnt_ += buffer_.length; block_cnt += buffer_.length; block_cnt_pre += buffer_.length; writer.write(buffer__); baos.reset(); } else { // Write directly to socket cnt += buffer.length; cnt_ += buffer.length; block_cnt += buffer.length; block_cnt_pre += buffer.length; writer.write(buffer, 0, l); } if ((block_cnt_pre / pre_flush_point) > 0) { block_cnt_pre = 0; writer.flush(); } //writer.flush(); if (listener != null) { listener.transferred(l); if (l > 0) { // l = bytes, dt_file = milliseconds dt_upd = System.currentTimeMillis() - dt_upd; double rate = (((double) (l)) / (((double) (dt_upd)))) * 1000.0; // bytes/s if (rate > 0) { String sd = size_display((long) (rate)); if (sd != null && sd.length() > 0) listener.setText(size_display((long) (rate)) + "/s"); } dt_upd = System.currentTimeMillis(); } } if (mm != null && tot != 0) { l_tot += l; double pct = (double) l_tot / (double) tot; int i_pct = (int) Math.floor(pct * 100); String s_pct = String.valueOf(i_pct) + "%"; mm.setValueAt(s_pct, idx, 5); } } // Get a representation of the MD5 digest (checksum) byte[] md5sum = digest.digest(); result = ""; for (int i = 0; i < md5sum.length; i++) result += Integer.toString((md5sum[i] & 0xff) + 0x100, 16).substring(1); } else if (tp == TYPE_BINARY) { // ------------------------------ BINARY DATA --------------------- System.out.println("Binary Transfer"); long cnt = 0, cnt_ = 0; long block_cnt = 0, block_cnt_pre = 0; long flush_point = 1048576L * 10L; long pre_flush_point = 1048576L * 9L; int bufsze = 250 * (UDPEndPoint.DATAGRAM_SIZE - 24); byte[] buffer = new byte[bufsze]; int l; long l_tot = 0; MessageDigest digest = null; // calculate checksum of incoming data stream try { digest = MessageDigest.getInstance("MD5"); // get the hash algorithm } catch (NoSuchAlgorithmException ex) { Logger.getLogger(UploadClientUDT.class.getName()).log(Level.SEVERE, null, ex); } // Actual transfer identical between TCP and UDT long dt_file = System.currentTimeMillis(), dt_upd = System.currentTimeMillis(); // time before upload CircularBuffer cb = new CircularBuffer(bufsze + (20 * (UDPEndPoint.DATAGRAM_SIZE - 24))); System.out.println("Actual Send Loop starts"); while ((l = inputStream.read(buffer)) != -1) { // The actual data transfer loop ------------------- if (this.pgKey != null) { // PGP Key present - encrypted Stream literalOut.write(buffer, 0, l); // Write to mem buffer - this is the encryption literalOut.flush(); byte[] buffer_ = baos.toByteArray(); // retrieve that buffer crypt_digest.update(buffer_); // update crypto MD5 c += buffer_.length; cb.put(buffer_); // Write into circular buffer baos.reset(); // empty mem buffer } else { c += l; //buffer.length; // only what was read! cb.put(Arrays.copyOf(buffer, l)); // Write into circular buffer } // Send the data in packet-sized portions from circular buffer temp structure while (cb.getSize() > (UDPEndPoint.DATAGRAM_SIZE - 24)) { byte[] sendbuf = new byte[(UDPEndPoint.DATAGRAM_SIZE - 24)]; sendbuf = cb.get(sendbuf.length); cnt += sendbuf.length; cnt_ += sendbuf.length; block_cnt += sendbuf.length; block_cnt_pre += sendbuf.length; dataTransferOutputStream.write(sendbuf, 0, sendbuf.length); // buffer, 0, l if ((block_cnt_pre / pre_flush_point) > 0) { block_cnt_pre = 0; ((UDTOutputStream) dataTransferOutputStream).pre_flush(); } if ((block_cnt / flush_point) > 0) { block_cnt = 0; dataTransferOutputStream.flush(); } } digest.update(buffer, 0, l); // Calculate plain text MD5 for TCP stream if (listener != null) { listener.transferred(l); // Update total-progress bar if (l > 0) { // l = bytes, dt_file = milliseconds dt_upd = System.currentTimeMillis() - dt_upd; double rate = (((double) (l)) / (((double) (dt_upd)))) * 1000.0; // bytes/s if (rate > 0) { String sd = size_display((long) (rate)); if (sd != null && sd.length() > 0) listener.setText(size_display((long) (rate)) + "/s"); } dt_upd = System.currentTimeMillis(); } } if (mm != null && tot != 0) { // Update in-table progress bar l_tot += l; double pct = (double) l_tot / (double) tot; int i_pct = (int) Math.floor(pct * 100); String s_pct = String.valueOf(i_pct) + "%"; mm.setValueAt(s_pct, idx, 5); } } // Input stream completely read --- if (cb.getSize() > 0) { // Flush the buffer at the end - MD5s already complete at this point byte[] sendbuf = new byte[cb.getSize()]; sendbuf = cb.get(sendbuf.length); dataTransferOutputStream.write(sendbuf, 0, sendbuf.length); } // Get a representation of the MD5 digest (checksum) plain file byte[] md5sum = digest.digest(); result = ""; for (int i = 0; i < md5sum.length; i++) result += Integer.toString((md5sum[i] & 0xff) + 0x100, 16).substring(1); } // Upload loop complete. Close PGP streams, if used (produces extra data) if (this.pgKey != null) { literalOut.close(); literalDataGenerator.close(); // Close all other streams compressedOut.close(); compressedDataGenerator.close(); encOut.close(); encryptedDataGenerator.close(); byte[] buffer_ = baos.toByteArray(); // retrieve that buffer crypt_digest.update(buffer_); // update crypto MD5 dataTransferOutputStream.write(buffer_); // Write cipher data to socket dataTransferOutputStream.flush(); baos.close(); // Get a representation of the MD5 digest (checksum) cipher file byte[] md5sum = crypt_digest.digest(); result1 = ""; for (int i = 0; i < md5sum.length; i++) result1 += Integer.toString((md5sum[i] & 0xff) + 0x100, 16).substring(1); } dataTransferOutputStream.flush(); } catch (Throwable e) { if (listener != null) { listener.aborted(); } try { throw new FTPDataTransferException("I/O error in data transfer", e); } catch (FTPDataTransferException ex) { Logger.getLogger(UploadClientUDT.class.getName()).log(Level.SEVERE, null, ex); } } finally { // Closing stream and data connection. if (dataTransferOutputStream != null) { try { dataTransferOutputStream.flush(); dataTransferOutputStream.close(); } catch (Throwable t) { ; } } try { dataSocket.close(); } catch (Throwable t) { ; } // Set to null the instance-level input stream. dataTransferOutputStream = null; // Consume the result reply of the transfer. FTPReply readFTPReply = null; try { readFTPReply = communication.readFTPReply(); } catch (Throwable ex) { Logger.getLogger(UploadClientUDT.class.getName()).log(Level.SEVERE, null, ex); } System.out.println(readFTPReply.toString()); // Change the operation status. } }