1 /*
2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @bug     8004873
27  * @summary Need to include data buffered by Padding impl when calculating
28  * output buffer sizes.
29  */
30 
31 import java.io.*;
32 import java.security.*;
33 import java.security.spec.*;
34 import java.util.*;
35 import javax.crypto.*;
36 import javax.crypto.spec.*;
37 
38 public class Test8004873 extends UcryptoTest {
39 
40     private static final String[] PADDEDCIPHER_ALGOS = {
41         "AES/ECB/PKCS5Padding",
42         "AES/CBC/PKCS5Padding",
43         "AES/CFB128/PKCS5Padding"
44     };
45 
46     private static final SecretKey AES_KEY;
47 
48     static {
49         byte[] keyValue = {
50             62, 124, -2, -15, 86, -25, 18, -112, 110, 31, 96, 59,
51             89, 70, 60, 103};
52         AES_KEY = new SecretKeySpec(keyValue, "AES");
53     }
54 
main(String[] args)55     public static void main(String[] args) throws Exception {
56         main(new Test8004873(), null);
57     }
58 
doTest(Provider prov)59     public void doTest(Provider prov) throws Exception {
60         boolean result = true;
61         for (String algo : PADDEDCIPHER_ALGOS) {
62             if (!testOOS(algo, prov)) {
63                 result = false;
64                 System.out.println(algo + " Test Failed!");
65             }
66         }
67         if (!result) {
68             throw new Exception("One or more test failed!");
69         }
70     }
71 
testOOS(String algo, Provider prov)72     private boolean testOOS(String algo, Provider prov)
73         throws Exception {
74 
75         String password = "abcd1234";
76         Cipher c;
77         try {
78             c = Cipher.getInstance(algo, prov);
79         } catch(NoSuchAlgorithmException nsae) {
80             System.out.println("Skipping Unsupported algo: " + algo);
81             return true;
82         }
83         c.init(Cipher.ENCRYPT_MODE, AES_KEY);
84         AlgorithmParameters params = c.getParameters();
85         ByteArrayOutputStream baos = new ByteArrayOutputStream();
86         CipherOutputStream cos = new CipherOutputStream(baos, c);
87         ObjectOutputStream oos = new ObjectOutputStream(cos);
88         oos.writeObject(password);
89         oos.flush();
90         oos.close();
91         byte[] encrypted = baos.toByteArray();
92 
93         c.init(Cipher.DECRYPT_MODE, AES_KEY, params);
94 
95         ByteArrayInputStream bais = new ByteArrayInputStream(encrypted);
96         CipherInputStream cis = new CipherInputStream(bais, c);
97         ObjectInputStream ois = new ObjectInputStream(cis);
98 
99         String recovered = (String) ois.readObject();
100         return recovered.equals(password);
101     }
102 }
103