Frames | No Frames |
1: /* SSL3.java -- SSLv3 padding scheme. 2: Copyright (C) 2004, 2006 Free Software Foundation, Inc. 3: 4: This file is a part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2 of the License, or (at 9: your option) any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; if not, write to the Free Software 18: Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 19: USA 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package gnu.javax.crypto.pad; 40: 41: /** 42: * The padding scheme used by the Secure Sockets Layer, version 3. This padding 43: * scheme is used in the block-ciphered struct, e.g.: 44: * <pre> 45: * block-ciphered struct { 46: * opaque content[SSLCompressed.length]; 47: * opaque MAC[CipherSpec.hash_size]; 48: * uint8 padding[GenericBlockCipher.padding_length]; 49: * uint8 padding_length; 50: * } GenericBlockCipher; 51: * </pre> 52: * <p> 53: * Where <i>padding_length</i> is <i>cipher_block_size</i> - 54: * ((<i>SSLCompressed.length</i> + <i>CipherSpec.hash_size</i>) % 55: * <i>cipher_block_size</i>) - 1. That is, the padding is enough bytes to make 56: * the plaintext a multiple of the block size minus one, plus one additional 57: * byte for the padding length. The padding can be any arbitrary data. 58: */ 59: public class SSL3 60: extends BasePad 61: { 62: public SSL3() 63: { 64: super("ssl3"); 65: } 66: 67: public void setup() 68: { 69: if (blockSize <= 0 || blockSize > 255) 70: throw new IllegalArgumentException("invalid block size: " + blockSize); 71: } 72: 73: public byte[] pad(final byte[] in, final int off, final int len) 74: { 75: int padlen = blockSize - (len % blockSize); 76: byte[] pad = new byte[padlen]; 77: for (int i = 0; i < padlen; i++) 78: pad[i] = (byte)(padlen - 1); 79: return pad; 80: } 81: 82: public int unpad(final byte[] in, final int off, final int len) 83: throws WrongPaddingException 84: { 85: int padlen = in[off + len - 1] & 0xFF; 86: if (padlen >= blockSize) 87: throw new WrongPaddingException(); 88: return padlen + 1; 89: } 90: }