Skip to content

Commit 67579dd

Browse files
Added tests for NotConstantTimeCryptoComparison.ql
1 parent c2c85d3 commit 67579dd

File tree

3 files changed

+93
-0
lines changed

3 files changed

+93
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
edges
2+
| NotConstantTimeCryptoComparison.java:14:28:14:44 | doFinal(...) : byte[] | NotConstantTimeCryptoComparison.java:15:43:15:51 | actualMac |
3+
| NotConstantTimeCryptoComparison.java:28:36:28:50 | digest(...) : byte[] | NotConstantTimeCryptoComparison.java:29:16:29:21 | actual |
4+
| NotConstantTimeCryptoComparison.java:44:28:44:40 | sign(...) : byte[] | NotConstantTimeCryptoComparison.java:45:40:45:48 | signature |
5+
| NotConstantTimeCryptoComparison.java:61:22:61:46 | doFinal(...) : byte[] | NotConstantTimeCryptoComparison.java:62:40:62:42 | tag |
6+
nodes
7+
| NotConstantTimeCryptoComparison.java:14:28:14:44 | doFinal(...) : byte[] | semmle.label | doFinal(...) : byte[] |
8+
| NotConstantTimeCryptoComparison.java:15:43:15:51 | actualMac | semmle.label | actualMac |
9+
| NotConstantTimeCryptoComparison.java:28:36:28:50 | digest(...) : byte[] | semmle.label | digest(...) : byte[] |
10+
| NotConstantTimeCryptoComparison.java:29:16:29:21 | actual | semmle.label | actual |
11+
| NotConstantTimeCryptoComparison.java:44:28:44:40 | sign(...) : byte[] | semmle.label | sign(...) : byte[] |
12+
| NotConstantTimeCryptoComparison.java:45:40:45:48 | signature | semmle.label | signature |
13+
| NotConstantTimeCryptoComparison.java:61:22:61:46 | doFinal(...) : byte[] | semmle.label | doFinal(...) : byte[] |
14+
| NotConstantTimeCryptoComparison.java:62:40:62:42 | tag | semmle.label | tag |
15+
#select
16+
| NotConstantTimeCryptoComparison.java:15:43:15:51 | actualMac | NotConstantTimeCryptoComparison.java:14:28:14:44 | doFinal(...) : byte[] | NotConstantTimeCryptoComparison.java:15:43:15:51 | actualMac | Using a not-constant time algorithm for comparison results of a cryptographic operation. |
17+
| NotConstantTimeCryptoComparison.java:29:16:29:21 | actual | NotConstantTimeCryptoComparison.java:28:36:28:50 | digest(...) : byte[] | NotConstantTimeCryptoComparison.java:29:16:29:21 | actual | Using a not-constant time algorithm for comparison results of a cryptographic operation. |
18+
| NotConstantTimeCryptoComparison.java:45:40:45:48 | signature | NotConstantTimeCryptoComparison.java:44:28:44:40 | sign(...) : byte[] | NotConstantTimeCryptoComparison.java:45:40:45:48 | signature | Using a not-constant time algorithm for comparison results of a cryptographic operation. |
19+
| NotConstantTimeCryptoComparison.java:62:40:62:42 | tag | NotConstantTimeCryptoComparison.java:61:22:61:46 | doFinal(...) : byte[] | NotConstantTimeCryptoComparison.java:62:40:62:42 | tag | Using a not-constant time algorithm for comparison results of a cryptographic operation. |
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import java.security.Key;
2+
import java.security.MessageDigest;
3+
import java.security.PrivateKey;
4+
import java.security.Signature;
5+
import java.util.Arrays;
6+
import javax.crypto.Cipher;
7+
import javax.crypto.Mac;
8+
9+
public class NotConstantTimeCryptoComparison {
10+
11+
// BAD: compare MACs using a not-constant time method
12+
public boolean unsafeMacCheck(byte[] expectedMac, byte[] data) throws Exception {
13+
Mac mac = Mac.getInstance("HmacSHA256");
14+
byte[] actualMac = mac.doFinal(data);
15+
return Arrays.equals(expectedMac, actualMac);
16+
}
17+
18+
// GOOD: compare MACs using a constant time method
19+
public boolean saferMacCheck(byte[] expectedMac, byte[] data) throws Exception {
20+
Mac mac = Mac.getInstance("HmacSHA256");
21+
byte[] actualMac = mac.doFinal(data);
22+
return MessageDigest.isEqual(expectedMac, actualMac);
23+
}
24+
25+
// BAD: compare hashes using a not-constant time method
26+
public boolean unsafeCheckMessageDigest(String expectedHash, byte[] data) throws Exception {
27+
MessageDigest md = MessageDigest.getInstance("SHA-256");
28+
String actual = new String(md.digest(data));
29+
return actual.equals(expectedHash);
30+
}
31+
32+
// GOOD: compare hashes using a constant time method
33+
public boolean saferCheckMessageDigest(byte[] expected, byte[] data) throws Exception {
34+
MessageDigest md = MessageDigest.getInstance("SHA-256");
35+
byte[] actual = md.digest(data);
36+
return MessageDigest.isEqual(expected, actual);
37+
}
38+
39+
// BAD: compare signatures using a not-constant time method
40+
public boolean unsafeCheckSignatures(byte[] expected, byte[] data, PrivateKey key) throws Exception {
41+
Signature engine = Signature.getInstance("SHA256withRSA");
42+
engine.initSign(key);
43+
engine.update(data);
44+
byte[] signature = engine.sign();
45+
return Arrays.equals(expected, signature);
46+
}
47+
48+
// GOOD: compare signatures using a constant time method
49+
public boolean saferCheckSignatures(byte[] expected, byte[] data, PrivateKey key) throws Exception {
50+
Signature engine = Signature.getInstance("SHA256withRSA");
51+
engine.initSign(key);
52+
engine.update(data);
53+
byte[] signature = engine.sign();
54+
return MessageDigest.isEqual(expected, signature);
55+
}
56+
57+
// BAD: compare ciphertexts using a not-constant time method
58+
public boolean unsafeCheckCustomMac(byte[] expected, byte[] plaintext, Key key) throws Exception {
59+
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
60+
cipher.init(Cipher.ENCRYPT_MODE, key);
61+
byte[] tag = cipher.doFinal(plaintext);
62+
return Arrays.equals(expected, tag);
63+
}
64+
65+
// GOOD: compare ciphertexts using a constant time method
66+
public boolean saferCheckCustomMac(byte[] expected, byte[] plaintext, Key key) throws Exception {
67+
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
68+
cipher.init(Cipher.ENCRYPT_MODE, key);
69+
byte[] tag = cipher.doFinal(plaintext);
70+
return MessageDigest.isEqual(expected, tag);
71+
}
72+
73+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
experimental/Security/CWE/CWE-208/NotConstantTimeCryptoComparison.ql

0 commit comments

Comments
 (0)