public EncryptedCommunityCards listenForCommunityCards()
			throws InvalidKeyException, IllegalBlockSizeException,
			BadPaddingException, NoSuchAlgorithmException,
			InvalidSubscriptionException, IOException, InterruptedException {

		final Subscription encSub = elvin.subscribe(NOT_TYPE + " == '"
				+ COMMUNITY_CARDS + "' && " + GAME_ID + " == '"
				+ gameHost.getID() + "'");
		Notification not;

		encSub.addListener(new NotificationListener() {
			public void notificationReceived(NotificationEvent e) {

				byte[] tmpBytes = (byte[]) e.notification
						.get(ENCRYPTED_COM_CARDS);

				try {
					encryptedCommunityCards = (EncryptedCommunityCards) Passable
							.readObject(tmpBytes);
					if (!sigServ.validateSignature(encryptedCommunityCards,
							gameHost.getPublicKey())) {
						// sig failed!
						callCheat(SIGNATURE_FAILED);
						System.exit(0);
					}

				} catch (Exception e1) {
					shutdown();
					System.exit(0);
				}

				synchronized (encSub) {
					encSub.notify();
				}

			}
		});

		not = new Notification();
		not.set(NOT_TYPE, HAVE_MY_HAND);
		not.set(GAME_ID, gameHost.getID());
		not.set(SOURCE_USER, user.getID());
		not.set(SIGNATURE,
				sigServ.createVerifiedSignature(SigService.HAVE_HAND_NONCE));

		synchronized (encSub) {
			elvin.send(not);
			// wait until received reply
			encSub.wait();
		}

		encSub.remove();
		System.out.println("Got Community Cards!");
		// System.out.println(new
		// String(encryptedCommunityCards.data.get(0).cardData));

		return encryptedCommunityCards;

	}