List of usage examples for org.bouncycastle.crypto Commitment getCommitment
public byte[] getCommitment()
From source file:org.cryptoworkshop.ximix.node.mixnet.service.BoardHostingService.java
License:Apache License
private FutureTask<MessageReply> submitToHandle(Message message) { if (message instanceof CommandMessage) { switch (((CommandMessage) message).getType()) { case GENERATE_SEED: final SeedMessage seedMessage = SeedMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(seedMessage.getBoardName(), new Callable<MessageReply>() { @Override/*from ww w. ja v a 2s . com*/ public MessageReply call() throws Exception { String seedKey = seedMessage.getBoardName() + "." + seedMessage.getOperationNumber(); if (seedsAndWitnesses.containsKey(seedKey)) { return new MessageReply(MessageReply.Type.ERROR, new ErrorMessage("Duplicate seed generation request for operation " + seedMessage.getOperationNumber())); } // TODO: specify source of randomness SecureRandom random = new SecureRandom(); byte[] seed = new byte[64]; // largest we can manage with SHA-512 random.nextBytes(seed); GeneralHashCommitter sha512Committer = new GeneralHashCommitter(new SHA512Digest(), random); Commitment commitment = sha512Committer.commit(seed); seedsAndWitnesses.put(seedKey, new byte[][] { seed, commitment.getSecret() }); SeedCommitmentMessage seedCommitmentMessage = new SeedCommitmentMessage( seedMessage.getBoardName(), seedMessage.getOperationNumber(), commitment.getCommitment()); CMSSignedDataGenerator cmsGen = new CMSSignedDataGenerator(); KeyStore nodeCAStore = nodeContext.getNodeCAStore(); Certificate[] nodeCerts = nodeCAStore.getCertificateChain("nodeCA"); cmsGen.addSignerInfoGenerator(new JcaSimpleSignerInfoGeneratorBuilder().setProvider("BC") .build("SHA256withECDSA", (PrivateKey) nodeCAStore.getKey("nodeCA", new char[0]), (X509Certificate) nodeCerts[0])); for (Certificate cert : nodeCerts) { cmsGen.addCertificate(new JcaX509CertificateHolder((X509Certificate) cert)); } return new MessageReply(MessageReply.Type.OKAY, cmsGen .generate(new CMSProcessableByteArray(seedCommitmentMessage.getEncoded()), true) .toASN1Structure()); } }); case FETCH_SEED: final SeedMessage seedFetchMessage = SeedMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(seedFetchMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { String seedKey = seedFetchMessage.getBoardName() + "." + seedFetchMessage.getOperationNumber(); byte[][] seedAndWitness = seedsAndWitnesses.get(seedKey); if (seedAndWitness == null) { return new MessageReply(MessageReply.Type.ERROR, new ErrorMessage("Unknown seed requested for key: " + seedKey)); } return new MessageReply(MessageReply.Type.OKAY, new SeedAndWitnessMessage(seedAndWitness[0], seedAndWitness[1])); } }); case GET_BOARD_DETAILS: Callable<MessageReply> replyCallable = new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { String[] boardNames = boardRegistry.getBoardNames(); BoardDetailMessage[] details = new BoardDetailMessage[boardNames.length]; int count = 0; for (String boardName : boardNames) { BulletinBoard board = boardRegistry.getBoard(boardName); details[count++] = new BoardDetailMessage(boardName, nodeContext.getName(), board.size(), board.getBackupHost()); } return new MessageReply(MessageReply.Type.OKAY, new DERSequence(details)); } }; FutureTask<MessageReply> task = new FutureTask<>(replyCallable); boardExecutor.execute(task); return task; case GET_BOARD_HOST: final BoardMessage boardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(boardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { String boardHost = nodeContext.getBoardHost(boardMessage.getBoardName()); if (boardHost != null) { return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(boardHost)); } else { return new MessageReply(MessageReply.Type.OKAY, DERNull.INSTANCE); } } }); case ACTIVATE_BOARD: final BoardMessage activateBoardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(activateBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { boardRegistry.activateBoard(activateBoardMessage.getBoardName()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case SUSPEND_BOARD: final BoardMessage suspendBoardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(suspendBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { if (boardRegistry.isSuspended(suspendBoardMessage.getBoardName())) { return new MessageReply(MessageReply.Type.ERROR, new BoardErrorStatusMessage( suspendBoardMessage.getBoardName(), BoardErrorStatusMessage.Status.SUSPENDED)); } boardRegistry.suspendBoard(suspendBoardMessage.getBoardName()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case BOARD_CREATE: final CreateBoardMessage createBoardMessage = CreateBoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(createBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { if (boardRegistry.hasBoard(createBoardMessage.getBoardName())) { return new MessageReply(MessageReply.Type.ERROR, new BoardErrorStatusMessage(createBoardMessage.getBoardName(), BoardErrorStatusMessage.Status.ALREADY_EXISTS)); } if (createBoardMessage.getBackUpHost() != null) { boardRegistry.createBoard(createBoardMessage.getBoardName(), createBoardMessage.getBackUpHost()); } else { boardRegistry.createBoard(createBoardMessage.getBoardName()); } return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case BACKUP_BOARD_CREATE: final BoardMessage backupBoardCreateMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(backupBoardCreateMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { boardRegistry.createBackupBoard(backupBoardCreateMessage.getBoardName()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case BOARD_DOWNLOAD_LOCK: final BoardMessage downloadLockBoardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(downloadLockBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { if (boardRegistry.isLocked(downloadLockBoardMessage.getBoardName())) { return new MessageReply(MessageReply.Type.ERROR, new BoardErrorStatusMessage(downloadLockBoardMessage.getBoardName(), BoardErrorStatusMessage.Status.SUSPENDED)); } boardRegistry.downloadLock(downloadLockBoardMessage.getBoardName()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case BOARD_DOWNLOAD_UNLOCK: final BoardMessage downloadUnlockBoardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(downloadUnlockBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { boardRegistry.downloadUnlock(downloadUnlockBoardMessage.getBoardName()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case BOARD_SHUFFLE_LOCK: final BoardMessage shuffleLockBoardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(shuffleLockBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { if (boardRegistry.isLocked(shuffleLockBoardMessage.getBoardName())) { return new MessageReply(MessageReply.Type.ERROR, new BoardErrorStatusMessage(shuffleLockBoardMessage.getBoardName(), BoardErrorStatusMessage.Status.SUSPENDED)); } boardRegistry.shuffleLock(shuffleLockBoardMessage.getBoardName()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case BOARD_SHUFFLE_UNLOCK: final BoardMessage shuffleUnlockBoardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(shuffleUnlockBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { boardRegistry.shuffleUnlock(shuffleUnlockBoardMessage.getBoardName()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case FETCH_BOARD_STATUS: final TransitBoardMessage transitBoardMessage = TransitBoardMessage .getInstance(message.getPayload()); return boardExecutor.submitTask(transitBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { if (boardRegistry.isInTransit(transitBoardMessage.getOperationNumber(), transitBoardMessage.getBoardName(), transitBoardMessage.getStepNumber())) { return new MessageReply(MessageReply.Type.OKAY, new BoardStatusMessage( transitBoardMessage.getBoardName(), BoardStatusMessage.Status.IN_TRANSIT)); } if (boardRegistry.isComplete(transitBoardMessage.getOperationNumber(), transitBoardMessage.getBoardName(), transitBoardMessage.getStepNumber())) { return new MessageReply(MessageReply.Type.OKAY, new BoardStatusMessage( transitBoardMessage.getBoardName(), BoardStatusMessage.Status.COMPLETE)); } return new MessageReply(MessageReply.Type.OKAY, new BoardStatusMessage( transitBoardMessage.getBoardName(), BoardStatusMessage.Status.UNKNOWN)); } }); case FETCH_BOARD_COMPLETION_STATUS: final BoardMessage compStatusBoardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(compStatusBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { if (boardRegistry.isLocked(compStatusBoardMessage.getBoardName())) { return new MessageReply(MessageReply.Type.OKAY, new BoardStatusMessage(compStatusBoardMessage.getBoardName(), BoardStatusMessage.Status.IN_TRANSIT)); } return new MessageReply(MessageReply.Type.OKAY, new BoardStatusMessage( compStatusBoardMessage.getBoardName(), BoardStatusMessage.Status.COMPLETE)); } }); case START_SHUFFLE_AND_MOVE_BOARD_TO_NODE: final CopyAndMoveMessage startPandMmessage = CopyAndMoveMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(startPandMmessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { if (!boardRegistry.isShuffleLocked(startPandMmessage.getBoardName())) { return new MessageReply(MessageReply.Type.ERROR, new BoardErrorStatusMessage(startPandMmessage.getBoardName(), BoardErrorStatusMessage.Status.NOT_SHUFFLE_LOCKED)); } nodeContext.execute(new CopyAndMoveTask(nodeContext, boardRegistry, getPeerConnection(startPandMmessage.getDestinationNode()), startPandMmessage)); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case SHUFFLE_AND_MOVE_BOARD_TO_NODE: final PermuteAndMoveMessage pAndmMessage = PermuteAndMoveMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(pAndmMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { nodeContext.execute(new TransformShuffleAndMoveTask(nodeContext, boardRegistry, getPeerConnection(pAndmMessage.getDestinationNode()), pAndmMessage)); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case RETURN_TO_BOARD: final TransitBoardMessage returnToBoardMessage = TransitBoardMessage .getInstance(message.getPayload()); return boardExecutor.submitTask(returnToBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { nodeContext .execute(new ReturnToBoardTask(nodeContext, boardRegistry, returnToBoardMessage)); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case INITIATE_INTRANSIT_BOARD: final TransitBoardMessage initiateTransitBoardMessage = TransitBoardMessage .getInstance(message.getPayload()); return boardExecutor.submitTask(initiateTransitBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { boardRegistry.markInTransit(initiateTransitBoardMessage.getOperationNumber(), initiateTransitBoardMessage.getBoardName(), initiateTransitBoardMessage.getStepNumber()); boardRegistry.getTransitBoard(initiateTransitBoardMessage.getOperationNumber(), initiateTransitBoardMessage.getBoardName(), initiateTransitBoardMessage.getStepNumber()).clear(); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case TRANSFER_TO_BOARD: final BoardUploadBlockMessage uploadMessage = BoardUploadBlockMessage .getInstance(message.getPayload()); return boardExecutor.submitTask(uploadMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { boardRegistry.markInTransit(uploadMessage.getOperationNumber(), uploadMessage.getBoardName(), uploadMessage.getStepNumber()); boardRegistry .getTransitBoard(uploadMessage.getOperationNumber(), uploadMessage.getBoardName(), uploadMessage.getStepNumber()) .postMessageBlock(uploadMessage.getMessageBlock()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case UPLOAD_TO_BOARD: final BoardUploadBlockMessage uploadToBoardMessage = BoardUploadBlockMessage .getInstance(message.getPayload()); return boardExecutor.submitTask(uploadToBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() { boardRegistry.markInTransit(uploadToBoardMessage.getOperationNumber(), uploadToBoardMessage.getBoardName(), uploadToBoardMessage.getStepNumber()); boardRegistry.getBoard(uploadToBoardMessage.getBoardName()) .postMessageBlock(uploadToBoardMessage.getMessageBlock()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case CLEAR_BACKUP_BOARD: final BoardMessage backupBoardMessage = BoardMessage.getInstance(message.getPayload()); return boardExecutor.submitBackupTask(backupBoardMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() { // TODO: maybe backup the current backup locally? boardRegistry.getBackupBoard(backupBoardMessage.getBoardName()).clear(); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case TRANSFER_TO_BACKUP_BOARD: final BoardUploadIndexedMessage uploadIndexedMessage = BoardUploadIndexedMessage .getInstance(message.getPayload()); return boardExecutor.submitBackupTask(uploadIndexedMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() { boardRegistry.getBackupBoard(uploadIndexedMessage.getBoardName()) .postMessages(uploadIndexedMessage.getData()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case TRANSFER_TO_BOARD_ENDED: final TransitBoardMessage transferToBoardEndedMessage = TransitBoardMessage .getInstance(message.getPayload()); return boardExecutor.submitTask(transferToBoardEndedMessage.getBoardName(), new Callable<MessageReply>() { public MessageReply call() { boardRegistry.markCompleted(transferToBoardEndedMessage.getOperationNumber(), transferToBoardEndedMessage.getBoardName(), transferToBoardEndedMessage.getStepNumber()); return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); case DOWNLOAD_BOARD_CONTENTS: final BoardDownloadMessage downloadRequest = BoardDownloadMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(downloadRequest.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() { if (!boardRegistry.isDownloadLocked(downloadRequest.getBoardName())) { return new MessageReply(MessageReply.Type.ERROR, new BoardErrorStatusMessage(downloadRequest.getBoardName(), BoardErrorStatusMessage.Status.NOT_DOWNLOAD_LOCKED)); } BulletinBoard board = boardRegistry.getBoard(downloadRequest.getBoardName()); PostedMessageBlock messages = board.removeMessages( new PostedMessageBlock.Builder(downloadRequest.getMaxNumberOfMessages())); return new MessageReply(MessageReply.Type.OKAY, messages); } }); case DOWNLOAD_SHUFFLE_TRANSCRIPT: final TranscriptDownloadMessage transcriptDownloadMessage = TranscriptDownloadMessage .getInstance(message.getPayload()); final BulletinBoard transitBoard = boardRegistry.getTransitBoard( transcriptDownloadMessage.getOperationNumber(), transcriptDownloadMessage.getStepNo()); return boardExecutor.submitTask(transitBoard.getName(), new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { boolean isCopyBoard = isCopyBoard(transitBoard); String challengerKey = getChallengerKey(transcriptDownloadMessage, isCopyBoard || (transitBoard.size() == 1)); IndexNumberGenerator challenger = challengers.get(challengerKey); if (challenger == null) { if (transitBoard.size() == 1) { challenger = new SerialChallenger(1, transcriptDownloadMessage.getStepNo(), transcriptDownloadMessage.getSeed()); } else if (TranscriptType.GENERAL == transcriptDownloadMessage.getType()) { challenger = new SerialChallenger( transitBoard.transcriptSize(TranscriptType.GENERAL), transcriptDownloadMessage.getStepNo(), transcriptDownloadMessage.getSeed()); } else { SHA512Digest seedDigest = new SHA512Digest(); byte[] challengeSeed = new byte[seedDigest.getDigestSize()]; if (transcriptDownloadMessage.getSeed() != null) { byte[] originalSeed = transcriptDownloadMessage.getSeed(); nodeContext.getEventNotifier().notify(EventNotifier.Level.INFO, "Original seed: " + new String(Hex.encode(originalSeed))); // we follow the formulation in "Randomized Partial Checking Revisited" where the seed is // modified by the step number, the one difference being that in our case this will only take // place at the start of a pairing, or on an individual step. seedDigest.update(originalSeed, 0, originalSeed.length); int stepNo = transcriptDownloadMessage.getStepNo(); seedDigest.update((byte) (stepNo >>> 24)); seedDigest.update((byte) (stepNo >>> 16)); seedDigest.update((byte) (stepNo >>> 8)); seedDigest.update((byte) stepNo); seedDigest.doFinal(challengeSeed, 0); } nodeContext.getEventNotifier().notify(EventNotifier.Level.INFO, "Challenge seed: " + transcriptDownloadMessage.getStepNo() + " " + new String(Hex.encode(challengeSeed))); try { if (isCopyBoard) { challenger = new SerialChallenger( transitBoard.transcriptSize(transcriptDownloadMessage.getType()), transcriptDownloadMessage.getStepNo(), challengeSeed); } else if (transcriptDownloadMessage.isWithPairing()) { // TODO: maybe configure int chunkSize = 100; IndexNumberGenerator sourceGenerator = new SerialChallenger( transitBoard.size(), 0, null); int[] indexes = new int[transitBoard.size()]; int count = 0; while (sourceGenerator.hasNext()) { TranscriptBlock transcript = transitBoard.fetchTranscriptData( TranscriptType.WITNESSES, sourceGenerator, new TranscriptBlock.Builder(0, chunkSize)); for (Enumeration en = transcript.getDetails().getObjects(); en .hasMoreElements();) { PostedData msg = PostedData.getInstance(en.nextElement()); indexes[count++] = MessageCommitment.getInstance(msg.getData()) .getNewIndex(); } } challenger = new PairedChallenger(indexes, transcriptDownloadMessage.getStepNo(), (IndexNumberGenerator) witnessChallengerConstructor.newInstance( transitBoard.transcriptSize( transcriptDownloadMessage.getType()), transcriptDownloadMessage.getStepNo(), challengeSeed)); } else { challenger = (IndexNumberGenerator) witnessChallengerConstructor .newInstance( transitBoard.transcriptSize( transcriptDownloadMessage.getType()), transcriptDownloadMessage.getStepNo(), challengeSeed); } } catch (Exception e) { nodeContext.getEventNotifier().notify(EventNotifier.Level.ERROR, e); return new MessageReply(MessageReply.Type.ERROR, new ErrorMessage( "Unable to create challenger on " + nodeContext.getName())); } } challengers.put(challengerKey, challenger); } if (challenger instanceof PairedChallenger) { ((PairedChallenger) challenger).setStepNo(transcriptDownloadMessage.getStepNo()); } TranscriptBlock transcriptBlock = transitBoard.fetchTranscriptData( transcriptDownloadMessage.getType(), challenger, new TranscriptBlock.Builder(transcriptDownloadMessage.getStepNo(), transcriptDownloadMessage.getMaxNumberOfMessages())); String generatorKey = getTranscriptGeneratorKey(transcriptDownloadMessage); TranscriptGenerator transGen = transcriptGenerators.get(generatorKey); if (transGen == null) { transGen = new TranscriptGenerator(); transcriptGenerators.put(generatorKey, transGen); } if (transcriptBlock.size() != 0) { for (Enumeration en = transcriptBlock.getDetails().getObjects(); en .hasMoreElements();) { transGen.writeFragment(((ASN1Object) en.nextElement()).getEncoded()); } return new MessageReply(MessageReply.Type.OKAY, new TranscriptTransferMessage( transcriptBlock.getStepNo(), transGen.getFragment())); } if (transGen.hasData()) { transGen.finish(); return new MessageReply(MessageReply.Type.OKAY, new TranscriptTransferMessage( transcriptBlock.getStepNo(), transGen.getFragment())); } // end of data return new MessageReply(MessageReply.Type.OKAY, new TranscriptTransferMessage(transcriptBlock.getStepNo())); } }); case DOWNLOAD_SHUFFLE_TRANSCRIPT_STEPS: final TranscriptQueryMessage transcriptQueryMessage = TranscriptQueryMessage .getInstance(message.getPayload()); FutureTask<MessageReply> dstsTask = new FutureTask(new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { List<String> transitBoardNames = boardRegistry .getTransitBoardNames(transcriptQueryMessage.getOperationNumber()); int[] stepNos = new int[transitBoardNames.size()]; String boardName = ""; for (int i = 0; i != stepNos.length; i++) { String name = transitBoardNames.get(i); boardName = name.substring(name.indexOf('.') + 1, name.lastIndexOf('.')); stepNos[i] = Integer.parseInt(name.substring(name.lastIndexOf('.') + 1)); } return new MessageReply(MessageReply.Type.OKAY, new TranscriptQueryResponse(queryCounter.incrementAndGet(), boardName, stepNos)); } }); nodeContext.getExecutorService().submit(dstsTask); return dstsTask; default: FutureTask<MessageReply> eTask = new FutureTask(new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { return new MessageReply(MessageReply.Type.ERROR, new ErrorMessage("Unknown command")); } }); nodeContext.getExecutorService().submit(eTask); return eTask; } } else { switch (((ClientMessage) message).getType()) { case UPLOAD_TO_BOARD: final BoardUploadMessage uploadMessage = BoardUploadMessage.getInstance(message.getPayload()); return boardExecutor.submitTask(uploadMessage.getBoardName(), new Callable<MessageReply>() { @Override public MessageReply call() { if (boardRegistry.isLocked(uploadMessage.getBoardName())) { return new MessageReply(MessageReply.Type.ERROR, new BoardErrorStatusMessage( uploadMessage.getBoardName(), BoardErrorStatusMessage.Status.SUSPENDED)); } byte[][] messages = uploadMessage.getData(); if (messages.length == 1) { boardRegistry.getBoard(uploadMessage.getBoardName()).postMessage(messages[0]); } else { boardRegistry.getBoard(uploadMessage.getBoardName()).postMessages(messages); } return new MessageReply(MessageReply.Type.OKAY, new DERUTF8String(nodeContext.getName())); } }); default: FutureTask<MessageReply> eTask = new FutureTask(new Callable<MessageReply>() { @Override public MessageReply call() throws Exception { return new MessageReply(MessageReply.Type.ERROR, new DERUTF8String("Unknown command")); } }); nodeContext.getExecutorService().submit(eTask); return eTask; } } }
From source file:org.cryptoworkshop.ximix.node.mixnet.shuffle.TransformShuffleAndMoveTask.java
License:Apache License
public void run() { BulletinBoard board = boardRegistry.getTransitBoard(message.getOperationNumber(), message.getBoardName(), message.getStepNumber());/*from www .j ava 2 s.c om*/ Transform transform = boardRegistry.getTransform(message.getTransformName()); IndexCommitter committer = new IndexCommitter(new SHA256Digest(), new SecureRandom()); try { PostedMessageBlock.Builder messageBlockBuilder = new PostedMessageBlock.Builder(20); // TODO: make configurable MessageWitnessBlock.Builder messageWitnessBlockBuilder = new MessageWitnessBlock.Builder( messageBlockBuilder.capacity()); RandomIndexNumberGenerator indexGen = new RandomIndexNumberGenerator(board.size(), new SecureRandom()); // TODO: specify random int nextStepNumber = message.getStepNumber() + 1; if (message.getKeyID() != null) { SubjectPublicKeyInfo keyInfo = nodeContext.getPublicKey(message.getKeyID()); ECPublicKeyParameters key; if (keyInfo != null) { key = (ECPublicKeyParameters) PublicKeyFactory.createKey(keyInfo); } else { // see if the key exists elsewhere on the MIXNET. FetchPublicKeyMessage fetchMessage = new FetchPublicKeyMessage(message.getKeyID()); MessageReply reply = nodeContext.getPeerMap().values().iterator().next() .sendMessage(ClientMessage.Type.FETCH_PUBLIC_KEY, fetchMessage); if (reply.getPayload() != null) { key = (ECPublicKeyParameters) PublicKeyFactory .createKey(reply.getPayload().toASN1Primitive().getEncoded()); } else { nodeContext.getEventNotifier().notify(EventNotifier.Level.ERROR, "Unable to find public key " + message.getKeyID()); return; } } transform.init(key); for (PostedMessage postedMessage : board) { byte[] transformed = transform.transform(postedMessage.getMessage()); int newIndex = indexGen.nextIndex(); Commitment commitment = committer.commit(newIndex); messageBlockBuilder.add(newIndex, transformed, commitment.getCommitment()); messageWitnessBlockBuilder.add(postedMessage.getIndex(), new MessageCommitment(newIndex, commitment.getSecret(), transform.getLastDetail())); if (messageBlockBuilder.isFull()) { processMessageBlock(messageBlockBuilder, nextStepNumber); processWitnessBlock(board, messageWitnessBlockBuilder); } } } else { for (PostedMessage postedMessage : board) { int newIndex = indexGen.nextIndex(); Commitment commitment = committer.commit(newIndex); messageBlockBuilder.add(newIndex, postedMessage.getMessage(), commitment.getCommitment()); messageWitnessBlockBuilder.add(postedMessage.getIndex(), new MessageCommitment(newIndex, commitment.getSecret())); if (messageBlockBuilder.isFull()) { processMessageBlock(messageBlockBuilder, nextStepNumber); processWitnessBlock(board, messageWitnessBlockBuilder); } } } if (!messageBlockBuilder.isEmpty()) { processMessageBlock(messageBlockBuilder, nextStepNumber); processWitnessBlock(board, messageWitnessBlockBuilder); } MessageReply reply = peerConnection.sendMessage(CommandMessage.Type.TRANSFER_TO_BOARD_ENDED, new TransitBoardMessage(message.getOperationNumber(), board.getName(), nextStepNumber)); if (reply.getType() != MessageReply.Type.OKAY) { nodeContext.getEventNotifier().notify(EventNotifier.Level.ERROR, "End of transfer message failed: " + reply.interpretPayloadAsError()); } } catch (ServiceConnectionException e) { nodeContext.getEventNotifier().notify(EventNotifier.Level.ERROR, "Connection failed: " + e.getMessage(), e); } catch (Exception e) { nodeContext.getEventNotifier().notify(EventNotifier.Level.ERROR, "TransformShuffleAndMoveTask connection failed: " + e.getMessage(), e); } }