    001package net.minecraft.network.packet;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.io.DataInputStream;
    006import java.io.DataOutputStream;
    007import java.io.IOException;
    008import java.security.PrivateKey;
    009import java.security.PublicKey;
    010import javax.crypto.SecretKey;
    011import net.minecraft.util.CryptManager;
    012
    013public class Packet252SharedKey extends Packet
    014{
    015    private byte[] sharedSecret = new byte[0];
    016    private byte[] verifyToken = new byte[0];
    017
    018    /**
    019     * Secret AES key decrypted from sharedSecret via the server's private RSA key
    020     */
    021    private SecretKey sharedKey;
    022
    023    public Packet252SharedKey() {}
    024
    025    @SideOnly(Side.CLIENT)
    026    public Packet252SharedKey(SecretKey par1SecretKey, PublicKey par2PublicKey, byte[] par3ArrayOfByte)
    027    {
    028        this.sharedKey = par1SecretKey;
    029        this.sharedSecret = CryptManager.encryptData(par2PublicKey, par1SecretKey.getEncoded());
    030        this.verifyToken = CryptManager.encryptData(par2PublicKey, par3ArrayOfByte);
    031    }
    032
    033    /**
    034     * Abstract. Reads the raw packet data from the data stream.
    035     */
    036    public void readPacketData(DataInputStream par1DataInputStream) throws IOException
    037    {
    038        this.sharedSecret = readBytesFromStream(par1DataInputStream);
    039        this.verifyToken = readBytesFromStream(par1DataInputStream);
    040    }
    041
    042    /**
    043     * Abstract. Writes the raw packet data to the data stream.
    044     */
    045    public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException
    046    {
    047        writeByteArray(par1DataOutputStream, this.sharedSecret);
    048        writeByteArray(par1DataOutputStream, this.verifyToken);
    049    }
    050
    051    /**
    052     * Passes this Packet on to the NetHandler for processing.
    053     */
    054    public void processPacket(NetHandler par1NetHandler)
    055    {
    056        par1NetHandler.handleSharedKey(this);
    057    }
    058
    059    /**
    060     * Abstract. Return the size of the packet (not counting the header).
    061     */
    062    public int getPacketSize()
    063    {
    064        return 2 + this.sharedSecret.length + 2 + this.verifyToken.length;
    065    }
    066
    067    /**
    068     * Return secretKey, decrypting it from the sharedSecret byte array if needed
    069     */
    070    public SecretKey getSharedKey(PrivateKey par1PrivateKey)
    071    {
    072        return par1PrivateKey == null ? this.sharedKey : (this.sharedKey = CryptManager.decryptSharedKey(par1PrivateKey, this.sharedSecret));
    073    }
    074
    075    /**
    076     * Return the secret AES sharedKey (used by client only)
    077     */
    078    public SecretKey getSharedKey()
    079    {
    080        return this.getSharedKey((PrivateKey)null);
    081    }
    082
    083    /**
    084     * Return verifyToken
    085     */
    086    public byte[] getVerifyToken(PrivateKey par1PrivateKey)
    087    {
    088        return par1PrivateKey == null ? this.verifyToken : CryptManager.decryptData(par1PrivateKey, this.verifyToken);
    089    }
    090}