aboutsummaryrefslogtreecommitdiff
path: root/password.c
blob: e028b610ac997c8f879cf8d94b611c59614f9fd3 (plain)
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
88
89
// https://github.com/dwyl/english-words

#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); **/
}