1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership. 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License. You may obtain a copy of the License at 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.xnet.provider.jsse; 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.xnet.provider.jsse.Logger; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.Cipher; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This abstract class is a base for Record Protocol operating environmet 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of different SSL protocol versions. 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class ConnectionState { 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The cipher used for encode operations 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected Cipher encCipher; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The cipher used for decode operations 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected Cipher decCipher; 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The cipher type 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected boolean is_block_cipher; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The size of MAC used under this connection state 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected int hash_size; 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Write sequence number which is incremented after each 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * encrypt call 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected final byte[] write_seq_num = {0, 0, 0, 0, 0, 0, 0, 0}; 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Read sequence number which is incremented after each 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * decrypt call 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected final byte[] read_seq_num = {0, 0, 0, 0, 0, 0, 0, 0}; 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected Logger.Stream logger = Logger.getStream("conn_state"); 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the minimal possible size of the 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Generic[Stream|Generic]Cipher structure under this 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * connection state. 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected int getMinFragmentSize() { 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // block ciphers return value with padding included 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return encCipher.getOutputSize(1+hash_size); // 1 byte for data 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the size of the Generic[Stream|Generic]Cipher structure 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * corresponding to the content data of specified size. 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected int getFragmentSize(int content_size) { 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return encCipher.getOutputSize(content_size+hash_size); 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the minimal upper bound of the content size enclosed 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * into the Generic[Stream|Generic]Cipher structure of specified size. 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For stream ciphers the returned value will be exact value. 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected int getContentSize(int generic_cipher_size) { 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //it does not take the padding of block ciphered structures 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //into account (so returned value can be greater than actual) 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return decCipher.getOutputSize(generic_cipher_size)-hash_size; 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Creates the GenericStreamCipher or GenericBlockCipher 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * data structure for specified data of specified type. 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type - the ContentType of the provided data 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param fragment - the byte array containing the 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * data to be encrypted under the current connection state. 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected byte[] encrypt(byte type, byte[] fragment) { 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return encrypt(type, fragment, 0, fragment.length); 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Creates the GenericStreamCipher or GenericBlockCipher 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * data structure for specified data of specified type. 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type - the ContentType of the provided data 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param fragment - the byte array containing the 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * data to be encrypted under the current connection state. 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param offset - the offset from which the data begins with. 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param len - the length of the data. 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected abstract byte[] encrypt 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (byte type, byte[] fragment, int offset, int len); 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Retrieves the fragment of the Plaintext structure of 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the specified type from the provided data. 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type - the ContentType of the data to be decrypted. 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param fragment - the byte array containing the 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * data to be encrypted under the current connection state. 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected byte[] decrypt(byte type, byte[] fragment) { 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return decrypt(type, fragment, 0, fragment.length); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Retrieves the fragment of the Plaintext structure of 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the specified type from the provided data. 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param type - the ContentType of the data to be decrypted. 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param fragment - the byte array containing the 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * data to be encrypted under the current connection state. 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param offset - the offset from which the data begins with. 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param len - the length of the data. 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected abstract byte[] decrypt 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (byte type, byte[] fragment, int offset, int len); 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Increments the sequence number. 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected static void incSequenceNumber(byte[] seq_num) { 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int octet = 7; 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (octet >= 0) { 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project seq_num[octet] ++; 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (seq_num[octet] == 0) { 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // characteristic overflow, so 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // carrying a number in adding 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project octet --; 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Shutdownes the protocol. It will be impossiblke to use the instance 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * after the calling of this method. 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected void shutdown() { 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project encCipher = null; 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project decCipher = null; 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i=0; i<write_seq_num.length; i++) { 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project write_seq_num[i] = 0; 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project read_seq_num[i] = 0; 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 170