· 5 years ago · Mar 17, 2020, 02:52 PM
1package lsrs2.application;
2
3//** LAB START ** //
4
5import java.security.KeyPair;
6import java.security.PrivateKey;
7import java.security.PublicKey;
8
9import javax.crypto.SecretKey;
10import javax.crypto.spec.SecretKeySpec;
11
12import lsrs2.comm.*;
13import lsrs2.crypto.*;
14import lsrs2.misc.Utils;
15
16/**
17 * Lab SRS. Simple example of application that uses symmetric encryption
18 * with pre-shared secret keys.
19 *
20 * Missing code is indicated by TODO!
21 * @author OCatrina ETTI UPB
22 *
23 */
24public class SeCom2 implements AppUserIntf
25{
26 private String locId;
27 private Communicator comm;
28
29 private String encPubName;
30 private String encSecName;
31 private EncSec encSec;
32 private KeyManager km;
33
34 public SeCom2(String locId, Communicator comm) throws Exception
35 {
36 this.locId = locId;
37 this.comm = comm;
38 // Register with the communicator
39 comm.setParty(locId, this);
40 km = new KeyManager(locId);
41 }
42
43 public void setEncPubName(String encPubName)
44 {
45 this.encPubName = encPubName;
46 }
47
48 public void setEncSecName(String encSecName)
49 {
50 this.encSecName = encSecName;
51 }
52
53 /**
54 * Generates a long-lived key pair used to establish session keys.
55 * Long term setup.
56 */
57 public void genKeyPair(int keyLen) throws Exception
58 {
59 // Generate own key pair
60 GenKeyPair genKeyPair = new GenKeyPair(encPubName.split("/")[0]);
61 KeyPair locKeyPair = genKeyPair.genKeys(keyLen);
62 km.setKey(locId + "_private_key", locKeyPair.getPrivate());
63 km.setKey(locId + "_public_key", locKeyPair.getPublic());
64 }
65
66 /**
67 * For public-key distribution (simulated). Returns own public key.
68 */
69 public PublicKey getPubKey() throws Exception
70 {
71 return km.getPublicKey(locId + "_public_key");
72 }
73
74 /**
75 * Public-key distribution (simulated). Receives the public key
76 * of the participant remId.
77 */
78 public void recvPubKey(String remId, PublicKey pubKey) throws Exception
79 {
80 km.setKey(remId + "_public_key", pubKey);
81 }
82
83 /**
84 * Session key establishment initiator.
85 */
86 public void sendKeyExch(String remId, int keyLen) throws Exception
87 {
88 // TODO: Generate session key (secret key for symmetric encryption)
89
90 // TODO: Save session key in km
91
92 // TODO: Encrypt session key using peer's public key
93
94 // TODO: Send encrypted session key
95 // TODO: Generate session key (secret key for symmetric encryption)
96 GenSecKey genSecKey = new GenSecKey(encSecName);
97 SecretKey sk = genSecKey.genKey(keyLen);
98 SecureRandom random = new SecureRandom();
99 byte [] bytes = new byte[keyLen/8];
100 random.engineNextBytes(bytes);
101 //sau random.nextBytes(... // Save session key in km and initialize symmetric encryption scheme
102 km.setKey(remId + "_secret_key", new SecretKeySpec(bytes, "AES"));
103 // Encrypt session key using peer's public key
104 EncPub encPub = new EncPub(encPubName);
105 encPub.setPubKey(km.getPublicKey(remId + "_public_key"));
106 byte [] ekey = encPub.encrypt(bytes);
107 // Send encrypted session key comm.sendKeyExchMsg(new KeyExchMsg(locId, remId, ekey));
108 }
109
110 /**
111 * Session key establishment responder.
112 */
113 public void recvKeyExch(KeyExchMsg msg) throws Exception
114 {
115 // TODO: Decrypt session key using own private key
116
117 // TODO: Save session key in km
118 // Decrypt session key using own private key
119 EncPub encPub = new EncPub(encPubName);
120 encPub.setPrivKey(km.getPrivateKey(locId + "_private_key"));
121 byte [] key = encPub.decrypt(msg.getData());
122 // Save session key in km and initialize symmetric encryption scheme
123 km.setKey(msg.getSrc() + "_secret_key", new SecretKeySpec(key, "AES"));
124 }
125
126 /**
127 * Encrypts ptxt (user data) and sends it to dstId.
128 */
129 public void sendData(String dstId, byte[] ptxt) throws Exception
130 {
131 // TODO: Get session key from key manager km (secret key for encryption)
132
133 // TODO: Set session key in encSec
134
135 // TODO: Encrypt ptxt using encSec
136
137 // TODO: Change this - data not protected
138 Ciphertext ctxt = new Ciphertext(new byte[0], ptxt);
139 Utils.debug("[Participant: "+ locId + "]: sends message to "+dstId+"\n "+Utils.toHexExt(ptxt));
140 comm.sendDataMsg(new DataMsg(locId, dstId, ctxt));
141 }
142
143 /**
144 * Receives dataMsg and decrypts the received data.
145 */
146 public byte[] recvData(DataMsg dataMsg) throws Exception
147 {
148 // TODO: Get session key from key manager km (secret key for encryption)
149
150 // TODO: Set session key in encSec
151
152 // TODO: Decrypt received data using encSec
153
154 // TODO: Change this - data not protected
155 byte[] ptxt = dataMsg.getData().getText();
156 Utils.debug("[Participant: "+locId+"]: rcvd message from "+dataMsg.getSrc()+"\n "+Utils.toHexExt(ptxt));
157 return ptxt;
158 }
159
160 public String getId()
161 {
162 return locId;
163 }
164
165}