package net.minecraft.util;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class CryptManager
{
private static final Logger field_180198_a = LogManager.getLogger();
private static final String __OBFID = "CL_00001483";
/**
* Generates RSA KeyPair
*/
public static KeyPair generateKeyPair()
{
try
{
KeyPairGenerator var0 = KeyPairGenerator.getInstance("RSA");
var0.initialize(1024);
return var0.generateKeyPair();
}
catch (NoSuchAlgorithmException var1)
{
var1.printStackTrace();
field_180198_a.error("Key pair generation failed!");
return null;
}
}
/**
* Compute a serverId hash for use by sendSessionRequest()
*/
public static byte[] getServerIdHash(String p_75895_0_, PublicKey p_75895_1_, SecretKey p_75895_2_)
{
try
{
return digestOperation("SHA-1", new byte[][] {p_75895_0_.getBytes("ISO_8859_1"), p_75895_2_.getEncoded(), p_75895_1_.getEncoded()});
}
catch (UnsupportedEncodingException var4)
{
var4.printStackTrace();
return null;
}
}
/**
* Compute a message digest on arbitrary byte[] data
*/
private static byte[] digestOperation(String p_75893_0_, byte[] ... p_75893_1_)
{
try
{
MessageDigest var2 = MessageDigest.getInstance(p_75893_0_);
byte[][] var3 = p_75893_1_;
int var4 = p_75893_1_.length;
for (int var5 = 0; var5 < var4; ++var5)
{
byte[] var6 = var3[var5];
var2.update(var6);
}
return var2.digest();
}
catch (NoSuchAlgorithmException var7)
{
var7.printStackTrace();
return null;
}
}
/**
* Create a new PublicKey from encoded X.509 data
*/
public static PublicKey decodePublicKey(byte[] p_75896_0_)
{
try
{
X509EncodedKeySpec var1 = new X509EncodedKeySpec(p_75896_0_);
KeyFactory var2 = KeyFactory.getInstance("RSA");
return var2.generatePublic(var1);
}
catch (NoSuchAlgorithmException var3)
{
;
}
catch (InvalidKeySpecException var4)
{
;
}
field_180198_a.error("Public key reconstitute failed!");
return null;
}
/**
* Decrypt shared secret AES key using RSA private key
*/
public static SecretKey decryptSharedKey(PrivateKey p_75887_0_, byte[] p_75887_1_)
{
return new SecretKeySpec(decryptData(p_75887_0_, p_75887_1_), "AES");
}
/**
* Decrypt byte[] data with RSA private key
*/
public static byte[] decryptData(Key p_75889_0_, byte[] p_75889_1_)
{
return cipherOperation(2, p_75889_0_, p_75889_1_);
}
/**
* Encrypt or decrypt byte[] data using the specified key
*/
private static byte[] cipherOperation(int p_75885_0_, Key p_75885_1_, byte[] p_75885_2_)
{
try
{
return createTheCipherInstance(p_75885_0_, p_75885_1_.getAlgorithm(), p_75885_1_).doFinal(p_75885_2_);
}
catch (IllegalBlockSizeException var4)
{
var4.printStackTrace();
}
catch (BadPaddingException var5)
{
var5.printStackTrace();
}
field_180198_a.error("Cipher data failed!");
return null;
}
/**
* Creates the Cipher Instance.
*/
private static Cipher createTheCipherInstance(int p_75886_0_, String p_75886_1_, Key p_75886_2_)
{
try
{
Cipher var3 = Cipher.getInstance(p_75886_1_);
var3.init(p_75886_0_, p_75886_2_);
return var3;
}
catch (InvalidKeyException var4)
{
var4.printStackTrace();
}
catch (NoSuchAlgorithmException var5)
{
var5.printStackTrace();
}
catch (NoSuchPaddingException var6)
{
var6.printStackTrace();
}
field_180198_a.error("Cipher creation failed!");
return null;
}
public static Cipher func_151229_a(int p_151229_0_, Key p_151229_1_)
{
try
{
Cipher var2 = Cipher.getInstance("AES/CFB8/NoPadding");
var2.init(p_151229_0_, p_151229_1_, new IvParameterSpec(p_151229_1_.getEncoded()));
return var2;
}
catch (GeneralSecurityException var3)
{
throw new RuntimeException(var3);
}
}
}