| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed 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.xnet.provider.jsse; |
| |
| import java.security.MessageDigest; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| import javax.crypto.Cipher; |
| import javax.crypto.Mac; |
| import junit.framework.TestCase; |
| import libcore.java.security.StandardNames; |
| import org.apache.harmony.xnet.provider.jsse.CipherSuite; |
| |
| public class CipherSuiteTest extends TestCase { |
| public void test_getByName() throws Exception { |
| for (String name : StandardNames.CIPHER_SUITES) { |
| if (name.equals(StandardNames.CIPHER_SUITE_SECURE_RENEGOTIATION)) { |
| assertNull(CipherSuite.getByName(name)); |
| } else { |
| test_CipherSuite(name); |
| } |
| } |
| |
| assertNull(CipherSuite.getByName("bogus")); |
| try { |
| CipherSuite.getByName(null); |
| fail(); |
| } catch (NullPointerException expected) { |
| } |
| } |
| |
| private void test_CipherSuite(String name) throws Exception { |
| CipherSuite cs = CipherSuite.getByName(name); |
| assertNotNull(name, cs); |
| assertEquals(name, cs.getName()); |
| test_CipherSuite(cs); |
| } |
| |
| private void test_CipherSuite(CipherSuite cs) throws Exception { |
| assertNotNull(cs); |
| |
| String name = cs.getName(); |
| assertNotNull(name); |
| assertSame(name, cs, CipherSuite.getByName(name)); |
| assertTrue(name, StandardNames.CIPHER_SUITES.contains(name)); |
| assertTrue(name, name.startsWith("SSL_") || name.startsWith("TLS_")); |
| |
| assertEquals(cs.isAnonymous(), name.contains("_anon_")); |
| |
| byte[] bytes = cs.toBytes(); |
| assertNotNull(name, bytes); |
| assertEquals(name, 2, bytes.length); |
| assertTrue(name + bytes[0], bytes[0] == (byte) 0x00 || bytes[0] == (byte) 0xc0); |
| assertSame(name, cs, CipherSuite.getByCode(bytes[0], bytes[1])); |
| assertSame(name, cs, CipherSuite.getByCode((byte) 0, bytes[0], bytes[1])); |
| |
| assertTrue(name, cs.toString().contains(name)); |
| |
| String bulkEncryptionAlgorithm = cs.getBulkEncryptionAlgorithm(); |
| int blockSize = cs.getBlockSize(); |
| if (bulkEncryptionAlgorithm == null) { |
| assertTrue(name, name.contains("_NULL_")); |
| assertEquals(name, 0, blockSize); |
| } else { |
| assertNotNull(name, Cipher.getInstance(cs.getBulkEncryptionAlgorithm())); |
| assertTrue(name, blockSize == 0 || blockSize == 8 || blockSize == 16); |
| } |
| |
| String hmacName = cs.getHmacName(); |
| assertNotNull(name, hmacName); |
| assertNotNull(name, Mac.getInstance(hmacName)); |
| |
| String hashName = cs.getHashName(); |
| assertNotNull(name, hashName); |
| assertNotNull(name, MessageDigest.getInstance(hashName)); |
| |
| int macLength = cs.getMACLength(); |
| assertTrue(name, macLength == 0 || macLength == 16 || macLength == 20); |
| |
| assertTrue(name, |
| cs.isExportable() == name.contains("_EXPORT_") |
| || cs.isExportable() == name.contains("_NULL_")); |
| |
| String keyType = cs.getServerKeyType(); |
| assertEquals(name, cs.isAnonymous(), keyType == null); |
| assertTrue(name, keyType == null || StandardNames.KEY_TYPES.contains(keyType)); |
| } |
| |
| public void test_getByCode() { |
| // CipherSuite.getByCode is also covered by test_CipherSuite |
| assertUnknown(CipherSuite.getByCode((byte) 0x12, (byte) 0x34)); |
| assertUnknown(CipherSuite.getByCode((byte) 0x12, (byte) 0x34, (byte) 0x56)); |
| assertUnknown(CipherSuite.getByCode((byte) -1, (byte) -1)); |
| assertUnknown(CipherSuite.getByCode((byte) -1, (byte) -1, (byte) -1)); |
| } |
| private void assertUnknown(CipherSuite cs) { |
| assertNotNull(cs); |
| assertNotNull(cs.getName().contains("UNKNOWN")); |
| } |
| |
| public void test_getSupported() throws Exception { |
| CipherSuite[] suites = CipherSuite.getSupported(); |
| List<String> names = new ArrayList<String>(suites.length); |
| for (CipherSuite cs : suites) { |
| test_CipherSuite(cs); |
| names.add(cs.getName()); |
| } |
| assertEquals(Arrays.asList(CipherSuite.getSupportedCipherSuiteNames()), names); |
| } |
| |
| public void test_getSupportedCipherSuiteNames() throws Exception { |
| String[] names = CipherSuite.getSupportedCipherSuiteNames(); |
| StandardNames.assertSupportedCipherSuites(StandardNames.CIPHER_SUITES_SSLENGINE, names); |
| for (String name : names) { |
| test_CipherSuite(name); |
| } |
| } |
| |
| public void test_getClientKeyType() throws Exception { |
| byte b = Byte.MIN_VALUE; |
| do { |
| String byteString = Byte.toString(b); |
| String keyType = CipherSuite.getClientKeyType(b); |
| switch (b) { |
| case 1: |
| assertEquals(byteString, "RSA", keyType); |
| break; |
| case 2: |
| assertEquals(byteString, "DSA", keyType); |
| break; |
| case 3: |
| assertEquals(byteString, "DH_RSA", keyType); |
| break; |
| case 4: |
| assertEquals(byteString, "DH_DSA", keyType); |
| break; |
| case 64: |
| assertEquals(byteString, "EC", keyType); |
| break; |
| case 65: |
| assertEquals(byteString, "EC_RSA", keyType); |
| break; |
| case 66: |
| assertEquals(byteString, "EC_EC", keyType); |
| break; |
| default: |
| assertNull(byteString, keyType); |
| } |
| b++; |
| } while (b != Byte.MIN_VALUE); |
| } |
| } |