diff --git a/testsuite/des-test.c b/testsuite/des-test.c index fd47fbac15c27e61a5ebae21ac7a760b52b849e6..0a8be7d153fff61c57861b27de167e236fb5374c 100644 --- a/testsuite/des-test.c +++ b/testsuite/des-test.c @@ -2,55 +2,122 @@ #include "nettle-internal.h" #include "des.h" -int -test_main(void) +static void +test_des(const uint8_t *key, int expected_parity, + unsigned length, + const uint8_t *cleartext, + const uint8_t *ciphertext) { struct des_ctx ctx; - - /* From Applied Cryptography */ - test_cipher(&nettle_des, - HL("01234567 89ABCDEF"), - HL("01234567 89ABCDE7"), - H("C9574425 6A5ED31D")); - - test_cipher(&nettle_des, - HL("01 01 01 01 01 01 01 80"), - HL("00 00 00 00 00 00 00 00"), - H("9C C6 2D F4 3B 6E ED 74")); - - test_cipher(&nettle_des, - HL("80 01 01 01 01 01 01 01"), - HL("00 00 00 00 00 00 00 40"), - H("A3 80 E0 2A 6B E5 46 96")); - - test_cipher(&nettle_des, - HL("08 19 2A 3B 4C 5D 6E 7F"), - HL("00 00 00 00 00 00 00 00"), - H("25 DD AC 3E 96 17 64 67")); - - - test_cipher(&nettle_des, - HL("01 23 45 67 89 AB CD EF"), - DES_BLOCK_SIZE, "Now is t", - H("3F A4 0E 8A 98 4D 48 15")); + uint8_t *data = xalloc(length); - /* Parity check */ - if (des_set_key(&ctx, H("01 01 01 01 01 01 01 00")) - || (ctx.status != DES_BAD_PARITY)) + if (des_check_parity(8, key) != expected_parity) FAIL(); - /* Weak key check */ - if (des_set_key(&ctx, H("01 01 01 01 01 01 01 01")) - || (ctx.status != DES_WEAK_KEY)) + if (!des_set_key(&ctx, key)) FAIL(); - if (des_set_key(&ctx, H("01 FE 01 FE 01 FE 01 FE")) + des_encrypt(&ctx, length, data, cleartext); + + if (!MEMEQ(length, data, ciphertext)) + { + fprintf(stderr, "Encrypt failed:\nInput:"); + print_hex(length, cleartext); + fprintf(stderr, "\nOutput: "); + print_hex(length, data); + fprintf(stderr, "\nExpected:"); + print_hex(length, ciphertext); + fprintf(stderr, "\n"); + FAIL(); + } + + des_decrypt(&ctx, length, data, data); + + if (!MEMEQ(length, data, cleartext)) + { + fprintf(stderr, "Decrypt failed:\nInput:"); + print_hex(length, ciphertext); + fprintf(stderr, "\nOutput: "); + print_hex(length, data); + fprintf(stderr, "\nExpected:"); + print_hex(length, cleartext); + fprintf(stderr, "\n"); + FAIL(); + } + + free(data); +} + +static void +test_weak(const uint8_t *key) +{ + struct des_ctx ctx; + + if (des_set_key(&ctx, key) || (ctx.status != DES_WEAK_KEY)) FAIL(); +} - if (des_set_key(&ctx, H("FE E0 FE E0 FE F1 FE F1")) - || (ctx.status != DES_WEAK_KEY)) +int +test_main(void) +{ + /* From Applied Cryptography */ + test_des(H("01234567 89ABCDEF"), 1, + HL("01234567 89ABCDE7"), + H("C9574425 6A5ED31D")); + + test_des(H("01 01 01 01 01 01 01 80"), 1, + HL("00 00 00 00 00 00 00 00"), + H("9C C6 2D F4 3B 6E ED 74")); + + test_des(H("80 01 01 01 01 01 01 01"), 1, + HL("00 00 00 00 00 00 00 40"), + H("A3 80 E0 2A 6B E5 46 96")); + + test_des(H("08 19 2A 3B 4C 5D 6E 7F"), 1, + HL("00 00 00 00 00 00 00 00"), + H("25 DD AC 3E 96 17 64 67")); + + test_des(H("01 23 45 67 89 AB CD EF"), 1, + DES_BLOCK_SIZE, "Now is t", + H("3F A4 0E 8A 98 4D 48 15")); + + /* Same key, but with one bad parity bit, */ + test_des(H("01 23 45 66 89 AB CD EF"), 0, + DES_BLOCK_SIZE, "Now is t", + H("3F A4 0E 8A 98 4D 48 15")); + + /* Parity check */ + if (des_check_parity(HL("01 01 01 01 01 01 01 00"))) FAIL(); + /* The four weak keys */ + test_weak(H("01 01 01 01 01 01 01 01")); + test_weak(H("FE FE FE FE FE FE FE FE")); + test_weak(H("1F 1F 1F 1F 0E 0E 0E 0E")); + test_weak(H("E0 E0 E0 E0 F1 F1 F1 F1")); + + /* Same weak key, but different parity. */ + test_weak(H("E0 E0 E0 E0 F0 F1 F1 F1")); + + /* The six pairs of semiweak keys */ + test_weak(H("01 FE 01 FE 01 FE 01 FE")); + test_weak(H("FE 01 FE 01 FE 01 FE 01")); + + test_weak(H("1F E0 1F E0 0E F1 0E F1")); + test_weak(H("E0 1F E0 1F F1 0E F1 0E")); + + test_weak(H("01 E0 01 E0 01 F1 01 F1")); + test_weak(H("E0 01 E0 01 F1 01 F1 01")); + + test_weak(H("1F FE 1F FE 0E FE 0E FE")); + test_weak(H("FE 1F FE 1F FE 0E FE 0E")); + + test_weak(H("01 1F 01 1F 01 0E 01 0E")); + test_weak(H("1F 01 1F 01 0E 01 0E 01")); + + test_weak(H("E0 FE E0 FE F1 FE F1 FE")); + test_weak(H("FE E0 FE E0 FE F1 FE F1")); + SUCCESS(); }