Compare commits
7 Commits
3afe9f0d4c
...
d3aa932bdc
Author | SHA1 | Date | |
---|---|---|---|
d3aa932bdc | |||
e34b8b962f | |||
25782d1263 | |||
fc2d3e1360 | |||
023e201ac7 | |||
e363eccc59 | |||
25113dc0b3 |
@ -25,6 +25,8 @@ extern "C" {
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <why2/flags.h>
|
||||||
|
|
||||||
//MACROS
|
//MACROS
|
||||||
#define WHY2_SUM_SEGMENT_SIZE 32 //SEGMENT SIZE FOR CALCULATING SUM
|
#define WHY2_SUM_SEGMENT_SIZE 32 //SEGMENT SIZE FOR CALCULATING SUM
|
||||||
#define WHY2_SUM_BASE_PRIME 31 //PRIME FOR SUM BASE
|
#define WHY2_SUM_BASE_PRIME 31 //PRIME FOR SUM BASE
|
||||||
@ -35,7 +37,9 @@ extern "C" {
|
|||||||
|
|
||||||
//FUNCTIONS
|
//FUNCTIONS
|
||||||
unsigned long long why2_sum_segment(char *input); //CALCULATE SUM++ FOR input; USED FOR PADDING SEED
|
unsigned long long why2_sum_segment(char *input); //CALCULATE SUM++ FOR input; USED FOR PADDING SEED
|
||||||
ssize_t why2_random(void *dest, size_t size); //WRITE CRYPTO-SECURE RANDOM NUMBER INTO dest
|
why2_bool why2_random(void *dest, size_t size); //WRITE CRYPTO-SECURE RANDOM NUMBER INTO dest
|
||||||
|
void why2_seed_random(unsigned long seed); //SEED why2_seeded_random OUTPUT
|
||||||
|
int why2_seeded_random(); //GENERATE RANDOM NUMBER BASED ON SEED PASSED IN why2_seed_random
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -189,13 +189,13 @@ why2_output_flags why2_decrypt_text(char *text, char *key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//OBTAIN SEED FROM key_new
|
//OBTAIN SEED FROM key_new
|
||||||
srand(why2_sum_segment(key_new));
|
why2_seed_random(why2_sum_segment(key_new));
|
||||||
|
|
||||||
//GET RANDOM SEQUENCE USED IN ENCRYPTION
|
//GET RANDOM SEQUENCE USED IN ENCRYPTION
|
||||||
why2_list_t random_sequence = WHY2_LIST_EMPTY;
|
why2_list_t random_sequence = WHY2_LIST_EMPTY;
|
||||||
for (unsigned long i = 0; i < why2_get_flags().padding; i++)
|
for (unsigned long i = 0; i < why2_get_flags().padding; i++)
|
||||||
{
|
{
|
||||||
int rand_buffer = rand();
|
int rand_buffer = why2_seeded_random();
|
||||||
why2_list_push(&random_sequence, &rand_buffer, sizeof(int)); //ADD
|
why2_list_push(&random_sequence, &rand_buffer, sizeof(int)); //ADD
|
||||||
}
|
}
|
||||||
why2_list_reverse(&random_sequence, sizeof(int)); //REVERSE
|
why2_list_reverse(&random_sequence, sizeof(int)); //REVERSE
|
||||||
|
@ -92,12 +92,12 @@ why2_output_flags why2_encrypt_text(char *text, char *key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//OBTAIN SEED FROM key_new
|
//OBTAIN SEED FROM key_new
|
||||||
srand(why2_sum_segment(key_new));
|
why2_seed_random(why2_sum_segment(key_new));
|
||||||
|
|
||||||
//ADD PADDING TO split_text LIST
|
//ADD PADDING TO split_text LIST
|
||||||
for (unsigned long i = 0; i < why2_get_flags().padding; i++)
|
for (unsigned long i = 0; i < why2_get_flags().padding; i++)
|
||||||
{
|
{
|
||||||
unsigned long random_position = (unsigned long) (rand() % (why2_list_get_size(&split_text))); //GET RANDOM POSITION
|
unsigned long random_position = (unsigned long) (why2_seeded_random() % (why2_list_get_size(&split_text))); //GET RANDOM POSITION
|
||||||
|
|
||||||
char random_char = 0;
|
char random_char = 0;
|
||||||
for (int j = 0; j < WHY2_PADDING_NONZERO_TRIES && random_char == 0 ; j++) //GET RANDOM (EXCLUDING 0)
|
for (int j = 0; j < WHY2_PADDING_NONZERO_TRIES && random_char == 0 ; j++) //GET RANDOM (EXCLUDING 0)
|
||||||
|
@ -18,11 +18,27 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
#include <why2/crypto.h>
|
#include <why2/crypto.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/random.h>
|
#include <sys/random.h>
|
||||||
|
|
||||||
|
#include <openssl/rand.h>
|
||||||
|
#include <openssl/hmac.h>
|
||||||
|
|
||||||
|
#include <why2/flags.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned long seed; //DA SEED
|
||||||
|
unsigned long counter; //COUNTER FOR DETERMINISTIC OUTPUT
|
||||||
|
} PRNG_CTX; //GENERATOR
|
||||||
|
|
||||||
|
//LOCAL
|
||||||
|
PRNG_CTX generator = { 0, 0 }; //SEEDED RANDOM GENERATOR
|
||||||
|
|
||||||
|
//GLOBAL
|
||||||
unsigned long long why2_sum_segment(char *input) //THE OUTPUT IS GOING TO GROW A LOT WITH LONG input, BUT IT SHOULDN'T BE A BIG PROBLEM. I TESTED FOR OVERFLOWS UP TO 4096-CHAR input AND ONLY GOT TO (14*10^(-7))% OF FULL ULL RANGE LMAO
|
unsigned long long why2_sum_segment(char *input) //THE OUTPUT IS GOING TO GROW A LOT WITH LONG input, BUT IT SHOULDN'T BE A BIG PROBLEM. I TESTED FOR OVERFLOWS UP TO 4096-CHAR input AND ONLY GOT TO (14*10^(-7))% OF FULL ULL RANGE LMAO
|
||||||
{
|
{
|
||||||
unsigned long input_size = strlen(input);
|
unsigned long input_size = strlen(input);
|
||||||
@ -47,7 +63,39 @@ unsigned long long why2_sum_segment(char *input) //THE OUTPUT IS GOING TO GROW A
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t why2_random(void *dest, size_t size)
|
why2_bool why2_random(void *dest, size_t size)
|
||||||
{
|
{
|
||||||
return getrandom(dest, size, GRND_NONBLOCK);
|
return RAND_bytes((unsigned char*) dest, size) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void why2_seed_random(unsigned long seed)
|
||||||
|
{
|
||||||
|
memset(&generator, 0, sizeof(PRNG_CTX)); //INIT GENERATOR
|
||||||
|
memcpy(&(generator.seed), &seed, sizeof(generator.seed)); //COPY SEED
|
||||||
|
generator.counter = 0; //INIT COUNTER
|
||||||
|
}
|
||||||
|
|
||||||
|
int why2_seeded_random()
|
||||||
|
{
|
||||||
|
int output;
|
||||||
|
unsigned char counter_bytes[4];
|
||||||
|
unsigned char hmac_output[EVP_MAX_MD_SIZE];
|
||||||
|
unsigned int hmac_len;
|
||||||
|
|
||||||
|
//CONVERT COUNTER TO BYTES
|
||||||
|
counter_bytes[0] = (generator.counter >> 24) & 0xFF;
|
||||||
|
counter_bytes[1] = (generator.counter >> 16) & 0xFF;
|
||||||
|
counter_bytes[2] = (generator.counter >> 8) & 0xFF;
|
||||||
|
counter_bytes[3] = generator.counter & 0xFF;
|
||||||
|
|
||||||
|
//HMAC (seed || counter)
|
||||||
|
HMAC(EVP_sha256(), &(generator.seed), sizeof(generator.seed), counter_bytes, sizeof(counter_bytes), hmac_output, &hmac_len);
|
||||||
|
|
||||||
|
//USE THE FIRST 4 BYTES OF THE HMAC OUTPUT AS DETERMINISTIC RANDOM INTEGER
|
||||||
|
memcpy(&output, hmac_output, sizeof(output));
|
||||||
|
|
||||||
|
//INCREMENT COUNTER
|
||||||
|
generator.counter++;
|
||||||
|
|
||||||
|
return output;
|
||||||
}
|
}
|
@ -438,7 +438,7 @@ char *why2_generate_key(int key_length)
|
|||||||
for (int i = 0; i < key_length; i++)
|
for (int i = 0; i < key_length; i++)
|
||||||
{
|
{
|
||||||
//GET RANDOM NUMBER
|
//GET RANDOM NUMBER
|
||||||
if (why2_random(&random_buffer, sizeof(unsigned int)) == -1) why2_die("getrandom fn failed!");
|
if (!why2_random(&random_buffer, sizeof(unsigned int))) why2_die("getrandom fn failed!");
|
||||||
|
|
||||||
//SET numberBuffer TO RANDOM NUMBER BETWEEN 0 AND 52
|
//SET numberBuffer TO RANDOM NUMBER BETWEEN 0 AND 52
|
||||||
number_buffer = (random_buffer % 52) + 1;
|
number_buffer = (random_buffer % 52) + 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user