@@ -8,13 +8,29 @@ namespace ScottBrady91.AspNetCore.Identity.BCryptPasswordHasher.Tests
8
8
{
9
9
public class BCryptPasswordHasherTests
10
10
{
11
+ private BCryptPasswordHasherOptions options = new BCryptPasswordHasherOptions ( ) ;
12
+
13
+ private BCryptPasswordHasher < string > CreateSut ( ) =>
14
+ new BCryptPasswordHasher < string > (
15
+ options != null ? new OptionsWrapper < BCryptPasswordHasherOptions > ( options ) : null ) ;
16
+
17
+ [ Theory ]
18
+ [ InlineData ( null ) ]
19
+ [ InlineData ( "" ) ]
20
+ [ InlineData ( " " ) ]
21
+ public void HashPassword_WhenPasswordIsNullOrWhitespace_ExpectArgumentNullException ( string password )
22
+ {
23
+ var sut = CreateSut ( ) ;
24
+ Assert . Throws < ArgumentNullException > ( ( ) => sut . HashPassword ( null , password ) ) ;
25
+ }
26
+
11
27
[ Fact ]
12
28
public void HashPassword_WithDefaultSettings_ExpectVerifiableHash ( )
13
29
{
14
30
var password = Guid . NewGuid ( ) . ToString ( ) ;
15
31
16
- var hasher = new BCryptPasswordHasher < string > ( ) ;
17
- var hashedPassword = hasher . HashPassword ( "" , password ) ;
32
+ var sut = CreateSut ( ) ;
33
+ var hashedPassword = sut . HashPassword ( "" , password ) ;
18
34
19
35
BCrypt . Net . BCrypt . Verify ( password , hashedPassword ) . Should ( ) . BeTrue ( ) ;
20
36
}
@@ -24,9 +40,9 @@ public void HashPassword_WhenCalledMultipleTimesWithSamePlaintext_ExpectDifferen
24
40
{
25
41
var password = Guid . NewGuid ( ) . ToString ( ) ;
26
42
27
- var hasher = new BCryptPasswordHasher < string > ( ) ;
28
- var hashedPassword1 = hasher . HashPassword ( "" , password ) ;
29
- var hashedPassword2 = hasher . HashPassword ( "" , password ) ;
43
+ var sut = CreateSut ( ) ;
44
+ var hashedPassword1 = sut . HashPassword ( "" , password ) ;
45
+ var hashedPassword2 = sut . HashPassword ( "" , password ) ;
30
46
31
47
hashedPassword1 . Should ( ) . NotBe ( hashedPassword2 ) ;
32
48
}
@@ -37,10 +53,10 @@ public void HashPassword_WithCustomWorkFactor_ExpectVerifiableHash()
37
53
var random = new Random ( ) ;
38
54
var password = Guid . NewGuid ( ) . ToString ( ) ;
39
55
40
- var hasher = new BCryptPasswordHasher < string > (
41
- new OptionsWrapper < BCryptPasswordHasherOptions > (
42
- new BCryptPasswordHasherOptions { WorkFactor = random . Next ( 8 , 18 ) } ) ) ;
43
- var hashedPassword = hasher . HashPassword ( "" , password ) ;
56
+ options . WorkFactor = options . WorkFactor - 1 ;
57
+ var sut = CreateSut ( ) ;
58
+
59
+ var hashedPassword = sut . HashPassword ( "" , password ) ;
44
60
45
61
BCrypt . Net . BCrypt . Verify ( password , hashedPassword ) . Should ( ) . BeTrue ( ) ;
46
62
}
@@ -50,11 +66,10 @@ public void HashPassword_WithEnhancedEntropy_ExpectHashNotToVerify()
50
66
{
51
67
var password = Guid . NewGuid ( ) . ToString ( ) ;
52
68
53
- var hasher = new BCryptPasswordHasher < string > (
54
- new OptionsWrapper < BCryptPasswordHasherOptions > (
55
- new BCryptPasswordHasherOptions { EnhancedEntropy = true } ) ) ;
69
+ options . EnhancedEntropy = true ;
70
+ var sut = CreateSut ( ) ;
56
71
57
- var hashedPassword = hasher . HashPassword ( "" , password ) ;
72
+ var hashedPassword = sut . HashPassword ( "" , password ) ;
58
73
59
74
BCrypt . Net . BCrypt . Verify ( password , hashedPassword , true ) . Should ( ) . BeTrue ( ) ;
60
75
BCrypt . Net . BCrypt . EnhancedVerify ( password , hashedPassword ) . Should ( ) . BeTrue ( ) ;
@@ -65,49 +80,68 @@ public void HashPassword_WithPasswordCreatedWithoutEnhancedEntropyButVerifiedWit
65
80
{
66
81
var password = Guid . NewGuid ( ) . ToString ( ) ;
67
82
68
- var hasher = new BCryptPasswordHasher < string > (
69
- new OptionsWrapper < BCryptPasswordHasherOptions > (
70
- new BCryptPasswordHasherOptions { EnhancedEntropy = false } ) ) ;
83
+ options . EnhancedEntropy = false ;
84
+ var sut = CreateSut ( ) ;
71
85
72
- var hashedPassword = hasher . HashPassword ( "" , password ) ;
86
+ var hashedPassword = sut . HashPassword ( "" , password ) ;
73
87
74
88
BCrypt . Net . BCrypt . Verify ( password , hashedPassword , true ) . Should ( ) . BeFalse ( ) ;
75
89
BCrypt . Net . BCrypt . EnhancedVerify ( password , hashedPassword ) . Should ( ) . BeFalse ( ) ;
76
90
}
91
+
92
+ [ Theory ]
93
+ [ InlineData ( null ) ]
94
+ [ InlineData ( "" ) ]
95
+ [ InlineData ( " " ) ]
96
+ public void VerifyHashedPassword_WhenHashedPasswordIsNullOrWhitespace_ExpectArgumentNullException ( string hashedPassword )
97
+ {
98
+ var sut = CreateSut ( ) ;
99
+ Assert . Throws < ArgumentNullException > ( ( ) => sut . VerifyHashedPassword ( null , hashedPassword , Guid . NewGuid ( ) . ToString ( ) ) ) ;
100
+ }
101
+
102
+ [ Theory ]
103
+ [ InlineData ( null ) ]
104
+ [ InlineData ( "" ) ]
105
+ [ InlineData ( " " ) ]
106
+ public void VerifyHashedPassword_WhenPasswordIsNullOrWhitespace_ExpectArgumentNullException ( string password )
107
+ {
108
+ var sut = CreateSut ( ) ;
109
+ Assert . Throws < ArgumentNullException > ( ( ) => sut . VerifyHashedPassword ( null , Guid . NewGuid ( ) . ToString ( ) , password ) ) ;
110
+ }
77
111
78
112
[ Fact ]
79
113
public void VerifyHashedPassword_WithDefaultSettings_ExpectSuccess ( )
80
114
{
81
115
var password = Guid . NewGuid ( ) . ToString ( ) ;
82
116
var hashedPassword = BCrypt . Net . BCrypt . HashPassword ( password ) ;
83
117
84
- var hasher = new BCryptPasswordHasher < string > ( ) ;
118
+ var sut = CreateSut ( ) ;
85
119
86
- hasher . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Success ) ;
120
+ sut . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Success ) ;
87
121
}
88
122
89
123
[ Fact ]
90
124
public void VerifyHashedPassword_WithEnhancedEntropy_ExpectSuccess ( )
91
125
{
92
- var options = new BCryptPasswordHasherOptions { EnhancedEntropy = true } ;
93
126
var password = Guid . NewGuid ( ) . ToString ( ) ;
94
127
var hashedPassword = BCrypt . Net . BCrypt . HashPassword ( password , options . WorkFactor , true ) ;
95
128
96
- var hasher = new BCryptPasswordHasher < string > ( new OptionsWrapper < BCryptPasswordHasherOptions > ( options ) ) ;
129
+ options . EnhancedEntropy = true ;
130
+ var sut = CreateSut ( ) ;
97
131
98
- hasher . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Success ) ;
132
+ sut . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Success ) ;
99
133
}
100
134
101
135
[ Fact ]
102
136
public void VerifyHashedPassword_WhenPasswordCreatedWithEnhancedEntropyButVerifiedWithout_ExpectFailure ( )
103
137
{
104
- var options = new BCryptPasswordHasherOptions { EnhancedEntropy = true } ;
105
138
var password = Guid . NewGuid ( ) . ToString ( ) ;
106
- var hashedPassword = BCrypt . Net . BCrypt . HashPassword ( password , options . WorkFactor ) ;
139
+ var hashedPassword = BCrypt . Net . BCrypt . HashPassword ( password , options . WorkFactor , false ) ;
107
140
108
- var hasher = new BCryptPasswordHasher < string > ( new OptionsWrapper < BCryptPasswordHasherOptions > ( options ) ) ;
141
+ options . EnhancedEntropy = true ;
142
+ var sut = CreateSut ( ) ;
109
143
110
- hasher . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Failed ) ;
144
+ sut . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Failed ) ;
111
145
}
112
146
113
147
[ Fact ]
@@ -116,20 +150,32 @@ public void VerifyHashedPassword_WhenSuppliedPasswordDoesNotMatch_ExpectFailure(
116
150
var password = Guid . NewGuid ( ) . ToString ( ) ;
117
151
var hashedPassword = BCrypt . Net . BCrypt . HashPassword ( Guid . NewGuid ( ) . ToString ( ) ) ;
118
152
119
- var hasher = new BCryptPasswordHasher < string > ( ) ;
153
+ var sut = CreateSut ( ) ;
120
154
121
- hasher . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Failed ) ;
155
+ sut . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Failed ) ;
122
156
}
123
157
124
158
[ Fact ]
125
- public void VerifyHashedPassword_WhenCorrectV10Password_ExpectSuccess ( )
159
+ public void VerifyHashedPassword_WhenCorrectV10Password_ExpectSuccessRehashNeeded ( )
126
160
{
127
161
const string password = "6@JM}T-3DeZo&2i=U73A^nEY7tXe_3UC%RR" ;
128
162
const string hashedPassword = "$2a$10$SpIhzEv3ATLa0CmTz4L7ouAn/w5NyedFic5X3fKaI9eu0xhW97OUC" ;
129
163
130
- var hasher = new BCryptPasswordHasher < string > ( ) ;
164
+ var sut = CreateSut ( ) ;
165
+
166
+ sut . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . SuccessRehashNeeded ) ;
167
+ }
168
+
169
+ [ Fact ]
170
+ public void VerifyHashedPassword_WhenPasswordHashedWithLowerEntropy_ExpectSuccessRehashNeeded ( )
171
+ {
172
+ var password = Guid . NewGuid ( ) . ToString ( ) ;
173
+ var hashedPassword = BCrypt . Net . BCrypt . HashPassword ( password , 10 ) ;
174
+
175
+ options . WorkFactor = 11 ;
176
+ var sut = CreateSut ( ) ;
131
177
132
- hasher . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . Success ) ;
178
+ sut . VerifyHashedPassword ( "" , hashedPassword , password ) . Should ( ) . Be ( PasswordVerificationResult . SuccessRehashNeeded ) ;
133
179
}
134
180
}
135
181
}
0 commit comments