51 lines
1.3 KiB
C++
51 lines
1.3 KiB
C++
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
// SPDX-License-Identifier: Apache-2.0 OR ISC
|
|
|
|
#include <openssl/des.h>
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
TEST(DESTest, WeakKeys) {
|
|
// The all 2 key is not weak and has odd parity
|
|
DES_cblock validKey = {{2, 2, 2, 2, 2, 2, 2, 2}};
|
|
EXPECT_FALSE(DES_is_weak_key(&validKey));
|
|
DES_key_schedule des;
|
|
EXPECT_EQ(0, DES_set_key(&validKey, &des));
|
|
|
|
// Weak key example from SP 800-67r2 section 3.3.2
|
|
static const DES_cblock weakKey = {{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}};
|
|
EXPECT_TRUE(DES_is_weak_key(&weakKey));
|
|
EXPECT_EQ(-2, DES_set_key(&weakKey, &des));
|
|
}
|
|
|
|
// If it wasn't for MSVC this could be __builtin_popcount, if this was C++20
|
|
// it could be std::popcount
|
|
static int countSetBits(uint8_t n) {
|
|
int count = 0;
|
|
while (n) {
|
|
count += n & 1;
|
|
n >>= 1;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
TEST(DESTest, Parity) {
|
|
// The all 2 key is not weak and has odd parity for each byte
|
|
DES_cblock key = {{2, 2, 2, 2, 2, 2, 2, 2}};
|
|
DES_key_schedule des;
|
|
int result = DES_set_key(&key, &des);
|
|
EXPECT_EQ(result, 0);
|
|
|
|
for (uint8_t i = 0; i < 255; i++) {
|
|
key.bytes[0] = i;
|
|
result = DES_set_key(&key, &des);
|
|
int bitsSet = countSetBits(i);
|
|
int oddParity = bitsSet % 2 == 1;
|
|
if (oddParity) {
|
|
EXPECT_EQ(result, 0);
|
|
} else {
|
|
EXPECT_EQ(result, -1);
|
|
}
|
|
}
|
|
}
|