FreeRDP
Loading...
Searching...
No Matches
TestCryptoCipher.c
1
2#include <winpr/crt.h>
3#include <winpr/print.h>
4#include <winpr/crypto.h>
5#include <winpr/ssl.h>
6
7static BOOL test_crypto_cipher_aes_128_cbc(BOOL ex)
8{
9 BOOL result = FALSE;
10 BYTE key[16] = "0123456789abcdeF";
11 BYTE iv[16] = "1234567887654321";
12 BYTE ibuf[1024] = { 0 };
13 BYTE obuf[1024] = { 0 };
14 size_t ilen = 0;
15 size_t olen = 0;
16 size_t xlen = 0;
17 const char plaintext[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do "
18 "eiusmod tempor incididunt ut labore et dolore magna aliqua.";
19
20 /* encrypt */
21
22 WINPR_CIPHER_CTX* ctx = NULL;
23 if (ex)
24 ctx = winpr_Cipher_NewEx(WINPR_CIPHER_AES_128_CBC, WINPR_ENCRYPT, key, sizeof(key), iv,
25 sizeof(iv));
26#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
27 else
28 ctx = winpr_Cipher_New(WINPR_CIPHER_AES_128_CBC, WINPR_ENCRYPT, key, iv);
29#endif
30 if (!ctx)
31 {
32 (void)fprintf(stderr, "%s: winpr_Cipher_New (encrypt) failed\n", __func__);
33 return FALSE;
34 }
35
36 ilen = strnlen(plaintext, sizeof(plaintext)) + 1;
37 memcpy(ibuf, plaintext, ilen);
38
39 ilen = ((ilen + 15) / 16) * 16;
40 olen = 0;
41 xlen = 0;
42
43 if (!winpr_Cipher_Update(ctx, ibuf, ilen, obuf, &olen))
44 {
45 (void)fprintf(stderr, "%s: winpr_Cipher_New (encrypt) failed\n", __func__);
46 goto out;
47 }
48 xlen += olen;
49
50 if (!winpr_Cipher_Final(ctx, obuf + xlen, &olen))
51 {
52 (void)fprintf(stderr, "%s: winpr_Cipher_Final (encrypt) failed\n", __func__);
53 goto out;
54 }
55 xlen += olen;
56
57 if (xlen != ilen)
58 {
59 (void)fprintf(stderr, "%s: error, xlen (%" PRIuz ") != ilen (%" PRIuz ") (encrypt)\n",
60 __func__, xlen, ilen);
61 goto out;
62 }
63
64 winpr_Cipher_Free(ctx);
65 ctx = NULL;
66
67 /* decrypt */
68
69 if (ex)
70 ctx = winpr_Cipher_NewEx(WINPR_CIPHER_AES_128_CBC, WINPR_DECRYPT, key, sizeof(key), iv,
71 sizeof(iv));
72#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
73 else
74 ctx = winpr_Cipher_New(WINPR_CIPHER_AES_128_CBC, WINPR_DECRYPT, key, iv);
75
76#endif
77 if (!ctx)
78 {
79 (void)fprintf(stderr, "%s: winpr_Cipher_New (decrypt) failed\n", __func__);
80 return FALSE;
81 }
82
83 memset(ibuf, 0, sizeof(ibuf));
84 memcpy(ibuf, obuf, xlen);
85 memset(obuf, 0, sizeof(obuf));
86
87 ilen = xlen;
88 olen = 0;
89 xlen = 0;
90
91 if (!winpr_Cipher_Update(ctx, ibuf, ilen, obuf, &olen))
92 {
93 (void)fprintf(stderr, "%s: winpr_Cipher_New (decrypt) failed\n", __func__);
94 goto out;
95 }
96 xlen += olen;
97
98 if (!winpr_Cipher_Final(ctx, obuf + xlen, &olen))
99 {
100 (void)fprintf(stderr, "%s: winpr_Cipher_Final (decrypt) failed\n", __func__);
101 goto out;
102 }
103 xlen += olen;
104
105 if (xlen != ilen)
106 {
107 (void)fprintf(stderr, "%s: error, xlen (%" PRIuz ") != ilen (%" PRIuz ") (decrypt)\n",
108 __func__, xlen, ilen);
109 goto out;
110 }
111
112 if (strcmp((const char*)obuf, plaintext) != 0)
113 {
114 (void)fprintf(stderr, "%s: error, decrypted data does not match plaintext\n", __func__);
115 goto out;
116 }
117
118 result = TRUE;
119
120out:
121 winpr_Cipher_Free(ctx);
122 return result;
123}
124
125static const char TEST_RC4_KEY[] = "Key";
126static const char TEST_RC4_PLAINTEXT[] = "Plaintext";
127static const char TEST_RC4_CIPHERTEXT[] = "\xBB\xF3\x16\xE8\xD9\x40\xAF\x0A\xD3";
128
129static BOOL test_crypto_cipher_rc4(void)
130{
131 BOOL rc = FALSE;
132 WINPR_RC4_CTX* ctx = NULL;
133
134 const size_t len = strnlen(TEST_RC4_PLAINTEXT, sizeof(TEST_RC4_PLAINTEXT));
135 BYTE* text = (BYTE*)calloc(1, len);
136 if (!text)
137 {
138 (void)fprintf(stderr, "%s: failed to allocate text buffer (len=%" PRIuz ")\n", __func__,
139 len);
140 goto out;
141 }
142
143 if ((ctx = winpr_RC4_New(TEST_RC4_KEY, strnlen(TEST_RC4_KEY, sizeof(TEST_RC4_KEY)))) == NULL)
144 {
145 (void)fprintf(stderr, "%s: winpr_RC4_New failed\n", __func__);
146 goto out;
147 }
148 rc = winpr_RC4_Update(ctx, len, (const BYTE*)TEST_RC4_PLAINTEXT, text);
149 winpr_RC4_Free(ctx);
150 if (!rc)
151 {
152 (void)fprintf(stderr, "%s: winpr_RC4_Update failed\n", __func__);
153 goto out;
154 }
155
156 if (memcmp(text, TEST_RC4_CIPHERTEXT, len) != 0)
157 {
158 char* actual = NULL;
159 char* expected = NULL;
160
161 actual = winpr_BinToHexString(text, len, FALSE);
162 expected = winpr_BinToHexString(TEST_RC4_CIPHERTEXT, len, FALSE);
163
164 (void)fprintf(stderr, "%s: unexpected RC4 ciphertext: Actual: %s Expected: %s\n", __func__,
165 actual, expected);
166
167 free(actual);
168 free(expected);
169 goto out;
170 }
171
172 rc = TRUE;
173
174out:
175 free(text);
176 return rc;
177}
178
179static const BYTE* TEST_RAND_DATA =
180 (BYTE*)"\x1F\xC2\xEE\x4C\xA3\x66\x80\xA2\xCE\xFE\x56\xB4\x9E\x08\x30\x96"
181 "\x33\x6A\xA9\x6D\x36\xFD\x3C\xB7\x83\x04\x4E\x5E\xDC\x22\xCD\xF3"
182 "\x48\xDF\x3A\x2A\x61\xF1\xA8\xFA\x1F\xC6\xC7\x1B\x81\xB4\xE1\x0E"
183 "\xCB\xA2\xEF\xA1\x12\x4A\x83\xE5\x1D\x72\x1D\x2D\x26\xA8\x6B\xC0";
184
185static const BYTE* TEST_CIPHER_KEY =
186 (BYTE*)"\x9D\x7C\xC0\xA1\x94\x3B\x07\x67\x2F\xD3\x83\x10\x51\x83\x38\x0E"
187 "\x1C\x74\x8C\x4E\x15\x79\xD6\xFF\xE2\xF0\x37\x7F\x8C\xD7\xD2\x13";
188
189static const BYTE* TEST_CIPHER_IV =
190 (BYTE*)"\xFE\xE3\x9F\xF0\xD1\x5E\x37\x0C\xAB\xAB\x9B\x04\xF3\xDB\x99\x15";
191
192static BOOL test_crypto_cipher_key(void)
193{
194 int status = 0;
195 BYTE key[32] = { 0 };
196 BYTE iv[16] = { 0 };
197 BYTE salt[8] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
198
199 status = winpr_Cipher_BytesToKey(WINPR_CIPHER_AES_256_CBC, WINPR_MD_SHA1, salt, TEST_RAND_DATA,
200 64, 4, key, iv);
201
202 if (status != 32 || memcmp(key, TEST_CIPHER_KEY, 32) != 0 ||
203 memcmp(iv, TEST_CIPHER_IV, 16) != 0)
204 {
205 char* akstr = NULL;
206 char* ekstr = NULL;
207 char* aivstr = NULL;
208 char* eivstr = NULL;
209
210 akstr = winpr_BinToHexString(key, 32, 0);
211 ekstr = winpr_BinToHexString(TEST_CIPHER_KEY, 32, 0);
212
213 aivstr = winpr_BinToHexString(iv, 16, 0);
214 eivstr = winpr_BinToHexString(TEST_CIPHER_IV, 16, 0);
215
216 (void)fprintf(stderr, "Unexpected EVP_BytesToKey Key: Actual: %s, Expected: %s\n", akstr,
217 ekstr);
218 (void)fprintf(stderr, "Unexpected EVP_BytesToKey IV : Actual: %s, Expected: %s\n", aivstr,
219 eivstr);
220
221 free(akstr);
222 free(ekstr);
223 free(aivstr);
224 free(eivstr);
225 }
226
227 return TRUE;
228}
229
230int TestCryptoCipher(int argc, char* argv[])
231{
232
233 WINPR_UNUSED(argc);
234 WINPR_UNUSED(argv);
235
236 winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT);
237
238 if (!test_crypto_cipher_aes_128_cbc(TRUE))
239 return -1;
240
241 if (!test_crypto_cipher_aes_128_cbc(FALSE))
242 return -1;
243
244 if (!test_crypto_cipher_rc4())
245 return -1;
246
247 if (!test_crypto_cipher_key())
248 return -1;
249
250 return 0;
251}