Skip to content

Commit 8c4da16

Browse files
More test cases for java/non-constant-time-crypto-comparison
1 parent 295fd68 commit 8c4da16

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

java/ql/test/experimental/query-tests/security/CWE-208/NonConstantTimeCryptoComparison.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ edges
1010
| NonConstantTimeCryptoComparison.java:107:52:107:54 | tag : ByteBuffer | NonConstantTimeCryptoComparison.java:109:40:109:42 | tag : ByteBuffer |
1111
| NonConstantTimeCryptoComparison.java:109:40:109:42 | tag : ByteBuffer | NonConstantTimeCryptoComparison.java:109:40:109:50 | array(...) |
1212
| NonConstantTimeCryptoComparison.java:119:52:119:54 | tag : ByteBuffer | NonConstantTimeCryptoComparison.java:120:49:120:51 | tag |
13+
| NonConstantTimeCryptoComparison.java:136:22:136:46 | doFinal(...) : byte[] | NonConstantTimeCryptoComparison.java:137:40:137:42 | tag |
1314
nodes
1415
| NonConstantTimeCryptoComparison.java:19:28:19:44 | doFinal(...) : byte[] | semmle.label | doFinal(...) : byte[] |
1516
| NonConstantTimeCryptoComparison.java:20:43:20:51 | actualMac | semmle.label | actualMac |
@@ -31,6 +32,8 @@ nodes
3132
| NonConstantTimeCryptoComparison.java:109:40:109:50 | array(...) | semmle.label | array(...) |
3233
| NonConstantTimeCryptoComparison.java:119:52:119:54 | tag : ByteBuffer | semmle.label | tag : ByteBuffer |
3334
| NonConstantTimeCryptoComparison.java:120:49:120:51 | tag | semmle.label | tag |
35+
| NonConstantTimeCryptoComparison.java:136:22:136:46 | doFinal(...) : byte[] | semmle.label | doFinal(...) : byte[] |
36+
| NonConstantTimeCryptoComparison.java:137:40:137:42 | tag | semmle.label | tag |
3437
#select
3538
| NonConstantTimeCryptoComparison.java:20:43:20:51 | actualMac | NonConstantTimeCryptoComparison.java:19:28:19:44 | doFinal(...) : byte[] | NonConstantTimeCryptoComparison.java:20:43:20:51 | actualMac | Using a non-constant time algorithm for comparing results of a cryptographic operation. |
3639
| NonConstantTimeCryptoComparison.java:29:66:29:93 | castToObjectArray(...) | NonConstantTimeCryptoComparison.java:28:28:28:40 | doFinal(...) : byte[] | NonConstantTimeCryptoComparison.java:29:66:29:93 | castToObjectArray(...) | Using a non-constant time algorithm for comparing results of a cryptographic operation. |

java/ql/test/experimental/query-tests/security/CWE-208/NonConstantTimeCryptoComparison.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,23 @@ public boolean saferCheckCiphertext(Socket socket, byte[] plaintext, Key key) th
129129
return MessageDigest.isEqual(expected, tag);
130130
}
131131

132+
// GOOD: compare ciphertexts using a constant time method, but no user input
133+
public boolean noUserInputWhenCheckingCiphertext(byte[] expected, byte[] plaintext, Key key) throws Exception {
134+
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
135+
cipher.init(Cipher.ENCRYPT_MODE, key);
136+
byte[] tag = cipher.doFinal(plaintext);
137+
return Arrays.equals(expected, tag);
138+
}
139+
140+
// GOOD: compare MAC with constant using a constant time method
141+
public boolean compareMacWithConstant(Socket socket) throws Exception {
142+
Mac mac = Mac.getInstance("HmacSHA256");
143+
byte[] data = new byte[1024];
144+
socket.getInputStream().read(data);
145+
byte[] actualMac = mac.doFinal(data);
146+
return "constant".equals(new String(actualMac));
147+
}
148+
132149
private static Object[] castToObjectArray(byte[] array) {
133150
Object[] result = new Object[array.length];
134151
for (int i = 0; i < array.length; i++) {

0 commit comments

Comments
 (0)