15850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann/*
25850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Copyright (C) 2009 The Android Open Source Project
35850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann *
45850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Licensed under the Apache License, Version 2.0 (the "License");
55850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * you may not use this file except in compliance with the License.
65850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * You may obtain a copy of the License at
75850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann *
85850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann *     http://www.apache.org/licenses/LICENSE-2.0
95850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann *
105850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Unless required by applicable law or agreed to in writing, software
115850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * distributed under the License is distributed on an "AS IS" BASIS,
125850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * See the License for the specific language governing permissions and
145850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * limitations under the License.
155850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann */
164557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.javax.crypto.spec;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
19c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.security.AlgorithmParameters;
20c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.security.NoSuchAlgorithmException;
21c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.security.Provider;
22c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.security.Security;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.DSAParameterSpec;
24c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.util.Base64;
25c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
26f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport tests.security.AlgorithmParameterSignatureHelper;
27f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport tests.security.AlgorithmParametersTest;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class AlgorithmParametersTestDSA extends AlgorithmParametersTest {
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31076562801559fd3619c1eb2aeba8da19331ab6abKenny Root    /*
32076562801559fd3619c1eb2aeba8da19331ab6abKenny Root     * Parameters generated with OpenSSL:
33076562801559fd3619c1eb2aeba8da19331ab6abKenny Root     * openssl dsaparam -genkey 1024 -C
34076562801559fd3619c1eb2aeba8da19331ab6abKenny Root     */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final byte[] P = new byte[] {
36076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xE6, (byte) 0x41, (byte) 0x58, (byte) 0x77, (byte) 0x76,
37076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x5A, (byte) 0x4A, (byte) 0x53, (byte) 0xF1, (byte) 0xD6,
38076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xC8, (byte) 0x7D, (byte) 0x67, (byte) 0x1F, (byte) 0x2F,
39076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xFA, (byte) 0xDE, (byte) 0xB7, (byte) 0xAA, (byte) 0xCD,
40076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xD7, (byte) 0x5D, (byte) 0xD0, (byte) 0xE9, (byte) 0xB1,
41076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xDA, (byte) 0xFE, (byte) 0x42, (byte) 0xBE, (byte) 0xCC,
42076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x42, (byte) 0x52, (byte) 0x2E, (byte) 0x01, (byte) 0xD2,
43076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x16, (byte) 0xB1, (byte) 0x5B, (byte) 0xC4, (byte) 0x42,
44076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xF9, (byte) 0x55, (byte) 0x0F, (byte) 0xE2, (byte) 0xD5,
45076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x01, (byte) 0xD2, (byte) 0x7E, (byte) 0x22, (byte) 0xF6,
46076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xC1, (byte) 0xFE, (byte) 0x5C, (byte) 0x6A, (byte) 0xCF,
47076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x82, (byte) 0x1B, (byte) 0x5C, (byte) 0x46, (byte) 0x66,
48076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x8B, (byte) 0xAF, (byte) 0xDF, (byte) 0x44, (byte) 0xE2,
49076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x0E, (byte) 0xA3, (byte) 0x58, (byte) 0xF7, (byte) 0xA3,
50076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x24, (byte) 0xE3, (byte) 0x84, (byte) 0xA6, (byte) 0x16,
51076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xE0, (byte) 0xCA, (byte) 0x72, (byte) 0x55, (byte) 0x07,
52076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xA0, (byte) 0x99, (byte) 0x7B, (byte) 0xF8, (byte) 0xB1,
53076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x5A, (byte) 0x84, (byte) 0x36, (byte) 0x5A, (byte) 0xC8,
54076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x6A, (byte) 0xFE, (byte) 0xA6, (byte) 0xB4, (byte) 0x1B,
55076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x3A, (byte) 0x0A, (byte) 0x00, (byte) 0x6B, (byte) 0x72,
56076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xDC, (byte) 0x0C, (byte) 0xD1, (byte) 0x09, (byte) 0x25,
57076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x11, (byte) 0x68, (byte) 0x6B, (byte) 0x75, (byte) 0xDE,
58076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x2C, (byte) 0x1A, (byte) 0xC2, (byte) 0x3A, (byte) 0xCB,
59076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xA0, (byte) 0x17, (byte) 0xCA, (byte) 0x2D, (byte) 0xEE,
60076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xA2, (byte) 0x5A, (byte) 0x9D, (byte) 0x1F, (byte) 0x33,
61076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x1B, (byte) 0x07, (byte) 0x6D,
62076562801559fd3619c1eb2aeba8da19331ab6abKenny Root    };
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final byte[] Q = new byte[] {
64076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x9B, (byte) 0x39, (byte) 0xD0, (byte) 0x02, (byte) 0x0F,
65076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xE9, (byte) 0x96, (byte) 0x16, (byte) 0xC5, (byte) 0x25,
66076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xF7, (byte) 0x94, (byte) 0xA9, (byte) 0x2C, (byte) 0xD0,
67076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x25, (byte) 0x5B, (byte) 0x6E, (byte) 0xE0, (byte) 0x8F,
68076562801559fd3619c1eb2aeba8da19331ab6abKenny Root    };
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final byte[] G = new byte[] {
70076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x5E, (byte) 0x9C, (byte) 0x95, (byte) 0x5F, (byte) 0x7E,
71076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x91, (byte) 0x47, (byte) 0x4D, (byte) 0x68, (byte) 0xA4,
72076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x1C, (byte) 0x44, (byte) 0x3B, (byte) 0xEC, (byte) 0x0A,
73076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x7E, (byte) 0x59, (byte) 0x54, (byte) 0xF7, (byte) 0xEF,
74076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x42, (byte) 0xFB, (byte) 0x63, (byte) 0x95, (byte) 0x08,
75076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x2F, (byte) 0x4A, (byte) 0xD3, (byte) 0xBC, (byte) 0x79,
76076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x9D, (byte) 0xBA, (byte) 0xD8, (byte) 0x8A, (byte) 0x83,
77076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x84, (byte) 0xAE, (byte) 0x5B, (byte) 0x26, (byte) 0x80,
78076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xB3, (byte) 0xFB, (byte) 0x9C, (byte) 0xA3, (byte) 0xCF,
79076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xF4, (byte) 0x0A, (byte) 0xD5, (byte) 0xB6, (byte) 0x65,
80076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x65, (byte) 0x1A, (byte) 0x4F, (byte) 0xC0, (byte) 0x86,
81076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x3B, (byte) 0xE6, (byte) 0xFB, (byte) 0x4E, (byte) 0x9E,
82076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x49, (byte) 0x0A, (byte) 0x8C, (byte) 0x77, (byte) 0x2D,
83076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x93, (byte) 0x0B, (byte) 0xCA, (byte) 0x81, (byte) 0x07,
84076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x09, (byte) 0xC4, (byte) 0x71, (byte) 0xFD, (byte) 0xC8,
85076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xC7, (byte) 0xD1, (byte) 0xA3, (byte) 0xD0, (byte) 0xBB,
86076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x7D, (byte) 0x92, (byte) 0x74, (byte) 0x8B, (byte) 0x3B,
87076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x2A, (byte) 0x45, (byte) 0x1F, (byte) 0x5D, (byte) 0x85,
88076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x90, (byte) 0xE3, (byte) 0xFB, (byte) 0x0E, (byte) 0x16,
89076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xBA, (byte) 0x8A, (byte) 0xDE, (byte) 0x10, (byte) 0x0F,
90076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xE0, (byte) 0x0F, (byte) 0x37, (byte) 0xA7, (byte) 0xC1,
91076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0xDC, (byte) 0xBC, (byte) 0x00, (byte) 0xB8, (byte) 0x24,
92076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x0F, (byte) 0xF6, (byte) 0x5F, (byte) 0xB1, (byte) 0xA8,
93076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x9A, (byte) 0xDB, (byte) 0x9F, (byte) 0x36, (byte) 0x54,
94076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x45, (byte) 0xBD, (byte) 0xC0, (byte) 0xE8, (byte) 0x27,
95076562801559fd3619c1eb2aeba8da19331ab6abKenny Root            (byte) 0x82, (byte) 0xC9, (byte) 0x75,
96076562801559fd3619c1eb2aeba8da19331ab6abKenny Root    };
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // The ASN.1 module for DSA is defined in RFC 3279 section 3. See README.ASN1 for how
99c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // to understand and reproduce this data.
100c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
101c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // asn1=SEQUENCE:dsa
102c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // [dsa]
103c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // p=INT:0xE6415877765A4A53F1D6C87D671F2FFADEB7AACDD75DD0E9B1DAFE42BECC42522E01D216B15BC442F9550FE2D501D27E22F6C1FE5C6ACF821B5C46668BAFDF44E20EA358F7A324E384A616E0CA725507A0997BF8B15A84365AC86AFEA6B41B3A0A006B72DC0CD1092511686B75DE2C1AC23ACBA017CA2DEEA25A9D1F331B076D
104c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // q=INT:0x9B39D0020FE99616C525F794A92CD0255B6EE08F
105c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // g=INT:0x5E9C955F7E91474D68A41C443BEC0A7E5954F7EF42FB6395082F4AD3BC799DBAD88A8384AE5B2680B3FB9CA3CFF40AD5B665651A4FC0863BE6FB4E9E490A8C772D930BCA810709C471FDC8C7D1A3D0BB7D92748B3B2A451F5D8590E3FB0E16BA8ADE100FE00F37A7C1DCBC00B8240FF65FB1A89ADB9F365445BDC0E82782C975
106c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    private static final String ENCODED_DATA = "MIIBHgKBgQDmQVh3dlpKU/HWyH1nHy/63reqzddd0Omx2v5"
107c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            + "CvsxCUi4B0haxW8RC+VUP4tUB0n4i9sH+XGrPghtcRmaLr99E4g6jWPejJOOEphbgynJVB6CZe/ixWoQ"
108c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            + "2Wshq/qa0GzoKAGty3AzRCSURaGt13iwawjrLoBfKLe6iWp0fMxsHbQIVAJs50AIP6ZYWxSX3lKks0CV"
109c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            + "bbuCPAoGAXpyVX36RR01opBxEO+wKfllU9+9C+2OVCC9K07x5nbrYioOErlsmgLP7nKPP9ArVtmVlGk/"
110c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            + "Ahjvm+06eSQqMdy2TC8qBBwnEcf3Ix9Gj0Lt9knSLOypFH12FkOP7Dha6it4QD+APN6fB3LwAuCQP9l+"
111c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            + "xqJrbnzZURb3A6CeCyXU=";
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public AlgorithmParametersTestDSA() {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super("DSA", new AlgorithmParameterSignatureHelper<DSAParameterSpec>(
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                "DSA", DSAParameterSpec.class), new DSAParameterSpec(
116076562801559fd3619c1eb2aeba8da19331ab6abKenny Root                new BigInteger(1, P), new BigInteger(1, Q), new BigInteger(1, G)));
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
119c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    public void testEncoding() throws Exception {
120c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian        for (Provider p : Security.getProviders()) {
121c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            AlgorithmParameters params;
122c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            try {
123c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                params = AlgorithmParameters.getInstance("DSA", p);
124c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            } catch (NoSuchAlgorithmException e) {
125c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                // This provider doesn't support DSA, ignore
126c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                continue;
127c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            }
128c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
129c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            DSAParameterSpec spec = new DSAParameterSpec(
130c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                    new BigInteger(1, P), new BigInteger(1, Q), new BigInteger(1, G));
131c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
132c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            params.init(spec);
133c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertEquals("Provider: " + p.getName(),
134c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                    ENCODED_DATA, Base64.getEncoder().encodeToString(params.getEncoded()));
135c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
136c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            params = AlgorithmParameters.getInstance("DSA", p);
137c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            params.init(Base64.getDecoder().decode(ENCODED_DATA));
138c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            DSAParameterSpec derivedSpec = params.getParameterSpec(DSAParameterSpec.class);
139c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
140c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertEquals("Provider: " + p.getName(), new BigInteger(1, P), derivedSpec.getP());
141c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertEquals("Provider: " + p.getName(), new BigInteger(1, Q), derivedSpec.getQ());
142c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertEquals("Provider: " + p.getName(), new BigInteger(1, G), derivedSpec.getG());
143c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian        }
144c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    }
145c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
147