1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
#include <sodium/randombytes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sodium.h>
#include <ctype.h> //To Upper
long count_lines(FILE *File) { // Accepts file as input
char c;
long line_counter = 0;
while ((c = getc(File)) != EOF) {
if (c == '\n') {
line_counter++; // Increment when each line number is passed
}
}
return(line_counter); // Return the found value
}
void randomize_case(char *a) { // Accepts a string as input
for (int i = 0; i < strlen(a); i++) { // Loop through the length of the string
int coin = randombytes_uniform(2); // Decide if the current character will be capitalized or lowercase
if (coin == 1) {
a[i] = toupper(a[i]); // Change current character into a capital
}
}
}
void generate_integers(void) { // Generates a string of random integers
int length = 5; // TO-DO: Make random eventually
for (int i=0; i<length; i++) {
int random = randombytes_uniform(length); // Generate random number
printf("%d", random);
}
}
void generate_characters(char *set) {
for (int i = 0; i < 5; i++) {
int random_character = randombytes_uniform(strlen(set));
printf("%c", set[random_character]);
}
}
int main (int argc, char **argv) {
char c;
FILE *words;
long line_counter;
long line_total, r;
char str[20];
char character_set[28] = "!@#$%^&*()_-+={}[]|~`<,>.?:;"; // Character set used to generate random characters
if (sodium_init() < 0) return 1; // Returns an error if sodium isn't working correctly
words = fopen("word_list.txt", "r"); // Open text file
line_total = count_lines(words); // Count the total number of lines in the file
fseek(words, 0, SEEK_SET); // Reset pointer to beginning of file
char temp[2]; // Cannot copy c directly to str. needs a buffer
temp[1] = '\0'; // Makes the array a string
r = randombytes_uniform(line_total + 1); // Generates random line number to use for string
temp[1] = '\0'; // Makes the array a string
while ((c = getc(words)) != EOF) {
int i;
temp[0] = c; // Temporally move the current character into temp
if ((r == i) && (c != '\n')) { // If the current line is the designated word & it isn't the break character
strcat(str, temp); // Copy the character to the string
}
if (c == '\n') {
i++; // Increment the line counter
}
}
//** Passwords are generated by just printing outputs of different functions. **/
randomize_case(str);
generate_integers();
printf("%s", str);
generate_characters(character_set);
printf("\n");
fseek(words, 0, SEEK_SET); // Reset pointer to beginning of file //
fclose(words);
/** printf("LINE TOTAL: %li\n", line_total); **/
}
|