1 /*
2  * Copyright (c) 2003, 2016, 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 4894125 7054918 8130181
27  * @library ../testlibrary
28  * @summary test that failover for KeyPairGenerator works
29  * @author Andreas Sterbenz
30  */
31 
32 import java.util.*;
33 
34 import java.security.*;
35 import java.security.interfaces.*;
36 import java.security.spec.*;
37 
38 public class Failover {
39 
main(String[] args)40     public static void main(String[] args) throws Exception {
41         ProvidersSnapshot snapshot = ProvidersSnapshot.create();
42         try {
43             main0(args);
44         } finally {
45             snapshot.restore();
46         }
47     }
48 
main0(String[] args)49     public static void main0(String[] args) throws Exception {
50         Security.insertProviderAt(new ProviderFail(), 1);
51         Security.addProvider(new ProviderPass());
52         System.out.println(Arrays.asList(Security.getProviders()));
53 
54         KeyPairGenerator kpg;
55         kpg = KeyPairGenerator.getInstance("FOO");
56         kpg.generateKeyPair();
57         kpg.generateKeyPair();
58 
59         kpg = KeyPairGenerator.getInstance("FOO");
60         kpg.initialize(1024);
61         kpg.initialize(1024);
62         kpg.initialize(null, null);
63         kpg.generateKeyPair();
64 
65         kpg = KeyPairGenerator.getInstance("FOO");
66         kpg.initialize(null, null);
67         kpg.generateKeyPair();
68 
69         kpg = KeyPairGenerator.getInstance("FOO");
70         kpg.initialize(512);
71         kpg.generateKeyPair();
72         kpg.generateKeyPair();
73 
74         // the SUN DSA KeyPairGenerator implementation extends
75         // KeyPairGenerator (in order to implement
76         // java.security.interfaces.DSAKeyPairGenerator)
77         // failover cannot work
78         kpg = KeyPairGenerator.getInstance("DSA");
79         try {
80             kpg.initialize(1024);
81             throw new Exception("no exception");
82         } catch (InvalidParameterException e) {
83             System.out.println(e);
84         }
85 
86         KeyPair kp;
87         kpg = KeyPairGenerator.getInstance("RSA");
88         kpg.initialize(512);
89         kp = kpg.generateKeyPair();
90         System.out.println(kp.getPublic());
91 
92         kpg = KeyPairGenerator.getInstance("RSA");
93         kpg.initialize(768);
94         kp = kpg.generateKeyPair();
95         System.out.println(kp.getPublic());
96 
97         kpg = KeyPairGenerator.getInstance("RSA");
98         kp = kpg.generateKeyPair();
99         System.out.println(kp.getPublic());
100 
101         kpg = KeyPairGenerator.getInstance("RSA");
102         try {
103             kpg.initialize(128);
104             throw new Exception("no exception");
105         } catch (InvalidParameterException e) {
106             System.out.println(e);
107         }
108 
109     }
110 
111     private static class ProviderPass extends Provider {
ProviderPass()112         ProviderPass() {
113             super("Pass", "1.0", "Pass");
114             put("KeyPairGenerator.FOO" , "Failover$KeyPairGeneratorPass");
115         }
116     }
117 
118     private static class ProviderFail extends Provider {
ProviderFail()119         ProviderFail() {
120             super("Fail", "1.0", "Fail");
121             put("KeyPairGenerator.FOO" , "Failover$KeyPairGeneratorFail");
122             put("KeyPairGenerator.DSA" , "Failover$KeyPairGeneratorFail");
123             put("KeyPairGenerator.RSA" , "Failover$KeyPairGeneratorFail");
124         }
125     }
126 
127     public static class KeyPairGeneratorPass extends KeyPairGeneratorSpi {
128 
initialize(int keysize, SecureRandom random)129         public void initialize(int keysize, SecureRandom random) {
130             System.out.println("KeyPairGeneratorPass.initialize(" + keysize + ", " + random + ")");
131         }
132 
initialize(AlgorithmParameterSpec params, SecureRandom random)133         public void initialize(AlgorithmParameterSpec params,
134                 SecureRandom random) throws InvalidAlgorithmParameterException {
135             System.out.println("KeyPairGeneratorPass.initialize()");
136         }
137 
generateKeyPair()138         public KeyPair generateKeyPair() {
139             System.out.println("KeyPairGeneratorPass.generateKeyPair()");
140             return null;
141         }
142 
143     }
144 
145     public static class KeyPairGeneratorFail extends KeyPairGeneratorSpi {
146 
initialize(int keysize, SecureRandom random)147         public void initialize(int keysize, SecureRandom random) {
148             if (keysize != 512) {
149                 System.out.println("KeyPairGeneratorFail.initialize()");
150                 throw new InvalidParameterException();
151             }
152             System.out.println("KeyPairGeneratorFail.initialize() PASS");
153         }
154 
initialize(AlgorithmParameterSpec params, SecureRandom random)155         public void initialize(AlgorithmParameterSpec params,
156                 SecureRandom random) throws InvalidAlgorithmParameterException {
157             System.out.println("KeyPairGeneratorFail.initialize()");
158             throw new InvalidParameterException();
159         }
160 
generateKeyPair()161         public KeyPair generateKeyPair() {
162             System.out.println("KeyPairGeneratorFail.generateKeyPair()");
163             throw new InvalidParameterException();
164         }
165 
166     }
167 
168 }
169