248TEST(FXCRYPT, CRYPT_ArcFourSetup) {
251 kNullPermutation[CRYPT_rc4_context::kPermutationLength] = {
252 0, 35, 3, 43, 9, 11, 65, 229, 32, 36, 134, 98, 59,
253 34, 173, 153, 214, 200, 64, 161, 191, 62, 6, 25, 56, 234,
254 49, 246, 69, 133, 203, 194, 10, 42, 228, 198, 195, 245, 236,
255 91, 206, 23, 235, 27, 138, 18, 143, 250, 244, 76, 123, 217,
256 132, 249, 72, 127, 94, 151, 33, 60, 248, 85, 177, 210, 142,
257 83, 110, 140, 41, 135, 196, 238, 156, 242, 141, 67, 5, 185,
258 131, 63, 137, 37, 172, 121, 70, 144, 237, 130, 17, 44, 253,
259 166, 78, 201, 12, 119, 215, 7, 126, 114, 97, 192, 53, 4,
260 254, 45, 102, 122, 230, 88, 193, 129, 160, 124, 84, 108, 239,
261 189, 152, 120, 115, 207, 50, 176, 86, 157, 164, 187, 71, 1,
262 15, 58, 29, 21, 46, 145, 247, 162, 95, 183, 13, 226, 159,
263 175, 221, 100, 96, 202, 101, 178, 154, 47, 205, 106, 148, 104,
264 93, 112, 26, 165, 128, 186, 146, 218, 66, 211, 171, 90, 252,
265 19, 40, 99, 223, 174, 255, 51, 77, 227, 48, 220, 168, 118,
266 224, 103, 75, 105, 125, 199, 73, 82, 57, 181, 81, 149, 68,
267 52, 232, 22, 2, 216, 113, 30, 109, 163, 92, 61, 14, 8,
268 38, 225, 79, 231, 170, 240, 20, 219, 204, 150, 180, 188, 116,
269 190, 241, 197, 179, 87, 74, 147, 80, 54, 212, 16, 167, 222,
270 136, 213, 55, 182, 139, 24, 209, 251, 208, 28, 111, 89, 158,
271 155, 243, 107, 233, 169, 117, 184, 31, 39};
272 CRYPT_rc4_context context;
273 CRYPT_ArcFourSetup(&context, {});
274 CheckArcFourContext(context, 0, 0, kNullPermutation);
278 kFoobarPermutation[CRYPT_rc4_context::kPermutationLength] = {
279 102, 214, 39, 49, 17, 132, 244, 106, 114, 76, 183, 212, 116,
280 73, 42, 103, 128, 246, 139, 199, 31, 234, 25, 109, 48, 19,
281 121, 4, 20, 54, 134, 77, 163, 38, 61, 101, 145, 78, 215,
282 96, 92, 80, 224, 168, 243, 210, 82, 252, 113, 56, 217, 62,
283 218, 129, 125, 33, 99, 9, 153, 59, 43, 13, 206, 124, 131,
284 18, 213, 118, 173, 122, 193, 172, 177, 105, 148, 207, 186, 5,
285 85, 32, 68, 220, 79, 84, 169, 209, 150, 7, 133, 63, 147,
286 93, 26, 130, 60, 117, 250, 57, 24, 247, 200, 127, 136, 66,
287 112, 107, 140, 154, 70, 170, 185, 138, 248, 236, 88, 86, 44,
288 216, 241, 35, 100, 151, 156, 74, 119, 55, 245, 46, 227, 208,
289 229, 16, 249, 149, 53, 157, 201, 75, 58, 28, 142, 238, 182,
290 180, 179, 144, 12, 6, 176, 10, 90, 239, 104, 40, 181, 194,
291 137, 69, 221, 205, 165, 188, 191, 87, 1, 91, 2, 171, 232,
292 34, 162, 166, 160, 126, 225, 167, 123, 197, 223, 195, 22, 203,
293 189, 237, 37, 27, 222, 175, 23, 143, 152, 192, 21, 231, 228,
294 141, 30, 204, 158, 240, 120, 98, 89, 83, 135, 251, 81, 196,
295 161, 3, 8, 230, 52, 219, 41, 242, 36, 97, 15, 155, 65,
296 187, 254, 64, 159, 67, 211, 108, 178, 146, 202, 11, 164, 226,
297 184, 50, 190, 174, 71, 233, 235, 198, 95, 51, 110, 255, 253,
298 72, 115, 0, 47, 94, 29, 45, 14, 111};
299 CRYPT_rc4_context context;
300 ByteStringView foobar =
"foobar";
301 CRYPT_ArcFourSetup(&context, foobar.unsigned_span());
302 CheckArcFourContext(context, 0, 0, kFoobarPermutation);
306TEST(FXCRYPT, CRYPT_ArcFourCrypt) {
307 static const uint8_t kDataShort[] =
308 "The Quick Fox Jumped Over The Lazy Brown Dog.";
309 static const uint8_t kDataLong[] =
310 "The Quick Fox Jumped Over The Lazy Brown Dog.\n"
311 "1234567890123456789012345678901234567890123456789012345678901234567890\n"
312 "1234567890123456789012345678901234567890123456789012345678901234567890\n"
313 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
314 "!@#$%^&*()[]{};':\",.<>/?\\|\r\t\n";
316 CRYPT_rc4_context context;
317 CRYPT_ArcFourSetup(&context, {});
319 std::vector<uint8_t> data_short(std::begin(kDataShort),
320 std::end(kDataShort));
321 static const uint8_t kExpectedEncryptedDataShort[] = {
322 138, 112, 236, 97, 242, 66, 52, 89, 225, 38, 88, 8,
323 47, 78, 216, 24, 170, 106, 26, 199, 208, 131, 157, 242,
324 55, 11, 25, 90, 66, 182, 19, 255, 210, 181, 85, 69,
325 31, 240, 206, 171, 97, 62, 202, 172, 30, 252};
326 CRYPT_ArcFourCrypt(&context, data_short);
327 EXPECT_THAT(data_short, ElementsAreArray(kExpectedEncryptedDataShort));
329 static const uint8_t kPermutation[CRYPT_rc4_context::kPermutationLength] = {
330 0, 198, 10, 37, 253, 192, 171, 183, 99, 8, 144, 103, 208, 191,
331 149, 9, 228, 243, 94, 150, 169, 151, 210, 206, 221, 235, 32, 186,
332 212, 122, 72, 200, 236, 138, 244, 217, 158, 213, 139, 242, 17, 143,
333 50, 132, 12, 160, 145, 250, 214, 76, 123, 35, 27, 249, 203, 127,
334 64, 62, 33, 60, 248, 85, 177, 6, 142, 83, 110, 140, 41, 135,
335 196, 238, 156, 91, 141, 67, 5, 185, 131, 63, 137, 43, 172, 121,
336 70, 134, 237, 130, 25, 44, 153, 166, 78, 201, 42, 119, 215, 7,
337 126, 114, 97, 11, 53, 4, 254, 45, 102, 133, 230, 88, 193, 129,
338 18, 124, 84, 108, 239, 189, 152, 120, 115, 207, 234, 176, 86, 157,
339 164, 187, 71, 1, 15, 58, 29, 21, 46, 23, 247, 162, 95, 229,
340 13, 226, 159, 175, 56, 100, 96, 202, 101, 178, 154, 47, 205, 106,
341 148, 104, 93, 112, 26, 165, 128, 246, 146, 218, 66, 211, 65, 90,
342 252, 19, 40, 49, 223, 174, 255, 51, 77, 227, 48, 220, 168, 118,
343 224, 98, 75, 105, 125, 199, 73, 82, 57, 181, 81, 173, 68, 52,
344 232, 22, 2, 216, 113, 30, 109, 163, 92, 61, 14, 36, 38, 225,
345 79, 231, 170, 240, 20, 219, 204, 161, 180, 188, 116, 190, 241, 197,
346 179, 87, 74, 147, 80, 54, 69, 16, 167, 222, 136, 245, 55, 182,
347 3, 24, 209, 251, 59, 28, 111, 89, 195, 155, 194, 107, 233, 34,
349 CheckArcFourContext(context, 46, 135, kPermutation);
352 CRYPT_rc4_context context;
353 CRYPT_ArcFourSetup(&context, {});
355 std::vector<uint8_t> data_long(std::begin(kDataLong), std::end(kDataLong));
356 static const uint8_t kExpectedEncryptedDataLong[] = {
357 138, 112, 236, 97, 242, 66, 52, 89, 225, 38, 88, 8, 47, 78,
358 216, 24, 170, 106, 26, 199, 208, 131, 157, 242, 55, 11, 25, 90,
359 66, 182, 19, 255, 210, 181, 85, 69, 31, 240, 206, 171, 97, 62,
360 202, 172, 30, 246, 19, 43, 184, 0, 173, 27, 140, 90, 167, 240,
361 122, 125, 184, 49, 149, 71, 63, 104, 171, 144, 242, 106, 121, 124,
362 209, 149, 61, 1, 66, 186, 252, 47, 51, 170, 253, 75, 95, 41,
363 203, 28, 197, 174, 144, 209, 166, 98, 142, 125, 44, 5, 147, 42,
364 73, 178, 119, 90, 253, 69, 103, 178, 15, 136, 51, 112, 39, 81,
365 37, 111, 129, 232, 106, 159, 126, 142, 120, 124, 48, 140, 253, 12,
366 223, 208, 106, 76, 60, 238, 5, 162, 100, 226, 251, 156, 169, 35,
367 193, 10, 242, 210, 20, 96, 37, 84, 99, 183, 179, 203, 62, 122,
368 54, 6, 51, 239, 142, 250, 238, 41, 223, 58, 48, 101, 29, 187,
369 43, 235, 3, 5, 176, 33, 14, 171, 36, 26, 234, 207, 105, 79,
370 69, 126, 82, 183, 105, 228, 31, 173, 8, 240, 99, 5, 147, 206,
371 215, 140, 48, 190, 165, 50, 41, 232, 29, 105, 156, 64, 229, 165,
372 12, 64, 163, 255, 146, 108, 212, 125, 142, 101, 13, 99, 174, 10,
373 160, 68, 196, 120, 110, 201, 254, 158, 97, 215, 0, 207, 90, 23,
374 208, 161, 105, 226, 164, 114, 80, 137, 58, 107, 109, 42, 110, 100,
375 202, 170, 224, 89, 28, 5, 138, 19, 253, 105, 220, 105, 24, 187,
376 109, 89, 205, 89, 202};
377 CRYPT_ArcFourCrypt(&context, data_long);
378 EXPECT_THAT(data_long, ElementsAreArray(kExpectedEncryptedDataLong));
380 static const uint8_t kPermutation[CRYPT_rc4_context::kPermutationLength] = {
381 172, 59, 196, 72, 101, 21, 215, 210, 212, 52, 243, 73, 47, 213,
382 211, 50, 228, 144, 66, 93, 169, 31, 237, 206, 221, 235, 222, 250,
383 97, 87, 174, 164, 190, 111, 27, 217, 173, 189, 65, 11, 115, 171,
384 104, 132, 12, 170, 205, 114, 7, 105, 37, 83, 78, 134, 236, 70,
385 197, 122, 177, 202, 39, 195, 30, 3, 86, 127, 74, 106, 68, 91,
386 110, 121, 208, 25, 56, 6, 28, 225, 163, 193, 166, 244, 119, 34,
387 23, 88, 108, 123, 162, 159, 242, 61, 230, 227, 254, 14, 4, 156,
388 161, 44, 58, 153, 33, 143, 129, 232, 182, 152, 76, 168, 238, 239,
389 185, 219, 233, 16, 188, 45, 40, 35, 103, 99, 89, 157, 241, 245,
390 192, 180, 248, 8, 85, 231, 146, 154, 252, 181, 107, 126, 98, 80,
391 102, 165, 199, 94, 49, 255, 18, 204, 216, 77, 20, 187, 145, 125,
392 1, 247, 79, 26, 207, 81, 117, 179, 186, 38, 175, 19, 139, 138,
393 149, 54, 64, 109, 249, 135, 142, 118, 17, 13, 201, 184, 55, 224,
394 209, 155, 113, 218, 82, 131, 178, 253, 140, 226, 43, 42, 24, 29,
395 229, 200, 137, 240, 203, 167, 95, 148, 15, 176, 60, 75, 53, 41,
396 150, 112, 160, 96, 22, 10, 234, 116, 130, 158, 214, 36, 9, 67,
397 198, 194, 191, 100, 124, 147, 32, 183, 120, 246, 51, 141, 46, 251,
398 92, 223, 133, 63, 0, 71, 48, 128, 220, 90, 62, 136, 2, 5,
400 CheckArcFourContext(context, 15, 222, kPermutation);
403 CRYPT_rc4_context context;
404 ByteStringView foobar =
"foobar";
405 CRYPT_ArcFourSetup(&context, foobar.unsigned_span());
407 std::vector<uint8_t> data_short(std::begin(kDataShort),
408 std::end(kDataShort));
409 static const uint8_t kExpectedEncryptedDataShort[] = {
410 59, 193, 117, 206, 167, 54, 218, 7, 229, 214, 188, 55,
411 90, 205, 196, 25, 36, 114, 199, 218, 161, 107, 122, 119,
412 106, 167, 44, 175, 240, 123, 192, 102, 174, 167, 105, 187,
413 202, 70, 121, 81, 17, 30, 5, 138, 116, 166};
414 CRYPT_ArcFourCrypt(&context, data_short);
415 EXPECT_THAT(data_short, ElementsAreArray(kExpectedEncryptedDataShort));
417 static const uint8_t kPermutation[CRYPT_rc4_context::kPermutationLength] = {
418 102, 41, 45, 82, 124, 141, 237, 38, 6, 64, 90, 140, 254, 96,
419 220, 109, 99, 49, 27, 227, 205, 75, 191, 37, 17, 54, 83, 196,
420 108, 79, 31, 190, 180, 0, 125, 194, 243, 156, 224, 246, 253, 193,
421 42, 81, 117, 56, 181, 252, 113, 210, 217, 62, 218, 129, 61, 33,
422 128, 9, 153, 59, 43, 13, 206, 48, 131, 18, 213, 118, 173, 122,
423 80, 172, 177, 105, 148, 207, 186, 5, 85, 32, 68, 215, 19, 84,
424 169, 209, 150, 7, 133, 63, 147, 93, 26, 130, 60, 145, 250, 57,
425 24, 247, 200, 127, 136, 66, 112, 107, 212, 154, 70, 170, 185, 138,
426 248, 236, 88, 86, 44, 216, 241, 35, 100, 151, 78, 74, 119, 55,
427 245, 46, 199, 208, 229, 16, 249, 149, 53, 157, 201, 234, 58, 28,
428 142, 238, 182, 163, 179, 144, 12, 114, 176, 10, 183, 239, 104, 40,
429 73, 101, 137, 69, 221, 134, 165, 188, 25, 87, 1, 91, 2, 171,
430 232, 34, 162, 166, 160, 126, 225, 167, 123, 197, 223, 195, 22, 203,
431 189, 244, 103, 139, 222, 175, 23, 143, 152, 192, 21, 231, 228, 132,
432 30, 204, 158, 240, 120, 98, 89, 121, 135, 251, 168, 4, 161, 3,
433 8, 230, 52, 219, 214, 242, 36, 97, 15, 155, 65, 187, 116, 76,
434 159, 67, 211, 20, 178, 146, 202, 11, 164, 226, 184, 50, 77, 174,
435 71, 233, 235, 198, 95, 51, 110, 255, 92, 72, 115, 106, 47, 94,
437 CheckArcFourContext(context, 46, 39, kPermutation);
440 CRYPT_rc4_context context;
441 ByteStringView foobar =
"foobar";
442 CRYPT_ArcFourSetup(&context, foobar.unsigned_span());
444 std::vector<uint8_t> data_long(std::begin(kDataLong), std::end(kDataLong));
445 static const uint8_t kExpectedEncryptedDataLong[] = {
446 59, 193, 117, 206, 167, 54, 218, 7, 229, 214, 188, 55, 90, 205,
447 196, 25, 36, 114, 199, 218, 161, 107, 122, 119, 106, 167, 44, 175,
448 240, 123, 192, 102, 174, 167, 105, 187, 202, 70, 121, 81, 17, 30,
449 5, 138, 116, 172, 169, 50, 160, 116, 237, 117, 108, 241, 127, 61,
450 83, 45, 77, 176, 0, 106, 191, 221, 132, 143, 219, 94, 2, 235,
451 204, 166, 201, 139, 140, 163, 104, 115, 48, 37, 18, 114, 168, 49,
452 235, 163, 179, 131, 182, 218, 120, 200, 9, 90, 60, 47, 55, 235,
453 135, 37, 21, 170, 48, 112, 185, 169, 43, 233, 88, 134, 117, 126,
454 248, 40, 176, 248, 30, 131, 108, 43, 139, 68, 232, 219, 7, 39,
455 223, 45, 199, 243, 54, 171, 31, 37, 161, 24, 38, 251, 13, 144,
456 106, 215, 179, 203, 5, 253, 25, 32, 25, 146, 109, 193, 143, 141,
457 177, 226, 134, 222, 95, 79, 156, 202, 240, 34, 153, 145, 169, 150,
458 231, 63, 113, 242, 156, 39, 136, 249, 108, 50, 181, 22, 22, 180,
459 57, 76, 69, 62, 254, 47, 141, 249, 235, 90, 25, 34, 40, 194,
460 66, 86, 110, 192, 235, 191, 205, 133, 91, 32, 104, 65, 43, 36,
461 140, 36, 228, 156, 105, 251, 169, 168, 203, 189, 238, 221, 64, 200,
462 68, 137, 153, 9, 183, 84, 153, 140, 239, 0, 15, 50, 126, 145,
463 22, 110, 43, 56, 94, 127, 48, 96, 47, 172, 3, 31, 130, 249,
464 243, 73, 206, 89, 9, 93, 156, 167, 205, 166, 75, 227, 36, 34,
465 81, 124, 195, 246, 152};
466 static_assert(std::size(kDataLong) > 256,
"too short");
467 CRYPT_ArcFourCrypt(&context, data_long);
468 EXPECT_THAT(data_long, ElementsAreArray(kExpectedEncryptedDataLong));
470 static const uint8_t kPermutation[CRYPT_rc4_context::kPermutationLength] = {
471 188, 12, 81, 130, 228, 58, 124, 218, 72, 210, 50, 70, 166, 38,
472 110, 111, 73, 49, 27, 227, 249, 21, 1, 226, 17, 54, 53, 16,
473 108, 51, 31, 123, 221, 23, 125, 148, 5, 200, 208, 246, 253, 193,
474 42, 45, 236, 56, 230, 194, 178, 213, 120, 116, 7, 164, 33, 107,
475 189, 20, 133, 114, 173, 161, 59, 128, 3, 238, 65, 69, 144, 179,
476 44, 35, 8, 163, 252, 195, 160, 197, 204, 28, 34, 129, 67, 89,
477 22, 149, 199, 131, 182, 46, 250, 222, 155, 104, 10, 32, 139, 245,
478 90, 41, 132, 224, 83, 242, 135, 75, 74, 61, 62, 141, 43, 127,
479 255, 91, 170, 78, 157, 101, 243, 216, 254, 156, 229, 118, 174, 147,
480 103, 76, 196, 145, 134, 94, 205, 146, 202, 98, 100, 106, 232, 177,
481 187, 13, 80, 137, 151, 11, 82, 40, 167, 175, 25, 219, 168, 240,
482 99, 55, 4, 19, 180, 2, 203, 18, 171, 154, 113, 117, 6, 185,
483 172, 186, 237, 223, 233, 244, 217, 191, 190, 198, 97, 165, 220, 9,
484 214, 150, 184, 143, 206, 24, 209, 207, 36, 142, 87, 15, 159, 71,
485 84, 162, 169, 86, 48, 47, 140, 215, 241, 235, 158, 14, 26, 248,
486 138, 119, 212, 39, 88, 121, 96, 109, 29, 66, 136, 102, 225, 92,
487 201, 126, 122, 192, 60, 0, 64, 239, 183, 37, 57, 63, 234, 181,
488 153, 52, 176, 112, 93, 79, 77, 115, 231, 30, 95, 251, 211, 68,
490 CheckArcFourContext(context, 15, 68, kPermutation);