mirror of
https://github.com/github/codeql.git
synced 2026-04-12 02:24:00 +02:00
- Model Signature.getInstance() as CryptoAlgoSpec sink (previously only Signature constructor was modeled) - Add HMAC-based algorithms (HMACSHA1/256/384/512, HmacSHA1/256/384/512) and PBKDF2 to the secure algorithm whitelist - Fix XDH/X25519/X448 tests to use KeyAgreement.getInstance() instead of KeyPairGenerator.getInstance() to match their key agreement semantics - Add test cases for SHA384withECDSA, HMACSHA*, and PBKDF2WithHmacSHA1 from user-reported false positives - Update change note to document all additions
96 lines
3.0 KiB
Java
96 lines
3.0 KiB
Java
// Semmle test case for CWE-327: Use of a Broken or Risky Cryptographic Algorithm
|
|
// http://cwe.mitre.org/data/definitions/327.html
|
|
package test.cwe327.semmle.tests;
|
|
|
|
import javax.crypto.*;
|
|
import javax.crypto.spec.*;
|
|
import java.security.*;
|
|
|
|
class Test {
|
|
public void test() {
|
|
try {
|
|
String input = "ABCDEFG123456";
|
|
KeyGenerator keyGenerator;
|
|
SecretKeySpec secretKeySpec;
|
|
Cipher cipher;
|
|
|
|
{
|
|
// BAD: DES is a weak algorithm
|
|
keyGenerator = KeyGenerator.getInstance("DES");
|
|
}
|
|
|
|
// GOOD: RSA is a strong algorithm
|
|
// NB: in general the algorithms used in the various stages must be
|
|
// the same, but for testing purposes we will vary them
|
|
keyGenerator = KeyGenerator.getInstance("RSA");
|
|
/* Perform initialization of KeyGenerator */
|
|
keyGenerator.init(112);
|
|
|
|
SecretKey secretKey = keyGenerator.generateKey();
|
|
byte[] byteKey = secretKey.getEncoded();
|
|
|
|
{
|
|
// BAD: foo is an unknown algorithm that may not be secure
|
|
secretKeySpec = new SecretKeySpec(byteKey, "foo");
|
|
}
|
|
|
|
// GOOD: GCM is a strong algorithm
|
|
secretKeySpec = new SecretKeySpec(byteKey, "GCM");
|
|
|
|
{
|
|
// BAD: RC2 is a weak algorithm
|
|
cipher = Cipher.getInstance("RC2");
|
|
}
|
|
// GOOD: ECIES is a strong algorithm
|
|
cipher = Cipher.getInstance("ECIES");
|
|
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
|
|
|
|
byte[] encrypted = cipher.doFinal(input.getBytes("UTF-8"));
|
|
|
|
KeyPairGenerator keyPairGenerator;
|
|
|
|
// GOOD: EC is a secure algorithm for key pair generation
|
|
keyPairGenerator = KeyPairGenerator.getInstance("EC");
|
|
|
|
// GOOD: ECDSA is a secure signature algorithm
|
|
Signature ecdsaSig = Signature.getInstance("ECDSA");
|
|
|
|
// GOOD: ECDH is a secure algorithm for key agreement
|
|
KeyAgreement ecdhKa = KeyAgreement.getInstance("ECDH");
|
|
|
|
// GOOD: EdDSA is a secure algorithm (Edwards-curve Digital Signature Algorithm)
|
|
keyPairGenerator = KeyPairGenerator.getInstance("EdDSA");
|
|
|
|
// GOOD: Ed25519 is a secure algorithm for key pair generation
|
|
keyPairGenerator = KeyPairGenerator.getInstance("Ed25519");
|
|
|
|
// GOOD: Ed448 is a secure algorithm for key pair generation
|
|
keyPairGenerator = KeyPairGenerator.getInstance("Ed448");
|
|
|
|
// GOOD: XDH is a secure algorithm for key agreement
|
|
KeyAgreement xdhKa = KeyAgreement.getInstance("XDH");
|
|
|
|
// GOOD: X25519 is a secure algorithm for key agreement
|
|
KeyAgreement x25519Ka = KeyAgreement.getInstance("X25519");
|
|
|
|
// GOOD: X448 is a secure algorithm for key agreement
|
|
KeyAgreement x448Ka = KeyAgreement.getInstance("X448");
|
|
|
|
// GOOD: SHA256withECDSA is a secure signature algorithm
|
|
Signature sha256Ecdsa = Signature.getInstance("SHA256withECDSA");
|
|
|
|
// GOOD: HMAC-based SecretKeySpec should not be flagged
|
|
new SecretKeySpec(null, "HMACSHA1");
|
|
new SecretKeySpec(null, "HMACSHA256");
|
|
new SecretKeySpec(null, "HMACSHA384");
|
|
new SecretKeySpec(null, "SHA384withECDSA");
|
|
|
|
// GOOD: PBKDF2 key derivation is a secure algorithm
|
|
SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
|
|
|
|
} catch (Exception e) {
|
|
// fail
|
|
}
|
|
}
|
|
}
|