GCryptLib: Fix include paths
This commit is contained in:
parent
9432325b4a
commit
7fe9dcc6dc
@ -1,8 +1,8 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <GhettoCryptWrapper.h>
|
#include <GCrypt/GhettoCryptWrapper.h>
|
||||||
#include <SecureBitset.h>
|
#include <GCrypt/SecureBitset.h>
|
||||||
#include <Util.h>
|
#include <GCrypt/Util.h>
|
||||||
#include <InitializationVector.h>
|
#include <GCrypt/InitializationVector.h>
|
||||||
|
|
||||||
using namespace Leonetienne::GCrypt;
|
using namespace Leonetienne::GCrypt;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "SecureBitset.h"
|
#include "GCrypt/SecureBitset.h"
|
||||||
#include "Config.h"
|
#include "GCrypt/Config.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
typedef SecureBitset<BLOCK_SIZE> Block;
|
typedef SecureBitset<BLOCK_SIZE> Block;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Feistel.h"
|
#include "GCrypt/Feistel.h"
|
||||||
#include "Flexblock.h"
|
#include "GCrypt/Flexblock.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
/** Class to apply a block cipher to messages of arbitrary length in a distributed manner
|
/** Class to apply a block cipher to messages of arbitrary length in a distributed manner
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Keyset.h"
|
#include "GCrypt/Keyset.h"
|
||||||
#include "Block.h"
|
#include "GCrypt/Block.h"
|
||||||
#include "Halfblock.h"
|
#include "GCrypt/Halfblock.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
/** Class to perform a feistel block chipher
|
/** Class to perform a feistel block chipher
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "SecureBitset.h"
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include "Config.h"
|
#include "GCrypt/SecureBitset.h"
|
||||||
|
#include "GCrypt/Config.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
constexpr std::size_t HALFBLOCK_SIZE = (BLOCK_SIZE / 2);
|
constexpr std::size_t HALFBLOCK_SIZE = (BLOCK_SIZE / 2);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Config.h"
|
#include "GCrypt/Config.h"
|
||||||
#include "Block.h"
|
#include "GCrypt/Block.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
/** Will create a sudo-random Block based on a seed
|
/** Will create a sudo-random Block based on a seed
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <array>
|
#include <array>
|
||||||
#include "Block.h"
|
#include "GCrypt/Block.h"
|
||||||
#include "Config.h"
|
#include "GCrypt/Config.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
typedef std::array<Block, N_ROUNDS> Keyset;
|
typedef std::array<Block, N_ROUNDS> Keyset;
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "SecureBitset.h"
|
#include "GCrypt/SecureBitset.h"
|
||||||
#include "Block.h"
|
#include "GCrypt/Block.h"
|
||||||
#include "Flexblock.h"
|
#include "GCrypt/Flexblock.h"
|
||||||
#include "Config.h"
|
#include "GCrypt/Config.h"
|
||||||
#include "Cipher.h"
|
#include "GCrypt/Cipher.h"
|
||||||
#include "InitializationVector.h"
|
#include "GCrypt/InitializationVector.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
//! Mod-operator that works with negative values
|
//! Mod-operator that works with negative values
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "Cipher.h"
|
#include "GCrypt/Cipher.h"
|
||||||
#include "Util.h"
|
#include "GCrypt/Util.h"
|
||||||
#include "InitializationVector.h"
|
#include "GCrypt/InitializationVector.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include "Feistel.h"
|
#include "GCrypt/Feistel.h"
|
||||||
#include "Util.h"
|
#include "GCrypt/Util.h"
|
||||||
#include "Config.h"
|
#include "GCrypt/Config.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include "GhettoCryptWrapper.h"
|
#include "GCrypt/GhettoCryptWrapper.h"
|
||||||
#include "Cipher.h"
|
#include "GCrypt/Cipher.h"
|
||||||
#include "Util.h"
|
#include "GCrypt/Util.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#include "InitializationVector.h"
|
#include "GCrypt/InitializationVector.h"
|
||||||
#include "Feistel.h"
|
#include "GCrypt/Feistel.h"
|
||||||
|
|
||||||
namespace Leonetienne::GCrypt {
|
namespace Leonetienne::GCrypt {
|
||||||
|
|
||||||
|
@ -1,230 +1,232 @@
|
|||||||
#include "CppUnitTest.h"
|
/*
|
||||||
#include "../GhettoCrypt/Cipher.h"
|
#include "CppUnitTest.h"
|
||||||
#include "../GhettoCrypt/Util.h"
|
#include "../GhettoCrypt/Cipher.h"
|
||||||
|
#include "../GhettoCrypt/Util.h"
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace GhettoCipher;
|
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
||||||
|
using namespace GhettoCipher;
|
||||||
// THESE TESTS ASSUME BLOCK_SIZE == 512
|
|
||||||
|
// THESE TESTS ASSUME BLOCK_SIZE == 512
|
||||||
namespace SimpleTests
|
|
||||||
{
|
namespace SimpleTests
|
||||||
TEST_CLASS(EncryptEqualsDecrypt)
|
{
|
||||||
{
|
TEST_CLASS(EncryptEqualsDecrypt)
|
||||||
public:
|
{
|
||||||
|
public:
|
||||||
// Tests that encrypting a message of exactly BLOCK_SIZE yields the exact message back
|
|
||||||
TEST_METHOD(SingleBlock_NoPadding)
|
// Tests that encrypting a message of exactly BLOCK_SIZE yields the exact message back
|
||||||
{
|
TEST_METHOD(SingleBlock_NoPadding)
|
||||||
// Instanciate our cipher and supply a key
|
{
|
||||||
const Block key = PasswordToKey("1234");
|
// Instanciate our cipher and supply a key
|
||||||
const Cipher cipher(key);
|
const Block key = PasswordToKey("1234");
|
||||||
|
const Cipher cipher(key);
|
||||||
// Recode the ascii-string to bits
|
|
||||||
const Flexblock cleartext_bits =
|
// Recode the ascii-string to bits
|
||||||
"1011110011010110000010110001111000111010111101001010100100011101"
|
const Flexblock cleartext_bits =
|
||||||
"0101110101010010100000110100001000011000111010001001110101111111"
|
"1011110011010110000010110001111000111010111101001010100100011101"
|
||||||
"1110110101100101110001010101011110001010000010111110011011010111"
|
"0101110101010010100000110100001000011000111010001001110101111111"
|
||||||
"1100110100111000000011100101010100110010001110010011000010111001"
|
"1110110101100101110001010101011110001010000010111110011011010111"
|
||||||
"0000010000010000011001111010011110111001000000000110101000110001"
|
"1100110100111000000011100101010100110010001110010011000010111001"
|
||||||
"0110111110110110100000010100000011010001000011100100111001001011"
|
"0000010000010000011001111010011110111001000000000110101000110001"
|
||||||
"1101100100000100010000001011100010010001101111100100101100010001"
|
"0110111110110110100000010100000011010001000011100100111001001011"
|
||||||
"0000011110010110111010110110111110011110011010001100100111110101";
|
"1101100100000100010000001011100010010001101111100100101100010001"
|
||||||
|
"0000011110010110111010110110111110011110011010001100100111110101";
|
||||||
// Encrypt our cleartext bits
|
|
||||||
const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits);
|
// Encrypt our cleartext bits
|
||||||
|
const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits);
|
||||||
// Decipher it again
|
|
||||||
const Flexblock decryptedBits = cipher.Decipher(ciphertext_bits);
|
// Decipher it again
|
||||||
|
const Flexblock decryptedBits = cipher.Decipher(ciphertext_bits);
|
||||||
// Assert that the decrypted text equals the plaintext
|
|
||||||
Assert::AreEqual(
|
// Assert that the decrypted text equals the plaintext
|
||||||
cleartext_bits,
|
Assert::AreEqual(
|
||||||
decryptedBits
|
cleartext_bits,
|
||||||
);
|
decryptedBits
|
||||||
}
|
);
|
||||||
|
}
|
||||||
// Tests that encrypting a message of less than BLOCK_SIZE yields the exact message plus zero-padding back
|
|
||||||
TEST_METHOD(SingleBlock_Padding)
|
// Tests that encrypting a message of less than BLOCK_SIZE yields the exact message plus zero-padding back
|
||||||
{
|
TEST_METHOD(SingleBlock_Padding)
|
||||||
// Instanciate our cipher and supply a key
|
{
|
||||||
const Block key = PasswordToKey("1234");
|
// Instanciate our cipher and supply a key
|
||||||
const Cipher cipher(key);
|
const Block key = PasswordToKey("1234");
|
||||||
|
const Cipher cipher(key);
|
||||||
// Recode the ascii-string to bits
|
|
||||||
const Flexblock cleartext_bits =
|
// Recode the ascii-string to bits
|
||||||
"1011110011010110000010110001111000111010111101001010100100011101"
|
const Flexblock cleartext_bits =
|
||||||
"0101110101010010100000110100001000011000111010001001110101111111"
|
"1011110011010110000010110001111000111010111101001010100100011101"
|
||||||
"1110110101100101110001010101011110001010000010111110011011010111"
|
"0101110101010010100000110100001000011000111010001001110101111111"
|
||||||
"1100110100111000000011100101010100110010001110010011000010111001"
|
"1110110101100101110001010101011110001010000010111110011011010111"
|
||||||
"0000010000010000011001111010011110111001000000000110101000110001"
|
"1100110100111000000011100101010100110010001110010011000010111001"
|
||||||
"0110111110110110100000010100000011010001000011100100111001001011"
|
"0000010000010000011001111010011110111001000000000110101000110001"
|
||||||
"1101100100000100";
|
"0110111110110110100000010100000011010001000011100100111001001011"
|
||||||
|
"1101100100000100";
|
||||||
const Flexblock cleartext_bits_EXPECTED_RESULT =
|
|
||||||
"1011110011010110000010110001111000111010111101001010100100011101"
|
const Flexblock cleartext_bits_EXPECTED_RESULT =
|
||||||
"0101110101010010100000110100001000011000111010001001110101111111"
|
"1011110011010110000010110001111000111010111101001010100100011101"
|
||||||
"1110110101100101110001010101011110001010000010111110011011010111"
|
"0101110101010010100000110100001000011000111010001001110101111111"
|
||||||
"1100110100111000000011100101010100110010001110010011000010111001"
|
"1110110101100101110001010101011110001010000010111110011011010111"
|
||||||
"0000010000010000011001111010011110111001000000000110101000110001"
|
"1100110100111000000011100101010100110010001110010011000010111001"
|
||||||
"0110111110110110100000010100000011010001000011100100111001001011"
|
"0000010000010000011001111010011110111001000000000110101000110001"
|
||||||
"1101100100000100000000000000000000000000000000000000000000000000"
|
"0110111110110110100000010100000011010001000011100100111001001011"
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000";
|
"1101100100000100000000000000000000000000000000000000000000000000"
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000";
|
||||||
// Encrypt our cleartext bits
|
|
||||||
const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits);
|
// Encrypt our cleartext bits
|
||||||
|
const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits);
|
||||||
// Decipher it again
|
|
||||||
const Flexblock decryptedBits = cipher.Decipher(ciphertext_bits);
|
// Decipher it again
|
||||||
|
const Flexblock decryptedBits = cipher.Decipher(ciphertext_bits);
|
||||||
// Assert that the decrypted text equals the plaintext
|
|
||||||
Assert::AreEqual(
|
// Assert that the decrypted text equals the plaintext
|
||||||
cleartext_bits_EXPECTED_RESULT,
|
Assert::AreEqual(
|
||||||
decryptedBits
|
cleartext_bits_EXPECTED_RESULT,
|
||||||
);
|
decryptedBits
|
||||||
}
|
);
|
||||||
|
}
|
||||||
// Tests that a decrypted ciphertext equals its plaintrext version, using a cleartext that requires A LOT of blocks
|
|
||||||
TEST_METHOD(MultiBlock_NoPadding)
|
// Tests that a decrypted ciphertext equals its plaintrext version, using a cleartext that requires A LOT of blocks
|
||||||
{
|
TEST_METHOD(MultiBlock_NoPadding)
|
||||||
// Instanciate our cipher and supply a key
|
{
|
||||||
const Block key = PasswordToKey("1234");
|
// Instanciate our cipher and supply a key
|
||||||
const Cipher cipher(key);
|
const Block key = PasswordToKey("1234");
|
||||||
|
const Cipher cipher(key);
|
||||||
// Recode the ascii-string to bits
|
|
||||||
const Flexblock cleartext_bits =
|
// Recode the ascii-string to bits
|
||||||
"1011110011010110000010110001111000111010111101001010100100011101"
|
const Flexblock cleartext_bits =
|
||||||
"0101110101010010100000110100001000011000111010001001110101111111"
|
"1011110011010110000010110001111000111010111101001010100100011101"
|
||||||
"1110110101100101110001010101011110001010000010111110011011010111"
|
"0101110101010010100000110100001000011000111010001001110101111111"
|
||||||
"1100110100111000000011100101010100110010001110010011000010111001"
|
"1110110101100101110001010101011110001010000010111110011011010111"
|
||||||
"0000010000010000011001111010011110111001000000000110101000110001"
|
"1100110100111000000011100101010100110010001110010011000010111001"
|
||||||
"0110111110110110100000010100000011010001000011100100111001001011"
|
"0000010000010000011001111010011110111001000000000110101000110001"
|
||||||
"1101100100000100010000001011100010010001101111100100101100010001"
|
"0110111110110110100000010100000011010001000011100100111001001011"
|
||||||
"0000011110010110111010110110111110011110011010001100100111110101"
|
"1101100100000100010000001011100010010001101111100100101100010001"
|
||||||
"1000010010000000000100101011110001000101101101100000010011111011"
|
"0000011110010110111010110110111110011110011010001100100111110101"
|
||||||
"1011111010110100100111100111110011100001111101111110000110001100"
|
"1000010010000000000100101011110001000101101101100000010011111011"
|
||||||
"0001000111000111101110000111011011101010100010100101100111010100"
|
"1011111010110100100111100111110011100001111101111110000110001100"
|
||||||
"0101111110110010110000111111011001101110101101100100100011000100"
|
"0001000111000111101110000111011011101010100010100101100111010100"
|
||||||
"1000110010101001000100001001101000011111101011111100100000100101"
|
"0101111110110010110000111111011001101110101101100100100011000100"
|
||||||
"1100001100111001011111001101000111011101011101000110010110110110"
|
"1000110010101001000100001001101000011111101011111100100000100101"
|
||||||
"0111001010011010010000010110000110010101101100101110111100100011"
|
"1100001100111001011111001101000111011101011101000110010110110110"
|
||||||
"0010111110011100010100000101100101110101101011110100100000110110"
|
"0111001010011010010000010110000110010101101100101110111100100011"
|
||||||
"1001101110101001001111111000010100011100100000101000111101101111"
|
"0010111110011100010100000101100101110101101011110100100000110110"
|
||||||
"0101111011110001101010111010001000111010101111001101100100100100"
|
"1001101110101001001111111000010100011100100000101000111101101111"
|
||||||
"1110110111001100011010110000101000011001011100101100111101110000"
|
"0101111011110001101010111010001000111010101111001101100100100100"
|
||||||
"1010101111011110000111011011011110000111010110110111111010101010"
|
"1110110111001100011010110000101000011001011100101100111101110000"
|
||||||
"0111100101111001010111101000001010100000111010111100111011111001"
|
"1010101111011110000111011011011110000111010110110111111010101010"
|
||||||
"0110111000000110100011011100101101010101101000010010011111100100"
|
"0111100101111001010111101000001010100000111010111100111011111001"
|
||||||
"0010111000001011101110000110010011101001111010100111110111110101"
|
"0110111000000110100011011100101101010101101000010010011111100100"
|
||||||
"1110111000000000101011000100101010000110110111101010011001111010"
|
"0010111000001011101110000110010011101001111010100111110111110101"
|
||||||
"1101011110001110000011010111001100001100101000000101000101000010"
|
"1110111000000000101011000100101010000110110111101010011001111010"
|
||||||
"0101000011011111010010110010000010101100001110011000110111110111"
|
"1101011110001110000011010111001100001100101000000101000101000010"
|
||||||
"1110010101011110111001100010110101101011100111100011101010001011"
|
"0101000011011111010010110010000010101100001110011000110111110111"
|
||||||
"0101110010100110101100111100010000111101111100000111000110110110"
|
"1110010101011110111001100010110101101011100111100011101010001011"
|
||||||
"1001100111000000011010100000011101011000010010011010001011110000"
|
"0101110010100110101100111100010000111101111100000111000110110110"
|
||||||
"1100100111111001001000011100110000011110001100000000010000001001"
|
"1001100111000000011010100000011101011000010010011010001011110000"
|
||||||
"1110000000110010000010011010100011011011000000000111110000110111"
|
"1100100111111001001000011100110000011110001100000000010000001001"
|
||||||
"0101110011001101010110010100011001110110000110010001100110011111";
|
"1110000000110010000010011010100011011011000000000111110000110111"
|
||||||
|
"0101110011001101010110010100011001110110000110010001100110011111";
|
||||||
// Encrypt our cleartext bits
|
|
||||||
const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits);
|
// Encrypt our cleartext bits
|
||||||
|
const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits);
|
||||||
// Decipher it again
|
|
||||||
const Flexblock decryptedBits = cipher.Decipher(ciphertext_bits);
|
// Decipher it again
|
||||||
|
const Flexblock decryptedBits = cipher.Decipher(ciphertext_bits);
|
||||||
// Assert that the decrypted text equals the plaintext
|
|
||||||
Assert::AreEqual(
|
// Assert that the decrypted text equals the plaintext
|
||||||
cleartext_bits,
|
Assert::AreEqual(
|
||||||
decryptedBits
|
cleartext_bits,
|
||||||
);
|
decryptedBits
|
||||||
}
|
);
|
||||||
|
}
|
||||||
// Tests that a decrypted ciphertext equals its plaintrext version, using a cleartext that requires A LOT of blocks
|
|
||||||
TEST_METHOD(MultiBlock_Padding)
|
// Tests that a decrypted ciphertext equals its plaintrext version, using a cleartext that requires A LOT of blocks
|
||||||
{
|
TEST_METHOD(MultiBlock_Padding)
|
||||||
// Instanciate our cipher and supply a key
|
{
|
||||||
const Block key = PasswordToKey("1234");
|
// Instanciate our cipher and supply a key
|
||||||
const Cipher cipher(key);
|
const Block key = PasswordToKey("1234");
|
||||||
|
const Cipher cipher(key);
|
||||||
// Recode the ascii-string to bits
|
|
||||||
const Flexblock cleartext_bits =
|
// Recode the ascii-string to bits
|
||||||
"1011110011010110000010110001111000111010111101001010100100011101"
|
const Flexblock cleartext_bits =
|
||||||
"0101110101010010100000110100001000011000111010001001110101111111"
|
"1011110011010110000010110001111000111010111101001010100100011101"
|
||||||
"1110110101100101110001010101011110001010000010111110011011010111"
|
"0101110101010010100000110100001000011000111010001001110101111111"
|
||||||
"1100110100111000000011100101010100110010001110010011000010111001"
|
"1110110101100101110001010101011110001010000010111110011011010111"
|
||||||
"0000010000010000011001111010011110111001000000000110101000110001"
|
"1100110100111000000011100101010100110010001110010011000010111001"
|
||||||
"0110111110110110100000010100000011010001000011100100111001001011"
|
"0000010000010000011001111010011110111001000000000110101000110001"
|
||||||
"1101100100000100010000001011100010010001101111100100101100010001"
|
"0110111110110110100000010100000011010001000011100100111001001011"
|
||||||
"0000011110010110111010110110111110011110011010001100100111110101"
|
"1101100100000100010000001011100010010001101111100100101100010001"
|
||||||
"1000010010000000000100101011110001000101101101100000010011111011"
|
"0000011110010110111010110110111110011110011010001100100111110101"
|
||||||
"1011111010110100100111100111110011100001111101111110000110001100"
|
"1000010010000000000100101011110001000101101101100000010011111011"
|
||||||
"0001000111000111101110000111011011101010100010100101100111010100"
|
"1011111010110100100111100111110011100001111101111110000110001100"
|
||||||
"0101111110110010110000111111011001101110101101100100100011000100"
|
"0001000111000111101110000111011011101010100010100101100111010100"
|
||||||
"1000110010101001000100001001101000011111101011111100100000100101"
|
"0101111110110010110000111111011001101110101101100100100011000100"
|
||||||
"1100001100111001011111001101000111011101011101000110010110110110"
|
"1000110010101001000100001001101000011111101011111100100000100101"
|
||||||
"0111001010011010010000010110000110010101101100101110111100100011"
|
"1100001100111001011111001101000111011101011101000110010110110110"
|
||||||
"0010111110011100010100000101100101110101101011110100100000110110"
|
"0111001010011010010000010110000110010101101100101110111100100011"
|
||||||
"1001101110101001001111111000010100011100100000101000111101101111"
|
"0010111110011100010100000101100101110101101011110100100000110110"
|
||||||
"0101111011110001101010111010001000111010101111001101100100100100"
|
"1001101110101001001111111000010100011100100000101000111101101111"
|
||||||
"1110110111001100011010110000101000011001011100101100111101110000"
|
"0101111011110001101010111010001000111010101111001101100100100100"
|
||||||
"1010101111011110000111011011011110000111010110110111111010101010"
|
"1110110111001100011010110000101000011001011100101100111101110000"
|
||||||
"0111100101111001010111101000001010100000111010111100111011111001"
|
"1010101111011110000111011011011110000111010110110111111010101010"
|
||||||
"0110111000000110100011011100101101010101101000010010011111100100"
|
"0111100101111001010111101000001010100000111010111100111011111001"
|
||||||
"0010111000001011101110000110010011101001111010100111110111110101"
|
"0110111000000110100011011100101101010101101000010010011111100100"
|
||||||
"1110111000000000101011000100101010000110110111101010011001111010"
|
"0010111000001011101110000110010011101001111010100111110111110101"
|
||||||
"1101011110001110000011010111001100001100101000000101000101000010"
|
"1110111000000000101011000100101010000110110111101010011001111010"
|
||||||
"0101000011011111010010110010000010101100001110011000110111110111"
|
"1101011110001110000011010111001100001100101000000101000101000010"
|
||||||
"1110010101011110111001100010110101101011100111100011101010001011"
|
"0101000011011111010010110010000010101100001110011000110111110111"
|
||||||
"0101110010100110101100111100010000111101111100000111000110110110"
|
"1110010101011110111001100010110101101011100111100011101010001011"
|
||||||
"1001100111000000011010100000011101011000010010011010001011110000"
|
"0101110010100110101100111100010000111101111100000111000110110110"
|
||||||
"1100100111111001001000011100110000011110001100000000010000001001"
|
"1001100111000000011010100000011101011000010010011010001011110000"
|
||||||
"11100000001100100000100110101000110110110000000001111100001";
|
"1100100111111001001000011100110000011110001100000000010000001001"
|
||||||
|
"11100000001100100000100110101000110110110000000001111100001";
|
||||||
const Flexblock cleartext_bits_EXPECTED_RESULT =
|
|
||||||
"1011110011010110000010110001111000111010111101001010100100011101"
|
const Flexblock cleartext_bits_EXPECTED_RESULT =
|
||||||
"0101110101010010100000110100001000011000111010001001110101111111"
|
"1011110011010110000010110001111000111010111101001010100100011101"
|
||||||
"1110110101100101110001010101011110001010000010111110011011010111"
|
"0101110101010010100000110100001000011000111010001001110101111111"
|
||||||
"1100110100111000000011100101010100110010001110010011000010111001"
|
"1110110101100101110001010101011110001010000010111110011011010111"
|
||||||
"0000010000010000011001111010011110111001000000000110101000110001"
|
"1100110100111000000011100101010100110010001110010011000010111001"
|
||||||
"0110111110110110100000010100000011010001000011100100111001001011"
|
"0000010000010000011001111010011110111001000000000110101000110001"
|
||||||
"1101100100000100010000001011100010010001101111100100101100010001"
|
"0110111110110110100000010100000011010001000011100100111001001011"
|
||||||
"0000011110010110111010110110111110011110011010001100100111110101"
|
"1101100100000100010000001011100010010001101111100100101100010001"
|
||||||
"1000010010000000000100101011110001000101101101100000010011111011"
|
"0000011110010110111010110110111110011110011010001100100111110101"
|
||||||
"1011111010110100100111100111110011100001111101111110000110001100"
|
"1000010010000000000100101011110001000101101101100000010011111011"
|
||||||
"0001000111000111101110000111011011101010100010100101100111010100"
|
"1011111010110100100111100111110011100001111101111110000110001100"
|
||||||
"0101111110110010110000111111011001101110101101100100100011000100"
|
"0001000111000111101110000111011011101010100010100101100111010100"
|
||||||
"1000110010101001000100001001101000011111101011111100100000100101"
|
"0101111110110010110000111111011001101110101101100100100011000100"
|
||||||
"1100001100111001011111001101000111011101011101000110010110110110"
|
"1000110010101001000100001001101000011111101011111100100000100101"
|
||||||
"0111001010011010010000010110000110010101101100101110111100100011"
|
"1100001100111001011111001101000111011101011101000110010110110110"
|
||||||
"0010111110011100010100000101100101110101101011110100100000110110"
|
"0111001010011010010000010110000110010101101100101110111100100011"
|
||||||
"1001101110101001001111111000010100011100100000101000111101101111"
|
"0010111110011100010100000101100101110101101011110100100000110110"
|
||||||
"0101111011110001101010111010001000111010101111001101100100100100"
|
"1001101110101001001111111000010100011100100000101000111101101111"
|
||||||
"1110110111001100011010110000101000011001011100101100111101110000"
|
"0101111011110001101010111010001000111010101111001101100100100100"
|
||||||
"1010101111011110000111011011011110000111010110110111111010101010"
|
"1110110111001100011010110000101000011001011100101100111101110000"
|
||||||
"0111100101111001010111101000001010100000111010111100111011111001"
|
"1010101111011110000111011011011110000111010110110111111010101010"
|
||||||
"0110111000000110100011011100101101010101101000010010011111100100"
|
"0111100101111001010111101000001010100000111010111100111011111001"
|
||||||
"0010111000001011101110000110010011101001111010100111110111110101"
|
"0110111000000110100011011100101101010101101000010010011111100100"
|
||||||
"1110111000000000101011000100101010000110110111101010011001111010"
|
"0010111000001011101110000110010011101001111010100111110111110101"
|
||||||
"1101011110001110000011010111001100001100101000000101000101000010"
|
"1110111000000000101011000100101010000110110111101010011001111010"
|
||||||
"0101000011011111010010110010000010101100001110011000110111110111"
|
"1101011110001110000011010111001100001100101000000101000101000010"
|
||||||
"1110010101011110111001100010110101101011100111100011101010001011"
|
"0101000011011111010010110010000010101100001110011000110111110111"
|
||||||
"0101110010100110101100111100010000111101111100000111000110110110"
|
"1110010101011110111001100010110101101011100111100011101010001011"
|
||||||
"1001100111000000011010100000011101011000010010011010001011110000"
|
"0101110010100110101100111100010000111101111100000111000110110110"
|
||||||
"1100100111111001001000011100110000011110001100000000010000001001"
|
"1001100111000000011010100000011101011000010010011010001011110000"
|
||||||
"1110000000110010000010011010100011011011000000000111110000100000"
|
"1100100111111001001000011100110000011110001100000000010000001001"
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000";
|
"1110000000110010000010011010100011011011000000000111110000100000"
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000";
|
||||||
// Encrypt our cleartext bits
|
|
||||||
const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits);
|
// Encrypt our cleartext bits
|
||||||
|
const Flexblock ciphertext_bits = cipher.Encipher(cleartext_bits);
|
||||||
// Decipher it again
|
|
||||||
const Flexblock decryptedBits = cipher.Decipher(ciphertext_bits);
|
// Decipher it again
|
||||||
|
const Flexblock decryptedBits = cipher.Decipher(ciphertext_bits);
|
||||||
// Assert that the decrypted text equals the plaintext
|
|
||||||
Assert::AreEqual(
|
// Assert that the decrypted text equals the plaintext
|
||||||
cleartext_bits_EXPECTED_RESULT,
|
Assert::AreEqual(
|
||||||
decryptedBits
|
cleartext_bits_EXPECTED_RESULT,
|
||||||
);
|
decryptedBits
|
||||||
}
|
);
|
||||||
};
|
}
|
||||||
}
|
};
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
@ -1,81 +1,103 @@
|
|||||||
#include "CppUnitTest.h"
|
#include <GCrypt/GhettoCryptWrapper.h>
|
||||||
#include "../GhettoCrypt/GhettoCryptWrapper.h"
|
#include <GCrypt/Flexblock.h>
|
||||||
#include "../GhettoCrypt/Flexblock.h"
|
#include <GCrypt/Util.h>
|
||||||
#include "../GhettoCrypt/Util.h"
|
#include "Catch2.h"
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
using namespace Leonetienne::GCrypt;
|
||||||
using namespace GhettoCipher;
|
|
||||||
|
// Tests that encrypting and decrypting strings using the wrapper works.
|
||||||
namespace SimpleTests
|
// This test will start from scratch after encryption, to ensure EVERYTHING has to be re-calculated.
|
||||||
{
|
TEST_CASE(__FILE__"/Encrypting and decrypting strings works", "[Wrapper]") {
|
||||||
TEST_CLASS(GCWrapper)
|
|
||||||
{
|
// Setup
|
||||||
public:
|
const std::string plaintext = "Hello, World!";
|
||||||
|
const std::string password = "Der Affe will Zucker";
|
||||||
// Tests that encrypting and decrypting strings using the wrapper works.
|
|
||||||
// This test will start from scratch after encryption, to ensure EVERYTHING has to be re-calculated.
|
std::string ciphertext;
|
||||||
TEST_METHOD(String)
|
std::string decrypted;
|
||||||
{
|
|
||||||
// Setup
|
// Encryption
|
||||||
const std::string plaintext = "Hello, World!";
|
ciphertext = GhettoCryptWrapper::EncryptString(plaintext, password);
|
||||||
const std::string password = "Der Affe will Zucker";
|
|
||||||
|
// Decryption
|
||||||
std::string ciphertext;
|
decrypted = GhettoCryptWrapper::DecryptString(ciphertext, password);
|
||||||
std::string decrypted;
|
|
||||||
|
// Assertion
|
||||||
// Encryption
|
REQUIRE(plaintext == decrypted);
|
||||||
{
|
}
|
||||||
ciphertext = GhettoCryptWrapper::EncryptString(plaintext, password);
|
|
||||||
}
|
/*
|
||||||
|
namespace SimpleTests
|
||||||
// Decryption
|
{
|
||||||
{
|
TEST_CLASS(GCWrapper)
|
||||||
decrypted = GhettoCryptWrapper::DecryptString(ciphertext, password);
|
{
|
||||||
}
|
public:
|
||||||
|
|
||||||
// Assertion
|
// Tests that encrypting and decrypting strings using the wrapper works.
|
||||||
Assert::AreEqual(
|
// This test will start from scratch after encryption, to ensure EVERYTHING has to be re-calculated.
|
||||||
plaintext,
|
TEST_METHOD(String)
|
||||||
decrypted
|
{
|
||||||
);
|
// Setup
|
||||||
}
|
const std::string plaintext = "Hello, World!";
|
||||||
|
const std::string password = "Der Affe will Zucker";
|
||||||
// Tests that encrypting and decrypting files using the wrapper works.
|
|
||||||
// This test will start from scratch after encryption, to ensure EVERYTHING has to be re-calculated.
|
std::string ciphertext;
|
||||||
TEST_METHOD(File)
|
std::string decrypted;
|
||||||
{
|
|
||||||
// Setup
|
// Encryption
|
||||||
#if defined _WIN64
|
{
|
||||||
const std::string testfile_dir = "../../SimpleTests/";
|
ciphertext = GhettoCryptWrapper::EncryptString(plaintext, password);
|
||||||
#elif defined _WIN32
|
}
|
||||||
const std::string testfile_dir = "../SimpleTests/";
|
|
||||||
#endif
|
// Decryption
|
||||||
|
{
|
||||||
const std::string filename_plain = testfile_dir + "testfile.png";
|
decrypted = GhettoCryptWrapper::DecryptString(ciphertext, password);
|
||||||
const std::string filename_encrypted = testfile_dir + "testfile.png.crypt";
|
}
|
||||||
const std::string filename_decrypted = testfile_dir + "testfile.png.clear.png";
|
|
||||||
const std::string password = "Der Affe will Zucker";
|
// Assertion
|
||||||
|
Assert::AreEqual(
|
||||||
|
plaintext,
|
||||||
// Encryption
|
decrypted
|
||||||
{
|
);
|
||||||
GhettoCryptWrapper::EncryptFile(filename_plain, filename_encrypted, password);
|
}
|
||||||
}
|
|
||||||
|
// Tests that encrypting and decrypting files using the wrapper works.
|
||||||
// Decryption
|
// This test will start from scratch after encryption, to ensure EVERYTHING has to be re-calculated.
|
||||||
{
|
TEST_METHOD(File)
|
||||||
GhettoCryptWrapper::DecryptFile(filename_encrypted, filename_decrypted, password);
|
{
|
||||||
}
|
// Setup
|
||||||
|
#if defined _WIN64
|
||||||
// Read in both the base, and the decrypted file
|
const std::string testfile_dir = "../../SimpleTests/";
|
||||||
const Flexblock plainfile = ReadFileToBits(filename_plain);
|
#elif defined _WIN32
|
||||||
const Flexblock decryptfile = ReadFileToBits(filename_decrypted);
|
const std::string testfile_dir = "../SimpleTests/";
|
||||||
|
#endif
|
||||||
// Assertion (If this fails, maybe check if the image is even readable by an image viewer)
|
|
||||||
Assert::AreEqual(
|
const std::string filename_plain = testfile_dir + "testfile.png";
|
||||||
PadStringToLength(plainfile, decryptfile.length(), '0', false),
|
const std::string filename_encrypted = testfile_dir + "testfile.png.crypt";
|
||||||
decryptfile
|
const std::string filename_decrypted = testfile_dir + "testfile.png.clear.png";
|
||||||
);
|
const std::string password = "Der Affe will Zucker";
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
// Encryption
|
||||||
|
{
|
||||||
|
GhettoCryptWrapper::EncryptFile(filename_plain, filename_encrypted, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decryption
|
||||||
|
{
|
||||||
|
GhettoCryptWrapper::DecryptFile(filename_encrypted, filename_decrypted, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read in both the base, and the decrypted file
|
||||||
|
const Flexblock plainfile = ReadFileToBits(filename_plain);
|
||||||
|
const Flexblock decryptfile = ReadFileToBits(filename_decrypted);
|
||||||
|
|
||||||
|
// Assertion (If this fails, maybe check if the image is even readable by an image viewer)
|
||||||
|
Assert::AreEqual(
|
||||||
|
PadStringToLength(plainfile, decryptfile.length(), '0', false),
|
||||||
|
decryptfile
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
@ -1,110 +1,112 @@
|
|||||||
#include "CppUnitTest.h"
|
/*
|
||||||
#include "../GhettoCrypt/Util.h"
|
#include "CppUnitTest.h"
|
||||||
#include "../GhettoCrypt/Config.h"
|
#include "../GhettoCrypt/Util.h"
|
||||||
#include <unordered_map>
|
#include "../GhettoCrypt/Config.h"
|
||||||
#include <codecvt>
|
#include <unordered_map>
|
||||||
#include <sstream>
|
#include <codecvt>
|
||||||
|
#include <sstream>
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
||||||
using namespace GhettoCipher;
|
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
||||||
|
using namespace GhettoCipher;
|
||||||
// We can generate passwords by just translating a decimal number to base "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
||||||
inline std::string Base10_2_X(const unsigned long long int i, const std::string set, unsigned int padding)
|
// We can generate passwords by just translating a decimal number to base "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
{
|
inline std::string Base10_2_X(const unsigned long long int i, const std::string set, unsigned int padding)
|
||||||
if (set.length() == 0)
|
{
|
||||||
return ""; // Return empty string, if set is empty. Play stupid games, win stupid prizes.
|
if (set.length() == 0)
|
||||||
|
return ""; // Return empty string, if set is empty. Play stupid games, win stupid prizes.
|
||||||
std::stringstream ss;
|
|
||||||
|
std::stringstream ss;
|
||||||
if (i != 0)
|
|
||||||
{
|
if (i != 0)
|
||||||
{
|
{
|
||||||
unsigned long long int buf = i;
|
{
|
||||||
while (buf != 0)
|
unsigned long long int buf = i;
|
||||||
{
|
while (buf != 0)
|
||||||
const unsigned long long int mod = buf % set.length();
|
{
|
||||||
buf /= set.length();
|
const unsigned long long int mod = buf % set.length();
|
||||||
ss << set[(std::size_t)mod];
|
buf /= set.length();
|
||||||
}
|
ss << set[(std::size_t)mod];
|
||||||
}
|
}
|
||||||
{
|
}
|
||||||
const std::string buf = ss.str();
|
{
|
||||||
ss.str("");
|
const std::string buf = ss.str();
|
||||||
for (long long int i = buf.length() - 1; i >= 0; i--)
|
ss.str("");
|
||||||
ss << buf[(std::size_t)i];
|
for (long long int i = buf.length() - 1; i >= 0; i--)
|
||||||
}
|
ss << buf[(std::size_t)i];
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
ss << set[0]; // If i is 0, just pass a null-value. The algorithm would hang otherwise.
|
{
|
||||||
}
|
ss << set[0]; // If i is 0, just pass a null-value. The algorithm would hang otherwise.
|
||||||
|
}
|
||||||
// Add as much null-values to the left as requested.
|
|
||||||
if (ss.str().length() < padding)
|
// Add as much null-values to the left as requested.
|
||||||
{
|
if (ss.str().length() < padding)
|
||||||
const std::size_t cachedLen = ss.str().length();
|
{
|
||||||
const std::string cachedStr = ss.str();
|
const std::size_t cachedLen = ss.str().length();
|
||||||
ss.str("");
|
const std::string cachedStr = ss.str();
|
||||||
for (std::size_t i = 0; i < padding - cachedLen; i++)
|
ss.str("");
|
||||||
ss << set[0];
|
for (std::size_t i = 0; i < padding - cachedLen; i++)
|
||||||
ss << cachedStr;
|
ss << set[0];
|
||||||
}
|
ss << cachedStr;
|
||||||
|
}
|
||||||
return ss.str();
|
|
||||||
}
|
return ss.str();
|
||||||
|
}
|
||||||
using convert_t = std::codecvt_utf8<wchar_t>;
|
|
||||||
|
using convert_t = std::codecvt_utf8<wchar_t>;
|
||||||
namespace SimpleTests
|
|
||||||
{
|
namespace SimpleTests
|
||||||
TEST_CLASS(Password2Key)
|
{
|
||||||
{
|
TEST_CLASS(Password2Key)
|
||||||
public:
|
{
|
||||||
|
public:
|
||||||
// Run a few thousand random passwords through the keygen and see if we'll find a collision.
|
|
||||||
// This test passing does NOT mean that it's resistant! Maybe good, maybe shit! But if it fails, it's definitely shit.
|
// Run a few thousand random passwords through the keygen and see if we'll find a collision.
|
||||||
// Already validated range: Password 0 - 1.000.000
|
// This test passing does NOT mean that it's resistant! Maybe good, maybe shit! But if it fails, it's definitely shit.
|
||||||
TEST_METHOD(CollisionResistance)
|
// Already validated range: Password 0 - 1.000.000
|
||||||
{
|
TEST_METHOD(CollisionResistance)
|
||||||
// To test resistence set this to a high number around a million.
|
{
|
||||||
// This will take a LONG while to execute though (about 2.5hrs on my machine), hence why it's set so low.
|
// To test resistence set this to a high number around a million.
|
||||||
constexpr std::size_t NUM_RUN_TESTS = 1000;
|
// This will take a LONG while to execute though (about 2.5hrs on my machine), hence why it's set so low.
|
||||||
|
constexpr std::size_t NUM_RUN_TESTS = 1000;
|
||||||
std::unordered_map<std::bitset<BLOCK_SIZE>, std::string> keys; // <key, password>
|
|
||||||
|
std::unordered_map<std::bitset<BLOCK_SIZE>, std::string> keys; // <key, password>
|
||||||
// Try NUM_RUN_TESTS passwords
|
|
||||||
const std::string charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
// Try NUM_RUN_TESTS passwords
|
||||||
|
const std::string charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
std::wstring_convert<convert_t, wchar_t> strconverter;
|
|
||||||
|
std::wstring_convert<convert_t, wchar_t> strconverter;
|
||||||
for (std::size_t i = 0; i < NUM_RUN_TESTS; i++)
|
|
||||||
{
|
for (std::size_t i = 0; i < NUM_RUN_TESTS; i++)
|
||||||
// Get password
|
{
|
||||||
const std::string password = Base10_2_X(i, charset, 0);
|
// Get password
|
||||||
|
const std::string password = Base10_2_X(i, charset, 0);
|
||||||
// Generate key
|
|
||||||
const std::bitset<BLOCK_SIZE> newKey = PasswordToKey(password).Get();
|
// Generate key
|
||||||
|
const std::bitset<BLOCK_SIZE> newKey = PasswordToKey(password).Get();
|
||||||
// Check if this block is already in our map
|
|
||||||
if (keys.find(newKey) != keys.cend())
|
// Check if this block is already in our map
|
||||||
{
|
if (keys.find(newKey) != keys.cend())
|
||||||
std::wstringstream wss;
|
{
|
||||||
wss << "Collision found between password \""
|
std::wstringstream wss;
|
||||||
<< strconverter.from_bytes(password)
|
wss << "Collision found between password \""
|
||||||
<< "\" and \""
|
<< strconverter.from_bytes(password)
|
||||||
<< strconverter.from_bytes(keys[newKey])
|
<< "\" and \""
|
||||||
<< "\". The key is \""
|
<< strconverter.from_bytes(keys[newKey])
|
||||||
<< newKey
|
<< "\". The key is \""
|
||||||
<< "\".";
|
<< newKey
|
||||||
|
<< "\".";
|
||||||
Assert::Fail(wss.str().c_str());
|
|
||||||
}
|
Assert::Fail(wss.str().c_str());
|
||||||
|
}
|
||||||
// All good? Insert it into our map
|
|
||||||
keys[newKey] = password;
|
// All good? Insert it into our map
|
||||||
}
|
keys[newKey] = password;
|
||||||
|
}
|
||||||
return;
|
|
||||||
}
|
return;
|
||||||
};
|
}
|
||||||
}
|
};
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
2
GCryptLib/test/main.cpp
Normal file
2
GCryptLib/test/main.cpp
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define CATCH_CONFIG_MAIN
|
||||||
|
#include "Catch2.h"
|
Loading…
x
Reference in New Issue
Block a user