Imported GNU Classpath 0.90
[official-gcc.git] / libjava / classpath / gnu / javax / crypto / jce / cipher / ARCFourSpi.java
blob8fc1fe4cbbfe37cf77adb560a3b4a44753966014
1 /* ARCFourSpi.java --
2 Copyright (C) 2002, 2006 Free Software Foundation, Inc.
4 This file is a part of GNU Classpath.
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.
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.
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
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.
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. */
39 package gnu.javax.crypto.jce.cipher;
41 import gnu.java.security.Registry;
42 import gnu.javax.crypto.prng.ARCFour;
43 import gnu.java.security.prng.IRandom;
44 import gnu.java.security.prng.LimitReachedException;
45 import gnu.javax.crypto.prng.PRNGFactory;
47 import java.security.AlgorithmParameters;
48 import java.security.InvalidAlgorithmParameterException;
49 import java.security.InvalidKeyException;
50 import java.security.Key;
51 import java.security.NoSuchAlgorithmException;
52 import java.security.SecureRandom;
53 import java.security.spec.AlgorithmParameterSpec;
55 import java.util.HashMap;
57 import javax.crypto.BadPaddingException;
58 import javax.crypto.Cipher;
59 import javax.crypto.CipherSpi;
60 import javax.crypto.IllegalBlockSizeException;
61 import javax.crypto.NoSuchPaddingException;
62 import javax.crypto.ShortBufferException;
64 /**
65 * The <i>Service Provider Interface</i> (<b>SPI</b>) for the ARCFOUR
66 * stream cipher.
68 * @version $Revision: 1.1 $
70 public class ARCFourSpi extends CipherSpi
73 // Constants and variables.
74 // -----------------------------------------------------------------------
76 private IRandom keystream;
78 // Constructors.
79 // -----------------------------------------------------------------------
81 public ARCFourSpi()
83 super();
84 keystream = PRNGFactory.getInstance(Registry.ARCFOUR_PRNG);
87 // Methods implementing CipherSpi.
88 // -----------------------------------------------------------------------
90 protected int engineGetBlockSize()
92 return 0; // stream cipher.
95 protected void engineSetMode(String s) throws NoSuchAlgorithmException
97 // ignored.
100 protected void engineSetPadding(String s) throws NoSuchPaddingException
102 // ignored.
105 protected byte[] engineGetIV()
107 return null;
110 protected int engineGetOutputSize(int in)
112 return in;
115 protected AlgorithmParameters engineGetParameters()
117 return null;
120 protected void engineInit(int mode, Key key, SecureRandom r)
121 throws InvalidKeyException
123 if (mode != Cipher.ENCRYPT_MODE && mode != Cipher.DECRYPT_MODE)
125 throw new IllegalArgumentException(
126 "arcfour is for encryption or decryption only");
128 if (key == null || !key.getFormat().equalsIgnoreCase("RAW"))
130 throw new InvalidKeyException("key must be non-null raw bytes");
132 HashMap attrib = new HashMap();
133 attrib.put(ARCFour.ARCFOUR_KEY_MATERIAL, key.getEncoded());
134 keystream.init(attrib);
137 protected void engineInit(int mode, Key key, AlgorithmParameterSpec p,
138 SecureRandom r) throws InvalidKeyException,
139 InvalidAlgorithmParameterException
141 engineInit(mode, key, r);
144 protected void engineInit(int mode, Key key, AlgorithmParameters p,
145 SecureRandom r) throws InvalidKeyException,
146 InvalidAlgorithmParameterException
148 engineInit(mode, key, r);
151 protected byte[] engineUpdate(byte[] in, int offset, int length)
153 if (length < 0 || offset < 0 || length + offset > in.length)
155 throw new ArrayIndexOutOfBoundsException();
157 byte[] result = new byte[length];
160 for (int i = 0; i < length; i++)
162 result[i] = (byte) (in[i + offset] ^ keystream.nextByte());
165 catch (LimitReachedException wontHappen)
168 return result;
171 protected int engineUpdate(byte[] in, int inOffset, int length, byte[] out,
172 int outOffset) throws ShortBufferException
174 if (length < 0 || inOffset < 0 || length + inOffset > in.length
175 || outOffset < 0)
177 throw new ArrayIndexOutOfBoundsException();
179 if (outOffset + length > out.length)
181 throw new ShortBufferException();
185 for (int i = 0; i < length; i++)
187 out[i + outOffset] = (byte) (in[i + inOffset] ^ keystream.nextByte());
190 catch (LimitReachedException wontHappen)
193 return length;
196 protected byte[] engineDoFinal(byte[] in, int offset, int length)
197 throws IllegalBlockSizeException, BadPaddingException
199 return engineUpdate(in, offset, length);
202 protected int engineDoFinal(byte[] in, int inOffset, int length, byte[] out,
203 int outOffset) throws ShortBufferException,
204 IllegalBlockSizeException, BadPaddingException
206 return engineUpdate(in, inOffset, length, out, outOffset);