diff --git a/src/main/java/com/neovisionaries/ws/client/Misc.java b/src/main/java/com/neovisionaries/ws/client/Misc.java index 097bb97..5049a70 100644 --- a/src/main/java/com/neovisionaries/ws/client/Misc.java +++ b/src/main/java/com/neovisionaries/ws/client/Misc.java @@ -29,7 +29,6 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.net.URI; -import java.security.SecureRandom; import java.util.Collection; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -37,9 +36,6 @@ class Misc { - private static final SecureRandom sRandom = new SecureRandom(); - - private Misc() { } @@ -107,28 +103,6 @@ public static String toStringUTF8(byte[] bytes, int offset, int length) } - /** - * Fill the given buffer with random bytes. - */ - public static byte[] nextBytes(byte[] buffer) - { - sRandom.nextBytes(buffer); - - return buffer; - } - - - /** - * Create a buffer of the given size filled with random bytes. - */ - public static byte[] nextBytes(int nBytes) - { - byte[] buffer = new byte[nBytes]; - - return nextBytes(buffer); - } - - /** * Convert a WebSocket opcode into a string representation. */ diff --git a/src/main/java/com/neovisionaries/ws/client/Security.java b/src/main/java/com/neovisionaries/ws/client/Security.java new file mode 100644 index 0000000..fb8d248 --- /dev/null +++ b/src/main/java/com/neovisionaries/ws/client/Security.java @@ -0,0 +1,46 @@ +package com.neovisionaries.ws.client; + +import java.security.SecureRandom; + +/** + * WebSocket Security. + */ +public final class Security { + + private final SecureRandom sRandom; + + private static Security instance; + + private Security() { + sRandom = new SecureRandom(); + } + + /** + * Returns the security instance. + * + * @return security instance. + */ + public static Security getInstance() { + if (instance == null) { + instance = new Security(); + } + return instance; + } + + /** + * Fill the given buffer with random bytes. + */ + public byte[] nextBytes(byte[] buffer) { + sRandom.nextBytes(buffer); + return buffer; + } + + /** + * Create a buffer of the given size filled with random bytes. + */ + public byte[] nextBytes(int nBytes) { + byte[] buffer = new byte[nBytes]; + return nextBytes(buffer); + } + +} \ No newline at end of file diff --git a/src/main/java/com/neovisionaries/ws/client/WebSocket.java b/src/main/java/com/neovisionaries/ws/client/WebSocket.java index 4690263..cdc3da2 100644 --- a/src/main/java/com/neovisionaries/ws/client/WebSocket.java +++ b/src/main/java/com/neovisionaries/ws/client/WebSocket.java @@ -3395,7 +3395,7 @@ private static String generateWebSocketKey() byte[] data = new byte[16]; // "randomly selected" - Misc.nextBytes(data); + Security.getInstance().nextBytes(data); // "base64-encoded" return Base64.encode(data); diff --git a/src/main/java/com/neovisionaries/ws/client/WebSocketOutputStream.java b/src/main/java/com/neovisionaries/ws/client/WebSocketOutputStream.java index 02a9bc4..aa69b0a 100644 --- a/src/main/java/com/neovisionaries/ws/client/WebSocketOutputStream.java +++ b/src/main/java/com/neovisionaries/ws/client/WebSocketOutputStream.java @@ -45,7 +45,7 @@ public void write(WebSocketFrame frame) throws IOException writeFrameExtendedPayloadLength(frame); // Generate a random masking key. - byte[] maskingKey = Misc.nextBytes(4); + byte[] maskingKey = Security.getInstance().nextBytes(4); // Write the masking key. write(maskingKey);