4 Commits

21 changed files with 118 additions and 48 deletions
+7 -5
View File
@@ -1,20 +1,22 @@
# GoPass
An easy to use command-line password generator that creates secure passwords (Version 1.1 adds proper cryptographic
seeding of math/rand)
An easy to use command-line password generator that creates secure passwords
# Usage:
`./gopass [number of characters]`<br>
or <br>
`./gopass [number of characters] "[excluded characters]"`
`./gopass [number of characters] -r=[excluded characters] [-s to remove all symbols]`
<hr>
eg: `./gopass 32` <br>
output: `E$bGOiiPASS*,ISl{!MJ&<\[COOL0eVw` <br>
eg (with excluded characters): `./gopass 32 "$,!"` <br>
output: `EYbGOiiPASS*2ISl{?MJ&<\[COOL0eVw` <- note the excluded characters are not present in the output
eg: (with excluded characters): `./gopass 32 -r=$,!` <br>
output: `EYbGOiiPASS*2ISl{?MJ&<\[COOL0eVw` <- note the excluded characters are not present in the output <br>
eg: `./gopass 32 -s` <br>
output: `LEYbGOiiPASS2ISlMJCOOL0eRt3KPOVw` <- note the symbols are not present in the output <br>
eg: `./gopass 32 -r=$,! -s` the -r and -s flags can be combined <br>
# How to install/use for Windows:
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+61 -41
View File
@@ -1,74 +1,94 @@
// GoPass
// Author: Maximilian Patterson
// Version: 1.2.2
package main
import (
cryptorand "crypto/rand"
"encoding/binary"
"crypto/rand"
"fmt"
"math/big"
mathrand "math/rand"
"os"
"strconv"
"strings"
)
var allowedCharacters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890`~!@#$%^&*()_+[]\\{}|;':,./<>?")
func main() {
// Take in all OS arg
args := os.Args[1:]
if len(args) < 1 {
println("No password length specified! (ex: ./gopass 16)")
return
const (
Version = "1.3.0"
symbols = "`~!@#$%^&*()_+[]\\{}|;':,./<>?"
)
func matchArguments(args []string) string {
// If there are no arguments
if len(args) == 0 {
return "No password length specified! (ex: gopass 16)"
}
// Convert String arg to int
size, err := strconv.Atoi(args[0])
if err != nil {
println("First argument supplied must be an integer! (ex: 16)")
return
// First argument is special, must be an integer, -v, or -h
var size = 0 // Password length
err := error(nil)
if size, err = strconv.Atoi(args[0]); err == nil { // If first argument is an integer
} else if args[0] == "-v" {
return "GoPass version " + Version
} else if args[0] == "-h" {
return "GoPass - A simple password generator written in Go\n" +
"Usage: gopass [length] [disallowed characters] [optional remove symbols -s]\n" +
" Example: gopass 16\n" +
" Example: gopass 16 -r=abc123!@#\n" +
" Example: gopass 16 -s\n" +
"\nFor help (this output): gopass -h\n" +
"For version: gopass -v\n"
}
// Grab second argument (if it exists) and use it as a disallowed character(s)
var disallowed []rune
if len(args) == 2 {
// Break apart the string into a slice of runes
disallowed = []rune(args[1])
// Remove all disallowed characters from the allowedCharacters slice
for _, r := range disallowed {
for i, v := range allowedCharacters {
if v == r {
allowedCharacters = append(allowedCharacters[:i], allowedCharacters[i+1:]...)
}
}
for i := 1; i < len(args); i++ {
v := args[i]
if v == "-s" {
removeDisallowed([]rune(symbols))
} else if strings.HasPrefix(v, "-r=") { // If argument starts with -r=
// Remove all characters after the = until next whitespace
removeDisallowed([]rune(v[2:]))
} else {
return "Invalid argument (\"" + v + "\") supplied! (Type gopass -h for help)"
}
}
if size <= 0 {
return "No/invalid password length specified! (ex: gopass 16)"
} else {
return generatePassword(size)
}
}
// Remove all disallowed characters from the allowedCharacters slice
func removeDisallowed(disallowed []rune) {
for _, r := range disallowed {
for i, v := range allowedCharacters {
if v == r {
allowedCharacters = append(allowedCharacters[:i], allowedCharacters[i+1:]...)
}
}
}
}
func generatePassword(size int) string {
// Make empty array of runes with size of size
pass := make([]rune, size)
// Seed rand with time
var b [8]byte
_, err = cryptorand.Read(b[:])
if err != nil {
println("Error securely seeding crypto/rand!")
return
}
mathrand.Seed(int64(binary.LittleEndian.Uint64(b[:])))
// Assign every slot of pass to a random allowedCharacter
for i := range pass {
// Generate a random int greater than 0 and not to exceed the length of allowedCharacters
index, err := cryptorand.Int(cryptorand.Reader, big.NewInt(int64(len(allowedCharacters))))
index, err := rand.Int(rand.Reader, big.NewInt(int64(len(allowedCharacters))))
if err != nil {
println("Error securely generating random character!")
return
return ""
}
pass[i] = allowedCharacters[index.Int64()]
}
// Print the password
fmt.Println(string(pass))
return string(pass)
}
func main() {
// Process arguments
fmt.Println(matchArguments(os.Args[1:]))
}
+50 -2
View File
@@ -1,13 +1,21 @@
# The current version number of the program
VERSION := 1.2.2
VERSION := 1.3.0
# List of OS and architecture combinations to build
BUILD_OS_ARCH := \
darwin/amd64 \
freebsd/386 \
freebsd/amd64 \
freebsd/arm \
linux/386 \
linux/amd64 \
linux/arm \
plan9/386 \
plan9/amd64 \
plan9/arm \
windows/386 \
windows/amd64
windows/amd64 \
windows/arm
# Build all targets
all: $(BUILD_OS_ARCH)
@@ -18,6 +26,21 @@ darwin/amd64:
GOARCH=amd64 \
go build -ldflags="-s -w" -o "gopass-darwin-amd64-$(VERSION)" main.go
freebsd/386:
GOOS=freebsd \
GOARCH=386 \
go build -ldflags="-s -w" -o "gopass-freebsd-386-$(VERSION)" main.go
freebsd/amd64:
GOOS=freebsd \
GOARCH=amd64 \
go build -ldflags="-s -w" -o "gopass-freebsd-amd64-$(VERSION)" main.go
freebsd/arm:
GOOS=freebsd \
GOARCH=arm \
go build -ldflags="-s -w" -o "gopass-freebsd-arm-$(VERSION)" main.go
linux/386:
GOOS=linux \
GOARCH=386 \
@@ -28,6 +51,26 @@ linux/amd64:
GOARCH=amd64 \
go build -ldflags="-s -w" -o "gopass-linux-amd64-$(VERSION)" main.go
linux/arm:
GOOS=linux \
GOARCH=arm \
go build -ldflags="-s -w" -o "gopass-linux-arm-$(VERSION)" main.go
plan9/386:
GOOS=plan9 \
GOARCH=386 \
go build -ldflags="-s -w" -o "gopass-plan9-386-$(VERSION)" main.go
plan9/amd64:
GOOS=plan9 \
GOARCH=amd64 \
go build -ldflags="-s -w" -o "gopass-plan9-amd64-$(VERSION)" main.go
plan9/arm:
GOOS=plan9 \
GOARCH=arm \
go build -ldflags="-s -w" -o "gopass-plan9-arm-$(VERSION)" main.go
windows/386:
GOOS=windows \
GOARCH=386 \
@@ -37,3 +80,8 @@ windows/amd64:
GOOS=windows \
GOARCH=amd64 \
go build -ldflags="-s -w" -o "gopass-windows-amd64-$(VERSION)" main.go
windows/arm:
GOOS=windows \
GOARCH=arm \
go build -ldflags="-s -w" -o "gopass-windows-arm-$(VERSION)" main.go