Example usage for org.bouncycastle.bcpg ArmoredOutputStream beginClearText

List of usage examples for org.bouncycastle.bcpg ArmoredOutputStream beginClearText

Introduction

In this page you can find the example usage for org.bouncycastle.bcpg ArmoredOutputStream beginClearText.

Prototype

public void beginClearText(int hashAlgorithm) throws IOException 

Source Link

Document

Start a clear text signed message.

Usage

From source file:com.github.sannies.nexusaptplugin.sign.PGPSigner.java

License:Apache License

/**
 * Creates a clear sign signature over the input data. (Not detached)
 *
 * @param input      the content to be signed
 * @param output     the output destination of the signature
 *///  w  ww. j  av a 2  s.  c o  m
public void clearSign(InputStream input, OutputStream output)
        throws IOException, PGPException, GeneralSecurityException {
    int digest = PGPUtil.SHA1;

    PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(
            new BcPGPContentSignerBuilder(privateKey.getPublicKeyPacket().getAlgorithm(), digest));
    signatureGenerator.init(PGPSignature.CANONICAL_TEXT_DOCUMENT, privateKey);

    ArmoredOutputStream armoredOutput = new ArmoredOutputStream(output);
    armoredOutput.beginClearText(digest);

    BufferedReader reader = new BufferedReader(new InputStreamReader(input));

    String line;
    while ((line = reader.readLine()) != null) {
        // trailing spaces must be removed for signature calculation (see http://tools.ietf.org/html/rfc4880#section-7.1)
        byte[] data = trim(line).getBytes("UTF-8");

        armoredOutput.write(data);
        armoredOutput.write(EOL);

        signatureGenerator.update(data);
        signatureGenerator.update(EOL);
    }

    armoredOutput.endClearText();

    PGPSignature signature = signatureGenerator.generate();
    signature.encode(new BCPGOutputStream(armoredOutput));

    armoredOutput.close();
}

From source file:com.navnorth.learningregistry.LRSigner.java

License:Apache License

/**
 * Encodes the provided message with the private key and pass phrase set in configuration
 *
 * @param message Message to encode/*from   ww w.ja  v a2  s . c o m*/
 * @return Encoded message
 * @throws LRException SIGNING_FAILED if the document cannot be signed, NO_KEY if the key cannot be obtained
 */
private String signEnvelopeData(String message) throws LRException {
    // Throw an exception if any of the required fields are null
    if (passPhrase == null || publicKeyLocation == null || privateKey == null) {
        throw new LRException(LRException.NULL_FIELD);
    }

    // Add the provider here so that after signing, we can remove the provider.
    // This allows using this code from multiple separate class loaders while Bouncy Castle is on a separate class loader
    BouncyCastleProvider provider = new BouncyCastleProvider();
    Security.addProvider(provider);

    try {

        // Get an InputStream for the private key
        InputStream privateKeyStream = getPrivateKeyStream(privateKey);

        // Get an OutputStream for the result
        ByteArrayOutputStream result = new ByteArrayOutputStream();
        ArmoredOutputStream aOut = new ArmoredOutputStream(result);

        // Get the pass phrase
        char[] privateKeyPassword = passPhrase.toCharArray();

        try {
            // Get the private key from the InputStream
            PGPSecretKey sk = readSecretKey(privateKeyStream);
            PGPPrivateKey pk = sk.extractPrivateKey(
                    new JcePBESecretKeyDecryptorBuilder().setProvider("BC").build(privateKeyPassword));
            PGPSignatureGenerator sGen = new PGPSignatureGenerator(
                    new JcaPGPContentSignerBuilder(sk.getPublicKey().getAlgorithm(), PGPUtil.SHA256)
                            .setProvider("BC"));
            PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator();

            // Clear sign the message
            java.util.Iterator it = sk.getPublicKey().getUserIDs();
            if (it.hasNext()) {
                spGen.setSignerUserID(false, (String) it.next());
                sGen.setHashedSubpackets(spGen.generate());
            }
            aOut.beginClearText(PGPUtil.SHA256);
            sGen.init(PGPSignature.CANONICAL_TEXT_DOCUMENT, pk);
            byte[] msg = message.getBytes();
            sGen.update(msg, 0, msg.length);
            aOut.write(msg, 0, msg.length);
            BCPGOutputStream bOut = new BCPGOutputStream(aOut);
            aOut.endClearText();
            sGen.generate().encode(bOut);
            aOut.close();

            String strResult = result.toString("utf8");

            // for whatever reason, bouncycastle is failing to put a linebreak before "-----BEGIN PGP SIGNATURE"
            strResult = strResult.replaceAll("([a-z0-9])-----BEGIN PGP SIGNATURE-----",
                    "$1\n-----BEGIN PGP SIGNATURE-----");

            return strResult;
        } catch (Exception e) {
            throw new LRException(LRException.SIGNING_FAILED, e);
        } finally {
            try {
                if (privateKeyStream != null) {
                    privateKeyStream.close();
                }

                result.close();
            } catch (IOException e) {
                //Could not close the streams
            }
        }
    } finally {
        Security.removeProvider(provider.getName());
    }
}

From source file:de.dentrassi.pm.signing.pgp.internal.PgpSigningService.java

License:Open Source License

@Override
public void sign(final InputStream in, final OutputStream out, final boolean inline) throws Exception {
    final int digest = HashAlgorithmTags.SHA1;
    final PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(
            new BcPGPContentSignerBuilder(this.privateKey.getPublicKeyPacket().getAlgorithm(), digest));
    signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, this.privateKey);

    final ArmoredOutputStream armoredOutput = new ArmoredOutputStream(out);

    if (inline) {
        armoredOutput.beginClearText(digest);
    }//from   w ww  .  j a v a  2 s  . co m

    final byte[] buffer = new byte[4096];

    int rc;
    while ((rc = in.read(buffer)) >= 0) {
        if (inline) {
            armoredOutput.write(buffer, 0, rc);
        }
        signatureGenerator.update(buffer, 0, rc);
    }

    armoredOutput.endClearText();

    final PGPSignature signature = signatureGenerator.generate();
    signature.encode(new BCPGOutputStream(armoredOutput));

    armoredOutput.close();
}

From source file:org.eclipse.packagedrone.repo.signing.pgp.internal.AbstractSecretKeySigningService.java

License:Open Source License

@Override
public void sign(final InputStream in, final OutputStream out, final boolean inline) throws Exception {
    final int digest = HashAlgorithmTags.SHA1;
    final PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(
            new BcPGPContentSignerBuilder(this.privateKey.getPublicKeyPacket().getAlgorithm(), digest));

    if (inline) {
        signatureGenerator.init(PGPSignature.CANONICAL_TEXT_DOCUMENT, this.privateKey);
    } else {//from w  w  w .j a va 2 s .  c  o  m
        signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, this.privateKey);
    }

    final ArmoredOutputStream armoredOutput = new ArmoredOutputStream(out);
    armoredOutput.setHeader("Version", VersionInformation.VERSIONED_PRODUCT);

    if (inline) {
        armoredOutput.beginClearText(digest);

        final LineNumberReader lnr = new LineNumberReader(new InputStreamReader(in, StandardCharsets.UTF_8));

        String line;
        while ((line = lnr.readLine()) != null) {
            if (lnr.getLineNumber() > 1) {
                signatureGenerator.update(NL_DATA);
            }

            final byte[] data = trimTrailing(line).getBytes(StandardCharsets.UTF_8);

            if (inline) {
                armoredOutput.write(data);
                armoredOutput.write(NL_DATA);
            }
            signatureGenerator.update(data);
        }

        armoredOutput.endClearText();
    } else {

        final byte[] buffer = new byte[4096];
        int rc;
        while ((rc = in.read(buffer)) >= 0) {
            signatureGenerator.update(buffer, 0, rc);
        }
    }

    final PGPSignature signature = signatureGenerator.generate();
    signature.encode(new BCPGOutputStream(armoredOutput));

    armoredOutput.close();
}

From source file:org.m1theo.apt.repo.signing.PGPSigner.java

License:Apache License

/**
 * Creates a clear sign signature over the input data. (Not detached)
 *
 * @param input      the content to be signed
 * @param output     the output destination of the signature
 *///  w ww .j a  v  a 2s.c o  m
public void clearSign(InputStream input, OutputStream output)
        throws IOException, PGPException, GeneralSecurityException {

    PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(
            new BcPGPContentSignerBuilder(privateKey.getPublicKeyPacket().getAlgorithm(), digest));
    signatureGenerator.init(PGPSignature.CANONICAL_TEXT_DOCUMENT, privateKey);

    ArmoredOutputStream armoredOutput = new ArmoredOutputStream(output);
    armoredOutput.beginClearText(digest);

    LineIterator iterator = new LineIterator(new InputStreamReader(input));

    while (iterator.hasNext()) {
        String line = iterator.nextLine();

        // trailing spaces must be removed for signature calculation (see http://tools.ietf.org/html/rfc4880#section-7.1)
        byte[] data = trim(line).getBytes("UTF-8");

        armoredOutput.write(data);
        armoredOutput.write(EOL);

        signatureGenerator.update(data);
        if (iterator.hasNext()) {
            signatureGenerator.update(EOL);
        }
    }

    armoredOutput.endClearText();

    PGPSignature signature = signatureGenerator.generate();
    signature.encode(new BCPGOutputStream(armoredOutput));

    armoredOutput.close();
}

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  v  a 2 s  .c  om
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.vafer.jdeb.signing.PGPSigner.java

License:Apache License

/**
 * Creates a clear sign signature over the input data. (Not detached)
 *
 * @param input      the content to be signed
 * @param output     the output destination of the signature
 *//*from  w  ww  .  j  av a 2  s.  co  m*/
public void clearSign(InputStream input, OutputStream output)
        throws IOException, PGPException, GeneralSecurityException {
    int digest = PGPUtil.SHA1;

    PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(
            new BcPGPContentSignerBuilder(privateKey.getPublicKeyPacket().getAlgorithm(), digest));
    signatureGenerator.init(PGPSignature.CANONICAL_TEXT_DOCUMENT, privateKey);

    ArmoredOutputStream armoredOutput = new ArmoredOutputStream(output);
    armoredOutput.beginClearText(digest);

    LineIterator iterator = new LineIterator(new InputStreamReader(input));

    while (iterator.hasNext()) {
        String line = iterator.nextLine();

        // trailing spaces must be removed for signature calculation (see http://tools.ietf.org/html/rfc4880#section-7.1)
        byte[] data = trim(line).getBytes("UTF-8");

        armoredOutput.write(data);
        armoredOutput.write(EOL);

        signatureGenerator.update(data);
        if (iterator.hasNext()) {
            signatureGenerator.update(EOL);
        }
    }

    armoredOutput.endClearText();

    PGPSignature signature = signatureGenerator.generate();
    signature.encode(new BCPGOutputStream(armoredOutput));

    armoredOutput.close();
}

From source file:org.vafer.jdeb.signing.SigningUtils.java

License:Apache License

/**
 * Create a clear sign signature over the input data. (Not detached)
 *
 * @param pInput//from   w  ww  .j  a va2s  . c o m
 * @param pKeyring
 * @param pKey
 * @param pPassphrase
 * @param pOutput
 * @throws IOException
 * @throws PGPException
 * @throws NoSuchProviderException
 * @throws NoSuchAlgorithmException
 * @throws SignatureException
 */
public static void clearSign(final InputStream pInput, final InputStream pKeyring, final String pKey,
        final String pPassphrase, final OutputStream pOutput) throws IOException, PGPException,
        NoSuchProviderException, NoSuchAlgorithmException, SignatureException {

    Security.addProvider(new BouncyCastleProvider());

    final PGPSecretKey secretKey = getSecretKey(pKeyring, pKey);
    final PGPPrivateKey privateKey = secretKey.extractPrivateKey(pPassphrase.toCharArray(), "BC");

    final int digest = PGPUtil.SHA1;

    final PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(
            secretKey.getPublicKey().getAlgorithm(), digest, "BC");
    signatureGenerator.initSign(PGPSignature.CANONICAL_TEXT_DOCUMENT, privateKey);

    //        final PGPSignatureSubpacketGenerator subpackageGenerator = new PGPSignatureSubpacketGenerator();
    //
    //        final Iterator it = secretKey.getPublicKey().getUserIDs();
    //        if (it.hasNext()) {
    //            subpackageGenerator.setSignerUserID(false, (String)it.next());
    //            signatureGenerator.setHashedSubpackets(subpackageGenerator.generate());
    //        }

    final ArmoredOutputStream armoredOutput = new ArmoredOutputStream(pOutput);

    armoredOutput.beginClearText(digest);

    final BufferedReader reader = new BufferedReader(new InputStreamReader(pInput));

    final byte[] newline = "\r\n".getBytes("UTF-8");

    processLine(reader.readLine(), armoredOutput, signatureGenerator);

    while (true) {
        final String line = reader.readLine();

        if (line == null) {
            armoredOutput.write(newline);
            break;
        }

        armoredOutput.write(newline);
        signatureGenerator.update(newline);

        processLine(line, armoredOutput, signatureGenerator);
    }

    armoredOutput.endClearText();

    final BCPGOutputStream pgpOutput = new BCPGOutputStream(armoredOutput);

    signatureGenerator.generate().encode(pgpOutput);

    armoredOutput.close();

}