/*
 * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/**
 * @test
 * @bug 4894125
 * @summary test that failover for KeyPairGenerator works
 * @author Andreas Sterbenz
 */

import java.util.*;

import java.security.*;
import java.security.interfaces.*;
import java.security.spec.*;

public class Failover {

    public static void main(String[] args) throws Exception {
        Security.insertProviderAt(new ProviderFail(), 1);
        Security.addProvider(new ProviderPass());
        System.out.println(Arrays.asList(Security.getProviders()));

        KeyPairGenerator kpg;
        kpg = KeyPairGenerator.getInstance("FOO");
        kpg.generateKeyPair();
        kpg.generateKeyPair();

        kpg = KeyPairGenerator.getInstance("FOO");
        kpg.initialize(1024);
        kpg.initialize(1024);
        kpg.initialize(null, null);
        kpg.generateKeyPair();

        kpg = KeyPairGenerator.getInstance("FOO");
        kpg.initialize(null, null);
        kpg.generateKeyPair();

        kpg = KeyPairGenerator.getInstance("FOO");
        kpg.initialize(512);
        kpg.generateKeyPair();
        kpg.generateKeyPair();

        // the SUN DSA KeyPairGenerator implementation extends
        // KeyPairGenerator (in order to implement
        // java.security.interfaces.DSAKeyPairGenerator)
        // failover cannot work
        kpg = KeyPairGenerator.getInstance("DSA");
        try {
            kpg.initialize(1024);
            throw new Exception("no exception");
        } catch (InvalidParameterException e) {
            System.out.println(e);
        }

        KeyPair kp;
        kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(512);
        kp = kpg.generateKeyPair();
        System.out.println(kp.getPublic());

        kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(768);
        kp = kpg.generateKeyPair();
        System.out.println(kp.getPublic());

        kpg = KeyPairGenerator.getInstance("RSA");
        kp = kpg.generateKeyPair();
        System.out.println(kp.getPublic());

        kpg = KeyPairGenerator.getInstance("RSA");
        try {
            kpg.initialize(128);
            throw new Exception("no exception");
        } catch (InvalidParameterException e) {
            System.out.println(e);
        }

    }

    private static class ProviderPass extends Provider {
        ProviderPass() {
            super("Pass", 1.0d, "Pass");
            put("KeyPairGenerator.FOO" , "Failover$KeyPairGeneratorPass");
        }
    }

    private static class ProviderFail extends Provider {
        ProviderFail() {
            super("Fail", 1.0d, "Fail");
            put("KeyPairGenerator.FOO" , "Failover$KeyPairGeneratorFail");
            put("KeyPairGenerator.DSA" , "Failover$KeyPairGeneratorFail");
            put("KeyPairGenerator.RSA" , "Failover$KeyPairGeneratorFail");
        }
    }

    public static class KeyPairGeneratorPass extends KeyPairGeneratorSpi {

        public void initialize(int keysize, SecureRandom random) {
            System.out.println("KeyPairGeneratorPass.initialize(" + keysize + ", " + random + ")");
        }

        public void initialize(AlgorithmParameterSpec params,
                SecureRandom random) throws InvalidAlgorithmParameterException {
            System.out.println("KeyPairGeneratorPass.initialize()");
        }

        public KeyPair generateKeyPair() {
            System.out.println("KeyPairGeneratorPass.generateKeyPair()");
            return null;
        }

    }

    public static class KeyPairGeneratorFail extends KeyPairGeneratorSpi {

        public void initialize(int keysize, SecureRandom random) {
            if (keysize != 512) {
                System.out.println("KeyPairGeneratorFail.initialize()");
                throw new InvalidParameterException();
            }
            System.out.println("KeyPairGeneratorFail.initialize() PASS");
        }

        public void initialize(AlgorithmParameterSpec params,
                SecureRandom random) throws InvalidAlgorithmParameterException {
            System.out.println("KeyPairGeneratorFail.initialize()");
            throw new InvalidParameterException();
        }

        public KeyPair generateKeyPair() {
            System.out.println("KeyPairGeneratorFail.generateKeyPair()");
            throw new InvalidParameterException();
        }

    }

}
