Skip to content

Commit 23227d0

Browse files
Fix key type specification (#237)
* add enricher for secret keys Signed-off-by: Nicklas Körtge <nicklas.koertge1@ibm.com> * add key specification and reorganisation in translation Signed-off-by: Nicklas Körtge <nicklas.koertge1@ibm.com> * update tests Signed-off-by: Nicklas Körtge <nicklas.koertge1@ibm.com> --------- Signed-off-by: Nicklas Körtge <nicklas.koertge1@ibm.com>
1 parent dd0ee0e commit 23227d0

File tree

24 files changed

+303
-49
lines changed

24 files changed

+303
-49
lines changed

engine/src/main/java/com/ibm/engine/model/KeyAction.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
public class KeyAction<T> extends AbstractValue<T> implements IAction<T> {
2525

2626
public enum Action {
27+
PRIVATE_KEY_GENERATION,
28+
PUBLIC_KEY_GENERATION,
29+
SECRET_KEY_GENERATION,
2730
GENERATION,
2831
KDF
2932
}

enricher/src/main/java/com/ibm/enricher/Enricher.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.ibm.enricher.algorithm.SHA3Enricher;
3434
import com.ibm.enricher.algorithm.SignatureEnricher;
3535
import com.ibm.enricher.algorithm.TagOrDigestEnricher;
36+
import com.ibm.enricher.key.SecretKeyEnricher;
3637
import com.ibm.mapper.model.INode;
3738
import java.util.ArrayList;
3839
import java.util.Collection;
@@ -92,7 +93,8 @@ private static INode enrichTree(@Nonnull INode node) {
9293
new RSAoaepEnricher(),
9394
new SignatureEnricher(),
9495
new TagOrDigestEnricher(),
95-
new KEMEnricher());
96+
new KEMEnricher(),
97+
new SecretKeyEnricher());
9698

9799
/**
98100
* Enriches the given node with additional information.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* SonarQube Cryptography Plugin
3+
* Copyright (C) 2025 IBM
4+
*
5+
* Licensed to the Apache Software Foundation (ASF) under one or more
6+
* contributor license agreements. See the NOTICE file distributed with
7+
* this work for additional information regarding copyright ownership.
8+
* The ASF licenses this file to you under the Apache License, Version 2.0
9+
* (the "License"); you may not use this file except in compliance with
10+
* the License. You may obtain a copy of the License at
11+
*
12+
* http://www.apache.org/licenses/LICENSE-2.0
13+
*
14+
* Unless required by applicable law or agreed to in writing, software
15+
* distributed under the License is distributed on an "AS IS" BASIS,
16+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17+
* See the License for the specific language governing permissions and
18+
* limitations under the License.
19+
*/
20+
package com.ibm.enricher.key;
21+
22+
import com.ibm.enricher.IEnricher;
23+
import com.ibm.mapper.model.AuthenticatedEncryption;
24+
import com.ibm.mapper.model.BlockCipher;
25+
import com.ibm.mapper.model.INode;
26+
import com.ibm.mapper.model.Key;
27+
import com.ibm.mapper.model.SecretKey;
28+
import javax.annotation.Nonnull;
29+
30+
public class SecretKeyEnricher implements IEnricher {
31+
@Nonnull
32+
@Override
33+
public INode enrich(@Nonnull INode node) {
34+
if (node instanceof Key key) {
35+
if (key.hasChildOfType(BlockCipher.class).isPresent()
36+
|| key.hasChildOfType(AuthenticatedEncryption.class).isPresent()) {
37+
return new SecretKey(key);
38+
}
39+
}
40+
return node;
41+
}
42+
}

java/src/main/java/com/ibm/plugin/rules/detection/jca/keyfactory/JcaKeyFactoryGenerate.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public final class JcaKeyFactoryGenerate {
4040
.createDetectionRule()
4141
.forObjectTypes("java.security.KeyFactory")
4242
.forMethods("generatePrivate")
43-
.shouldBeDetectedAs(new KeyActionFactory<>(KeyAction.Action.GENERATION))
43+
.shouldBeDetectedAs(
44+
new KeyActionFactory<>(KeyAction.Action.PRIVATE_KEY_GENERATION))
4445
.withMethodParameter(KEY_SPEC_TYPE)
4546
.addDependingDetectionRules(JcaKeySpec.rules())
4647
.buildForContext(new PrivateKeyContext(KeyContext.Kind.NONE))
@@ -52,7 +53,8 @@ public final class JcaKeyFactoryGenerate {
5253
.createDetectionRule()
5354
.forObjectTypes("java.security.KeyFactory")
5455
.forMethods("generatePublic")
55-
.shouldBeDetectedAs(new KeyActionFactory<>(KeyAction.Action.GENERATION))
56+
.shouldBeDetectedAs(
57+
new KeyActionFactory<>(KeyAction.Action.PUBLIC_KEY_GENERATION))
5658
.withMethodParameter(KEY_SPEC_TYPE)
5759
.addDependingDetectionRules(JcaKeySpec.rules())
5860
.buildForContext(new PublicKeyContext(KeyContext.Kind.NONE))

java/src/main/java/com/ibm/plugin/rules/detection/jca/keyfactory/JcaSecretKeyFactoryGenerateSecret.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public final class JcaSecretKeyFactoryGenerateSecret {
3939
.createDetectionRule()
4040
.forObjectTypes("javax.crypto.SecretKeyFactory")
4141
.forMethods("generateSecret")
42-
.shouldBeDetectedAs(new KeyActionFactory<>(KeyAction.Action.GENERATION))
42+
.shouldBeDetectedAs(
43+
new KeyActionFactory<>(KeyAction.Action.SECRET_KEY_GENERATION))
4344
.withMethodParameter(KEY_SPEC_TYPE)
4445
.addDependingDetectionRules(JcaKeySpec.rules())
4546
.buildForContext(new SecretKeyContext(KeyContext.Kind.NONE))

java/src/main/java/com/ibm/plugin/rules/detection/jca/keygenerator/JcaKeyGeneratorGetInstance.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import static com.ibm.plugin.rules.detection.TypeShortcuts.STRING_TYPE;
2323

2424
import com.ibm.engine.model.context.KeyContext;
25-
import com.ibm.engine.model.context.SecretKeyContext;
2625
import com.ibm.engine.model.factory.AlgorithmFactory;
2726
import com.ibm.engine.rule.IDetectionRule;
2827
import com.ibm.engine.rule.builder.DetectionRuleBuilder;
@@ -39,7 +38,7 @@ public final class JcaKeyGeneratorGetInstance {
3938
.forMethods("getInstance")
4039
.withMethodParameter(STRING_TYPE)
4140
.shouldBeDetectedAs(new AlgorithmFactory<>())
42-
.buildForContext(new SecretKeyContext(KeyContext.Kind.NONE))
41+
.buildForContext(new KeyContext(KeyContext.Kind.NONE))
4342
.inBundle(() -> "Jca")
4443
.withDependingDetectionRules(JcaKeyGeneratorInit.rules());
4544

@@ -51,7 +50,7 @@ public final class JcaKeyGeneratorGetInstance {
5150
.withMethodParameter(STRING_TYPE)
5251
.shouldBeDetectedAs(new AlgorithmFactory<>())
5352
.withMethodParameter(STRING_TYPE)
54-
.buildForContext(new SecretKeyContext(KeyContext.Kind.NONE))
53+
.buildForContext(new KeyContext(KeyContext.Kind.NONE))
5554
.inBundle(() -> "Jca")
5655
.withDependingDetectionRules(JcaKeyGeneratorInit.rules());
5756

@@ -63,7 +62,7 @@ public final class JcaKeyGeneratorGetInstance {
6362
.withMethodParameter(STRING_TYPE)
6463
.shouldBeDetectedAs(new AlgorithmFactory<>())
6564
.withMethodParameter("java.security.Provider")
66-
.buildForContext(new SecretKeyContext(KeyContext.Kind.NONE))
65+
.buildForContext(new KeyContext(KeyContext.Kind.NONE))
6766
.inBundle(() -> "Jca")
6867
.withDependingDetectionRules(JcaKeyGeneratorInit.rules());
6968

java/src/main/java/com/ibm/plugin/rules/detection/jca/keygenerator/JcaKeyGeneratorInit.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
import com.ibm.engine.model.Size;
2323
import com.ibm.engine.model.context.KeyContext;
24-
import com.ibm.engine.model.context.SecretKeyContext;
2524
import com.ibm.engine.model.factory.KeySizeFactory;
2625
import com.ibm.engine.rule.IDetectionRule;
2726
import com.ibm.engine.rule.builder.DetectionRuleBuilder;
@@ -39,7 +38,7 @@ public final class JcaKeyGeneratorInit {
3938
.forMethods("init")
4039
.withMethodParameter("int")
4140
.shouldBeDetectedAs(new KeySizeFactory<>(Size.UnitType.BIT))
42-
.buildForContext(new SecretKeyContext(KeyContext.Kind.NONE))
41+
.buildForContext(new KeyContext(KeyContext.Kind.NONE))
4342
.inBundle(() -> "Jca")
4443
.withoutDependingDetectionRules();
4544

@@ -51,7 +50,7 @@ public final class JcaKeyGeneratorInit {
5150
.withMethodParameter("int")
5251
.shouldBeDetectedAs(new KeySizeFactory<>(Size.UnitType.BIT))
5352
.withMethodParameter("java.security.SecureRandom")
54-
.buildForContext(new SecretKeyContext(KeyContext.Kind.NONE))
53+
.buildForContext(new KeyContext(KeyContext.Kind.NONE))
5554
.inBundle(() -> "Jca")
5655
.withoutDependingDetectionRules();
5756

@@ -62,7 +61,7 @@ public final class JcaKeyGeneratorInit {
6261
.forMethods("init")
6362
.withMethodParameter("java.security.spec.AlgorithmParameterSpec")
6463
.addDependingDetectionRules(JcaParameterSpec.rules())
65-
.buildForContext(new SecretKeyContext(KeyContext.Kind.NONE))
64+
.buildForContext(new KeyContext(KeyContext.Kind.NONE))
6665
.inBundle(() -> "Jca")
6766
.withoutDependingDetectionRules();
6867

@@ -74,7 +73,7 @@ public final class JcaKeyGeneratorInit {
7473
.withMethodParameter("java.security.spec.AlgorithmParameterSpec")
7574
.addDependingDetectionRules(JcaParameterSpec.rules())
7675
.withMethodParameter("java.security.SecureRandom")
77-
.buildForContext(new SecretKeyContext(KeyContext.Kind.NONE))
76+
.buildForContext(new KeyContext(KeyContext.Kind.NONE))
7877
.inBundle(() -> "Jca")
7978
.withoutDependingDetectionRules();
8079

java/src/main/java/com/ibm/plugin/translation/reorganizer/JavaReorganizerRules.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.ibm.mapper.reorganizer.rules.BlockCipherReorganizer;
2828
import com.ibm.mapper.reorganizer.rules.CipherParameterReorganizer;
2929
import com.ibm.mapper.reorganizer.rules.CipherSuiteReorganizer;
30+
import com.ibm.mapper.reorganizer.rules.KeyReorgenizer;
3031
import com.ibm.mapper.reorganizer.rules.MacReorganizer;
3132
import com.ibm.mapper.reorganizer.rules.SignatureReorganizer;
3233
import java.util.List;
@@ -55,6 +56,7 @@ public static List<IReorganizerRule> rules() {
5556
SignatureReorganizer.MERGE_UNKNOWN_SIGNATURE_PARENT_AND_CHILD,
5657
SignatureReorganizer.moveNodesFromUnderFunctionalityUnderParent(
5758
Sign.class, Signature.class),
58-
SignatureReorganizer.MERGE_SIGNATURE_PARENT_AND_CHILD);
59+
SignatureReorganizer.MERGE_SIGNATURE_PARENT_AND_CHILD,
60+
KeyReorgenizer.SPECIFY_KEY_TYPE_BY_LOOKING_AT_KEY_GENERATION);
5961
}
6062
}

java/src/main/java/com/ibm/plugin/translation/translator/contexts/JavaKeyContextTranslator.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.ibm.engine.model.AlgorithmParameter;
2424
import com.ibm.engine.model.Curve;
2525
import com.ibm.engine.model.IValue;
26+
import com.ibm.engine.model.KeyAction;
2627
import com.ibm.engine.model.KeySize;
2728
import com.ibm.engine.model.OperationMode;
2829
import com.ibm.engine.model.ValueAction;
@@ -90,6 +91,23 @@ public final class JavaKeyContextTranslator extends JavaAbstractLibraryTranslato
9091
algo.put(new KeyGeneration(detectionLocation));
9192
return algo;
9293
});
94+
} else if (value instanceof KeyAction<Tree> keyAction) {
95+
return switch (keyAction.getAction()) {
96+
case PRIVATE_KEY_GENERATION ->
97+
Optional.of(
98+
new KeyGeneration(
99+
KeyGeneration.Specification.PRIVATE_KEY,
100+
detectionLocation));
101+
case PUBLIC_KEY_GENERATION ->
102+
Optional.of(
103+
new KeyGeneration(
104+
KeyGeneration.Specification.PUBLIC_KEY, detectionLocation));
105+
case SECRET_KEY_GENERATION ->
106+
Optional.of(
107+
new KeyGeneration(
108+
KeyGeneration.Specification.SECRET_KEY, detectionLocation));
109+
default -> Optional.empty();
110+
};
93111
}
94112
return Optional.empty();
95113
}

java/src/test/files/rules/detection/jca/keyfactory/JcaKeyFactoryGenerateTestFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
public class JcaKeyFactoryGenerateTestFile {
88

99
public void test() throws NoSuchAlgorithmException, InvalidKeySpecException {
10-
KeyFactory factory = KeyFactory.getInstance("RSA"); // Noncompliant {{(Key) RSA}}
10+
KeyFactory factory = KeyFactory.getInstance("RSA"); // Noncompliant {{(PrivateKey) RSA}}
1111
factory.generatePrivate(new DHPrivateKeySpec(
1212
new BigInteger("1"),
1313
new BigInteger("10110011011010110001100001001011111111101110010100000111010110100000110000101011000110010111110100011100111000101101100100101111010010000010011101011101001000001000110100100001100101011001100010010110101101011011010101101111100000101010111010010111101111100000011111110111011110100000010101110000100100110100111101001101000001000100101100100000110011110001001010110101100011110111100100001001000011110111000001010111100101001111011011011110001001110011111111000101011011111001011001110111000011001010100011001110"),

0 commit comments

Comments
 (0)