|
8 | 8 | import java.io.ObjectInputStream;
|
9 | 9 | import java.io.ObjectOutputStream;
|
10 | 10 | import java.io.ObjectStreamClass;
|
| 11 | +import java.util.HashSet; |
| 12 | +import java.util.Set; |
11 | 13 |
|
12 | 14 | import org.bouncycastle.crypto.Digest;
|
13 | 15 | import org.bouncycastle.util.Arrays;
|
@@ -382,6 +384,24 @@ public static boolean isNewAuthenticationPathNeeded(long globalIndex, int xmssHe
|
382 | 384 | private static class CheckingStream
|
383 | 385 | extends ObjectInputStream
|
384 | 386 | {
|
| 387 | + private static final Set<String> components = new HashSet<>(); |
| 388 | + |
| 389 | + static |
| 390 | + { |
| 391 | + components.add("java.util.TreeMap"); |
| 392 | + components.add("java.lang.Integer"); |
| 393 | + components.add("java.lang.Number"); |
| 394 | + components.add("org.bouncycastle.pqc.crypto.xmss.BDS"); |
| 395 | + components.add("java.util.ArrayList"); |
| 396 | + components.add("org.bouncycastle.pqc.crypto.xmss.XMSSNode"); |
| 397 | + components.add("[B"); |
| 398 | + components.add("java.util.LinkedList"); |
| 399 | + components.add("java.util.Stack"); |
| 400 | + components.add("java.util.Vector"); |
| 401 | + components.add("[Ljava.lang.Object;"); |
| 402 | + components.add("org.bouncycastle.pqc.crypto.xmss.BDSTreeHash"); |
| 403 | + } |
| 404 | + |
385 | 405 | private final Class mainClass;
|
386 | 406 | private boolean found = false;
|
387 | 407 |
|
@@ -409,6 +429,14 @@ protected Class<?> resolveClass(ObjectStreamClass desc)
|
409 | 429 | found = true;
|
410 | 430 | }
|
411 | 431 | }
|
| 432 | + else |
| 433 | + { |
| 434 | + if (!components.contains(desc.getName())) |
| 435 | + { |
| 436 | + throw new InvalidClassException( |
| 437 | + "unexpected class: ", desc.getName()); |
| 438 | + } |
| 439 | + } |
412 | 440 | return super.resolveClass(desc);
|
413 | 441 | }
|
414 | 442 | }
|
|
0 commit comments