55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
|
package matching
|
||
|
|
||
|
import (
|
||
|
"github.com/nbutton23/zxcvbn-go/entropy"
|
||
|
"github.com/nbutton23/zxcvbn-go/match"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func buildDictMatcher(dictName string, rankedDict map[string]int) func(password string) []match.Match {
|
||
|
return func(password string) []match.Match {
|
||
|
matches := dictionaryMatch(password, dictName, rankedDict)
|
||
|
for _, v := range matches {
|
||
|
v.DictionaryName = dictName
|
||
|
}
|
||
|
return matches
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func dictionaryMatch(password string, dictionaryName string, rankedDict map[string]int) []match.Match {
|
||
|
length := len(password)
|
||
|
var results []match.Match
|
||
|
pwLower := strings.ToLower(password)
|
||
|
|
||
|
for i := 0; i < length; i++ {
|
||
|
for j := i; j < length; j++ {
|
||
|
word := pwLower[i : j+1]
|
||
|
if val, ok := rankedDict[word]; ok {
|
||
|
matchDic := match.Match{Pattern: "dictionary",
|
||
|
DictionaryName: dictionaryName,
|
||
|
I: i,
|
||
|
J: j,
|
||
|
Token: password[i : j+1],
|
||
|
}
|
||
|
matchDic.Entropy = entropy.DictionaryEntropy(matchDic, float64(val))
|
||
|
|
||
|
results = append(results, matchDic)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return results
|
||
|
}
|
||
|
|
||
|
func buildRankedDict(unrankedList []string) map[string]int {
|
||
|
|
||
|
result := make(map[string]int)
|
||
|
|
||
|
for i, v := range unrankedList {
|
||
|
result[strings.ToLower(v)] = i + 1
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
}
|