@@ -15,18 +15,51 @@ class EVPKeyGenInitialize extends EVPInitialize {
15
15
override Expr getAlgorithmArg ( ) { result = getAlgorithmFromCtx ( this .getContextArg ( ) ) }
16
16
}
17
17
18
- class EVPKeyGenOperation extends EVPOperation , Crypto:: KeyGenerationOperationInstance {
18
+ /**
19
+ * All calls that can be tracked via ctx.
20
+ * For example calls used to set parameters like a key size.
21
+ */
22
+ class EVPKeyGenUpdate extends EVPUpdate {
23
+ EVPKeyGenUpdate ( ) {
24
+ this .( Call ) .getTarget ( ) .getName ( ) in [
25
+ "EVP_PKEY_CTX_set_rsa_keygen_bits" ,
26
+ // TODO: "EVP_PKEY_CTX_set_params"
27
+ ]
28
+ }
29
+
30
+ /**
31
+ * No input in our meaning.
32
+ */
33
+ override Expr getInputArg ( ) { none ( ) }
34
+
35
+ /**
36
+ * No output in our meaning.
37
+ */
38
+ override Expr getOutputArg ( ) { none ( ) }
39
+
40
+ Expr getKeySizeArg ( ) {
41
+ this .( Call ) .getTarget ( ) .getName ( ) = "EVP_PKEY_CTX_set_rsa_keygen_bits" and
42
+ result = this .( Call ) .getArgument ( 1 )
43
+ }
44
+ }
45
+
46
+ class EVPKeyGenOperation extends EVPFinal , Crypto:: KeyGenerationOperationInstance {
19
47
EVPKeyGenOperation ( ) {
20
48
this .( Call ) .getTarget ( ) .getName ( ) in [
21
- "EVP_PKEY_generate" , "EVP_PKEY_keygen" , "EVP_PKEY_Q_keygen" , "EVP_PKEY_paramgen"
22
- // TODO: "EVP_PKEY_paramgen"
49
+ "EVP_PKEY_generate" , "EVP_PKEY_keygen" , "EVP_PKEY_Q_keygen" , "EVP_PKEY_paramgen" ,
50
+ "EVP_RSA_gen"
51
+ // TODO: "EVP_PKEY_paramgen" may need special handling
52
+ // TODO: RSA_generate_key, RSA_generate_key_ex, etc
23
53
]
24
54
}
25
55
26
56
override Expr getAlgorithmArg ( ) {
27
57
if this .( Call ) .getTarget ( ) .getName ( ) = "EVP_PKEY_Q_keygen"
28
58
then result = this .( Call ) .getArgument ( 0 )
29
- else result = EVPOperation .super .getAlgorithmArg ( )
59
+ else
60
+ if this .( Call ) .getTarget ( ) .getName ( ) = "EVP_RSA_gen"
61
+ then result = this
62
+ else result = EVPFinal .super .getAlgorithmArg ( )
30
63
}
31
64
32
65
override Crypto:: KeyArtifactType getOutputKeyType ( ) { result = Crypto:: TAsymmetricKeyType ( ) }
@@ -36,11 +69,16 @@ class EVPKeyGenOperation extends EVPOperation, Crypto::KeyGenerationOperationIns
36
69
override Expr getOutputArg ( ) { result = this .( Call ) .getArgument ( 1 ) }
37
70
38
71
override Crypto:: ArtifactOutputDataFlowNode getOutputKeyArtifact ( ) {
39
- result = EVPOperation .super .getOutputKeyArtifact ( )
72
+ result = EVPFinal .super .getOutputKeyArtifact ( )
40
73
}
41
74
42
75
override Crypto:: ConsumerInputDataFlowNode getKeySizeConsumer ( ) {
43
- none ( ) // TODO
76
+ if this .( Call ) .getTarget ( ) .getName ( ) = "EVP_PKEY_Q_keygen"
77
+ then result = DataFlow:: exprNode ( this .( Call ) .getArgument ( 3 ) ) // TODO: may be wrong for EC keys
78
+ else
79
+ if this .( Call ) .getTarget ( ) .getName ( ) = "EVP_RSA_gen"
80
+ then result = DataFlow:: exprNode ( this .( Call ) .getArgument ( 0 ) )
81
+ else result = DataFlow:: exprNode ( this .getUpdateCalls ( ) .( EVPKeyGenUpdate ) .getKeySizeArg ( ) )
44
82
}
45
83
46
84
override int getKeySizeFixed ( ) {
0 commit comments