001 package net.minecraft.src;
002
003 import cpw.mods.fml.common.Side;
004 import cpw.mods.fml.common.asm.SideOnly;
005 import java.io.InputStream;
006 import java.io.OutputStream;
007 import java.io.UnsupportedEncodingException;
008 import java.nio.charset.Charset;
009 import java.security.InvalidKeyException;
010 import java.security.Key;
011 import java.security.KeyFactory;
012 import java.security.KeyPair;
013 import java.security.KeyPairGenerator;
014 import java.security.MessageDigest;
015 import java.security.NoSuchAlgorithmException;
016 import java.security.PrivateKey;
017 import java.security.PublicKey;
018 import java.security.SecureRandom;
019 import java.security.Security;
020 import java.security.spec.InvalidKeySpecException;
021 import java.security.spec.X509EncodedKeySpec;
022 import javax.crypto.BadPaddingException;
023 import javax.crypto.Cipher;
024 import javax.crypto.IllegalBlockSizeException;
025 import javax.crypto.NoSuchPaddingException;
026 import javax.crypto.SecretKey;
027 import javax.crypto.spec.SecretKeySpec;
028 import org.bouncycastle.crypto.BufferedBlockCipher;
029 import org.bouncycastle.crypto.CipherKeyGenerator;
030 import org.bouncycastle.crypto.KeyGenerationParameters;
031 import org.bouncycastle.crypto.engines.AESFastEngine;
032 import org.bouncycastle.crypto.io.CipherInputStream;
033 import org.bouncycastle.crypto.io.CipherOutputStream;
034 import org.bouncycastle.crypto.modes.CFBBlockCipher;
035 import org.bouncycastle.crypto.params.KeyParameter;
036 import org.bouncycastle.crypto.params.ParametersWithIV;
037 import org.bouncycastle.jce.provider.BouncyCastleProvider;
038
039 public class CryptManager
040 {
041 /** ISO_8859_1 */
042 public static final Charset charSet = Charset.forName("ISO_8859_1");
043
044 @SideOnly(Side.CLIENT)
045 public static SecretKey func_75890_a()
046 {
047 CipherKeyGenerator var0 = new CipherKeyGenerator();
048 var0.init(new KeyGenerationParameters(new SecureRandom(), 128));
049 return new SecretKeySpec(var0.generateKey(), "AES");
050 }
051
052 public static KeyPair createNewKeyPair()
053 {
054 try
055 {
056 KeyPairGenerator var0 = KeyPairGenerator.getInstance("RSA");
057 var0.initialize(1024);
058 return var0.generateKeyPair();
059 }
060 catch (NoSuchAlgorithmException var1)
061 {
062 var1.printStackTrace();
063 System.err.println("Key pair generation failed!");
064 return null;
065 }
066 }
067
068 public static byte[] func_75895_a(String par0Str, PublicKey par1PublicKey, SecretKey par2SecretKey)
069 {
070 try
071 {
072 return func_75893_a("SHA-1", new byte[][] {par0Str.getBytes("ISO_8859_1"), par2SecretKey.getEncoded(), par1PublicKey.getEncoded()});
073 }
074 catch (UnsupportedEncodingException var4)
075 {
076 var4.printStackTrace();
077 return null;
078 }
079 }
080
081 private static byte[] func_75893_a(String par0Str, byte[] ... par1ArrayOfByte)
082 {
083 try
084 {
085 MessageDigest var2 = MessageDigest.getInstance(par0Str);
086 byte[][] var3 = par1ArrayOfByte;
087 int var4 = par1ArrayOfByte.length;
088
089 for (int var5 = 0; var5 < var4; ++var5)
090 {
091 byte[] var6 = var3[var5];
092 var2.update(var6);
093 }
094
095 return var2.digest();
096 }
097 catch (NoSuchAlgorithmException var7)
098 {
099 var7.printStackTrace();
100 return null;
101 }
102 }
103
104 public static PublicKey func_75896_a(byte[] par0ArrayOfByte)
105 {
106 try
107 {
108 X509EncodedKeySpec var1 = new X509EncodedKeySpec(par0ArrayOfByte);
109 KeyFactory var2 = KeyFactory.getInstance("RSA");
110 return var2.generatePublic(var1);
111 }
112 catch (NoSuchAlgorithmException var3)
113 {
114 var3.printStackTrace();
115 }
116 catch (InvalidKeySpecException var4)
117 {
118 var4.printStackTrace();
119 }
120
121 System.err.println("Public key reconstitute failed!");
122 return null;
123 }
124
125 public static SecretKey func_75887_a(PrivateKey par0PrivateKey, byte[] par1ArrayOfByte)
126 {
127 return new SecretKeySpec(func_75889_b(par0PrivateKey, par1ArrayOfByte), "AES");
128 }
129
130 @SideOnly(Side.CLIENT)
131 public static byte[] func_75894_a(Key par0Key, byte[] par1ArrayOfByte)
132 {
133 return func_75885_a(1, par0Key, par1ArrayOfByte);
134 }
135
136 public static byte[] func_75889_b(Key par0Key, byte[] par1ArrayOfByte)
137 {
138 return func_75885_a(2, par0Key, par1ArrayOfByte);
139 }
140
141 private static byte[] func_75885_a(int par0, Key par1Key, byte[] par2ArrayOfByte)
142 {
143 try
144 {
145 return createTheChiperInstance(par0, par1Key.getAlgorithm(), par1Key).doFinal(par2ArrayOfByte);
146 }
147 catch (IllegalBlockSizeException var4)
148 {
149 var4.printStackTrace();
150 }
151 catch (BadPaddingException var5)
152 {
153 var5.printStackTrace();
154 }
155
156 System.err.println("Cipher data failed!");
157 return null;
158 }
159
160 /**
161 * Creates the Chiper Instance.
162 */
163 private static Cipher createTheChiperInstance(int par0, String par1Str, Key par2Key)
164 {
165 try
166 {
167 Cipher var3 = Cipher.getInstance(par1Str);
168 var3.init(par0, par2Key);
169 return var3;
170 }
171 catch (InvalidKeyException var4)
172 {
173 var4.printStackTrace();
174 }
175 catch (NoSuchAlgorithmException var5)
176 {
177 var5.printStackTrace();
178 }
179 catch (NoSuchPaddingException var6)
180 {
181 var6.printStackTrace();
182 }
183
184 System.err.println("Cipher creation failed!");
185 return null;
186 }
187
188 private static BufferedBlockCipher func_75892_a(boolean par0, Key par1Key)
189 {
190 BufferedBlockCipher var2 = new BufferedBlockCipher(new CFBBlockCipher(new AESFastEngine(), 8));
191 var2.init(par0, new ParametersWithIV(new KeyParameter(par1Key.getEncoded()), par1Key.getEncoded(), 0, 16));
192 return var2;
193 }
194
195 public static OutputStream encryptOuputStream(SecretKey par0SecretKey, OutputStream par1OutputStream)
196 {
197 return new CipherOutputStream(par1OutputStream, func_75892_a(true, par0SecretKey));
198 }
199
200 public static InputStream decryptInputStream(SecretKey par0SecretKey, InputStream par1InputStream)
201 {
202 return new CipherInputStream(par1InputStream, func_75892_a(false, par0SecretKey));
203 }
204
205 static
206 {
207 Security.addProvider(new BouncyCastleProvider());
208 }
209 }