package main import ( "flag" "fmt" "math" "os" "strings" ) func contains(arr [3]string, str string) bool { for _, a := range arr { if a == str { return true } } return false } func main() { var charsets map[string]string var usedCharsets[] string var possibleSymbols int = 0 var passphrase string var words int charsets = make(map[string]string) charsets["Numbers"] = "0123456789" charsets["Lowercase"] = "abcdefghijklmnopqrstuvwxyz" charsets["Uppercase"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" charsets["Common Special Characters"] = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" charsets["Space"] = " " charsets["Extended ASCII"] = "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" flag.StringVar(&passphrase, "diceware", "", "a diceware passphrase") flag.IntVar(&words, "words", 0, "How many words") flag.StringVar(&passphrase, "random", "", "a random string password") flag.StringVar(&passphrase, "insecure", "", "a human invented password") flag.Parse() seen := make(map[string]bool) flag.Visit(func(f *flag.Flag) { seen[f.Name] = true }) if len(seen) == 0 { flag.PrintDefaults() os.Exit(2) // the same exit code flag.Parse uses } fmt.Println("\nEvaluated string:", passphrase) if dice := seen["diceware"]; dice { if dice := !seen["words"]; dice { os.Exit(2) } else { entropy := math.Log2(math.Pow(float64(7776), float64(words))) fmt.Println("\nPassphrase entropy:", entropy) } } else if rnd := seen["random"]; rnd { passphraseLength := len(passphrase) for key, value := range charsets { if strings.ContainsAny(passphrase, value) { possibleSymbols += len(value) usedCharsets = append(usedCharsets, key) } } entropy := math.Log2(math.Pow(float64(possibleSymbols), float64(passphraseLength))) fmt.Println("\nNumber of characters:", passphraseLength) fmt.Println("\nUsed character sets:", strings.Join(usedCharsets, ", ")) fmt.Println("\nPassphrase entropy:", entropy) } }