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