Java: Not Catching deliberate BadPaddingException

426 Views Asked by At

My app prompts the user for the password that was used to encrypt a control file. If the wrong password is entered, the app responds by creating a new control file. Therefore I need to catch a BadPaddingException so I can trigger the appropriate response.

Here's the code snippet that should generate the exception

private void existingHashFile(String file) {
        psUI = new passwordUI(new javax.swing.JFrame(), true, "existing");
        psUI.setVisible(true);
        this.key = passwordUI.key;
        try {
            hash.decryptHashFile(file, this.key); //this is line 240
        } catch (BadPaddingException ex) {
            Logger.getLogger(homePage.class.getName()).log(Level.SEVERE, null, ex);
            //then the file was not decrypted
            System.out.println("BPE 2!");
        } catch (Exception ex) {
            Logger.getLogger(homePage.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("BPE 3!");
        }

For completeness, here's the decryptHashFile method that is called above

public void decryptHashFile(String filename, String key) throws BadPaddingException, UnsupportedEncodingException, Exception {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        CipherInputStream cis = null;   
        String outFile = filename.replace(".enc", "");
        byte[] byteKey = key.getBytes("UTF-8");

        Cipher cipher = getCipher(byteKey, "decrypt");

        try {
            fis = new FileInputStream(filename);
            fos = new FileOutputStream(outFile);
            cis = new CipherInputStream(fis, cipher);
            byte[] buffer = new byte[1024];
            int read = cis.read(buffer);
            while (read != -1) {
                fos.write(buffer, 0, read);
                read = cis.read(buffer); //this is line 197
            }
        } catch (IOException  ex) {
            Logger.getLogger(hashListClass.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (fos != null) {
                fos.close();
            }
            if (cis != null) {
               cis.close(); 
            }
            if (fis != null) {
               fis.close(); 
            }
        }
    }

When I deliberately enter the wrong password, I see this stack trace, but my code (I've used a println in the example) isn't executed:

Dec 02, 2017 2:31:34 PM appwatch.hashListClass decryptHashFile
SEVERE: null
java.io.IOException: javax.crypto.BadPaddingException: Given final block not properly padded
    at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:121)
    at javax.crypto.CipherInputStream.read(CipherInputStream.java:239)
    at javax.crypto.CipherInputStream.read(CipherInputStream.java:215)
    at appwatch.hashListClass.decryptHashFile(hashListClass.java:197)
    at appwatch.homePage.existingHashFile(homePage.java:240)
1

There are 1 best solutions below

2
On

CipherInputStream.read (your line 197) throws IOException, not BadPaddingException, therefore the exception is caught by the subsequent catch (IOException ex).

After that you are not explicitly throwing other exceptions, so there is nothing else to catch after decryptHashFile.