001    package net.minecraft.network.packet;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.io.DataInputStream;
006    import java.io.DataOutputStream;
007    import java.io.IOException;
008    import java.security.PrivateKey;
009    import java.security.PublicKey;
010    import javax.crypto.SecretKey;
011    import net.minecraft.util.CryptManager;
012    
013    public 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    }