blob: 069d5dbc298edb9a6ba19b93ed7ea0ff5bf6652b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 javax.crypto.Cipher;
/**
* This abstract class is a base for Record Protocol operating environmet
* of different SSL protocol versions.
*/
public abstract class ConnectionState {
/**
* The cipher used for encode operations
*/
protected Cipher encCipher;
/**
* The cipher used for decode operations
*/
protected Cipher decCipher;
/**
* The block size, or zero if not a block cipher
*/
protected int block_size;
/**
* The size of MAC used under this connection state
*/
protected int hash_size;
/**
* Write sequence number which is incremented after each
* encrypt call
*/
protected final byte[] write_seq_num = {0, 0, 0, 0, 0, 0, 0, 0};
/**
* Read sequence number which is incremented after each
* decrypt call
*/
protected final byte[] read_seq_num = {0, 0, 0, 0, 0, 0, 0, 0};
protected Logger.Stream logger = Logger.getStream("conn_state");
/**
* Returns the minimal possible size of the
* Generic[Stream|Generic]Cipher structure under this
* connection state.
*/
protected int getMinFragmentSize() {
// block ciphers return value with padding included
return encCipher.getOutputSize(1+hash_size); // 1 byte for data
}
/**
* Returns the size of the Generic[Stream|Generic]Cipher structure
* corresponding to the content data of specified size.
*/
protected int getFragmentSize(int content_size) {
return encCipher.getOutputSize(content_size+hash_size);
}
/**
* Returns the minimal upper bound of the content size enclosed
* into the Generic[Stream|Generic]Cipher structure of specified size.
* For stream ciphers the returned value will be exact value.
*/
protected int getContentSize(int generic_cipher_size) {
//it does not take the padding of block ciphered structures
//into account (so returned value can be greater than actual)
return decCipher.getOutputSize(generic_cipher_size)-hash_size;
}
/**
* Returns the number of bytes of padding required to round the
* content up to the required block size. Assumes power of two
* block size.
*/
protected int getPaddingSize(int content_size) {
int mask = block_size - 1;
return (block_size - (content_size & mask));
}
/**
* Creates the GenericStreamCipher or GenericBlockCipher
* data structure for specified data of specified type.
* @param type - the ContentType of the provided data
* @param fragment - the byte array containing the
* data to be encrypted under the current connection state.
*/
protected byte[] encrypt(byte type, byte[] fragment) {
return encrypt(type, fragment, 0, fragment.length);
}
/**
* Creates the GenericStreamCipher or GenericBlockCipher
* data structure for specified data of specified type.
* @param type - the ContentType of the provided data
* @param fragment - the byte array containing the
* data to be encrypted under the current connection state.
* @param offset - the offset from which the data begins with.
* @param len - the length of the data.
*/
protected abstract byte[] encrypt
(byte type, byte[] fragment, int offset, int len);
/**
* Retrieves the fragment of the Plaintext structure of
* the specified type from the provided data.
* @param type - the ContentType of the data to be decrypted.
* @param fragment - the byte array containing the
* data to be encrypted under the current connection state.
*/
protected byte[] decrypt(byte type, byte[] fragment) {
return decrypt(type, fragment, 0, fragment.length);
}
/**
* Retrieves the fragment of the Plaintext structure of
* the specified type from the provided data.
* @param type - the ContentType of the data to be decrypted.
* @param fragment - the byte array containing the
* data to be encrypted under the current connection state.
* @param offset - the offset from which the data begins with.
* @param len - the length of the data.
*/
protected abstract byte[] decrypt
(byte type, byte[] fragment, int offset, int len);
/**
* Increments the sequence number.
*/
protected static void incSequenceNumber(byte[] seq_num) {
int octet = 7;
while (octet >= 0) {
seq_num[octet] ++;
if (seq_num[octet] == 0) {
// characteristic overflow, so
// carrying a number in adding
octet --;
} else {
return;
}
}
}
/**
* Shutdownes the protocol. It will be impossiblke to use the instance
* after the calling of this method.
*/
protected void shutdown() {
encCipher = null;
decCipher = null;
for (int i=0; i<write_seq_num.length; i++) {
write_seq_num[i] = 0;
read_seq_num[i] = 0;
}
}
}