Skip to content
Snippets Groups Projects
Commit 314e9c18 authored by Niels Möller's avatar Niels Möller
Browse files

(test_des): New function.

(test_weak): New function.
(test_main): Use test_des and test_weak. Added tests for all the
weak keys. Added some tests with invalid (to be ignored) parity
bits.

Rev: nettle/testsuite/des-test.c:1.2
parent a547ba68
No related branches found
No related tags found
No related merge requests found
......@@ -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();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment