Example usage for org.bouncycastle.crypto Commitment getCommitment

List of usage examples for org.bouncycastle.crypto Commitment getCommitment

Introduction

In this page you can find the example usage for org.bouncycastle.crypto Commitment getCommitment.

Prototype

public byte[] getCommitment() 

Source Link

Document

The sealed commitment.

Usage

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);
    }
}