]> source.dussan.org Git - poi.git/commitdiff
Fix bug #49378 - correct 1.6ism
authorNick Burch <nick@apache.org>
Thu, 3 Jun 2010 16:13:38 +0000 (16:13 +0000)
committerNick Burch <nick@apache.org>
Thu, 3 Jun 2010 16:13:38 +0000 (16:13 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@951048 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/poifs/crypt/Decryptor.java

index 10c8334d448cdb0e7b7701d544e6d1ccac881189..ccf3fff899a84889a7909483cd5a19fc8fc65d03 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-SNAPSHOT" date="2010-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">49378 - correct 1.6ism</action>
            <action dev="POI-DEVELOPERS" type="add">Parse the HSMF headers chunk if present, and use it to find Dates in text extraction if needed</action>
            <action dev="POI-DEVELOPERS" type="fix">48494 - detect and support time formats like HH:MM;HH:MM</action>
            <action dev="POI-DEVELOPERS" type="fix">48494 - have ExcelExtractor make use of HSSFDataFormatter, so that numbers and dates come out closer to how Excel would render them</action>
index 7b36dc4e01332020e0191b6201fe971cb05710f2..9e6c430803cc03a8f9606805331ed703509e82c3 100644 (file)
 ==================================================================== */
 package org.apache.poi.poifs.crypt;
 
-import org.apache.poi.poifs.filesystem.DocumentInputStream;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.util.LittleEndian;
-
-import javax.crypto.Cipher;
-import javax.crypto.CipherInputStream;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
 import java.security.GeneralSecurityException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 
+import javax.crypto.Cipher;
+import javax.crypto.CipherInputStream;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.poi.poifs.filesystem.DocumentInputStream;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.util.LittleEndian;
+
 /**
  *  @author Maxim Valyanskiy
  */
@@ -104,7 +104,7 @@ public class Decryptor {
         System.arraycopy(x1, 0, x3, 0, x1.length);
         System.arraycopy(x2, 0, x3, x1.length, x2.length);
 
-        return Arrays.copyOf(x3, requiredKeyLength);
+        return truncateOrPad(x3, requiredKeyLength);
     }
 
     public boolean verifyPassword(String password) throws GeneralSecurityException {
@@ -117,10 +117,26 @@ public class Decryptor {
         MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
         byte[] calcVerifierHash = sha1.digest(verifier);
 
-        byte[] verifierHash = Arrays.copyOf(cipher.doFinal(info.getVerifier().getVerifierHash()), calcVerifierHash.length);
+        byte[] verifierHash = truncateOrPad(cipher.doFinal(info.getVerifier().getVerifierHash()), calcVerifierHash.length);
 
         return Arrays.equals(calcVerifierHash, verifierHash);
     }
+    
+    /**
+     * Returns a byte array of the requested length,
+     *  truncated or zero padded as needed.
+     * Behaves like Arrays.copyOf in Java 1.6
+     */
+    private byte[] truncateOrPad(byte[] source, int length) {
+       byte[] result = new byte[length];
+       System.arraycopy(source, 0, result, 0, Math.min(length, source.length));
+       if(length > source.length) {
+          for(int i=source.length; i<length; i++) {
+             result[i] = 0;
+          }
+       }
+       return result;
+    }
 
     private Cipher getCipher() throws GeneralSecurityException {
         byte[] key = generateKey(0);