1+
2+ typedef unsigned long size_t ;
3+
4+ // --- simple encryption macro invocations ---
5+
6+ void my_implementation1 (void *data, size_t amount);
7+ void my_implementation2 (void *data, size_t amount);
8+ void my_implementation3 (void *data, size_t amount);
9+ void my_implementation4 (void *data, size_t amount);
10+ void my_implementation5 (void *data, size_t amount);
11+ void my_implementation6 (const char *str);
12+
13+ #define ENCRYPT_WITH_DES (data, amount ) my_implementation1(data, amount)
14+ #define ENCRYPT_WITH_RC2 (data, amount ) my_implementation2(data, amount)
15+ #define ENCRYPT_WITH_AES (data, amount ) my_implementation3(data, amount)
16+ #define ENCRYPT_WITH_3DES (data, amount ) my_implementation4(data, amount)
17+ #define ENCRYPT_WITH_TRIPLE_DES (data, amount ) my_implementation4(data, amount)
18+ #define ENCRYPT_WITH_RC20 (data, amount ) my_implementation5(data, amount)
19+ #define ENCRYPT_WITH_DES_REMOVED (data, amount )
20+
21+ #define DESENCRYPT (data, amount ) my_implementation1(data, amount)
22+ #define RC2ENCRYPT (data, amount ) my_implementation2(data, amount)
23+ #define AESENCRYPT (data, amount ) my_implementation3(data, amount)
24+ #define DES3ENCRYPT (data, amount ) my_implementation4(data, amount)
25+
26+ #define DES_DO_ENCRYPTION (data, amount ) my_implementation1(data, amount)
27+ #define RUN_DES_ENCODING (data, amount ) my_implementation1(data, amount)
28+ #define DES_ENCODE (data, amount ) my_implementation1(data, amount)
29+ #define DES_SET_KEY (data, amount ) my_implementation1(data, amount)
30+
31+ #define DES (str ) my_implementation6(str)
32+ #define DESMOND (str ) my_implementation6(str)
33+ #define ANODES (str ) my_implementation6(str)
34+ #define SORT_ORDER_DES (1 )
35+
36+ void test_macros (void *data, size_t amount, const char *str)
37+ {
38+ ENCRYPT_WITH_DES (data, amount); // BAD
39+ ENCRYPT_WITH_RC2 (data, amount); // BAD
40+ ENCRYPT_WITH_AES (data, amount); // GOOD (good algorithm)
41+ ENCRYPT_WITH_3DES (data, amount); // BAD
42+ ENCRYPT_WITH_TRIPLE_DES (data, amount); // BAD
43+ ENCRYPT_WITH_RC20 (data, amount); // GOOD (if there ever is an RC20 algorithm, we have no reason to believe it's weak)
44+ ENCRYPT_WITH_DES_REMOVED (data, amount); // GOOD (implementation has been deleted)
45+
46+ DESENCRYPT (data, amount); // BAD [NOT DETECTED]
47+ RC2ENCRYPT (data, amount); // BAD [NOT DETECTED]
48+ AESENCRYPT (data, amount); // GOOD (good algorithm)
49+ DES3ENCRYPT (data, amount); // BAD [NOT DETECTED]
50+
51+ DES_DO_ENCRYPTION (data, amount); // BAD
52+ RUN_DES_ENCODING (data, amount); // BAD
53+ DES_ENCODE (data, amount); // BAD
54+ DES_SET_KEY (data, amount); // BAD
55+
56+ DES (str); // GOOD (probably nothing to do with encryption)
57+ DESMOND (str); // GOOD (probably nothing to do with encryption)
58+ ANODES (str); // GOOD (probably nothing to do with encryption)
59+ int ord = SORT_ORDER_DES; // GOOD (probably nothing to do with encryption)
60+ }
61+
62+ // --- simple encryption function calls ---
63+
64+ void encryptDES (void *data, size_t amount);
65+ void encryptRC2 (void *data, size_t amount);
66+ void encryptAES (void *data, size_t amount);
67+ void encrypt3DES (void *data, size_t amount);
68+ void encryptTripleDES (void *data, size_t amount);
69+
70+ void DESEncrypt (void *data, size_t amount);
71+ void RC2Encrypt (void *data, size_t amount);
72+ void AESEncrypt (void *data, size_t amount);
73+ void DES3Encrypt (void *data, size_t amount);
74+
75+ void DoDESEncryption (void *data, size_t amount);
76+ void encryptDes (void *data, size_t amount);
77+ void do_des_encrypt (void *data, size_t amount);
78+ void DES_Set_Key (const char *key);
79+ void DESSetKey (const char *key);
80+
81+ int Des ();
82+ void Desmond (const char *str);
83+ void Anodes (int i);
84+ void ConDes ();
85+
86+ void test_functions (void *data, size_t amount, const char *str)
87+ {
88+ encryptDES (data, amount); // BAD
89+ encryptRC2 (data, amount); // BAD
90+ encryptAES (data, amount); // GOOD (good algorithm)
91+ encrypt3DES (data, amount); // BAD
92+ encryptTripleDES (data, amount); // BAD
93+
94+ DESEncrypt (data, amount); // BAD [NOT DETECTED]
95+ RC2Encrypt (data, amount); // BAD [NOT DETECTED]
96+ AESEncrypt (data, amount); // GOOD (good algorithm)
97+ DES3Encrypt (data, amount); // BAD [NOT DETECTED]
98+
99+ DoDESEncryption (data, amount); // BAD [NOT DETECTED]
100+ encryptDes (data, amount); // BAD [NOT DETECTED]
101+ do_des_encrypt (data, amount); // BAD
102+ DES_Set_Key (str); // BAD
103+ DESSetKey (str); // BAD [NOT DETECTED]
104+
105+ Des (); // GOOD (probably nothing to do with encryption)
106+ Desmond (str); // GOOD (probably nothing to do with encryption)
107+ Anodes (1 ); // GOOD (probably nothing to do with encryption)
108+ ConDes (); // GOOD (probably nothing to do with encryption)
109+ }
110+
111+ // --- macros for functions with no arguments ---
112+
113+ void my_implementation7 ();
114+ void my_implementation8 ();
115+
116+ #define INIT_ENCRYPT_WITH_DES () my_implementation7()
117+ #define INIT_ENCRYPT_WITH_AES () my_implementation8()
118+
119+ void test_macros2 ()
120+ {
121+ INIT_ENCRYPT_WITH_DES (); // BAD
122+ INIT_ENCRYPT_WITH_AES (); // GOOD (good algorithm)
123+
124+ // ...
125+ }
0 commit comments