List of usage examples for org.apache.commons.compress PasswordRequiredException PasswordRequiredException
public PasswordRequiredException(final String name)
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() { } }; }