@@ -15,18 +15,51 @@ class EVPKeyGenInitialize extends EVPInitialize {
1515 override Expr getAlgorithmArg ( ) { result = getAlgorithmFromCtx ( this .getContextArg ( ) ) }
1616}
1717
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 {
1947 EVPKeyGenOperation ( ) {
2048 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
2353 ]
2454 }
2555
2656 override Expr getAlgorithmArg ( ) {
2757 if this .( Call ) .getTarget ( ) .getName ( ) = "EVP_PKEY_Q_keygen"
2858 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 ( )
3063 }
3164
3265 override Crypto:: KeyArtifactType getOutputKeyType ( ) { result = Crypto:: TAsymmetricKeyType ( ) }
@@ -36,11 +69,16 @@ class EVPKeyGenOperation extends EVPOperation, Crypto::KeyGenerationOperationIns
3669 override Expr getOutputArg ( ) { result = this .( Call ) .getArgument ( 1 ) }
3770
3871 override Crypto:: ArtifactOutputDataFlowNode getOutputKeyArtifact ( ) {
39- result = EVPOperation .super .getOutputKeyArtifact ( )
72+ result = EVPFinal .super .getOutputKeyArtifact ( )
4073 }
4174
4275 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 ( ) )
4482 }
4583
4684 override int getKeySizeFixed ( ) {
0 commit comments