1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Vera Y. Petrashkova
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.crypto.tests.javax.crypto.interfaces;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.KeyPair;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.KeyPairGenerator;
288ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thiererimport java.security.SecureRandom;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
308ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thiererimport javax.crypto.KeyGenerator;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.interfaces.DHKey;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.interfaces.DHPrivateKey;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.spec.DHParameterSpec;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests for <code>DHPrivateKey</code> class field
39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class DHPrivateKeyTest extends TestCase {
42f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>serialVersionUID</code> field
45f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     */
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testField() {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkDHPrivateKey key = new checkDHPrivateKey();
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect serialVersionUID",
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                key.getSerVerUID(), //DHPrivateKey.serialVersionUID
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                2211791113380396553L);
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
52f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
538ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer    public void test_getParams_initToHardCoded() throws Exception {
548ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        // (p, g) values from RFC 7919, Appendix A (2048-bit group)
558ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        String pStr = "FFFFFFFFFFFFFFFFADF85458A2BB4A9AAFDC5620273D3CF1" +
568ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "D8B9C583CE2D3695A9E13641146433FBCC939DCE249B3EF9" +
578ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "7D2FE363630C75D8F681B202AEC4617AD3DF1ED5D5FD6561" +
588ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "2433F51F5F066ED0856365553DED1AF3B557135E7F57C935" +
598ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "984F0C70E0E68B77E2A689DAF3EFE8721DF158A136ADE735" +
608ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "30ACCA4F483A797ABC0AB182B324FB61D108A94BB2C8E3FB" +
618ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "B96ADAB760D7F4681D4F42A3DE394DF4AE56EDE76372BB19" +
628ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "0B07A7C8EE0A6D709E02FCE1CDF7E2ECC03404CD28342F61" +
638ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "9172FE9CE98583FF8E4F1232EEF28183C3FE3B1B4C6FAD73" +
648ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "3BB5FCBC2EC22005C58EF1837D1683B2C6F34A26C1B2EFFA" +
658ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer                "886B423861285C97FFFFFFFFFFFFFFFF";
668ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        BigInteger p = new BigInteger(new BigInteger(pStr, 16).toByteArray());
678ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        BigInteger g = BigInteger.valueOf(2);
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KeyPairGenerator kg = KeyPairGenerator.getInstance("DH");
698ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        kg.initialize(new DHParameterSpec(p, g), new SecureRandom());
708ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        check_getParams(kg);
718ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer    }
728ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer
738ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer    public void test_getParams_initToRandom192bit() throws Exception {
748ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        KeyPairGenerator kg = KeyPairGenerator.getInstance("DH");
758ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        // DH group generation is slow, so we test with a small (insecure) value
768bc378b1cec65bc06766a14a9cc575fec931b418Jesse Wilson        kg.initialize(192);
778ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer        check_getParams(kg);
788ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer    }
798ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer
808ee6debb115ba7479dd166fe5eba95b38e0d61cbTobias Thierer    private static void check_getParams(KeyPairGenerator kg) throws Exception {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KeyPair kp1 = kg.genKeyPair();
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        KeyPair kp2 = kg.genKeyPair();
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DHPrivateKey pk1 = (DHPrivateKey) kp1.getPrivate();
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        DHPrivateKey pk2 = (DHPrivateKey) kp2.getPrivate();
85f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(pk1.getX().getClass().getCanonicalName().equals("java.math.BigInteger"));
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(pk1.getParams().getClass().getCanonicalName().equals("javax.crypto.spec.DHParameterSpec"));
88bc4e9bf5401c7405fbed3e9855fd05b0940fc685Jorg Pleumann        assertFalse(pk1.equals(pk2));
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(pk1.getX().equals(pk1.getX()));
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
91f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public class checkDHPrivateKey implements DHPrivateKey {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String getAlgorithm() {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "SecretKey";
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String getFormat() {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "Format";
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getEncoded() {
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new byte[0];
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public long getSerVerUID() {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return serialVersionUID;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public BigInteger getX() {
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public DHParameterSpec getParams() {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
113