1 /* 2 * Copyright (c) 2013, 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 4811968 6908628 8006564 27 * @modules java.base/sun.misc 28 * java.base/sun.security.util 29 * @run main S11N check 30 * @summary Serialization compatibility with old versions (and fixes) 31 */ 32 33 import java.io.ByteArrayInputStream; 34 import java.io.ByteArrayOutputStream; 35 import java.io.ObjectInputStream; 36 import java.io.ObjectOutputStream; 37 import java.util.HashMap; 38 import java.util.Map; 39 import sun.misc.BASE64Encoder; 40 import sun.security.util.ObjectIdentifier; 41 42 public class S11N { 43 static String[] SMALL= { 44 "0.0", 45 "1.1", 46 "2.2", 47 "1.2.3456", 48 "1.2.2147483647.4", 49 "1.2.268435456.4", 50 }; 51 52 static String[] HUGE = { 53 "2.16.764.1.3101555394.1.0.100.2.1", 54 "1.2.2147483648.4", 55 "2.3.4444444444444444444444", 56 "1.2.8888888888888888.33333333333333333.44444444444444", 57 }; 58 59 // Do not use j.u.Base64, the test needs to run in jdk6 60 static BASE64Encoder encoder = new BASE64Encoder() { 61 @Override 62 protected int bytesPerLine() { 63 return 48; 64 } 65 }; 66 67 public static void main(String[] args) throws Exception { 68 if (args[0].equals("check")) { 69 int version = Integer.valueOf(System.getProperty("java.version") 70 .split("\\.")[1]); 71 System.out.println("version is " + version); 72 if (version >= 7) { 73 for (String oid: SMALL) { 74 // 7 -> 7 75 check(out(oid), oid); 76 // 6 -> 7 77 check(out6(oid), oid); 78 } 79 for (String oid: HUGE) { 80 // 7 -> 7 81 check(out(oid), oid); 82 } 83 } else { 84 for (String oid: SMALL) { 85 // 6 -> 6 86 check(out(oid), oid); 87 // 7 -> 6 88 check(out7(oid), oid); 89 } 90 for (String oid: HUGE) { 91 // 7 -> 6 fails for HUGE oids 92 boolean ok = false; 93 try { 94 check(out7(oid), oid); 95 ok = true; 96 } catch (Exception e) { 97 System.out.println(e); 98 } 99 if (ok) { 100 throw new Exception(); 101 } 102 } 103 } 104 } else { 105 // Generates the JDK6 serialized string inside this test, call 106 // $JDK7/bin/java S11N dump7 107 // $JDK6/bin/java S11N dump6 108 // and paste the output at the end of this test. 109 dump(args[0], SMALL); 110 // For jdk6, the following line will throw an exception, ignore it 111 dump(args[0], HUGE); 112 } 113 } 114 115 // Gets the serialized form for jdk6 116 private static byte[] out6(String oid) throws Exception { 117 return new sun.misc.BASE64Decoder().decodeBuffer(dump6.get(oid)); 118 } 119 120 // Gets the serialized form for jdk7 121 private static byte[] out7(String oid) throws Exception { 122 return new sun.misc.BASE64Decoder().decodeBuffer(dump7.get(oid)); 123 } 124 125 // Gets the serialized form for this java 126 private static byte[] out(String oid) throws Exception { 127 ByteArrayOutputStream bout = new ByteArrayOutputStream(); 128 new ObjectOutputStream(bout).writeObject(new ObjectIdentifier(oid)); 129 return bout.toByteArray(); 130 } 131 132 // Makes sure serialized form can be deserialized 133 private static void check(byte[] in, String oid) throws Exception { 134 ObjectIdentifier o = (ObjectIdentifier) ( 135 new ObjectInputStream(new ByteArrayInputStream(in)).readObject()); 136 if (!o.toString().equals(oid)) { 137 throw new Exception("Read Fail " + o + ", not " + oid); 138 } 139 } 140 141 // dump serialized form to java code style text 142 private static void dump(String title, String[] oids) throws Exception { 143 for (String oid: oids) { 144 String[] base64 = encoder.encodeBuffer(out(oid)).split("\n"); 145 System.out.println(" " + title + ".put(\"" + oid + "\","); 146 for (int i = 0; i<base64.length; i++) { 147 System.out.print(" \"" + base64[i] + "\""); 148 if (i == base64.length - 1) { 149 System.out.println(");"); 150 } else { 151 System.out.println(" +"); 152 } 153 } 154 } 155 } 156 157 // Do not use diamond operator, this test is also meant to run in jdk6 158 private static Map<String,String> dump7 = new HashMap<String,String>(); 159 private static Map<String,String> dump6 = new HashMap<String,String>(); 160 161 static { 162 ////////////// PASTE BEGIN ////////////// 163 dump7.put("0.0", 164 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 165 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 166 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhwAAAAAnVyAAJbSU26YCZ26rKlAgAAeHAA" + 167 "AAACAAAAAAAAAAB1cgACW0Ks8xf4BghU4AIAAHhwAAAAAQB4"); 168 dump7.put("1.1", 169 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 170 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 171 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhwAAAAAnVyAAJbSU26YCZ26rKlAgAAeHAA" + 172 "AAACAAAAAQAAAAF1cgACW0Ks8xf4BghU4AIAAHhwAAAAASl4"); 173 dump7.put("2.2", 174 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 175 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 176 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhwAAAAAnVyAAJbSU26YCZ26rKlAgAAeHAA" + 177 "AAACAAAAAgAAAAJ1cgACW0Ks8xf4BghU4AIAAHhwAAAAAVJ4"); 178 dump7.put("1.2.3456", 179 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 180 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 181 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhwAAAAA3VyAAJbSU26YCZ26rKlAgAAeHAA" + 182 "AAADAAAAAQAAAAIAAA2AdXIAAltCrPMX+AYIVOACAAB4cAAAAAMqmwB4"); 183 dump7.put("1.2.2147483647.4", 184 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 185 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 186 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhwAAAABHVyAAJbSU26YCZ26rKlAgAAeHAA" + 187 "AAAEAAAAAQAAAAJ/////AAAABHVyAAJbQqzzF/gGCFTgAgAAeHAAAAAHKof///9/" + 188 "BHg="); 189 dump7.put("1.2.268435456.4", 190 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 191 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 192 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhwAAAABHVyAAJbSU26YCZ26rKlAgAAeHAA" + 193 "AAAEAAAAAQAAAAIQAAAAAAAABHVyAAJbQqzzF/gGCFTgAgAAeHAAAAAHKoGAgIAA" + 194 "BHg="); 195 dump7.put("2.16.764.1.3101555394.1.0.100.2.1", 196 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 197 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 198 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhw/////3NyAD5zdW4uc2VjdXJpdHkudXRp" + 199 "bC5PYmplY3RJZGVudGlmaWVyJEh1Z2VPaWROb3RTdXBwb3J0ZWRCeU9sZEpESwAA" + 200 "AAAAAAABAgAAeHB1cgACW0Ks8xf4BghU4AIAAHhwAAAADmCFfAGLxvf1QgEAZAIB" + 201 "eA=="); 202 dump7.put("1.2.2147483648.4", 203 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 204 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 205 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhw/////3NyAD5zdW4uc2VjdXJpdHkudXRp" + 206 "bC5PYmplY3RJZGVudGlmaWVyJEh1Z2VPaWROb3RTdXBwb3J0ZWRCeU9sZEpESwAA" + 207 "AAAAAAABAgAAeHB1cgACW0Ks8xf4BghU4AIAAHhwAAAAByqIgICAAAR4"); 208 dump7.put("2.3.4444444444444444444444", 209 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 210 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 211 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhw/////3NyAD5zdW4uc2VjdXJpdHkudXRp" + 212 "bC5PYmplY3RJZGVudGlmaWVyJEh1Z2VPaWROb3RTdXBwb3J0ZWRCeU9sZEpESwAA" + 213 "AAAAAAABAgAAeHB1cgACW0Ks8xf4BghU4AIAAHhwAAAADFOD4e+HpNG968eOHHg="); 214 dump7.put("1.2.8888888888888888.33333333333333333.44444444444444", 215 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 216 "fy4DAANJAAxjb21wb25lbnRMZW5MAApjb21wb25lbnRzdAASTGphdmEvbGFuZy9P" + 217 "YmplY3Q7WwAIZW5jb2Rpbmd0AAJbQnhw/////3NyAD5zdW4uc2VjdXJpdHkudXRp" + 218 "bC5PYmplY3RJZGVudGlmaWVyJEh1Z2VPaWROb3RTdXBwb3J0ZWRCeU9sZEpESwAA" + 219 "AAAAAAABAgAAeHB1cgACW0Ks8xf4BghU4AIAAHhwAAAAGCqP5Yzbxa6cOLubj9ek" + 220 "japVio3AusuOHHg="); 221 222 dump6.put("0.0", 223 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 224 "fy4CAAJJAAxjb21wb25lbnRMZW5bAApjb21wb25lbnRzdAACW0l4cAAAAAJ1cgAC" + 225 "W0lNumAmduqypQIAAHhwAAAAAgAAAAAAAAAA"); 226 dump6.put("1.1", 227 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 228 "fy4CAAJJAAxjb21wb25lbnRMZW5bAApjb21wb25lbnRzdAACW0l4cAAAAAJ1cgAC" + 229 "W0lNumAmduqypQIAAHhwAAAAAgAAAAEAAAAB"); 230 dump6.put("2.2", 231 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 232 "fy4CAAJJAAxjb21wb25lbnRMZW5bAApjb21wb25lbnRzdAACW0l4cAAAAAJ1cgAC" + 233 "W0lNumAmduqypQIAAHhwAAAAAgAAAAIAAAAC"); 234 dump6.put("1.2.3456", 235 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 236 "fy4CAAJJAAxjb21wb25lbnRMZW5bAApjb21wb25lbnRzdAACW0l4cAAAAAN1cgAC" + 237 "W0lNumAmduqypQIAAHhwAAAAAwAAAAEAAAACAAANgA=="); 238 dump6.put("1.2.2147483647.4", 239 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 240 "fy4CAAJJAAxjb21wb25lbnRMZW5bAApjb21wb25lbnRzdAACW0l4cAAAAAR1cgAC" + 241 "W0lNumAmduqypQIAAHhwAAAABAAAAAEAAAACf////wAAAAQ="); 242 dump6.put("1.2.268435456.4", 243 "rO0ABXNyACJzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyeLIO7GQX" + 244 "fy4CAAJJAAxjb21wb25lbnRMZW5bAApjb21wb25lbnRzdAACW0l4cAAAAAR1cgAC" + 245 "W0lNumAmduqypQIAAHhwAAAABAAAAAEAAAACEAAAAAAAAAQ="); 246 ////////////// PASTE END ////////////// 247 } 248 }