DaviesTobi alex
DaviesTobi alex

Reputation: 670

PGP Library won't encrypt base64 string

I have an implementation of the PGP Encryption/Decryption as a class helper, but I am having trouble encrypting payloads with base64 strings in them.

Below is an example payload I am trying to encrypt:

{
    "superagentCode": "AB0003",
    "agentCode": "004FJM01023",
    "bankCode": "000015",
    "requestId": "000001201910240846150999883774",
    "bankVerificationNumber": "22123456789",
    "firstName": "Samuel",
    "middleName": "John",
    "lastName": "Smith",
    "gender": "Male",
    "dateOfBirth": "1978-Oct-20",
    "houseNumber": "10B",
    "streetName": "Almond street",
    "city": "Igando",
    "lgaCode": "502",
    "emailAddress": "[email protected]",
    "phoneNumber": "08012345678",
    "customerImage": "data:image/jpeg;base64,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",
    "customerSignature": "data:image/jpeg;base64,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",
    "accountOpeningBalance": 1000
}

Below is my encryption function:

public String encrypt(String text, String publicKeyLocation) {
    logger.info(" -|- step 1 ======== ");
    try {
        PGPLib pgp = new PGPLib();
        boolean armor = true;
        boolean withIntegrityCheck = false;
        logger.info(" -|- step  2 ======== ");
        PipedInputStream pin = new PipedInputStream();
        OutputStream o = new PipedOutputStream(pin);
        InputStream is = new ByteArrayInputStream(text.getBytes("UTF-8"));
        logger.info(" -|- step 3 ======== ");
        if (publicKeyFile == null) {
            publicKeyFile = new File(publicKeyLocation);
        }
        logger.info(" -|- step 4 ======== ");
        InputStream publicKeyStream = new FileInputStream(publicKeyFile);
        logger.info(" -|- step 5 ======== ");
        pgp.encryptStream(is, publicKeyLocation, publicKeyStream, o, armor,
                withIntegrityCheck);
        logger.info(" -|- step 6 ======== ");
        do {
            logger.info(" -|-  pin.available(): " + pin.available());
        } while (pin.available() <= 0);
        logger.info(" -|- starting encryption 7 ======== ");
        byte[] body = new byte[pin.available()];
        int numberRead = pin.read(body);
        logger.info(" -|- SSModuleClient :: pickMessage :: numberRead: "
                + numberRead);

        return byte2hex(body);
    } catch (Exception ex) {
        logger.info(" -|- SSModule :: MessageProcessor :: encrypt () :: Error Occurred ..."
                + ex.getMessage());
        logger.info("SSModule", ex);
    }

    return "";
}

When I remove the base64 string it encrypts, but if the base64 string is present, it hangs at steps 5.

Upvotes: 1

Views: 383

Answers (1)

Dan Getz
Dan Getz

Reputation: 9132

This is because your code waits until encryptStream finishes to start reading from the PipedInputStream. Piped streams are intended to be used by two different threads: the reading thread reads while the writing thread writes. By waiting to read until the writing is finished, you caused a deadlock.

So one way to fix your code would be to spawn encryptStream in a separate thread, either directly with a thread, or with an executor, etc. You'd then have to deal with all the threading considerations.

This sort of setup can have advantages when the string you're encrypting is large, and you can do something productive with part of the string, such as send it to a file or network connection, before the rest of the encrypted string is ready. However, it appears your code is not set up to take advantage of that—all you're doing with the results of encryptStream is convert them to a hex string and return it. This points to a simpler solution: don't use piped streams.

The way you're trying to use PipedOutputStream is provided in a much simpler manner, which doesn't require threads, by the class ByteArrayOutputStream:

ByteArrayOutputStream o = new ByteArrayOutputStream();
pgp.encryptStream(is, publicKeyLocation, publicKeyStream, o, armor,
        withIntegrityCheck);
byte[] body = o.toByteArray();
int numberRead = body.length;

Upvotes: 1

Related Questions