@@ -69,8 +69,6 @@ class ConstantDataSource extends Crypto::GenericConstantOrAllocationSource insta
6969 override DataFlow:: Node getOutputNode ( ) { result .asExpr ( ) = this }
7070
7171 override predicate flowsTo ( Crypto:: FlowAwareElement other ) {
72- other instanceof NonceArtifactInstance and
73- // limit to only nonces for now
7472 // TODO: separate config to avoid blowing up data-flow analysis
7573 GenericDataSourceUniversalFlow:: flow ( this .getOutputNode ( ) , other .getInputNode ( ) )
7674 }
@@ -113,40 +111,42 @@ abstract class AdditionalFlowInputStep extends DataFlow::Node {
113111 final DataFlow:: Node getInput ( ) { result = this }
114112}
115113
116- module ArtifactUniversalFlowConfig implements DataFlow:: ConfigSig {
117- predicate isSource ( DataFlow:: Node source ) {
118- source = any ( Crypto:: ArtifactElement artifact ) .getOutputNode ( )
119- }
114+ module ArtifactUniversalFlow = DataFlow:: Global< ArtifactUniversalFlowConfig > ;
120115
121- predicate isSink ( DataFlow:: Node sink ) {
122- sink = any ( Crypto:: FlowAwareElement other ) .getInputNode ( )
116+ class NonceArtifactConsumer extends Crypto:: NonceArtifactInstance instanceof Crypto:: NonceArtifactConsumer
117+ {
118+ override predicate flowsTo ( Crypto:: FlowAwareElement other ) {
119+ ArtifactUniversalFlow:: flow ( this .getOutputNode ( ) , other .getInputNode ( ) )
123120 }
124121
125- predicate isBarrierIn ( DataFlow:: Node node ) {
126- node = any ( Crypto:: FlowAwareElement element ) .getOutputNode ( )
122+ override DataFlow:: Node getOutputNode ( ) {
123+ result = this . ( Crypto:: NonceArtifactConsumer ) .getOutputNode ( )
127124 }
128125
129- predicate isAdditionalFlowStep ( DataFlow:: Node node1 , DataFlow :: Node node2 ) {
130- node1 . ( AdditionalFlowInputStep ) . getOutput ( ) = node2
126+ override DataFlow:: Node getInputNode ( ) {
127+ result = this . ( Crypto :: NonceArtifactConsumer ) . getInputNode ( )
131128 }
132129}
133130
134- module ArtifactUniversalFlow = DataFlow:: Global< ArtifactUniversalFlowConfig > ;
135-
136- class NonceArtifactInstance extends Crypto:: NonceArtifactInstance {
137- NonceArtifactInstance ( ) { this instanceof Crypto:: NonceArtifactConsumer }
138-
131+ class CipherInputConsumer extends Crypto:: CipherInputArtifactInstance instanceof Crypto:: CipherInputConsumer
132+ {
139133 override predicate flowsTo ( Crypto:: FlowAwareElement other ) {
140134 ArtifactUniversalFlow:: flow ( this .getOutputNode ( ) , other .getInputNode ( ) )
141135 }
142136
143- override DataFlow:: Node getOutputNode ( ) {
144- result = this .( Crypto:: NonceArtifactConsumer ) .getOutputNode ( )
145- }
137+ override DataFlow:: Node getOutputNode ( ) { none ( ) }
146138
147139 override DataFlow:: Node getInputNode ( ) {
148- result = this .( Crypto:: NonceArtifactConsumer ) .getInputNode ( )
140+ result = this .( Crypto:: CipherInputArtifactInstance ) .getInputNode ( )
141+ }
142+ }
143+
144+ abstract class CipherOutputArtifact extends Crypto:: CipherOutputArtifactInstance {
145+ override predicate flowsTo ( Crypto:: FlowAwareElement other ) {
146+ ArtifactUniversalFlow:: flow ( this .getOutputNode ( ) , other .getInputNode ( ) )
149147 }
148+
149+ override DataFlow:: Node getInputNode ( ) { none ( ) }
150150}
151151
152152/**
@@ -161,6 +161,32 @@ module GenericDataSourceUniversalFlowConfig implements DataFlow::ConfigSig {
161161 sink = any ( Crypto:: FlowAwareElement other ) .getInputNode ( )
162162 }
163163
164+ predicate isBarrierOut ( DataFlow:: Node node ) {
165+ node = any ( Crypto:: FlowAwareElement element ) .getInputNode ( )
166+ }
167+
168+ predicate isBarrierIn ( DataFlow:: Node node ) {
169+ node = any ( Crypto:: FlowAwareElement element ) .getOutputNode ( )
170+ }
171+
172+ predicate isAdditionalFlowStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
173+ node1 .( AdditionalFlowInputStep ) .getOutput ( ) = node2
174+ }
175+ }
176+
177+ module ArtifactUniversalFlowConfig implements DataFlow:: ConfigSig {
178+ predicate isSource ( DataFlow:: Node source ) {
179+ source = any ( Crypto:: ArtifactElement artifact ) .getOutputNode ( )
180+ }
181+
182+ predicate isSink ( DataFlow:: Node sink ) {
183+ sink = any ( Crypto:: FlowAwareElement other ) .getInputNode ( )
184+ }
185+
186+ predicate isBarrierOut ( DataFlow:: Node node ) {
187+ node = any ( Crypto:: FlowAwareElement element ) .getInputNode ( )
188+ }
189+
164190 predicate isBarrierIn ( DataFlow:: Node node ) {
165191 node = any ( Crypto:: FlowAwareElement element ) .getOutputNode ( )
166192 }
0 commit comments