Ejemplo n.º 1
0
        private SenderMessageKey getSenderKey(SenderKeyState senderKeyState, uint iteration)
        {
            SenderChainKey senderChainKey = senderKeyState.getSenderChainKey();

            if (senderChainKey.getIteration() > iteration)
            {
                if (senderKeyState.hasSenderMessageKey(iteration))
                {
                    return(senderKeyState.removeSenderMessageKey(iteration));
                }
                else
                {
                    throw new DuplicateMessageException("Received message with old counter: " +
                                                        senderChainKey.getIteration() + " , " + iteration);
                }
            }

            //Avoiding a uint overflow
            uint senderChainKeyIteration = senderChainKey.getIteration();

            if ((iteration > senderChainKeyIteration) && (iteration - senderChainKeyIteration > 2000))
            {
                throw new InvalidMessageException("Over 2000 messages into the future!");
            }

            while (senderChainKey.getIteration() < iteration)
            {
                senderKeyState.addSenderMessageKey(senderChainKey.getSenderMessageKey());
                senderChainKey = senderChainKey.getNext();
            }

            senderKeyState.setSenderChainKey(senderChainKey.getNext());
            return(senderChainKey.getSenderMessageKey());
        }