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