Example usage for org.bouncycastle.openpgp PGPLiteralData BINARY

List of usage examples for org.bouncycastle.openpgp PGPLiteralData BINARY

Introduction

In this page you can find the example usage for org.bouncycastle.openpgp PGPLiteralData BINARY.

Prototype

char BINARY

To view the source code for org.bouncycastle.openpgp PGPLiteralData BINARY.

Click Source Link

Document

Format tag for binary literal data

Usage

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.
    }

}