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