checks.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package main
  2. import (
  3. "math"
  4. "strings"
  5. )
  6. // check each line of a diff and see if there are any potential secrets
  7. // [1] https://people.eecs.berkeley.edu/~rohanpadhye/files/key_leaks-msr15.pdf
  8. func checkRegex(diff string) []string {
  9. var match string
  10. var results []string
  11. lines := strings.Split(diff, "\n")
  12. for _, line := range lines {
  13. // doubtful a leak would be on a line > 120 characters
  14. if len(line) == 0 || len(line) > 120 {
  15. continue
  16. }
  17. for _, re := range regexes {
  18. match = re.FindString(line)
  19. if len(match) == 0 {
  20. continue
  21. }
  22. results = append(results, line)
  23. }
  24. }
  25. return results
  26. }
  27. // checkShannonEntropy checks entropy of target
  28. func checkShannonEntropy(target string, entropy64Cutoff int, entropyHexCutoff int) bool {
  29. var (
  30. sum float64
  31. targetBase64Len int
  32. targetHexLen int
  33. base64Freq = make(map[rune]float64)
  34. hexFreq = make(map[rune]float64)
  35. bits int
  36. )
  37. // get assignment value
  38. index := assignRegex.FindStringIndex(target)
  39. if len(index) == 0 {
  40. return false
  41. }
  42. target = strings.Trim(target[index[1]:], " ")
  43. if len(target) > 100 {
  44. return false
  45. }
  46. // base64Shannon
  47. for _, i := range target {
  48. if strings.Contains(base64Chars, string(i)) {
  49. base64Freq[i]++
  50. targetBase64Len++
  51. }
  52. }
  53. for _, v := range base64Freq {
  54. f := v / float64(targetBase64Len)
  55. sum += f * math.Log2(f)
  56. }
  57. bits = int(math.Ceil(sum*-1)) * targetBase64Len
  58. if bits > entropy64Cutoff {
  59. return true
  60. }
  61. // hexShannon
  62. sum = 0
  63. for _, i := range target {
  64. if strings.Contains(hexChars, string(i)) {
  65. hexFreq[i]++
  66. targetHexLen++
  67. }
  68. }
  69. for _, v := range hexFreq {
  70. f := v / float64(targetHexLen)
  71. sum += f * math.Log2(f)
  72. }
  73. bits = int(math.Ceil(sum*-1)) * targetHexLen
  74. return bits > entropyHexCutoff
  75. }
  76. // containsStopWords checks if there are any stop words in target
  77. func containsStopWords(target string) bool {
  78. for _, stopWord := range stopWords {
  79. if strings.Contains(target, stopWord) {
  80. return true
  81. }
  82. }
  83. return false
  84. }