]> git.somenet.org - pub/jan/dslab.git/blob - ue3/src/Client/TCP.java
GITOLITE.txt
[pub/jan/dslab.git] / ue3 / src / Client / TCP.java
1 package Client;\r
2 \r
3 import java.io.*;\r
4 import java.util.*;\r
5 import java.net.*;\r
6 import java.io.*;\r
7 import java.security.*;\r
8 import javax.crypto.*;\r
9 import javax.crypto.spec.*;\r
10 import java.math.*;\r
11 import org.bouncycastle.openssl.*; \r
12 import org.bouncycastle.util.encoders.*;\r
13 \r
14 /*\r
15 * >--TCP--<\r
16 * Author: Someone\r
17 */\r
18 public class TCP implements Runnable{\r
19   private Socket $sock = null;\r
20   private InputStream $in = null;\r
21   private OutputStream $out = null;\r
22   private Cipher $c2s = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding");\r
23   private Cipher $s2c = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding");\r
24   private PublicKey $puk = null;\r
25   public PrivateKey $prk = null;\r
26   public String $challenge = null;\r
27 \r
28 \r
29 public TCP(String $server, int $port)throws Exception{\r
30   System.out.println("CLIENT TCP: "+$server+":"+$port);\r
31   $sock = new Socket($server, $port);\r
32   $in = $sock.getInputStream();\r
33   $out = $sock.getOutputStream();\r
34 \r
35   PEMReader in = new PEMReader(new FileReader(Main.$cfg.getString("server.key"))); \r
36   $puk = (PublicKey) in.readObject();\r
37 \r
38   $c2s.init(Cipher.ENCRYPT_MODE, $puk);\r
39   $s2c.init(Cipher.DECRYPT_MODE, $prk);\r
40   new Thread(this).start();\r
41 }\r
42 \r
43 public void run(){\r
44   try{\r
45     while($sock != null){\r
46       receive();\r
47     }\r
48   }catch(Exception $e){}\r
49   System.out.println("TCP:run() ended");\r
50 }\r
51 \r
52 public void send(String $msg){\r
53   try{\r
54     byte[] $encrypted = $c2s.doFinal($msg.getBytes());\r
55     byte[] $len = Helper.int2ba($encrypted.length);\r
56     $out.write($len);\r
57     $out.write($encrypted);\r
58     $out.flush();\r
59   }catch(Exception $e){$e.printStackTrace();}\r
60 }\r
61 \r
62 public void receive()throws Exception{\r
63   int $len = Helper.ba2int(Helper.readBA($in, 4));\r
64   byte[]$raw = Helper.readBA($in, $len);\r
65   String $msg = new String($s2c.doFinal($raw));\r
66   if($msg.startsWith("!ok")){\r
67     String[] $eing = $msg.split("\\s+");\r
68     if(!$challenge.equals($eing[1])){\r
69       System.out.println("ERROR: Challenge mismatch!");\r
70       shutdown();\r
71     }\r
72     send($eing[2]);\r
73     byte[] $skey = Base64.decode($eing[3].getBytes());\r
74     byte[] $iv = Base64.decode($eing[4].getBytes());\r
75     $c2s = Cipher.getInstance("AES/CTR/NoPadding");\r
76     $s2c = Cipher.getInstance("AES/CTR/NoPadding");\r
77     $c2s.init(Cipher.ENCRYPT_MODE, new SecretKeySpec($skey, "AES"), new IvParameterSpec($iv));\r
78     $s2c.init(Cipher.DECRYPT_MODE, new SecretKeySpec($skey, "AES"), new IvParameterSpec($iv));\r
79 \r
80   }else{\r
81     System.out.println($msg);\r
82   }\r
83 }\r
84 \r
85 public void shutdown(){\r
86   try{\r
87     send("CLIENT shutting down...");\r
88     $out.close();\r
89     $in.close();\r
90     $sock.close();\r
91     $sock = null;\r
92   }catch(Exception $e){$e.printStackTrace();}\r
93 }\r
94 \r
95 }