@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(); }
/** * Returns a byte array containing the sequence of bits written. * * @return The byte array containing the written bits. */ public byte[] toByteArray() { // write any bits left in the buffer to the stream writeCurrentByte(); // retrieve the byte array from the stream byte[] byteArray = byteStream.toByteArray(); // reset stream for the sake of consistency byteStream.reset(); // return the byte array return byteArray; }
@Override public byte[] fragmentToByteArray() { DatagramWriter writer = new DatagramWriter(); writer.writeBytes(verifyData); return writer.toByteArray(); }
private static void writeBytes(final byte[] bytesToWrite, final DatagramWriter writer) { writer.write(bytesToWrite.length, 16); writer.writeBytes(bytesToWrite); }
@Override public byte[] toByteArray() { DatagramWriter writer = new DatagramWriter(); writer.write(CCSProtocolType.getCode(), CCS_BITS); return writer.toByteArray(); }
@Override protected void addExtensionData(final DatagramWriter writer) { if (serverNames == null) { writer.write(0, LENGTH_BITS); } else { writer.write(serverNames.getEncodedLength() + 2, LENGTH_BITS); //extension_length writer.write(serverNames.getEncodedLength(), LIST_LENGTH_BITS); //server_names_list_length for (ServerName serverName : serverNames) { writer.writeByte(serverName.getType().getCode()); // name type writer.write(serverName.getName().length, LENGTH_BITS); // name length writer.writeBytes(serverName.getName()); // name } } }
writer.write(protocolVersion.getMajor(), 8); writer.write(protocolVersion.getMinor(), 8); writer.write(cipherSuite.getCode(), CipherSuite.CIPHER_SUITE_BITS); writer.write(compressionMethod.getCode(), CompressionMethod.COMPRESSION_METHOD_BITS); writer.writeBytes(masterSecret); writer.writeLong(timestamp, 32);
@Override public byte[] fragmentToByteArray() { DatagramWriter writer = new DatagramWriter(); switch (curveType) { // TODO add support for other curve types case EXPLICIT_PRIME: case EXPLICIT_CHAR2: break; case NAMED_CURVE: writeNamedCurve(writer); break; default: LOGGER.log(Level.WARNING, MSG_UNKNOWN_CURVE_TYPE, curveType); break; } return writer.toByteArray(); }
/** * Writes one byte to the stream. * * @param b * The byte to be written. */ public void writeByte(final byte b) { writeBytes(new byte[] { b }); }
private static void serializeIdentity(final PreSharedKeyIdentity principal, final DatagramWriter writer) { writer.writeByte(ClientAuthenticationType.PSK.code); writeBytes(principal.getName().getBytes(StandardCharsets.UTF_8), writer); }
private byte[] getNonce(byte[] implicitNonce, byte[] explicitNonce) { DatagramWriter writer = new DatagramWriter(); writer.writeBytes(implicitNonce); writer.writeBytes(explicitNonce); return writer.toByteArray(); }
/** * Transform a list of cipher suites into the appropriate bit-format. * * @param cipherSuites * the cipher suites * @return the byte[] */ public static byte[] listToByteArray(List<CipherSuite> cipherSuites) { DatagramWriter writer = new DatagramWriter(); for (CipherSuite cipherSuite : cipherSuites) { writer.write(cipherSuite.getCode(), CIPHER_SUITE_BITS); } return writer.toByteArray(); }
private void writeNamedCurve(DatagramWriter writer) { // http://tools.ietf.org/html/rfc4492#section-5.4 writer.write(NAMED_CURVE, CURVE_TYPE_BITS); writer.write(curveId, NAMED_CURVE_BITS); writer.write(pointEncoded.length, PUBLIC_LENGTH_BITS); writer.writeBytes(pointEncoded); // signature if (signatureEncoded != null) { // according to http://tools.ietf.org/html/rfc5246#section-A.7 the // signature algorithm must also be included writer.write(signatureAndHashAlgorithm.getHash().getCode(), HASH_ALGORITHM_BITS); writer.write(signatureAndHashAlgorithm.getSignature().getCode(), SIGNATURE_ALGORITHM_BITS); writer.write(signatureEncoded.length, SIGNATURE_LENGTH_BITS); writer.writeBytes(signatureEncoded); } }
private static void serializeSubjectInfo(final RawPublicKeyIdentity principal, final DatagramWriter writer) { writer.writeByte(ClientAuthenticationType.RPK.code); writeBytes(principal.getSubjectInfo(), writer); }
@Override public byte[] fragmentToByteArray() { DatagramWriter writer = new DatagramWriter(); writer.write(identityEncoded.length, IDENTITY_LENGTH_BITS); writer.writeBytes(identityEncoded); return writer.toByteArray(); }
/** * Calculates a MAC for use with CBC block ciphers as specified * by <a href="http://tools.ietf.org/html/rfc5246#section-6.2.3.2"> * RFC 5246, section 6.2.3.2</a>. * * @param conState the security parameters for calculating the MAC * @param content the data to calculate the MAC for * @return the MAC * @throws GeneralSecurityException if the MAC could not be calculated, * e.g. because the JVM does not support the cipher suite's * HMac algorithm */ private byte[] getBlockCipherMac(DTLSConnectionState conState, byte[] content) throws GeneralSecurityException { Mac hmac = Mac.getInstance(conState.getCipherSuite().getMacName()); hmac.init(conState.getMacKey()); DatagramWriter mac = new DatagramWriter(); mac.writeBytes(generateAdditionalData(content.length)); mac.writeBytes(content); return hmac.doFinal(mac.toByteArray()); }
/** * Takes a list of compression methods and creates the representing byte * stream. * * @param compressionMethods * the list of the compression methods * @return the corresponding byte array */ public static byte[] listToByteArray(List<CompressionMethod> compressionMethods) { DatagramWriter writer = new DatagramWriter(); for (CompressionMethod compressionMethod : compressionMethods) { writer.write(compressionMethod.getCode(), COMPRESSION_METHOD_BITS); } return writer.toByteArray(); }
@Override protected void serializeHeader(final DatagramWriter writer, final MessageHeader header) { writer.write(VERSION, VERSION_BITS); writer.write(header.getType().value, TYPE_BITS); writer.write(header.getToken().length, TOKEN_LENGTH_BITS); writer.write(header.getCode(), CODE_BITS); writer.write(header.getMID(), MESSAGE_ID_BITS); writer.writeBytes(header.getToken()); } }