// Everyone except player 1 creates a new keypair and sends it around to everyone else. DecryptionKey broadcastNewKey(Map<VerificationKey, Address> changeAddresses) throws TimeoutException, InterruptedException, IOException, FormatException { DecryptionKey dk = null; dk = crypto.makeDecryptionKey(); // Broadcast the public key and store it in the set with everyone else's. encryptionKeys.put(vk, dk.EncryptionKey()); changeAddresses.put(vk, change); Message message = messages.make().attach(dk.EncryptionKey()); if (change != null) { message = message.attach(change); } mailbox.broadcast(message, phase.get()); return dk; }
// In the shuffle phase, we have to receive a set of strings from the previous player and // decrypt them all. final Message decryptAll(Message message, DecryptionKey key, int expected) throws IOException, InterruptedException, FormatException { Message decrypted = messages.make(); int count = 0; Set<String> addrs = new HashSet<>(); // Used to check that all addresses are different. while (!message.isEmpty()) { String encrypted = message.readString(); message = message.rest(); addrs.add(encrypted); count++; decrypted = decrypted.attach(key.decrypt(encrypted)); } if (addrs.size() != count || count != expected) { phase.set(Phase.Blame); mailbox.broadcast( messages.make().attach(Blame.ShuffleFailure(players.get(N))), phase.get()); return null; } return decrypted; }