/* * 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 org.apache.harmony.security.tests.java.security; import java.math.BigInteger; import java.security.InvalidParameterException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.Provider; import java.security.Security; import java.security.Signature; import java.security.spec.DSAParameterSpec; import java.util.Locale; public class Signature2Test extends junit.framework.TestCase { private static final String MESSAGE = "abc"; static KeyPair keys; static { try { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA"); keyGen.initialize(1024); keys = keyGen.generateKeyPair(); } catch (Exception e) { fail(e.toString()); } } /** * @tests java.security.Signature#clone() */ public void test_clone() throws Exception { Signature s = Signature.getInstance("DSA"); try { s.clone(); fail("A Signature may not be cloneable"); } catch (CloneNotSupportedException e) { // Expected - a Signature may not be cloneable } } /** * @tests java.security.Signature#getAlgorithm() */ public void test_getAlgorithm() throws Exception { String alg = Signature.getInstance("DSA").getAlgorithm(); assertTrue("getAlgorithm did not get DSA (" + alg + ")", alg .indexOf("DSA") != -1); } /** * @tests java.security.Signature#getInstance(java.lang.String) */ public void test_getInstanceLjava_lang_String() throws Exception { Signature.getInstance("DSA"); } /** * @tests java.security.Signature#getInstance(java.lang.String, * java.lang.String) */ public void test_getInstanceLjava_lang_StringLjava_lang_String() throws Exception { Provider[] providers = Security.getProviders("Signature.DSA"); for (int i = 0; i < providers.length; i++) { Signature.getInstance("DSA", providers[i].getName()); }// end for } /** * @tests java.security.Signature#getParameters() */ public void test_getParameters() throws Exception { Signature sig = Signature.getInstance("DSA"); try { sig.getParameters(); } catch (UnsupportedOperationException e) { // Could be that the operation is not supported } } /** * @tests java.security.Signature#getParameter(java.lang.String) */ public void test_getParameterLjava_lang_String() throws Exception { Signature sig = Signature.getInstance("DSA"); try { sig.getParameter("r"); sig.getParameter("s"); } catch (UnsupportedOperationException e) { } } /** * @tests java.security.Signature#getProvider() */ public void test_getProvider() throws Exception { Provider p = Signature.getInstance("DSA").getProvider(); assertNotNull("provider is null", p); } /** * @tests java.security.Signature#initSign(java.security.PrivateKey) */ public void test_initSignLjava_security_PrivateKey() throws Exception { Signature.getInstance("DSA").initSign(keys.getPrivate()); } /** * @tests java.security.Signature#initVerify(java.security.PublicKey) */ public void test_initVerifyLjava_security_PublicKey() throws Exception { Signature.getInstance("DSA").initVerify(keys.getPublic()); } /** * @tests java.security.Signature#setParameter(java.lang.String, * java.lang.Object) */ public void test_setParameterLjava_lang_StringLjava_lang_Object() throws Exception { Signature sig = Signature.getInstance("DSA"); try { sig.setParameter("r", BigInteger.ONE); sig.setParameter("s", BigInteger.ONE); } catch (InvalidParameterException e) { // Could be that it's an invalid param for the found algorithm } catch (UnsupportedOperationException e) { // Could be that the operation is not supported } } /** * @tests java.security.Signature#setParameter(java.security.spec.AlgorithmParameterSpec) */ public void test_setParameterLjava_security_spec_AlgorithmParameterSpec() throws Exception { Signature sig = Signature.getInstance("DSA"); try { DSAParameterSpec spec = new DSAParameterSpec(BigInteger.ONE, BigInteger.ONE, BigInteger.ONE); sig.setParameter(spec); } catch (InvalidParameterException e) { // Could be that it's an invalid param for the found algorithm } catch (UnsupportedOperationException e) { // Could be that the operation is not supported } } /** * @tests java.security.Signature#sign() */ public void test_sign() throws Exception { Signature sig = Signature.getInstance("DSA"); sig.initSign(keys.getPrivate()); sig.update(MESSAGE.getBytes()); sig.sign(); } /** * @tests java.security.Signature#toString() */ public void test_toString() throws Exception { String str = Signature.getInstance("DSA").toString(); assertNotNull("toString is null", str); } /** * @tests java.security.Signature#update(byte[]) */ public void test_update$B() throws Exception { Signature sig = Signature.getInstance("DSA"); sig.initSign(keys.getPrivate()); byte[] bytes = MESSAGE.getBytes(); sig.update(bytes); } /** * @tests java.security.Signature#update(byte[], int, int) */ public void test_update$BII() throws Exception { Signature sig = Signature.getInstance("DSA"); sig.initSign(keys.getPrivate()); byte[] bytes = MESSAGE.getBytes(); sig.update(bytes, 0, bytes.length); } /** * @tests java.security.Signature#update(byte) */ public void test_updateB() throws Exception { Signature sig = Signature.getInstance("DSA"); sig.initSign(keys.getPrivate()); sig.update(MESSAGE.getBytes()[0]); } /** * @tests java.security.Signature#verify(byte[]) */ public void test_verify$B() throws Exception { Signature sig = Signature.getInstance("DSA"); sig.initSign(keys.getPrivate()); sig.update(MESSAGE.getBytes()); byte[] signature = sig.sign(); sig.initVerify(keys.getPublic()); sig.update(MESSAGE.getBytes()); assertTrue("Sign/Verify does not pass", sig.verify(signature)); } //Regression Test for HARMONY-4916 public void test_getInstance_withI18n() throws Exception { // Enfore that providers information has been loaded. Signature.getInstance("DSA"); Locale defaultLocale = Locale.getDefault(); try { /** * In locale("tr"), char 'i' will be transferred to an upper case * other char than 'I'. Thus in security architecture, all * manipulation to the string representing an algorithm name or * standard property shall be treated as locale neutral */ Locale.setDefault(new Locale("tr")); Signature.getInstance("MD5withRSA"); } finally { Locale.setDefault(defaultLocale); } } }