Added code
This commit is contained in:
parent
84ff1840f2
commit
d11091ba27
3 changed files with 306 additions and 1 deletions
17
Makefile
Normal file
17
Makefile
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
all: passgen
|
||||||
|
|
||||||
|
WARNINGS = -Wall
|
||||||
|
DEBUG = -ggdb -fno-omit-frame-pointer
|
||||||
|
OPTIMIZE = -O2
|
||||||
|
|
||||||
|
passgen: Makefile passgen.c
|
||||||
|
$(CC) -o $@ $(WARNINGS) $(DEBUG) $(OPTIMIZE) passgen.c
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f passgen
|
||||||
|
|
||||||
|
install:
|
||||||
|
echo "Installing is not supported"
|
||||||
|
|
||||||
|
run:
|
||||||
|
./passgen
|
101
README.md
101
README.md
|
@ -1,2 +1,101 @@
|
||||||
# passgen
|
# passgen
|
||||||
A simple and efficient command line password generator written in C
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
- [Introduction](#introduction)
|
||||||
|
- [Building](#building)
|
||||||
|
- [Usage](#usage)
|
||||||
|
- [Options](#options)
|
||||||
|
- [Examples](#examples)
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
**passgen** is a password generation tool that allows you to create secure and
|
||||||
|
customizable passwords. It generates passwords based on user-specified
|
||||||
|
criteria, including password length and character types (lowercase letters,
|
||||||
|
uppercase letters, digits, and special characters). You can also use
|
||||||
|
**passgen** without any options to generate a random password with default
|
||||||
|
settings.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
This tool is provided as source code and can be built using `make`. By just
|
||||||
|
typing make in the terminal within the code's directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
|
You should now have an executable named `passgen`. You can copy it to a location
|
||||||
|
in your PATH for easy access.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
To use passgen, open your terminal and execute the program with the desired
|
||||||
|
options.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
passgen [OPTIONS]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
**passgen** provides the following command-line options:
|
||||||
|
|
||||||
|
- `-L`, `--length`:
|
||||||
|
- Specify the length of the generated password. Default is 24 characters.
|
||||||
|
- Valid range: 5 to 4096 characters.
|
||||||
|
|
||||||
|
- `-l`, `--lower-case`:
|
||||||
|
- Enable lowercase letters in the password.
|
||||||
|
|
||||||
|
- `-u`, `--upper-case`:
|
||||||
|
- Enable uppercase letters in the password.
|
||||||
|
|
||||||
|
- `-d`, `--digits`:
|
||||||
|
- Enable digits in the password.
|
||||||
|
|
||||||
|
- `-s`, `--special`:
|
||||||
|
- Enable special characters in the password.
|
||||||
|
|
||||||
|
- `-h`, `--help`:
|
||||||
|
- Display the help message and exit.
|
||||||
|
|
||||||
|
- `-v`, `--version`:
|
||||||
|
- Display the program version and exit.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
1. Generate a default password:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
passgen
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate a 24-character password with a mix of lowercase letters,
|
||||||
|
uppercase letters, digits, and special characters.
|
||||||
|
|
||||||
|
2. Generate a password with specific options:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
passgen -L 12 -lud
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate a 12-character password with only lowercase letters,
|
||||||
|
uppercase letters, digits, and no special characters.
|
||||||
|
|
||||||
|
3. Display help message:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
passgen -h
|
||||||
|
```
|
||||||
|
|
||||||
|
This will display the usage and available options.
|
||||||
|
|
||||||
|
4. Display version:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
passgen -v
|
||||||
|
```
|
||||||
|
|
||||||
|
This will display the version of Passgen.
|
||||||
|
|
189
passgen.c
Normal file
189
passgen.c
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
/*
|
||||||
|
* passgen.c
|
||||||
|
*
|
||||||
|
* Copyright 2024 Clay Gomera
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#define VERSION 0.1
|
||||||
|
#define NAME "passgen"
|
||||||
|
|
||||||
|
// Function prototypes
|
||||||
|
char* generatePassword(unsigned int length, bool wantsUpCase, bool wantsLowCase, bool wantsDigits, bool wantsSpecials);
|
||||||
|
void displayHelp();
|
||||||
|
void displayVersion();
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
int option;
|
||||||
|
unsigned int length = 24;
|
||||||
|
bool wantsUpCase = false,
|
||||||
|
wantsLowCase = false,
|
||||||
|
wantsDigits = false,
|
||||||
|
wantsSpecials = false;
|
||||||
|
|
||||||
|
// Generate a random password if no arguments are given
|
||||||
|
if (argc == 1) {
|
||||||
|
char* password = generatePassword(length, true, true, true, true);
|
||||||
|
printf("Password: %s\n", password);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Options
|
||||||
|
static const char* short_options = "L:ludshv";
|
||||||
|
static struct option long_options[] = {
|
||||||
|
{"length", required_argument, 0, 'L'},
|
||||||
|
{"lower-case", no_argument, 0, 'l'},
|
||||||
|
{"upper-case", no_argument, 0, 'u'},
|
||||||
|
{"digits", no_argument, 0, 'd'},
|
||||||
|
{"special", no_argument, 0, 's'},
|
||||||
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"version", no_argument, 0, 'v'},
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
while ((option = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {
|
||||||
|
switch (option) {
|
||||||
|
case 'L':
|
||||||
|
if ((length = atoi(optarg)) != 0) {
|
||||||
|
if (length > 4096 || length < 5) {
|
||||||
|
fprintf(stderr, "Error: The password length can't be greater than 4096 or less than 5 characters.\n\n");
|
||||||
|
displayHelp();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "Invalid value provided. Please provide a valid numeric value for the length.\n\n");
|
||||||
|
displayHelp();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
wantsLowCase = true;
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
wantsUpCase = true;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
wantsDigits = true;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
wantsSpecials = true;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
displayHelp();
|
||||||
|
return 0;
|
||||||
|
case 'v':
|
||||||
|
displayVersion();
|
||||||
|
return 0;
|
||||||
|
case '?':
|
||||||
|
fprintf(stderr, "Use '-h, --help' for help.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wantsLowCase && !wantsUpCase && !wantsDigits && !wantsSpecials) {
|
||||||
|
char* password = generatePassword(length, true, true, true, true);
|
||||||
|
printf("Password: %s\n", password);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* password = generatePassword(length, wantsUpCase, wantsLowCase, wantsDigits, wantsSpecials);
|
||||||
|
printf("Password: %s\n", password);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* generatePassword(unsigned int length, bool wantsUpCase, bool wantsLowCase, bool wantsDigits, bool wantsSpecials) {
|
||||||
|
const char* uppercase_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
const char* lowercase_letters = "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
const char* digits = "0123456789";
|
||||||
|
const char* special_chars = "!@#$%^&*()_=[{]}\\|;:'\",<.>?`~+-/*";
|
||||||
|
|
||||||
|
// Seed the random number generator with processor time
|
||||||
|
srand((unsigned int)clock());
|
||||||
|
|
||||||
|
// Calculate the total number of characters based on user preferences
|
||||||
|
unsigned int total_chars = 0;
|
||||||
|
if (wantsUpCase) total_chars += strlen(uppercase_letters);
|
||||||
|
if (wantsLowCase) total_chars += strlen(lowercase_letters);
|
||||||
|
if (wantsDigits) total_chars += strlen(digits);
|
||||||
|
if (wantsSpecials) total_chars += strlen(special_chars);
|
||||||
|
|
||||||
|
char* password = (char*)malloc((length + 1) * sizeof(char)); // +1 for null-terminator
|
||||||
|
if (password == NULL) {
|
||||||
|
fprintf(stderr, "Memory allocation error.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < length; i++) {
|
||||||
|
int random_index = rand() % total_chars;
|
||||||
|
|
||||||
|
if (wantsUpCase) {
|
||||||
|
if (random_index < strlen(uppercase_letters)) {
|
||||||
|
password[i] = uppercase_letters[random_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
random_index -= strlen(uppercase_letters);
|
||||||
|
}
|
||||||
|
if (wantsLowCase) {
|
||||||
|
if (random_index < strlen(lowercase_letters)) {
|
||||||
|
password[i] = lowercase_letters[random_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
random_index -= strlen(lowercase_letters);
|
||||||
|
}
|
||||||
|
if (wantsDigits) {
|
||||||
|
if (random_index < strlen(digits)) {
|
||||||
|
password[i] = digits[random_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
random_index -= strlen(digits);
|
||||||
|
}
|
||||||
|
if (wantsSpecials) {
|
||||||
|
password[i] = special_chars[random_index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
password[length] = '\0'; // Null-terminate the string
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to display the help message
|
||||||
|
void displayHelp() {
|
||||||
|
printf("Usage: %s [OPTIONS]\n", NAME);
|
||||||
|
printf("Generate passwords with ease.\n\n");
|
||||||
|
printf("Options:\n");
|
||||||
|
printf("\t-L, --length Specify the length of the password.\n");
|
||||||
|
printf("\t-l, --lower-case Enable lowercase for the password.\n");
|
||||||
|
printf("\t-u, --upper-case Enable uppercase for the password.\n");
|
||||||
|
printf("\t-d, --digits Enable digits for the password.\n");
|
||||||
|
printf("\t-s, --special Enable special characters for the password.\n");
|
||||||
|
printf("\t-h, --help Display this help message and exit.\n");
|
||||||
|
printf("\t-v, --version Display version and exit.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to display the version information
|
||||||
|
void displayVersion() {
|
||||||
|
printf("%s v%.1f\n", NAME, VERSION);
|
||||||
|
}
|
Loading…
Reference in a new issue