blob: 6355bee95d080545d9b3a8577ecadfb8248c6239 [file] [log] [blame]
/*
* 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 dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargets;
import dalvik.annotation.TestLevel;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.InvalidParameterException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import java.security.Signature;
import java.security.SignatureException;
import java.security.cert.Certificate;
import java.security.spec.DSAParameterSpec;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
@TestTargetClass(Signature.class)
public class Signature2Test extends junit.framework.TestCase {
private static final String MESSAGE = "abc";
static KeyPair dsaKeys;
static KeyPair rsaKeys;
static {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
keyGen.initialize(1024);
dsaKeys = keyGen.generateKeyPair();
KeyPairGenerator keyGen2 = KeyPairGenerator.getInstance("RSA");
keyGen2.initialize(1024);
rsaKeys = keyGen2.generateKeyPair();
} catch (Exception e) {
fail(e.toString());
}
}
/**
* @tests java.security.Signature#clone()
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "CloneNotSupportedException checking was tested",
method = "clone",
args = {}
)
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()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getAlgorithm",
args = {}
)
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)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getInstance",
args = {java.lang.String.class}
)
public void test_getInstanceLjava_lang_String() {
try {
Signature.getInstance("DSA");
} catch (Exception e) {
fail("Unexpected exception for DSA algorithm");
}
try {
Signature.getInstance("SHA-256");
fail("NoSuchAlgorithmException was not thrown for unavailable algorithm");
} catch (NoSuchAlgorithmException e) {
//expected
}
}
/**
* @tests java.security.Signature#getInstance(java.lang.String,
* java.security.Provider)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getInstance",
args = {java.lang.String.class, java.security.Provider.class}
)
public void test_getInstanceLjava_lang_StringLjava_lang_String_java_security_Provider()
throws Exception {
Provider[] providers = Security.getProviders("Signature.DSA");
for (int i = 0; i < providers.length; i++) {
Signature signature = Signature.getInstance("DSA", providers[i]);
assertEquals("DSA", signature.getAlgorithm());
assertEquals(providers[i], signature.getProvider());
}
try {
Signature.getInstance((String) null, (Provider) null);
fail("NullPointerException expected");
} catch (NullPointerException e) {
// expected
}
try {
Signature.getInstance("DSA", (Provider) null);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException e) {
// expected
}
try {
Signature.getInstance((String) null, providers[0]);
fail("NullPointerException expected");
} catch (NullPointerException e) {
// expected
}
try {
Signature.getInstance("SHA-256", providers[0]);
fail("NoSuchAlgorithmException expected");
} catch (NoSuchAlgorithmException e) {
// expected
}
}
/**
* @tests java.security.Signature#getInstance(java.lang.String,
* java.lang.String)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getInstance",
args = {java.lang.String.class, java.lang.String.class}
)
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
try {
Signature.getInstance("SHA-256", providers[0].getName());
fail("NoSuchAlgorithmException expected");
} catch (NoSuchAlgorithmException e) {
// expected
}
Provider[] pp = Security.getProviders();
for (int i = 0; i < pp.length; i++) {
try {
Signature.getInstance("DSA", pp[i].toString());
fail("NoSuchProviderException expected");
} catch (NoSuchProviderException e) {
// expected
}
}
String[] sp = {null, ""};
for (int i = 0; i < sp.length; i++) {
try {
Signature.getInstance("DSA", sp[i]);
fail("IllegalArgumentException was not throw for " + sp[i]);
} catch (IllegalArgumentException e) {
// expected
}
}
}
/**
* @tests java.security.Signature#getParameters()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getParameters",
args = {}
)
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
}
try {
MySignature sig2 = new MySignature("test");
sig2.getParameters();
fail("expected UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// ok
}
try {
MySignature sig2 = new MySignature("ABC");
sig2.getParameters();
} catch (UnsupportedOperationException e) {
fail("unexpected: " + e);
}
}
/**
* @tests java.security.Signature#getParameter(java.lang.String)
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Just exception case was tested",
method = "getParameter",
args = {java.lang.String.class}
)
@SuppressWarnings("deprecation")
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()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getProvider",
args = {}
)
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)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "initSign",
args = {java.security.PrivateKey.class}
)
public void test_initSignLjava_security_PrivateKey() throws Exception {
try {
Signature.getInstance("DSA").initSign(dsaKeys.getPrivate());
} catch (InvalidKeyException e) {
fail("unexpected: " + e);
}
try {
Signature.getInstance("DSA").initSign(rsaKeys.getPrivate());
fail("expected InvalidKeyException");
} catch (InvalidKeyException e) {
// ok
}
}
@TestTargetNew (
level=TestLevel.COMPLETE,
method="initSign",
args={PrivateKey.class, SecureRandom.class}
)
public void test_initSignLjava_security_PrivateKeyLjava_security_SecureRandom() {
try {
Signature sig = Signature.getInstance("DSA");
sig.initSign(dsaKeys.getPrivate(), new SecureRandom());
} catch (NoSuchAlgorithmException e) {
fail("unexpected: " + e);
} catch (InvalidKeyException e) {
fail("unexpected: " + e);
}
try {
Signature sig = Signature.getInstance("DSA");
sig.initSign(rsaKeys.getPrivate(), new SecureRandom());
fail("expected InvalidKeyException");
} catch (InvalidKeyException e) {
// ok
} catch (NoSuchAlgorithmException e) {
fail("unexpected: " + e);
}
}
/**
* @tests java.security.Signature#initVerify(java.security.PublicKey)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "initVerify",
args = {java.security.PublicKey.class}
)
public void test_initVerifyLjava_security_PublicKey() throws Exception {
Signature.getInstance("DSA").initVerify(dsaKeys.getPublic());
try {
Signature.getInstance("DSA").initVerify(rsaKeys.getPublic());
fail("expected InvalidKeyException");
} catch (InvalidKeyException e) {
// ok
}
}
/**
* @tests java.security.Signature#initVerify(java.security.cert.Certificate)
*/
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "InvalidKeyException checking missed",
method = "initVerify",
args = {java.security.cert.Certificate.class}
)
public void test_initVerifyLjava_security_Certificate() throws Exception {
Provider p = new MyProvider();
p.put("DSA", "tests.java.security.support.cert.MyCertificate$1");
Provider myProvider = new MyProvider();
Security.addProvider(myProvider);
try {
Provider[] pp = Security.getProviders();
if (pp == null) {
return;
}
try {
Signature.getInstance("DSA").initVerify((Certificate) null);
fail("NullPointerException expected");
} catch (NullPointerException e) {
// fail
}
} finally {
Security.removeProvider(myProvider.getName());
}
}
/**
* @tests java.security.Signature#setParameter(java.lang.String,
* java.lang.Object)
*/
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Just exception case was tested",
method = "setParameter",
args = {java.lang.String.class, java.lang.Object.class}
)
@SuppressWarnings("deprecation")
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)
*/
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Just exception case was tested",
method = "setParameter",
args = {java.security.spec.AlgorithmParameterSpec.class}
)
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()
*/
@TestTargetNew(
level = TestLevel.SUFFICIENT,
notes = "Verification of returned value missed. SignatureException checking missed.",
method = "sign",
args = {}
)
public void test_sign() throws Exception {
Signature sig = Signature.getInstance("DSA");
sig.initSign(dsaKeys.getPrivate());
sig.update(MESSAGE.getBytes());
sig.sign();
}
/**
* @tests java.security.Signature#toString()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "toString",
args = {}
)
public void test_toString() throws Exception {
String str = Signature.getInstance("DSA").toString();
assertNotNull("toString is null", str);
}
/**
* @tests java.security.Signature#update(byte[])
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "SignatureException checking missed",
method = "update",
args = {byte[].class}
)
public void test_update$B() throws Exception {
Signature sig = Signature.getInstance("DSA");
sig.initSign(dsaKeys.getPrivate());
byte[] bytes = MESSAGE.getBytes();
sig.update(bytes);
try {
Signature sig2 = Signature.getInstance("DSA");
sig2.update(MESSAGE.getBytes());
fail("expected SignatureException");
} catch (SignatureException e) {
// ok
}
}
/**
* @tests java.security.Signature#update(byte[], int, int)
*/
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "SignatureException checking missed. Verification of different values off and len missed.",
method = "update",
args = {byte[].class, int.class, int.class}
)
public void test_update$BII() throws Exception {
Signature sig = Signature.getInstance("DSA");
byte[] bytes = MESSAGE.getBytes();
try {
sig.update(bytes, 0, bytes.length);
fail("expected SignatureException");
} catch (SignatureException e) {
// ok;
}
sig.initSign(dsaKeys.getPrivate());
sig.update(bytes, 0, bytes.length);
sig.update(bytes, bytes.length - 2, 2);
try {
sig.update(bytes, bytes.length -3, 4);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
// ok
}
try {
sig.update(null, 0, 5);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
// ok
}
}
/**
* @tests java.security.Signature#update(byte)
*/
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "SignatureException checking missed",
method = "update",
args = {byte.class}
)
public void test_updateB() throws Exception {
Signature sig = Signature.getInstance("DSA");
sig.initSign(dsaKeys.getPrivate());
sig.update(MESSAGE.getBytes()[0]);
}
/**
* @tests java.security.Signature#update(ByteBuffer data)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "update",
args = {java.nio.ByteBuffer.class}
)
public void test_updateLjava_nio_ByteBuffer() throws Exception {
Signature sig = Signature.getInstance("DSA");
ByteBuffer buffer = ByteBuffer.allocate(10);
try {
sig.update(buffer);
fail("SignatureException expected");
} catch (SignatureException e) {
// expected
}
try {
sig.initSign(dsaKeys.getPrivate());
sig.update(buffer);
} catch (Exception e) {
fail("Unexpected exception " + e.getMessage());
}
}
/**
* @tests java.security.Signature#verify(byte[])
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "verify",
args = {byte[].class}
)
public void test_verify$B() throws Exception {
Signature sig = Signature.getInstance("DSA");
try {
sig.verify(new byte[] { 0,1,2,3 });
fail("expected SignatureException");
} catch (SignatureException e) {
// ok
}
sig.initSign(dsaKeys.getPrivate());
sig.update(MESSAGE.getBytes());
byte[] signature = sig.sign();
sig.initVerify(dsaKeys.getPublic());
sig.update(MESSAGE.getBytes());
assertTrue("Sign/Verify does not pass", sig.verify(signature));
}
/**
* @tests java.security.Signature#verify(byte[], int, int)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "verify",
args = {byte[].class, int.class, int.class}
)
public void test_verify$BII() throws Exception {
Signature sig = Signature.getInstance("DSA");
sig.initSign(dsaKeys.getPrivate());
sig.update(MESSAGE.getBytes());
byte[] signature = sig.sign();
sig.initVerify(dsaKeys.getPublic());
sig.update(MESSAGE.getBytes());
assertTrue("Sign/Verify does not pass", sig.verify(signature, 0,
signature.length));
try {
sig.verify(null, 0, signature.length);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException e) {
// expected
}
try {
sig.verify(signature, -5, signature.length);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException e) {
// expected
}
try {
sig.verify(signature, signature.length, 0);
fail("SignatureException expected");
} catch (SignatureException e) {
// expected
}
try {
sig.verify(signature, 0, signature.length * 2);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException e) {
// expected
}
}
class MyProvider extends Provider {
private Set<Provider.Service> services = null;
MyProvider() {
super("MyProvider", 1.0, "Provider for testing");
put("MessageDigest.SHA-1", "SomeClassName");
put("MessageDigest.abc", "SomeClassName");
put("Alg.Alias.MessageDigest.SHA1", "SHA-1");
if (services != null) {
services.clear();
} else {
services = new HashSet<Service>();
}
}
MyProvider(String name, double version, String info) {
super(name, version, info);
if (services != null) {
services.clear();
} else {
services = new HashSet<Service>();
}
}
public void putService(Provider.Service s) {
super.putService(s);
services.add(s);
}
public void removeService(Provider.Service s) {
super.removeService(s);
services.remove(s);
}
public int getNumServices() {
return services.size();
}
}
@SuppressWarnings("unused")
private class MySignature extends Signature {
protected MySignature(String algorithm) {
super(algorithm);
}
@Override
protected Object engineGetParameter(String param)
throws InvalidParameterException {
return null;
}
@Override
protected void engineInitSign(PrivateKey privateKey)
throws InvalidKeyException {
}
@Override
protected void engineInitVerify(PublicKey publicKey)
throws InvalidKeyException {
}
@Override
protected void engineSetParameter(String param, Object value)
throws InvalidParameterException {
}
@Override
protected byte[] engineSign() throws SignatureException {
return null;
}
@Override
protected void engineUpdate(byte b) throws SignatureException {
}
@Override
protected void engineUpdate(byte[] b, int off, int len)
throws SignatureException {
}
@Override
protected boolean engineVerify(byte[] sigBytes)
throws SignatureException {
return false;
}
@Override
protected AlgorithmParameters engineGetParameters() {
if (this.getAlgorithm().equals("test")) {
return super.engineGetParameters();
} else {
return null;
}
}
}
}