@Override public byte[] fragmentToByteArray() { DatagramWriter writer = new DatagramWriter(); // TODO only true, if the public value encoding is explicit (not in the // client's certificate), see // http://tools.ietf.org/html/rfc4492#section-5.7 int length = pointEncoded.length; writer.write(length, LENGTH_BITS); writer.writeBytes(pointEncoded); return writer.toByteArray(); }
private void notifyEvictionListeners(V session) { for (EvictionListener<V> listener : evictionListeners) { listener.onEviction(session); } }
private byte[] getNonce(byte[] implicitNonce, byte[] explicitNonce) { DatagramWriter writer = new DatagramWriter(); writer.writeBytes(implicitNonce); writer.writeBytes(explicitNonce); return writer.toByteArray(); }
/** * Generates the explicit part of the nonce to be used with the AEAD Cipher. * * <a href="http://tools.ietf.org/html/rfc6655#section-3">RFC6655, Section 3</a> * encourages the use of the session's 16bit epoch value concatenated * with a monotonically increasing 48bit sequence number as the explicit nonce. * * @return the 64-bit explicit nonce constructed from the epoch and sequence number */ private byte[] generateExplicitNonce() { //TODO: re-factor to use simple byte array manipulation instead of using bit-based DatagramWriter DatagramWriter writer = new DatagramWriter(); writer.write(epoch, EPOCH_BITS); writer.writeLong(sequenceNumber, SEQUENCE_NUMBER_BITS); return writer.toByteArray(); }
private static void writeBytes(final byte[] bytesToWrite, final DatagramWriter writer) { writer.write(bytesToWrite.length, 16); writer.writeBytes(bytesToWrite); }
/** * Reads the next byte from the stream. * * @return The next byte. */ public byte readNextByte() { byte[] bytes = readBytes(1); return bytes[0]; }
/** * Writes one byte to the stream. * * @param b * The byte to be written. */ public void writeByte(final byte b) { writeBytes(new byte[] { b }); }
@Override public synchronized int remainingCapacity() { return connections.remainingCapacity(); }
@Override public synchronized Connection get(final InetSocketAddress peerAddress) { return connections.get(peerAddress); }
private void givenABuffer(byte[] buffer) { reader = new DatagramReader(buffer); } }
private synchronized Connection findLocally(final SessionId id) { return connections.find(new Predicate<Connection>() { @Override public boolean accept(final Connection connection) { DTLSSession session = connection.getEstablishedSession(); return session != null && id.equals(session.getSessionIdentifier()); } }); }
@Override public final synchronized void clear() { connections.clear(); // TODO: does it make sense to clear the SessionCache as well? }
private void initLinkedList() { header = new CacheEntry<>(null, null, -1); header.after = header.before = header; }
@Override public DatagramSocketImpl createDatagramSocketImpl() { return new DirectDatagramSocketImpl(); } }
@Override public byte[] fragmentToByteArray() { DatagramWriter writer = new DatagramWriter(); writer.write(identityEncoded.length, IDENTITY_LENGTH_BITS); writer.writeBytes(identityEncoded); return writer.toByteArray(); }
@Override public byte[] fragmentToByteArray() { DatagramWriter writer = new DatagramWriter(); writer.writeBytes(verifyData); return writer.toByteArray(); }
/** * Reads the complete sequence of bytes left in the stream. * * @return The sequence of bytes left in the stream. */ public byte[] readBytesLeft() { return readBytes(-1); }
@Override public byte[] fragmentToByteArray() { DatagramWriter writer = new DatagramWriter(); writer.write(hintEncoded.length, IDENTITY_HINT_LENGTH_BITS); writer.writeBytes(hintEncoded); return writer.toByteArray(); }