1
1
import java
2
2
import experimental.quantum.Language
3
3
import AlgorithmValueConsumers
4
+ import OperationInstances
4
5
import FlowAnalysis
5
6
6
- /**
7
- * Elliptic curve algorithms.
8
- */
9
- abstract private class EllipticCurveConsumingAlgorithmInstance extends Crypto:: EllipticCurveConsumingAlgorithmInstance
10
- {
11
- string getFixedEllipticCurveName ( ) { none ( ) }
12
-
13
- override Crypto:: AlgorithmValueConsumer getEllipticCurveConsumer ( ) {
14
- result .( ImplicitEllipticCurveInstance ) .getAlgorithm ( ) = this
15
- }
16
- }
17
-
18
7
/**
19
8
* A string literal that represents an elliptic curve name.
20
9
*/
@@ -42,28 +31,12 @@ class EllipticCurveStringLiteralInstance extends Crypto::EllipticCurveInstance i
42
31
}
43
32
44
33
/**
45
- * Represents an elliptic curve that is implicitly defined by the underlying
46
- * algorithm. In this case, we view the algorithm and elliptic curve as being
47
- * implicitly defined by the constructor call.
34
+ * Represents an elliptic curve algorithm where the elliptic curve is implicitly
35
+ * defined by the underlying type.
48
36
*/
49
- class ImplicitEllipticCurveInstance extends Crypto:: EllipticCurveInstance ,
50
- EllipticCurveAlgorithmValueConsumer instanceof ClassInstanceExpr
37
+ abstract class KnownEllipticCurveInstance extends Crypto:: EllipticCurveInstance ,
38
+ Crypto :: EllipticCurveConsumingAlgorithmInstance , Crypto :: AlgorithmValueConsumer instanceof ClassInstanceExpr
51
39
{
52
- EllipticCurveConsumingAlgorithmInstance algorithm ;
53
-
54
- ImplicitEllipticCurveInstance ( ) {
55
- this = algorithm and
56
- exists ( algorithm .getFixedEllipticCurveName ( ) )
57
- }
58
-
59
- EllipticCurveConsumingAlgorithmInstance getAlgorithm ( ) { result = this }
60
-
61
- override string getRawEllipticCurveName ( ) { result = algorithm .getFixedEllipticCurveName ( ) }
62
-
63
- override Crypto:: ConsumerInputDataFlowNode getInputNode ( ) { none ( ) }
64
-
65
- override Crypto:: AlgorithmInstance getAKnownAlgorithmSource ( ) { result = this }
66
-
67
40
override Crypto:: TEllipticCurveType getEllipticCurveType ( ) {
68
41
Crypto:: ellipticCurveNameToKeySizeAndFamilyMapping ( this .getRawEllipticCurveName ( ) .toUpperCase ( ) ,
69
42
_, result )
@@ -73,6 +46,8 @@ class ImplicitEllipticCurveInstance extends Crypto::EllipticCurveInstance,
73
46
Crypto:: ellipticCurveNameToKeySizeAndFamilyMapping ( this .getRawEllipticCurveName ( ) .toUpperCase ( ) ,
74
47
result , _)
75
48
}
49
+
50
+ override Crypto:: AlgorithmValueConsumer getEllipticCurveConsumer ( ) { result = this }
76
51
}
77
52
78
53
/**
@@ -112,6 +87,18 @@ abstract class SignatureAlgorithmInstance extends Crypto::KeyOperationAlgorithmI
112
87
DataFlow:: Node getEllipticCurveInput ( ) { none ( ) }
113
88
}
114
89
90
+ /**
91
+ * Represents an elliptic curve signature algorithm where both the signature
92
+ * algorithm and elliptic curve are implicitly defined by the underlying type.
93
+ */
94
+ abstract class KnownEllipticCurveSignatureAlgorithmInstance extends KnownEllipticCurveInstance ,
95
+ SignatureAlgorithmInstance
96
+ {
97
+ override Crypto:: ConsumerInputDataFlowNode getInputNode ( ) { none ( ) }
98
+
99
+ override Crypto:: AlgorithmInstance getAKnownAlgorithmSource ( ) { result = this }
100
+ }
101
+
115
102
/**
116
103
* DSA and DSADigest signers.
117
104
*/
@@ -129,22 +116,24 @@ class DSASignatureAlgorithmInstance extends SignatureAlgorithmInstance instanceo
129
116
/**
130
117
* Ed25519, Ed25519ph, and Ed25519ctx signers.
131
118
*/
132
- class Ed25519SignatureAlgorithmInstance extends SignatureAlgorithmInstance ,
133
- EllipticCurveConsumingAlgorithmInstance instanceof ClassInstanceExpr
119
+ class Ed25519SignatureAlgorithmInstance extends KnownEllipticCurveSignatureAlgorithmInstance instanceof ClassInstanceExpr
134
120
{
135
121
Ed25519SignatureAlgorithmInstance ( ) {
136
122
super .getConstructedType ( ) instanceof Signers:: Signer and
137
123
super .getConstructedType ( ) .getName ( ) .matches ( "Ed25519%" )
138
124
}
139
125
140
- override string getFixedEllipticCurveName ( ) { result = "Curve25519" }
126
+ override string getRawAlgorithmName ( ) {
127
+ typeNameToRawAlgorithmName ( super .getConstructedType ( ) .getName ( ) , result )
128
+ }
129
+
130
+ override string getRawEllipticCurveName ( ) { result = "Curve25519" }
141
131
}
142
132
143
133
/**
144
134
* Ed448 and Ed448ph signers.
145
135
*/
146
- class Ed448SignatureAlgorithmInstance extends SignatureAlgorithmInstance ,
147
- EllipticCurveConsumingAlgorithmInstance instanceof ClassInstanceExpr
136
+ class Ed448SignatureAlgorithmInstance extends KnownEllipticCurveSignatureAlgorithmInstance instanceof ClassInstanceExpr
148
137
{
149
138
Ed448SignatureAlgorithmInstance ( ) {
150
139
super .getConstructedType ( ) instanceof Signers:: Signer and
@@ -155,7 +144,7 @@ class Ed448SignatureAlgorithmInstance extends SignatureAlgorithmInstance,
155
144
typeNameToRawAlgorithmName ( super .getConstructedType ( ) .getName ( ) , result )
156
145
}
157
146
158
- override string getFixedEllipticCurveName ( ) { result = "Curve448" }
147
+ override string getRawEllipticCurveName ( ) { result = "Curve448" }
159
148
}
160
149
161
150
/**
@@ -171,7 +160,7 @@ class Ed448SignatureAlgorithmInstance extends SignatureAlgorithmInstance,
171
160
class ECDSASignatureAlgorithmInstance extends SignatureAlgorithmInstance instanceof ClassInstanceExpr
172
161
{
173
162
ECDSASignatureAlgorithmInstance ( ) {
174
- super .getConstructedType ( ) instanceof Signers:: Signer and
163
+ super .getConstructedType ( ) instanceof Signers:: OneShotSigner and
175
164
super .getConstructedType ( ) .getName ( ) .matches ( "ECDSA%" )
176
165
}
177
166
@@ -186,6 +175,9 @@ class ECDSASignatureAlgorithmInstance extends SignatureAlgorithmInstance instanc
186
175
override int getKeySizeFixed ( ) { none ( ) }
187
176
}
188
177
178
+ /**
179
+ * LMS signers.
180
+ */
189
181
class LMSSignatureAlgorithmInstance extends SignatureAlgorithmInstance instanceof ClassInstanceExpr {
190
182
LMSSignatureAlgorithmInstance ( ) {
191
183
super .getConstructedType ( ) instanceof Signers:: Signer and
@@ -239,50 +231,79 @@ abstract class KeyGenerationAlgorithmInstance extends Crypto::KeyOperationAlgori
239
231
DataFlow:: Node getEllipticCurveInput ( ) { none ( ) }
240
232
}
241
233
242
- class Ed25519KeyGenerationAlgorithmInstance extends KeyGenerationAlgorithmInstance ,
243
- EllipticCurveConsumingAlgorithmInstance instanceof ClassInstanceExpr
234
+ /**
235
+ * Represents an elliptic curve key generation algorithm where both the key
236
+ * generation algorithm and elliptic curve are implicitly defined by the
237
+ * underlying type.
238
+ */
239
+ abstract class KnownEllipticCurveKeyGenerationAlgorithmInstance extends KnownEllipticCurveInstance ,
240
+ KeyGenerationAlgorithmInstance
241
+ {
242
+ override Crypto:: ConsumerInputDataFlowNode getInputNode ( ) { none ( ) }
243
+
244
+ override Crypto:: AlgorithmInstance getAKnownAlgorithmSource ( ) { result = this }
245
+ }
246
+
247
+ class Ed25519KeyGenerationAlgorithmInstance extends KnownEllipticCurveKeyGenerationAlgorithmInstance instanceof ClassInstanceExpr
244
248
{
245
249
Ed25519KeyGenerationAlgorithmInstance ( ) {
246
250
super .getConstructedType ( ) instanceof Generators:: KeyGenerator and
247
251
super .getConstructedType ( ) .getName ( ) .matches ( "Ed25519%" )
248
252
}
249
253
250
- override string getFixedEllipticCurveName ( ) { result = "Curve25519" }
254
+ override string getRawEllipticCurveName ( ) { result = "Curve25519" }
251
255
}
252
256
253
- class Ed448KeyGenerationAlgorithmInstance extends KeyGenerationAlgorithmInstance ,
254
- EllipticCurveConsumingAlgorithmInstance instanceof ClassInstanceExpr
257
+ class Ed448KeyGenerationAlgorithmInstance extends KnownEllipticCurveKeyGenerationAlgorithmInstance instanceof ClassInstanceExpr
255
258
{
256
259
Ed448KeyGenerationAlgorithmInstance ( ) {
257
260
super .getConstructedType ( ) instanceof Generators:: KeyGenerator and
258
261
super .getConstructedType ( ) .getName ( ) .matches ( "Ed448%" )
259
262
}
260
263
261
- override string getFixedEllipticCurveName ( ) { result = "Curve448" }
264
+ override string getRawEllipticCurveName ( ) { result = "Curve448" }
262
265
}
263
266
264
267
/**
265
268
* Represents a generic `ECKeyPairGenerator` instance.
266
269
*/
267
- class GenericEllipticCurveKeyGenerationAlgorithmInstance extends KeyGenerationAlgorithmInstance instanceof ClassInstanceExpr
270
+ class GenericEllipticCurveKeyGenerationAlgorithmInstance extends KeyGenerationAlgorithmInstance ,
271
+ Crypto:: EllipticCurveConsumingAlgorithmInstance instanceof ClassInstanceExpr
268
272
{
269
273
GenericEllipticCurveKeyGenerationAlgorithmInstance ( ) {
270
274
super .getConstructedType ( ) instanceof Generators:: KeyGenerator and
271
275
super .getConstructedType ( ) .getName ( ) .matches ( "EC%" )
272
276
}
273
277
274
278
override string getRawAlgorithmName ( ) {
275
- // TODO: The generator constructs an elliptic curve key pair, but the
276
- // algorithm is not determined at key generation. As an example, the key
277
- // could be used for either ECDSA or ECDH. For this reason, we just return
278
- // "EllipticCurve".
279
- result = "EllipticCurve"
279
+ // TODO: The generator constructs an elliptic curve key pair. The curve used
280
+ // is determined using data flow. If this fails we would like to report
281
+ // something useful, so we use "UnknownCurve". However, this should probably
282
+ // be handled at the node layer.
283
+ if exists ( this .getConsumedEllipticCurve ( ) )
284
+ then result = this .getConsumedEllipticCurve ( ) .getRawEllipticCurveName ( )
285
+ else result = "UnknownCurve"
280
286
}
281
287
282
288
override Crypto:: KeyOpAlg:: Algorithm getAlgorithmType ( ) {
283
- // The algorithm type is not known. See above.
289
+ // TODO: There is currently to algorithm type for elliptic curve key
290
+ // generation.
284
291
result = Crypto:: KeyOpAlg:: TUnknownKeyOperationAlgorithmType ( )
285
292
}
293
+
294
+ override Crypto:: AlgorithmValueConsumer getEllipticCurveConsumer ( ) {
295
+ // The elliptic curve is resolved recursively from the parameters passed to
296
+ // the `init()` call.
297
+ exists ( MethodCall init |
298
+ init = Generators:: KeyGeneratorFlow:: getInitFromNew ( this , _, _) and
299
+ result =
300
+ Generators:: ParametersFlow:: getParametersFromInit ( init , _, _) .getAnAlgorithmValueConsumer ( )
301
+ )
302
+ }
303
+
304
+ Crypto:: EllipticCurveInstance getConsumedEllipticCurve ( ) {
305
+ result = this .getEllipticCurveConsumer ( ) .getAKnownAlgorithmSource ( )
306
+ }
286
307
}
287
308
288
309
/**
0 commit comments