app.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "math"
  6. "os"
  7. "strings"
  8. )
  9. func contains(arr [3]string, str string) bool {
  10. for _, a := range arr {
  11. if a == str {
  12. return true
  13. }
  14. }
  15. return false
  16. }
  17. func myUsage() {
  18. fmt.Println("usage: passphrase-entropy <command> [<args>]")
  19. fmt.Println("Available commands are: ")
  20. fmt.Println(" diceware Calculate entropy of a diceware passphrase")
  21. fmt.Println(" random Calculate entropy of a random string")
  22. fmt.Println(" invented Calculate entropy of an invented passphrase")
  23. }
  24. func main() {
  25. var charsets map[string]string
  26. var usedCharsets[] string
  27. var possibleSymbols int = 0
  28. var passphrase string
  29. var err error
  30. charsets = make(map[string]string)
  31. charsets["Numbers"] = "0123456789"
  32. charsets["Lowercase"] = "abcdefghijklmnopqrstuvwxyz"
  33. charsets["Uppercase"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  34. charsets["Common Special Characters"] = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
  35. charsets["Space"] = " "
  36. charsets["Extended ASCII"] = "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  37. dicewareCommand := flag.NewFlagSet("diceware", flag.ExitOnError)
  38. dicewarePassphraseFlag := dicewareCommand.String("password", "", "the password")
  39. wordsFlag := dicewareCommand.Int("words", 0, "number of words in passphrase")
  40. dictSizeFlag := dicewareCommand.Int("dictSize", 0, "number of words in dictionary")
  41. delimiterFlag := dicewareCommand.String("delimiter", "", "delimiter used")
  42. randomCommand := flag.NewFlagSet("random", flag.ExitOnError)
  43. randomPassphraseFlag := randomCommand.String("password", "", "the password")
  44. inventedCommand := flag.NewFlagSet("invented", flag.ExitOnError)
  45. inventedPassphraseFlag := inventedCommand.String("password", "", "the password")
  46. inventedWords := inventedCommand.Int("words", 0, "number of words in invented passphrase")
  47. if len(os.Args) == 1 {
  48. myUsage()
  49. return
  50. }
  51. switch os.Args[1] {
  52. case "diceware":
  53. dicewareCommand.Parse(os.Args[2:])
  54. case "random":
  55. randomCommand.Parse(os.Args[2:])
  56. case "invented":
  57. inventedCommand.Parse(os.Args[2:])
  58. default:
  59. myUsage()
  60. fmt.Printf("\n%q is not valid command.\n", os.Args[1])
  61. os.Exit(2)
  62. }
  63. if *inventedPassphraseFlag != "" {
  64. passphrase = *inventedPassphraseFlag
  65. } else if *randomPassphraseFlag != "" {
  66. passphrase = *randomPassphraseFlag
  67. } else {
  68. passphrase = *dicewarePassphraseFlag
  69. }
  70. if dicewareCommand.Parsed() {
  71. if *wordsFlag == 0 {
  72. dicewareCommand.Usage()
  73. return
  74. }
  75. if *dictSizeFlag == 0 {
  76. dicewareCommand.Usage()
  77. return
  78. }
  79. if *delimiterFlag != "" {
  80. for key, value := range charsets {
  81. if strings.ContainsAny(*delimiterFlag, value) {
  82. *dictSizeFlag += len(value)
  83. usedCharsets = append(usedCharsets, key)
  84. }
  85. }
  86. }
  87. entropy := math.Log2(math.Pow(float64(*dictSizeFlag), float64(*wordsFlag)))
  88. fmt.Println("\nPassphrase entropy:", entropy)
  89. }
  90. if randomCommand.Parsed() {
  91. if *randomPassphraseFlag == "" {
  92. randomCommand.Usage()
  93. return
  94. }
  95. passphraseLength := len(*randomPassphraseFlag)
  96. for key, value := range charsets {
  97. if strings.ContainsAny(*randomPassphraseFlag, value) {
  98. possibleSymbols += len(value)
  99. usedCharsets = append(usedCharsets, key)
  100. }
  101. }
  102. entropy := math.Log2(math.Pow(float64(possibleSymbols), float64(passphraseLength)))
  103. fmt.Println("\nNumber of characters:", passphraseLength)
  104. fmt.Println("\nUsed character sets:", strings.Join(usedCharsets, ", "))
  105. fmt.Println("\nPassphrase entropy:", entropy)
  106. }
  107. if inventedCommand.Parsed() {
  108. if *inventedWords != 0 {
  109. inventedCommand.Usage()
  110. return
  111. }
  112. fmt.Println("Calc entropy here")
  113. }
  114. }