1f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson/*
2f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * Copyright (C) 2009 The Android Open Source Project
3f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson *
4f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * you may not use this file except in compliance with the License.
6f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * You may obtain a copy of the License at
7f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson *
8f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
9f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson *
10f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * See the License for the specific language governing permissions and
14f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * limitations under the License.
15f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson */
16f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
17f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonpackage tests.security;
18f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
19f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.AlgorithmParameters;
20f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.InvalidAlgorithmParameterException;
21f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.InvalidKeyException;
22f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.KeyPair;
23f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.KeyPairGenerator;
24f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.NoSuchAlgorithmException;
25f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.Signature;
26f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.SignatureException;
27f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.spec.AlgorithmParameterSpec;
28f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.security.spec.InvalidParameterSpecException;
29f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport junit.framework.Assert;
30f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
31f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonpublic class AlgorithmParameterSignatureHelper<T extends AlgorithmParameterSpec>
32f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        extends TestHelper<AlgorithmParameters> {
33f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
34f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson    private final String algorithmName;
35f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson    private final String plainData = "some data do sign and verify";
36f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson    private final Class<T> parameterSpecClass;
37f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
38f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson    public AlgorithmParameterSignatureHelper(String algorithmName, Class<T> parameterSpecCla1ss) {
39f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        this.algorithmName = algorithmName;
40f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        this.parameterSpecClass = parameterSpecCla1ss;
41f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson    }
42f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
43f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson    @Override
44f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson    public void test(AlgorithmParameters parameters) {
45f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
46f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        Signature signature = null;
47f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
48f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            signature = Signature.getInstance(algorithmName);
49f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (NoSuchAlgorithmException e) {
50f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
51f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
52f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
53f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
54f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        T parameterSpec = null;
55f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
56f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            parameterSpec = parameters.getParameterSpec(parameterSpecClass);
57f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (InvalidParameterSpecException e) {
58f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
59f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
60f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
61f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        KeyPairGenerator generator = null;
62f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
63f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            generator = KeyPairGenerator.getInstance(algorithmName);
64f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (NoSuchAlgorithmException e) {
65f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
66f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
67f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
68f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
69f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            generator.initialize(parameterSpec);
70f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (InvalidAlgorithmParameterException e) {
71f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
72f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
73f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
74f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        KeyPair keyPair = generator.genKeyPair();
75f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
76f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
77f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            signature.initSign(keyPair.getPrivate());
78f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (InvalidKeyException e) {
79f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
80f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
81f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
82f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
83f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            signature.update(plainData.getBytes());
84f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (SignatureException e) {
85f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
86f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
87f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
88f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        byte[] signed = null;
89f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
90f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            signed = signature.sign();
91f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (SignatureException e) {
92f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
93f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
94f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
95f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
96f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            signature.initVerify(keyPair.getPublic());
97f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (InvalidKeyException e) {
98f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
99f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
100f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
101f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
102f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            signature.update(plainData.getBytes());
103f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (SignatureException e) {
104f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
105f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
106f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson
107f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        try {
108f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.assertTrue("signature could not be verified", signature
109f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson                    .verify(signed));
110f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        } catch (SignatureException e) {
111f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson            Assert.fail(e.getMessage());
112f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson        }
113f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson    }
114f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson}
115