/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package javax.xml.crypto.test.dsig;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.xml.crypto.KeySelector;

import javax.xml.crypto.test.KeySelectors;

import static org.junit.Assert.assertTrue;

/**
 * This is a testcase to validate all the W3C xmldsig XMLDSig11 testcases.
 *
 */
public class InteropXMLDSig11Test {

    private SignatureValidator validator;
    private File dir;
    private KeySelector kvks, sks;
    private boolean ecSupport = true;

    static {
        Security.insertProviderAt
            (new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI(), 1);
    }

    public InteropXMLDSig11Test() throws Exception {
        // check if EC is supported
        try {
            KeyFactory.getInstance("EC");
        } catch (NoSuchAlgorithmException nsae) {
            ecSupport = false;
        }
        if ("IBM Corporation".equals(System.getProperty("java.vendor"))) {
            ecSupport = false;
        }
        String fs = File.separator;
        String base = System.getProperty("basedir") == null
            ? "./": System.getProperty("basedir");
        dir = new File(base + fs + "src/test/resources" + fs
            + "org" + fs + "w3c" + fs + "www" + fs
            + "interop" + fs + "xmldsig11");
        validator = new SignatureValidator(dir);
        kvks = new KeySelectors.KeyValueKeySelector();
        sks = new KeySelectors.SecretKeySelector("testkey".getBytes(StandardCharsets.US_ASCII));
    }

    @org.junit.Test
    public void test_enveloping_p256_sha1() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p256_sha1", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p256_sha256() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p256_sha256", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p256_sha384() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p256_sha384", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p256_sha512() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p256_sha512", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p384_sha1() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p384_sha1", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p384_sha256() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p384_sha256", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p384_sha384() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p384_sha384", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p384_sha512() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p384_sha512", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p521_sha1() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p521_sha1", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p521_sha256() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p521_sha256", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p521_sha384() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p521_sha384", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_p521_sha512() throws Exception {
        if (ecSupport) {
            test_xmldsig11("signature-enveloping-p521_sha512", "oracle");
        }
    }

    @org.junit.Test
    public void test_enveloping_rsa_sha256() throws Exception {
        test_xmldsig11("signature-enveloping-rsa-sha256", "oracle");
    }

    @org.junit.Test
    public void test_enveloping_rsa_sha384() throws Exception {
        test_xmldsig11("signature-enveloping-rsa_sha384", "oracle");
    }

    @org.junit.Test
    public void test_enveloping_rsa_sha512() throws Exception {
        test_xmldsig11("signature-enveloping-rsa_sha512", "oracle");
    }

    @org.junit.Test
    public void test_enveloping_sha256_rsa_sha256() throws Exception {
        test_xmldsig11("signature-enveloping-sha256-rsa-sha256", "oracle");
    }

    @org.junit.Test
    public void test_enveloping_sha384_rsa_sha256() throws Exception {
        test_xmldsig11("signature-enveloping-sha384-rsa_sha256", "oracle");
    }

    @org.junit.Test
    public void test_enveloping_sha512_rsa_sha256() throws Exception {
        test_xmldsig11("signature-enveloping-sha512-rsa_sha256", "oracle");
    }

    @org.junit.Test
    public void test_enveloping_hmac_sha256() throws Exception {
        test_xmldsig11("signature-enveloping-hmac-sha256", sks, "oracle");
    }

    @org.junit.Test
    public void test_enveloping_hmac_sha384() throws Exception {
        test_xmldsig11("signature-enveloping-hmac-sha384", sks, "oracle");
    }

    @org.junit.Test
    public void test_enveloping_hmac_sha512() throws Exception {
        test_xmldsig11("signature-enveloping-hmac-sha512", sks, "oracle");
    }

    private void test_xmldsig11(String test, String vendor) throws Exception {
        String file = vendor + File.separator + test + ".xml";
        // System.out.println("Validating " + file);
        boolean coreValidity = validator.validate(file, kvks);
        assertTrue(file + " failed core validation", coreValidity);
    }

    private void test_xmldsig11(String test, KeySelector ks, String vendor)
        throws Exception {
        String file = vendor + File.separator + test + ".xml";
        // System.out.println("Validating " + file);
        boolean coreValidity = validator.validate(file, ks);
        assertTrue(file + " failed core validation", coreValidity);
    }
}
