MDC packet in inter-operation with openpgpjs

Lou Wynn <[email protected]>
Newsgroups gmane.comp.encryption.bouncy-castle.devel
Message-ID <[email protected]>
Hi,

I have a Java server app that uses BC to encrypt data. The client
running in a browser uses the OpenPGPJS (v3.x) to decrypt it. In the
default mode I get this error from OpenPGPJS:

Error decrypting message: Decryption failed due to missing MDC.     at
SymmetricallyEncrypted._callee$ (openpgp.js:49622)     at tryCatch
(openpgp.js:26630)     at Generator.invoke [as _invoke]
(openpgp.js:26864)     at Generator.prototype.(anonymous function) [as
next]
(chrome-extension://dmeinfklhaiihnaiiaiimanofkcmefpa/background.js:28478:21)
    at step (openpgp.js:4012)     at openpgp.js:4030     at new Promise
(<anonymous>)     at new F (openpgp.js:9832)     at
SymmetricallyEncrypted.<anonymous> (openpgp.js:4009)     at
SymmetricallyEncrypted.decrypt (openpgp.js:49638)


If I disable the MDC feature by setting "openpgp.config.ignore_mdc_error
= true;" then the error is gone.

When I looked at my BC code, I found that the PGPEncryptedDataGenerator
does add a MDC packet in its close() function, which reads like this:

// hand code a mod detection packet // BCPGOutputStream bOut = new
BCPGOutputStream(genOut, PacketTags.MOD_DETECTION_CODE, 20);


Could anyone help me point out where I did wrong? My BC code that
encrypts is as follows.

byte[] signEncrypt(final PGPPrivateKey priKey,
            final PGPPublicKey encKey, final byte[] bytes) {
    try {
            // Prepare to sign
            PGPSignatureGenerator sigG = null;
            if (priKey != null) {
                sigG = new PGPSignatureGenerator(new
JcaPGPContentSignerBuilder(
                        priKey.getPublicKeyPacket().getAlgorithm(),
KeyGen.SignatureHash)
                                .setProvider(Provider));
                sigG.init(PGPSignature.BINARY_DOCUMENT, priKey);
//                log.info("Signing key is {}",
Long.toHexString(priKey.getKeyID()));
            }

            // Encrypt
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            PGPEncryptedDataGenerator encGen = new
PGPEncryptedDataGenerator(
                    new
JcePGPDataEncryptorBuilder(EncAlg).setSecureRandom(Random)
                            .setProvider(Provider));
            encGen.addMethod(new
JcePublicKeyKeyEncryptionMethodGenerator(encKey)
                    .setProvider(Provider));
            OutputStream encOut = encGen.open(bout, new byte[BufferSize]);
            BCPGOutputStream bcOut = null;

            // Compress data before encryption
            if (pgpCompressed) {
                PGPCompressedDataGenerator compG = new
PGPCompressedDataGenerator(
                        PGPCompressedData.ZIP);
                bcOut = new BCPGOutputStream(compG.open(encOut));
            }
            else {
                bcOut = new BCPGOutputStream(encOut);
            }

            if (sigG != null)
                sigG.generateOnePassVersion(false).encode(bcOut);

            // Write to pgp object
            PGPLiteralDataGenerator literalG = new
PGPLiteralDataGenerator();
            OutputStream ldOut = literalG.open(bcOut, PGPLiteralData.BINARY,
                    PGPLiteralData.CONSOLE, bytes.length, new Date());

            ByteArrayInputStream bIn = new ByteArrayInputStream(bytes);
            byte[] buf = new byte[BufferSize];
            for (int n = 0; (n = bIn.read(buf)) >= 0;) {
                ldOut.write(buf, 0, n);
                if (sigG != null)
                    sigG.update(buf, 0, n);
            }

            if (sigG != null) {
                sigG.generate().encode(bcOut);
            }
            ldOut.close();
            bcOut.close();
            encGen.close();

            return bout.toByteArray();
        }
        catch (PGPException | IOException e) {
            throw new CryptoServiceException(e);
        }
    }


-- 
Thanks,
Lou
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.