You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

passwords_test.go 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright (c) 2020 Shivaram Lingamneni <slingamn@cs.stanford.edu>
  2. // released under the MIT license
  3. package migrations
  4. import (
  5. "encoding/base64"
  6. "testing"
  7. )
  8. func TestAthemePassphrases(t *testing.T) {
  9. var err error
  10. // modules/crypto/crypt3-md5:
  11. err = CheckAthemePassphrase([]byte("$1$hcspif$nCm4r3S14Me9ifsOPGuJT."), []byte("shivarampassphrase"))
  12. if err != nil {
  13. t.Errorf("failed to check passphrase: %v", err)
  14. }
  15. err = CheckAthemePassphrase([]byte("$1$hcspif$nCm4r3S14Me9ifsOPGuJT."), []byte("sh1varampassphrase"))
  16. if err == nil {
  17. t.Errorf("accepted invalid passphrase")
  18. }
  19. err = CheckAthemePassphrase([]byte("$1$diwesm$9MjapdOyhyC.2FdHzKMzK."), []byte("1Ss1GN4q-3e8SgIJblfQxw"))
  20. if err != nil {
  21. t.Errorf("failed to check passphrase: %v", err)
  22. }
  23. err = CheckAthemePassphrase([]byte("$1$hcspif$nCm4r3S14Me9ifsOPGuJT."), []byte("sh1varampassphrase"))
  24. if err == nil {
  25. t.Errorf("accepted invalid passphrase")
  26. }
  27. // modules/crypto/pbkdf2:
  28. err = CheckAthemePassphrase([]byte("khMlbBBIFya2ihyN42abc3e768663e2c4fd0e0020e46292bf9fdf44e9a51d2a2e69509cb73b4b1bf9c1b6355a1fc9ea663fcd6da902287159494f15b905e5e651d6a60f2ec834598"), []byte("password"))
  29. if err != nil {
  30. t.Errorf("failed to check passphrase: %v", err)
  31. }
  32. err = CheckAthemePassphrase([]byte("khMlbBBIFya2ihyN42abc3e768663e2c4fd0e0020e46292bf9fdf44e9a51d2a2e69509cb73b4b1bf9c1b6355a1fc9ea663fcd6da902287159494f15b905e5e651d6a60f2ec834598"), []byte("passw0rd"))
  33. if err == nil {
  34. t.Errorf("accepted invalid passphrase")
  35. }
  36. // modules/crypto/pbkdf2v2:
  37. err = CheckAthemePassphrase([]byte("$z$65$64000$1kz1I9YJPJ2gkJALbrpL2DoxRDhYPBOg60KNJMK/6do=$Cnfg6pYhBNrVXiaXYH46byrC+3HKet/XvYwvI1BvZbs=$m0hrT33gcF90n2TU3lm8tdm9V9XC4xEV13KsjuT38iY="), []byte("password"))
  38. if err != nil {
  39. t.Errorf("failed to check passphrase: %v", err)
  40. }
  41. err = CheckAthemePassphrase([]byte("$z$65$64000$1kz1I9YJPJ2gkJALbrpL2DoxRDhYPBOg60KNJMK/6do=$Cnfg6pYhBNrVXiaXYH46byrC+3HKet/XvYwvI1BvZbs=$m0hrT33gcF90n2TU3lm8tdm9V9XC4xEV13KsjuT38iY="), []byte("passw0rd"))
  42. if err == nil {
  43. t.Errorf("accepted invalid passphrase")
  44. }
  45. weirdHash := []byte("$z$6$64000$rWfIGzPY9qiIt7m5$VdFroDOlTQSLlFUJtpvlbp2i7sH3ZUndqwdnOvoDvt6b2AzLjaAK/lhSO/QaR2nA3Wm4ObHdl3WMW32NdtSMdw==")
  46. err = CheckAthemePassphrase(weirdHash, []byte("pHQpwje5CjS3_Lx0RaeS7w"))
  47. if err != nil {
  48. t.Errorf("failed to check passphrase: %v", err)
  49. }
  50. err = CheckAthemePassphrase(weirdHash, []byte("pHQpwje5CjS3-Lx0RaeS7w"))
  51. if err == nil {
  52. t.Errorf("accepted invalid passphrase")
  53. }
  54. }
  55. func TestAthemeRawSha1(t *testing.T) {
  56. var err error
  57. shivaramHash := []byte("$rawsha1$49fffa5543f21dd6effe88a79633e4073e36a828")
  58. err = CheckAthemePassphrase(shivaramHash, []byte("shivarampassphrase"))
  59. if err != nil {
  60. t.Errorf("failed to check passphrase: %v", err)
  61. }
  62. err = CheckAthemePassphrase(shivaramHash, []byte("edpassphrase"))
  63. if err == nil {
  64. t.Errorf("accepted invalid passphrase")
  65. }
  66. }
  67. func TestOragonoLegacyPassphrase(t *testing.T) {
  68. shivaramHash, err := base64.StdEncoding.DecodeString("ZPLKvCGipalUo9AlDIlMzAuY/ACWvM3yr1kh7k0/wa7lLlCwaPpe2ht9LNZZlZ9FPUWggUi7D4jyg2WnJDJhJDE0JDRsN0gwVmYvNHlyNjR1U212U2Q0YU9EVmRvWngwcXNGLkkyYVc4eUZISGxYaGE4SWVrRzRt")
  69. if err != nil {
  70. panic(err)
  71. }
  72. edHash, err := base64.StdEncoding.DecodeString("ZPLKvCGipalUo9AlDIlMzAuY/ACWvM3yr1kh7k0/+42q72mFnpDZWgjmqp1Zd77rEUO8ItYe4aGwWelUJDJhJDE0JHFqSGJ5NWVJbnJTdXBRT29pUmNUUWV5U2xmWjZETlRNcXlSMExUb2RmY3l1Skw2c3BTb3lh")
  73. if err != nil {
  74. panic(err)
  75. }
  76. err = CheckOragonoPassphraseV0(shivaramHash, []byte("shivarampassphrase"))
  77. if err != nil {
  78. t.Errorf("failed to check passphrase: %v", err)
  79. }
  80. err = CheckOragonoPassphraseV0(shivaramHash, []byte("edpassphrase"))
  81. if err == nil {
  82. t.Errorf("accepted invalid passphrase")
  83. }
  84. err = CheckOragonoPassphraseV0(edHash, []byte("edpassphrase"))
  85. if err != nil {
  86. t.Errorf("failed to check passphrase: %v", err)
  87. }
  88. err = CheckOragonoPassphraseV0(edHash, []byte("shivarampassphrase"))
  89. if err == nil {
  90. t.Errorf("accepted invalid passphrase")
  91. }
  92. }
  93. func TestAnopePassphraseRawSha1(t *testing.T) {
  94. var err error
  95. shivaramHash := []byte("sha1:49fffa5543f21dd6effe88a79633e4073e36a828")
  96. err = CheckAnopePassphrase(shivaramHash, []byte("shivarampassphrase"))
  97. if err != nil {
  98. t.Errorf("failed to check passphrase: %v", err)
  99. }
  100. err = CheckAnopePassphrase(shivaramHash, []byte("edpassphrase"))
  101. if err == nil {
  102. t.Errorf("accepted invalid passphrase")
  103. }
  104. edHash := []byte("sha1:ea44e256819de972c25fef0aa277396067d6024f")
  105. err = CheckAnopePassphrase(edHash, []byte("edpassphrase"))
  106. if err != nil {
  107. t.Errorf("failed to check passphrase: %v", err)
  108. }
  109. err = CheckAnopePassphrase(edHash, []byte("shivarampassphrase"))
  110. if err == nil {
  111. t.Errorf("accepted invalid passphrase")
  112. }
  113. }
  114. func TestAnopePassphraseRawMd5(t *testing.T) {
  115. var err error
  116. shivaramHash := []byte("md5:ce4bd864f37ffaa1b871aef22eea82ff")
  117. err = CheckAnopePassphrase(shivaramHash, []byte("shivarampassphrase"))
  118. if err != nil {
  119. t.Errorf("failed to check passphrase: %v", err)
  120. }
  121. err = CheckAnopePassphrase(shivaramHash, []byte("edpassphrase"))
  122. if err == nil {
  123. t.Errorf("accepted invalid passphrase")
  124. }
  125. edHash := []byte("md5:dbf8be80e8dccdd33915b482e4390426")
  126. err = CheckAnopePassphrase(edHash, []byte("edpassphrase"))
  127. if err != nil {
  128. t.Errorf("failed to check passphrase: %v", err)
  129. }
  130. err = CheckAnopePassphrase(edHash, []byte("shivarampassphrase"))
  131. if err == nil {
  132. t.Errorf("accepted invalid passphrase")
  133. }
  134. }
  135. func TestAnopePassphrasePlain(t *testing.T) {
  136. var err error
  137. // not actually a hash
  138. weirdHash := []byte("plain:YVxzMC1fMmZ+ZjM0OEAhN2FzZGYxNDJAIyFhZmE=")
  139. err = CheckAnopePassphrase(weirdHash, []byte("a\\s0-_2f~f348@!7asdf142@#!afa"))
  140. if err != nil {
  141. t.Errorf("failed to check passphrase: %v", err)
  142. }
  143. err = CheckAnopePassphrase(weirdHash, []byte("edpassphrase"))
  144. if err == nil {
  145. t.Errorf("accepted invalid passphrase")
  146. }
  147. }
  148. func TestAnopePassphraseBcrypt(t *testing.T) {
  149. var err error
  150. shivaramHash := []byte("bcrypt:$2a$10$UyNgHyniPukGf/3A6vzBx.VMNfej0h4WzATg4ahKW2H86a0QLcVIK")
  151. err = CheckAnopePassphrase(shivaramHash, []byte("shivarampassphrase"))
  152. if err != nil {
  153. t.Errorf("failed to check passphrase: %v", err)
  154. }
  155. err = CheckAnopePassphrase(shivaramHash, []byte("edpassphrase"))
  156. if err == nil {
  157. t.Errorf("accepted invalid passphrase")
  158. }
  159. }
  160. func TestAnopePassphraseEncSha256(t *testing.T) {
  161. var err error
  162. shivaramHash := []byte("sha256:ff337943c8c4219cd330a3075a699492e0f8b1a823bb76af0129f1f117ba0630:60250c3053f7b34e35576fc5063b8b396fe7b9ab416842117991a8e027aa72f6")
  163. err = CheckAnopePassphrase(shivaramHash, []byte("shivarampassphrase"))
  164. if err != nil {
  165. t.Errorf("failed to check passphrase: %v", err)
  166. }
  167. err = CheckAnopePassphrase(shivaramHash, []byte("edpassphrase"))
  168. if err == nil {
  169. t.Errorf("accepted invalid passphrase")
  170. }
  171. edHash := []byte("sha256:93a430c8c3c6917dc6e9a32ac1aba90bc5768265278a45b86eacd636fc723d8f:10ea72683a499c155d72cd3571cb80e5050280620f789a44492c0e0c7956942f")
  172. err = CheckAnopePassphrase(edHash, []byte("edpassphrase"))
  173. if err != nil {
  174. t.Errorf("failed to check passphrase: %v", err)
  175. }
  176. err = CheckAnopePassphrase(edHash, []byte("shivarampassphrase"))
  177. if err == nil {
  178. t.Errorf("accepted invalid passphrase")
  179. }
  180. weirdHash := []byte("sha256:06d11a06025354e37a7ddf48913a1c9831ffab47d04e4c22a89fd7835abcb6cc:3137788c2749da0419bc9df320991d2d72495c7065da4f39004fd21710601409")
  181. err = CheckAnopePassphrase(weirdHash, []byte("1Ss1GN4q-3e8SgIJblfQxw"))
  182. if err != nil {
  183. t.Errorf("failed to check passphrase: %v", err)
  184. }
  185. err = CheckAnopePassphrase(weirdHash, []byte("shivarampassphrase"))
  186. if err == nil {
  187. t.Errorf("accepted invalid passphrase")
  188. }
  189. }