Example usage for org.apache.commons.compress PasswordRequiredException PasswordRequiredException

List of usage examples for org.apache.commons.compress PasswordRequiredException PasswordRequiredException

Introduction

In this page you can find the example usage for org.apache.commons.compress PasswordRequiredException PasswordRequiredException.

Prototype

public PasswordRequiredException(final String name) 

Source Link

Document

Create a new exception.

Usage

From source file:bobs.is.compress.sevenzip.AES256SHA256Decoder.java

@Override
InputStream decode(final String archiveName, final InputStream in, final long uncompressedLength,
        final Coder coder, final byte[] passwordBytes) throws IOException {
    return new InputStream() {
        private boolean isInitialized = false;
        private CipherInputStream cipherInputStream = null;

        private CipherInputStream init() throws IOException {
            if (isInitialized) {
                return cipherInputStream;
            }/*from  ww  w .  j  a  v a  2 s .  c om*/
            final int byte0 = 0xff & coder.properties[0];
            final int numCyclesPower = byte0 & 0x3f;
            final int byte1 = 0xff & coder.properties[1];
            final int ivSize = ((byte0 >> 6) & 1) + (byte1 & 0x0f);
            final int saltSize = ((byte0 >> 7) & 1) + (byte1 >> 4);
            if (2 + saltSize + ivSize > coder.properties.length) {
                throw new IOException("Salt size + IV size too long in " + archiveName);
            }
            final byte[] salt = new byte[saltSize];
            System.arraycopy(coder.properties, 2, salt, 0, saltSize);
            final byte[] iv = new byte[16];
            System.arraycopy(coder.properties, 2 + saltSize, iv, 0, ivSize);

            if (passwordBytes == null) {
                throw new PasswordRequiredException(archiveName);
            }
            final byte[] aesKeyBytes;
            if (numCyclesPower == 0x3f) {
                aesKeyBytes = new byte[32];
                System.arraycopy(salt, 0, aesKeyBytes, 0, saltSize);
                System.arraycopy(passwordBytes, 0, aesKeyBytes, saltSize,
                        Math.min(passwordBytes.length, aesKeyBytes.length - saltSize));
            } else {
                final MessageDigest digest;
                try {
                    digest = MessageDigest.getInstance("SHA-256");
                } catch (final NoSuchAlgorithmException noSuchAlgorithmException) {
                    throw new IOException("SHA-256 is unsupported by your Java implementation",
                            noSuchAlgorithmException);
                }
                final byte[] extra = new byte[8];
                for (long j = 0; j < (1L << numCyclesPower); j++) {
                    digest.update(salt);
                    digest.update(passwordBytes);
                    digest.update(extra);
                    for (int k = 0; k < extra.length; k++) {
                        ++extra[k];
                        if (extra[k] != 0) {
                            break;
                        }
                    }
                }
                aesKeyBytes = digest.digest();
            }

            final SecretKey aesKey = new SecretKeySpec(aesKeyBytes, "AES");
            try {
                final Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
                cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(iv));
                cipherInputStream = new CipherInputStream(in, cipher);
                isInitialized = true;
                return cipherInputStream;
            } catch (final GeneralSecurityException generalSecurityException) {
                throw new IOException("Decryption error "
                        + "(do you have the JCE Unlimited Strength Jurisdiction Policy Files installed?)",
                        generalSecurityException);
            }
        }

        @Override
        public int read() throws IOException {
            return init().read();
        }

        @Override
        public int read(final byte[] b, final int off, final int len) throws IOException {
            return init().read(b, off, len);
        }

        @Override
        public void close() {
        }
    };
}