@@ -15,175 +15,183 @@ abstract class InsufficientKeySizeSink extends DataFlow::Node {
15
15
predicate hasState ( DataFlow:: FlowState state ) { state instanceof DataFlow:: FlowStateEmpty }
16
16
}
17
17
18
- /** A source for an insufficient key size used in RSA, DSA, and DH algorithms. */
19
- private class AsymmetricNonEcSource extends InsufficientKeySizeSource {
20
- AsymmetricNonEcSource ( ) {
21
- this .asExpr ( ) .( IntegerLiteral ) .getIntValue ( ) < getMinAsymNonEcKeySize ( )
18
+ private module Asymmetric {
19
+ private module NonEllipticCurve {
20
+ /** A source for an insufficient key size used in RSA, DSA, and DH algorithms. */
21
+ private class AsymmetricNonEcSource extends InsufficientKeySizeSource {
22
+ AsymmetricNonEcSource ( ) {
23
+ this .asExpr ( ) .( IntegerLiteral ) .getIntValue ( ) < getMinAsymNonEcKeySize ( )
24
+ }
25
+
26
+ override predicate hasState ( DataFlow:: FlowState state ) {
27
+ state = getMinAsymNonEcKeySize ( ) .toString ( )
28
+ }
29
+ }
30
+
31
+ /** A sink for an insufficient key size used in RSA, DSA, and DH algorithms. */
32
+ private class AsymmetricNonEcSink extends InsufficientKeySizeSink {
33
+ AsymmetricNonEcSink ( ) {
34
+ exists ( AsymmetricInitMethodAccess ma , AsymmetricKeyGenerator kg |
35
+ kg .getAlgoName ( ) .matches ( [ "RSA" , "DSA" , "DH" ] ) and
36
+ DataFlow:: localExprFlow ( kg , ma .getQualifier ( ) ) and
37
+ this .asExpr ( ) = ma .getKeySizeArg ( )
38
+ )
39
+ or
40
+ exists ( AsymmetricNonEcSpec spec | this .asExpr ( ) = spec .getKeySizeArg ( ) )
41
+ }
42
+
43
+ override predicate hasState ( DataFlow:: FlowState state ) {
44
+ state = getMinAsymNonEcKeySize ( ) .toString ( )
45
+ }
46
+ }
47
+
48
+ /** Returns the minimum recommended key size for RSA, DSA, and DH algorithms. */
49
+ private int getMinAsymNonEcKeySize ( ) { result = 2048 }
50
+
51
+ /** An instance of an RSA, DSA, or DH algorithm specification. */
52
+ private class AsymmetricNonEcSpec extends ClassInstanceExpr {
53
+ AsymmetricNonEcSpec ( ) {
54
+ this .getConstructedType ( ) instanceof RsaKeyGenParameterSpec or
55
+ this .getConstructedType ( ) instanceof DsaGenParameterSpec or
56
+ this .getConstructedType ( ) instanceof DhGenParameterSpec
57
+ }
58
+
59
+ /** Gets the `keysize` argument of this instance. */
60
+ Argument getKeySizeArg ( ) { result = this .getArgument ( 0 ) }
61
+ }
22
62
}
23
63
24
- override predicate hasState ( DataFlow:: FlowState state ) {
25
- state = getMinAsymNonEcKeySize ( ) .toString ( )
64
+ private module EllipticCurve {
65
+ /** A source for an insufficient key size used in elliptic curve (EC) algorithms. */
66
+ private class AsymmetricEcSource extends InsufficientKeySizeSource {
67
+ AsymmetricEcSource ( ) {
68
+ this .asExpr ( ) .( IntegerLiteral ) .getIntValue ( ) < getMinAsymEcKeySize ( )
69
+ or
70
+ // the below is needed for cases when the key size is embedded in the curve name
71
+ getEcKeySize ( this .asExpr ( ) .( StringLiteral ) .getValue ( ) ) < getMinAsymEcKeySize ( )
72
+ }
73
+
74
+ override predicate hasState ( DataFlow:: FlowState state ) {
75
+ state = getMinAsymEcKeySize ( ) .toString ( )
76
+ }
77
+ }
78
+
79
+ /** A sink for an insufficient key size used in elliptic curve (EC) algorithms. */
80
+ private class AsymmetricEcSink extends InsufficientKeySizeSink {
81
+ AsymmetricEcSink ( ) {
82
+ exists ( AsymmetricInitMethodAccess ma , AsymmetricKeyGenerator kg |
83
+ kg .getAlgoName ( ) .matches ( "EC%" ) and
84
+ DataFlow:: localExprFlow ( kg , ma .getQualifier ( ) ) and
85
+ this .asExpr ( ) = ma .getKeySizeArg ( )
86
+ )
87
+ or
88
+ exists ( AsymmetricEcSpec s | this .asExpr ( ) = s .getKeySizeArg ( ) )
89
+ }
90
+
91
+ override predicate hasState ( DataFlow:: FlowState state ) {
92
+ state = getMinAsymEcKeySize ( ) .toString ( )
93
+ }
94
+ }
95
+
96
+ /** Returns the minimum recommended key size for elliptic curve (EC) algorithms. */
97
+ private int getMinAsymEcKeySize ( ) { result = 256 }
98
+
99
+ /** Returns the key size from an EC algorithm's curve name string */
100
+ bindingset [ algorithm]
101
+ private int getEcKeySize ( string algorithm ) {
102
+ algorithm .matches ( "sec%" ) and // specification such as "secp256r1"
103
+ result = algorithm .regexpCapture ( "sec[p|t](\\d+)[a-zA-Z].*" , 1 ) .toInt ( )
104
+ or
105
+ algorithm .matches ( "X9.62%" ) and //specification such as "X9.62 prime192v2"
106
+ result = algorithm .regexpCapture ( "X9\\.62 .*[a-zA-Z](\\d+)[a-zA-Z].*" , 1 ) .toInt ( )
107
+ or
108
+ ( algorithm .matches ( "prime%" ) or algorithm .matches ( "c2tnb%" ) ) and //specification such as "prime192v2"
109
+ result = algorithm .regexpCapture ( ".*[a-zA-Z](\\d+)[a-zA-Z].*" , 1 ) .toInt ( )
110
+ }
111
+
112
+ /** An instance of an elliptic curve (EC) algorithm specification. */
113
+ private class AsymmetricEcSpec extends ClassInstanceExpr {
114
+ AsymmetricEcSpec ( ) { this .getConstructedType ( ) instanceof EcGenParameterSpec }
115
+
116
+ /** Gets the `keysize` argument of this instance. */
117
+ Argument getKeySizeArg ( ) { result = this .getArgument ( 0 ) }
118
+ }
26
119
}
27
- }
28
120
29
- /** A source for an insufficient key size used in elliptic curve (EC) algorithms. */
30
- private class AsymmetricEcSource extends InsufficientKeySizeSource {
31
- AsymmetricEcSource ( ) {
32
- this .asExpr ( ) .( IntegerLiteral ) .getIntValue ( ) < getMinAsymEcKeySize ( )
33
- or
34
- // the below is needed for cases when the key size is embedded in the curve name
35
- getEcKeySize ( this .asExpr ( ) .( StringLiteral ) .getValue ( ) ) < getMinAsymEcKeySize ( )
121
+ /**
122
+ * A call to the `initialize` method declared in `java.security.KeyPairGenerator`
123
+ * or to the `init` method declared in `java.security.AlgorithmParameterGenerator`.
124
+ */
125
+ private class AsymmetricInitMethodAccess extends MethodAccess {
126
+ AsymmetricInitMethodAccess ( ) {
127
+ this .getMethod ( ) instanceof KeyPairGeneratorInitMethod or
128
+ this .getMethod ( ) instanceof AlgoParamGeneratorInitMethod
129
+ }
130
+
131
+ /** Gets the `keysize` argument of this call. */
132
+ Argument getKeySizeArg ( ) { result = this .getArgument ( 0 ) }
36
133
}
37
134
38
- override predicate hasState ( DataFlow:: FlowState state ) {
39
- state = getMinAsymEcKeySize ( ) .toString ( )
135
+ /**
136
+ * An instance of a `java.security.KeyPairGenerator`
137
+ * or of a `java.security.AlgorithmParameterGenerator`.
138
+ */
139
+ private class AsymmetricKeyGenerator extends AlgoGeneratorObject {
140
+ AsymmetricKeyGenerator ( ) {
141
+ this instanceof JavaSecurityKeyPairGenerator or
142
+ this instanceof JavaSecurityAlgoParamGenerator
143
+ }
144
+
145
+ override Expr getAlgoSpec ( ) {
146
+ result =
147
+ [
148
+ this .( JavaSecurityKeyPairGenerator ) .getAlgoSpec ( ) ,
149
+ this .( JavaSecurityAlgoParamGenerator ) .getAlgoSpec ( )
150
+ ]
151
+ }
40
152
}
41
153
}
42
154
43
- /** A source for an insufficient key size used in AES algorithms. */
44
- private class SymmetricSource extends InsufficientKeySizeSource {
45
- SymmetricSource ( ) { this .asExpr ( ) .( IntegerLiteral ) .getIntValue ( ) < getMinSymKeySize ( ) }
46
-
47
- override predicate hasState ( DataFlow:: FlowState state ) { state = getMinSymKeySize ( ) .toString ( ) }
48
- }
49
-
50
- /** Returns the minimum recommended key size for RSA, DSA, and DH algorithms. */
51
- private int getMinAsymNonEcKeySize ( ) { result = 2048 }
52
-
53
- /** Returns the minimum recommended key size for elliptic curve (EC) algorithms. */
54
- private int getMinAsymEcKeySize ( ) { result = 256 }
55
-
56
- /** Returns the minimum recommended key size for AES algorithms. */
57
- private int getMinSymKeySize ( ) { result = 128 }
58
-
59
- /** Returns the key size from an EC algorithm's curve name string */
60
- bindingset [ algorithm]
61
- private int getEcKeySize ( string algorithm ) {
62
- algorithm .matches ( "sec%" ) and // specification such as "secp256r1"
63
- result = algorithm .regexpCapture ( "sec[p|t](\\d+)[a-zA-Z].*" , 1 ) .toInt ( )
64
- or
65
- algorithm .matches ( "X9.62%" ) and //specification such as "X9.62 prime192v2"
66
- result = algorithm .regexpCapture ( "X9\\.62 .*[a-zA-Z](\\d+)[a-zA-Z].*" , 1 ) .toInt ( )
67
- or
68
- ( algorithm .matches ( "prime%" ) or algorithm .matches ( "c2tnb%" ) ) and //specification such as "prime192v2"
69
- result = algorithm .regexpCapture ( ".*[a-zA-Z](\\d+)[a-zA-Z].*" , 1 ) .toInt ( )
70
- }
155
+ private module Symmetric {
156
+ /** A source for an insufficient key size used in AES algorithms. */
157
+ private class SymmetricSource extends InsufficientKeySizeSource {
158
+ SymmetricSource ( ) { this .asExpr ( ) .( IntegerLiteral ) .getIntValue ( ) < getMinSymKeySize ( ) }
71
159
72
- /** A sink for an insufficient key size used in RSA, DSA, and DH algorithms. */
73
- private class AsymmetricNonEcSink extends InsufficientKeySizeSink {
74
- AsymmetricNonEcSink ( ) {
75
- exists ( AsymmetricInitMethodAccess ma , AsymmetricKeyGenerator kg |
76
- kg .getAlgoName ( ) .matches ( [ "RSA" , "DSA" , "DH" ] ) and
77
- DataFlow:: localExprFlow ( kg , ma .getQualifier ( ) ) and
78
- this .asExpr ( ) = ma .getKeySizeArg ( )
79
- )
80
- or
81
- exists ( AsymmetricNonEcSpec spec | this .asExpr ( ) = spec .getKeySizeArg ( ) )
160
+ override predicate hasState ( DataFlow:: FlowState state ) { state = getMinSymKeySize ( ) .toString ( ) }
82
161
}
83
162
84
- override predicate hasState ( DataFlow:: FlowState state ) {
85
- state = getMinAsymNonEcKeySize ( ) .toString ( )
163
+ /** A sink for an insufficient key size used in AES algorithms. */
164
+ private class SymmetricSink extends InsufficientKeySizeSink {
165
+ SymmetricSink ( ) {
166
+ exists ( SymmetricInitMethodAccess ma , SymmetricKeyGenerator kg |
167
+ kg .getAlgoName ( ) = "AES" and
168
+ DataFlow:: localExprFlow ( kg , ma .getQualifier ( ) ) and
169
+ this .asExpr ( ) = ma .getKeySizeArg ( )
170
+ )
171
+ }
172
+
173
+ override predicate hasState ( DataFlow:: FlowState state ) { state = getMinSymKeySize ( ) .toString ( ) }
86
174
}
87
- }
88
175
89
- /** A sink for an insufficient key size used in elliptic curve (EC) algorithms. */
90
- private class AsymmetricEcSink extends InsufficientKeySizeSink {
91
- AsymmetricEcSink ( ) {
92
- exists ( AsymmetricInitMethodAccess ma , AsymmetricKeyGenerator kg |
93
- kg .getAlgoName ( ) .matches ( "EC%" ) and
94
- DataFlow:: localExprFlow ( kg , ma .getQualifier ( ) ) and
95
- this .asExpr ( ) = ma .getKeySizeArg ( )
96
- )
97
- or
98
- exists ( AsymmetricEcSpec s | this .asExpr ( ) = s .getKeySizeArg ( ) )
99
- }
176
+ /** Returns the minimum recommended key size for AES algorithms. */
177
+ private int getMinSymKeySize ( ) { result = 128 }
100
178
101
- override predicate hasState ( DataFlow:: FlowState state ) {
102
- state = getMinAsymEcKeySize ( ) .toString ( )
103
- }
104
- }
179
+ /** A call to the `init` method declared in `javax.crypto.KeyGenerator`. */
180
+ private class SymmetricInitMethodAccess extends MethodAccess {
181
+ SymmetricInitMethodAccess ( ) { this .getMethod ( ) instanceof KeyGeneratorInitMethod }
105
182
106
- /** A sink for an insufficient key size used in AES algorithms. */
107
- private class SymmetricSink extends InsufficientKeySizeSink {
108
- SymmetricSink ( ) {
109
- exists ( SymmetricInitMethodAccess ma , SymmetricKeyGenerator kg |
110
- kg .getAlgoName ( ) = "AES" and
111
- DataFlow:: localExprFlow ( kg , ma .getQualifier ( ) ) and
112
- this .asExpr ( ) = ma .getKeySizeArg ( )
113
- )
183
+ /** Gets the `keysize` argument of this call. */
184
+ Argument getKeySizeArg ( ) { result = this .getArgument ( 0 ) }
114
185
}
115
186
116
- override predicate hasState ( DataFlow:: FlowState state ) { state = getMinSymKeySize ( ) .toString ( ) }
117
- }
118
-
119
- /**
120
- * A call to the `initialize` method declared in `java.security.KeyPairGenerator`
121
- * or to the `init` method declared in `java.security.AlgorithmParameterGenerator`.
122
- */
123
- private class AsymmetricInitMethodAccess extends MethodAccess {
124
- AsymmetricInitMethodAccess ( ) {
125
- this .getMethod ( ) instanceof KeyPairGeneratorInitMethod or
126
- this .getMethod ( ) instanceof AlgoParamGeneratorInitMethod
187
+ /** An instance of a `javax.crypto.KeyGenerator`. */
188
+ private class SymmetricKeyGenerator extends AlgoGeneratorObject instanceof JavaxCryptoKeyGenerator {
189
+ override Expr getAlgoSpec ( ) { result = JavaxCryptoKeyGenerator .super .getAlgoSpec ( ) }
127
190
}
128
-
129
- /** Gets the `keysize` argument of this call. */
130
- Argument getKeySizeArg ( ) { result = this .getArgument ( 0 ) }
131
- }
132
-
133
- /** A call to the `init` method declared in `javax.crypto.KeyGenerator`. */
134
- private class SymmetricInitMethodAccess extends MethodAccess {
135
- SymmetricInitMethodAccess ( ) { this .getMethod ( ) instanceof KeyGeneratorInitMethod }
136
-
137
- /** Gets the `keysize` argument of this call. */
138
- Argument getKeySizeArg ( ) { result = this .getArgument ( 0 ) }
139
191
}
140
192
141
193
/** An instance of a generator that specifies an encryption algorithm. */
142
194
abstract private class AlgoGeneratorObject extends CryptoAlgoSpec {
143
195
/** Returns an uppercase string representing the algorithm name specified by this generator object. */
144
196
string getAlgoName ( ) { result = this .getAlgoSpec ( ) .( StringLiteral ) .getValue ( ) .toUpperCase ( ) }
145
197
}
146
-
147
- /**
148
- * An instance of a `java.security.KeyPairGenerator`
149
- * or of a `java.security.AlgorithmParameterGenerator`.
150
- */
151
- private class AsymmetricKeyGenerator extends AlgoGeneratorObject {
152
- AsymmetricKeyGenerator ( ) {
153
- this instanceof JavaSecurityKeyPairGenerator or
154
- this instanceof JavaSecurityAlgoParamGenerator
155
- }
156
-
157
- override Expr getAlgoSpec ( ) {
158
- result =
159
- [
160
- this .( JavaSecurityKeyPairGenerator ) .getAlgoSpec ( ) ,
161
- this .( JavaSecurityAlgoParamGenerator ) .getAlgoSpec ( )
162
- ]
163
- }
164
- }
165
-
166
- /** An instance of a `javax.crypto.KeyGenerator`. */
167
- private class SymmetricKeyGenerator extends AlgoGeneratorObject instanceof JavaxCryptoKeyGenerator {
168
- override Expr getAlgoSpec ( ) { result = JavaxCryptoKeyGenerator .super .getAlgoSpec ( ) }
169
- }
170
-
171
- /** An instance of an RSA, DSA, or DH algorithm specification. */
172
- private class AsymmetricNonEcSpec extends ClassInstanceExpr {
173
- AsymmetricNonEcSpec ( ) {
174
- this .getConstructedType ( ) instanceof RsaKeyGenParameterSpec or
175
- this .getConstructedType ( ) instanceof DsaGenParameterSpec or
176
- this .getConstructedType ( ) instanceof DhGenParameterSpec
177
- }
178
-
179
- /** Gets the `keysize` argument of this instance. */
180
- Argument getKeySizeArg ( ) { result = this .getArgument ( 0 ) }
181
- }
182
-
183
- /** An instance of an elliptic curve (EC) algorithm specification. */
184
- private class AsymmetricEcSpec extends ClassInstanceExpr {
185
- AsymmetricEcSpec ( ) { this .getConstructedType ( ) instanceof EcGenParameterSpec }
186
-
187
- /** Gets the `keysize` argument of this instance. */
188
- Argument getKeySizeArg ( ) { result = this .getArgument ( 0 ) }
189
- }
0 commit comments