1+ import powershell
2+ import semmle.code.powershell.dataflow.DataFlow
3+ import semmle.code.powershell.ApiGraphs
4+
5+ import CryptoArtifact
6+
7+ class CryptoAlgorithmObjectCreation extends DataFlow:: ObjectCreationNode {
8+ string objectName ;
9+ CryptoAlgorithmObjectCreation ( ) {
10+ objectName = this .getExprNode ( ) .getExpr ( ) .( CallExpr ) .getAnArgument ( ) .getValue ( ) .asString ( ) .toLowerCase ( )
11+ }
12+ string getObjectName ( ) {
13+ result = objectName
14+ }
15+ }
16+
17+ class CryptoAlgorithmCreateCall extends DataFlow:: CallNode {
18+ string objectName ;
19+ CryptoAlgorithmCreateCall ( ) {
20+ this = API:: getTopLevelMember ( "system" ) .getMember ( "security" ) .getMember ( "cryptography" ) .getMember ( objectName ) .getMember ( "create" ) .asCall ( )
21+ }
22+
23+ string getObjectName ( ) {
24+ result = objectName
25+ }
26+ }
27+
28+ class CryptoAlgorithmCreateArgCall extends DataFlow:: CallNode {
29+ string objectName ;
30+ CryptoAlgorithmCreateArgCall ( ) {
31+ (
32+ this = API:: getTopLevelMember ( "system" ) .getMember ( "security" ) .getMember ( "cryptography" ) .getMember ( _) .getMember ( "create" ) .asCall ( ) or
33+ this = API:: getTopLevelMember ( "system" ) .getMember ( "security" ) .getMember ( "cryptography" ) .getMember ( "create" ) .asCall ( )
34+ ) and
35+ objectName = this .getAnArgument ( ) .asExpr ( ) .getValue ( ) .asString ( ) .toLowerCase ( )
36+ }
37+
38+ string getObjectName ( ) {
39+ result = objectName
40+ }
41+ }
42+
43+
44+ class CryptoAlgorithmCreateFromNameCall extends DataFlow:: CallNode {
45+ string objectName ;
46+ CryptoAlgorithmCreateFromNameCall ( ) {
47+ this = API:: getTopLevelMember ( "system" ) .getMember ( "security" ) .getMember ( "cryptography" ) .getMember ( "cryptoconfig" ) .getMember ( "createfromname" ) .asCall ( ) and
48+ objectName = this .getAnArgument ( ) .asExpr ( ) .getValue ( ) .asString ( ) .toLowerCase ( )
49+ }
50+
51+ string getObjectName ( ) {
52+ result = objectName
53+ }
54+ }
55+
56+ class HashAlgorithmObjectCreation extends HashAlgorithm , CryptoAlgorithmObjectCreation {
57+ string algName ;
58+ HashAlgorithmObjectCreation ( ) {
59+ (
60+ this .getObjectName ( ) = "system.security.cryptography." + algName or
61+ this .getObjectName ( ) = "system.security.cryptography." + algName + "cryptoserviceprovider"
62+ )
63+ and
64+ isHashingAlgorithm ( algName )
65+ }
66+
67+ override string getName ( ) {
68+ result = algName
69+ }
70+ }
71+
72+ class HashAlgorithmCreateCall extends HashAlgorithm , CryptoAlgorithmCreateCall {
73+ string algName ;
74+ HashAlgorithmCreateCall ( ) {
75+ isHashingAlgorithm ( this .getObjectName ( ) ) and
76+ (
77+ this .getObjectName ( ) = algName or
78+ this .getObjectName ( ) = "system.security.cryptography." + algName
79+ )
80+ }
81+ override string getName ( ) {
82+ result = algName
83+ }
84+ }
85+
86+ class HashAlgorithmCreateFromNameCall extends HashAlgorithm , CryptoAlgorithmCreateFromNameCall {
87+ string algName ;
88+ HashAlgorithmCreateFromNameCall ( ) {
89+ (
90+ this .getObjectName ( ) = algName or
91+ this .getObjectName ( ) = "system.security.cryptography." + algName
92+ ) and
93+ isHashingAlgorithm ( algName )
94+ }
95+
96+ override string getName ( ) {
97+ result = algName
98+ }
99+ }
100+
101+ class SymmetricAlgorithmObjectCreation extends SymmetricAlgorithm , CryptoAlgorithmObjectCreation {
102+ string algName ;
103+ SymmetricAlgorithmObjectCreation ( ) {
104+ (
105+ this .getObjectName ( ) = "system.security.cryptography." + algName or
106+ this .getObjectName ( ) = "system.security.cryptography." + algName + "cryptoserviceprovider" or
107+ this .getObjectName ( ) = "system.security.cryptography.symmetricalgorithm." + algName
108+ )
109+ and
110+ isSymmetricAlgorithm ( algName )
111+ }
112+
113+ override string getName ( ) {
114+ result = algName
115+ }
116+ }
117+
118+ class SymmetricAlgorithmCreateCall extends SymmetricAlgorithm , CryptoAlgorithmCreateCall {
119+ string algName ;
120+ SymmetricAlgorithmCreateCall ( ) {
121+ isSymmetricAlgorithm ( this .getObjectName ( ) ) and
122+ (
123+ this .getObjectName ( ) = algName or
124+ this .getObjectName ( ) = "system.security.cryptography." + algName or
125+ this .getObjectName ( ) = "system.security.cryptography.symmetricalgorithm." + algName
126+ )
127+ }
128+ override string getName ( ) {
129+ result = algName
130+ }
131+ }
132+
133+ class SymmetricAlgorithmCreateArgCall extends SymmetricAlgorithm , CryptoAlgorithmCreateArgCall {
134+ string algName ;
135+ SymmetricAlgorithmCreateArgCall ( ) {
136+
137+ (
138+ algName = this .getObjectName ( ) and
139+ isSymmetricAlgorithm ( algName )
140+ ) or
141+ (
142+ this .getObjectName ( ) = "system.security.cryptography." + algName and
143+ isSymmetricAlgorithm ( algName )
144+ )
145+ }
146+ override string getName ( ) {
147+ result = algName
148+ }
149+ }
150+
151+ class SymmetricAlgorithmCreateFromNameCall extends SymmetricAlgorithm , CryptoAlgorithmCreateFromNameCall {
152+ string algName ;
153+ SymmetricAlgorithmCreateFromNameCall ( ) {
154+ (
155+ this .getObjectName ( ) = algName or
156+ this .getObjectName ( ) = "system.security.cryptography." + algName or
157+ this .getObjectName ( ) = "system.security.cryptography.symmetricalgorithm." + algName
158+ ) and
159+ isSymmetricAlgorithm ( algName )
160+ }
161+
162+ override string getName ( ) {
163+ result = algName
164+ }
165+ }
166+
167+ class CipherBlockStringConstExpr extends BlockMode {
168+ string modeName ;
169+ CipherBlockStringConstExpr ( ) {
170+ exists ( StringConstExpr s |
171+ s = this .asExpr ( ) .getExpr ( ) and
172+ modeName = s .getValueString ( ) .toLowerCase ( ) and
173+ isCipherBlockModeAlgorithm ( modeName )
174+ )
175+ }
176+ override string getName ( ) {
177+ result = modeName
178+ }
179+ }
180+
181+ class CipherBlockModeEnum extends BlockMode {
182+ string modeName ;
183+ CipherBlockModeEnum ( ) {
184+ exists ( API:: Node node |
185+ node =
186+ API:: getTopLevelMember ( "system" )
187+ .getMember ( "security" )
188+ .getMember ( "cryptography" )
189+ .getMember ( "ciphermode" )
190+ .getMember ( modeName ) and
191+ this = node .asSource ( ) and
192+ isCipherBlockModeAlgorithm ( modeName )
193+ )
194+ }
195+ override string getName ( ) {
196+ result = modeName
197+ }
198+ }
0 commit comments