Example usage for org.bouncycastle.openpgp PGPSignature update

List of usage examples for org.bouncycastle.openpgp PGPSignature update

Introduction

In this page you can find the example usage for org.bouncycastle.openpgp PGPSignature update.

Prototype

public void update(byte[] bytes, int off, int length) 

Source Link

Usage

From source file:bisq.desktop.main.overlays.windows.downloadupdate.BisqInstaller.java

License:Open Source License

/**
 * Verifies detached PGP signatures against GPG/openPGP RSA public keys. Does currently not work with openssl or JCA/JCE keys.
 *
 * @param pubKeyFile Path to file providing the public key to use
 * @param sigFile    Path to detached signature file
 * @param dataFile   Path to signed data file
 * @return {@code true} if signature is valid, {@code false} if signature is not valid
 * @throws Exception throws various exceptions in case something went wrong. Main reason should be that key or
 *                   signature could be extracted from the provided files due to a "bad" format.<br>
 *                   <code>FileNotFoundException, IOException, SignatureException, PGPException</code>
 *//*  ww  w .  j  av a  2  s .  c  o m*/
public static VerifyStatusEnum verifySignature(File pubKeyFile, File sigFile, File dataFile) throws Exception {
    InputStream inputStream;
    int bytesRead;
    PGPPublicKey publicKey;
    PGPSignature pgpSignature;
    boolean result;

    // Read keys from file
    inputStream = PGPUtil.getDecoderStream(new FileInputStream(pubKeyFile));
    PGPPublicKeyRingCollection publicKeyRingCollection = new PGPPublicKeyRingCollection(inputStream,
            new JcaKeyFingerprintCalculator());
    inputStream.close();

    Iterator<PGPPublicKeyRing> iterator = publicKeyRingCollection.getKeyRings();
    PGPPublicKeyRing pgpPublicKeyRing;
    if (iterator.hasNext()) {
        pgpPublicKeyRing = iterator.next();
    } else {
        throw new PGPException("Could not find public keyring in provided key file");
    }

    // Would be the solution for multiple keys in one file
    //        Iterator<PGPPublicKey> kIt;
    //        kIt = pgpPublicKeyRing.getPublicKeys();
    //        publicKey = pgpPublicKeyRing.getPublicKey(0xF5B84436F379A1C6L);

    // Read signature from file
    inputStream = PGPUtil.getDecoderStream(new FileInputStream(sigFile));
    PGPObjectFactory pgpObjectFactory = new PGPObjectFactory(inputStream, new JcaKeyFingerprintCalculator());
    Object o = pgpObjectFactory.nextObject();
    if (o instanceof PGPSignatureList) {
        PGPSignatureList signatureList = (PGPSignatureList) o;
        checkArgument(!signatureList.isEmpty(), "signatureList must not be empty");
        pgpSignature = signatureList.get(0);
    } else if (o instanceof PGPSignature) {
        pgpSignature = (PGPSignature) o;
    } else {
        throw new SignatureException("Could not find signature in provided signature file");
    }
    inputStream.close();
    log.debug("KeyID used in signature: %X\n", pgpSignature.getKeyID());
    publicKey = pgpPublicKeyRing.getPublicKey(pgpSignature.getKeyID());

    // If signature is not matching the key used for signing we fail
    if (publicKey == null)
        return VerifyStatusEnum.FAIL;

    log.debug("The ID of the selected key is %X\n", publicKey.getKeyID());
    pgpSignature.init(new BcPGPContentVerifierBuilderProvider(), publicKey);

    // Read file to verify
    byte[] data = new byte[1024];
    inputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
    while (true) {
        bytesRead = inputStream.read(data, 0, 1024);
        if (bytesRead == -1)
            break;
        pgpSignature.update(data, 0, bytesRead);
    }
    inputStream.close();

    // Verify the signature
    result = pgpSignature.verify();
    return result ? VerifyStatusEnum.OK : VerifyStatusEnum.FAIL;
}

From source file:org.elasticsearch.plugins.InstallPluginCommand.java

License:Apache License

/**
 * Verify the signature of the downloaded plugin ZIP. The signature is obtained from the source of the downloaded plugin by appending
 * ".asc" to the URL. It is expected that the plugin is signed with the Elastic signing key with ID D27D666CD88E42B4.
 *
 * @param zip       the path to the downloaded plugin ZIP
 * @param urlString the URL source of the downloade plugin ZIP
 * @throws IOException  if an I/O exception occurs reading from various input streams
 * @throws PGPException if the PGP implementation throws an internal exception during verification
 *//*from   ww w . j  a  va 2s  . c  om*/
void verifySignature(final Path zip, final String urlString) throws IOException, PGPException {
    final String ascUrlString = urlString + ".asc";
    final URL ascUrl = openUrl(ascUrlString);
    try (
            // fin is a file stream over the downloaded plugin zip whose signature to verify
            InputStream fin = pluginZipInputStream(zip);
            // sin is a URL stream to the signature corresponding to the downloaded plugin zip
            InputStream sin = urlOpenStream(ascUrl);
            // ain is a input stream to the public key in ASCII-Armor format (RFC4880)
            InputStream ain = new ArmoredInputStream(getPublicKey())) {
        final JcaPGPObjectFactory factory = new JcaPGPObjectFactory(PGPUtil.getDecoderStream(sin));
        final PGPSignature signature = ((PGPSignatureList) factory.nextObject()).get(0);

        // validate the signature has key ID matching our public key ID
        final String keyId = Long.toHexString(signature.getKeyID()).toUpperCase(Locale.ROOT);
        if (getPublicKeyId().equals(keyId) == false) {
            throw new IllegalStateException(
                    "key id [" + keyId + "] does not match expected key id [" + getPublicKeyId() + "]");
        }

        // compute the signature of the downloaded plugin zip
        final PGPPublicKeyRingCollection collection = new PGPPublicKeyRingCollection(ain,
                new JcaKeyFingerprintCalculator());
        final PGPPublicKey key = collection.getPublicKey(signature.getKeyID());
        signature.init(new JcaPGPContentVerifierBuilderProvider().setProvider(new BouncyCastleProvider()), key);
        final byte[] buffer = new byte[1024];
        int read;
        while ((read = fin.read(buffer)) != -1) {
            signature.update(buffer, 0, read);
        }

        // finally we verify the signature of the downloaded plugin zip matches the expected signature
        if (signature.verify() == false) {
            throw new IllegalStateException("signature verification for [" + urlString + "] failed");
        }
    }
}

From source file:org.sufficientlysecure.keychain.pgp.PgpSignatureChecker.java

License:Open Source License

/**
 * Mostly taken from ClearSignedFileProcessor in Bouncy Castle
 *///from   w  w w . j  av a2s. co  m

private static void processLine(PGPSignature sig, byte[] line) throws SignatureException {
    int length = getLengthWithoutWhiteSpace(line);
    if (length > 0) {
        sig.update(line, 0, length);
    }
}