public void verifyCommunityCards(final CommunityCards myComCards)
			throws InvalidSubscriptionException, IOException,
			InterruptedException, InvalidKeyException,
			IllegalBlockSizeException, BadPaddingException,
			NoSuchAlgorithmException {
		
		// if anyone disagrees with the deck they will call cheat
		final Subscription encSub = elvin.subscribe(NOT_TYPE + " == '"
				+ RAW_COMMUNITY_CARDS_BC + "' && " + GAME_ID + " == '"
				+ gameHost.getID() + "'");
		Notification not;

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

				CommunityCards comCards;
				byte[] tmpBytes = (byte[]) e.notification
						.get(RAW_COMMUNITY_CARDS);

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

					// check the cards are the same as yours
					for (int i = 0; i < CommunityCards.NUM_CARDS; i++) {
						if (comCards.data.get(i).cardType != myComCards.data
								.get(i).cardType
								|| !comCards.data.get(i).suit
										.equals(myComCards.data.get(i).suit)) {
							callCheat(COMMUNITY_CARDS_DIFFER);
						}
					}

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

					elvin.send(not);

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

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

			}
		});

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

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

		encSub.remove();

	}