Skip to content

Commit dcd8d91

Browse files
Optimization for start time
Change-Id: I1e098f71e727277f3fc170522f30fbfce88bb9ea
1 parent a3ebf26 commit dcd8d91

2 files changed

Lines changed: 51 additions & 33 deletions

File tree

AndroidSocketIO/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dependencies {
2929
androidTestCompile fileTree(dir: 'src/androidTest/libs', include: '*.jar')
3030
}
3131

32-
def baseVersionName = "1.1.2"
32+
def baseVersionName = "1.1.3"
3333
if (project.hasProperty("versionSuffix")) {
3434
project.ext.versionSuffix = project.versionSuffix
3535
} else {

AndroidSocketIO/src/main/java/com/appunite/websocket/WebSocket.java

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,52 @@
5252
*
5353
*/
5454
public class WebSocket {
55+
56+
public static class SecureRandomProvider {
57+
58+
private boolean mError = false;
59+
private SecureRandom mSecureRandom;
60+
61+
62+
public synchronized Optional<SecureRandom> getSecureRandom() {
63+
if (mError) {
64+
return Optional.absent();
65+
}
66+
if (mSecureRandom != null) {
67+
return Optional.of(mSecureRandom);
68+
}
69+
try {
70+
mSecureRandom = SecureRandom.getInstance("SHA1PRNG");
71+
return Optional.of(mSecureRandom);
72+
} catch (NoSuchAlgorithmException e) {
73+
// if we do not have secure random we have to leave data unmasked
74+
mError = true;
75+
return Optional.absent();
76+
}
77+
}
78+
79+
public synchronized String generateHandshakeSecret() {
80+
final Optional<SecureRandom> secureRandom = getSecureRandom();
81+
82+
byte[] nonce = new byte[16];
83+
if (secureRandom.isPresent()) {
84+
secureRandom.get().nextBytes(nonce);
85+
} else {
86+
Arrays.fill(nonce, (byte) 0);
87+
}
88+
return Base64.encodeToString(nonce, Base64.NO_WRAP);
89+
}
90+
91+
public synchronized Optional<byte[]> generateMask() {
92+
final Optional<SecureRandom> secureRandom = getSecureRandom();
93+
if (!secureRandom.isPresent())
94+
return Optional.absent();
95+
96+
byte[] bytes = new byte[4];
97+
secureRandom.get().nextBytes(bytes);
98+
return Optional.of(bytes);
99+
}
100+
}
55101

56102
// WebSocket states
57103
private enum State {
@@ -82,8 +128,7 @@ private enum State {
82128
// Not need to be locked
83129
private final WebSocketListener mListener;
84130

85-
// Should be locked via self
86-
private final Optional<SecureRandom> mSecureRandom;
131+
private final SecureRandomProvider mSecureRandomProvider;
87132

88133
private final Object mLockObj = new Object(); // 1
89134

@@ -116,19 +161,7 @@ private enum State {
116161
public WebSocket(WebSocketListener listener) {
117162
checkArgument(listener != null, "Lister cannot be null");
118163
this.mListener = listener;
119-
120-
SecureRandom secureRandom;
121-
try {
122-
secureRandom = SecureRandom.getInstance("SHA1PRNG");
123-
} catch (NoSuchAlgorithmException e) {
124-
// if we do not have secure random we have to leave data unmasked
125-
secureRandom = null;
126-
}
127-
if (secureRandom == null) {
128-
mSecureRandom = Optional.absent();
129-
} else {
130-
mSecureRandom = Optional.of(secureRandom);
131-
}
164+
mSecureRandomProvider = new SecureRandomProvider();
132165
}
133166

134167
/**
@@ -421,14 +454,7 @@ private void readPayload(boolean fin, int opcode,
421454
* @return 4 bit random mask
422455
*/
423456
private Optional<byte[]> generateMask() {
424-
synchronized (mSecureRandom) {
425-
if (!mSecureRandom.isPresent())
426-
return Optional.absent();
427-
428-
byte[] bytes = new byte[4];
429-
mSecureRandom.get().nextBytes(bytes);
430-
return Optional.of(bytes);
431-
}
457+
return mSecureRandomProvider.generateMask();
432458
}
433459

434460
/**
@@ -699,15 +725,7 @@ private static boolean verifyHandshakeAcceptValue(String key,
699725
* @return random handshake key
700726
*/
701727
private String generateHandshakeSecret() {
702-
synchronized (mSecureRandom) {
703-
byte[] nonce = new byte[16];
704-
if (mSecureRandom.isPresent()) {
705-
mSecureRandom.get().nextBytes(nonce);
706-
} else {
707-
Arrays.fill(nonce, (byte) 0);
708-
}
709-
return Base64.encodeToString(nonce, Base64.NO_WRAP);
710-
}
728+
return mSecureRandomProvider.generateHandshakeSecret();
711729
}
712730

713731
/**

0 commit comments

Comments
 (0)