@@ -181,7 +181,16 @@ impl Generator {
181
181
182
182
struct Secret {
183
183
value : [ u8 ; 32 ] ,
184
- birth : Instant ,
184
+ birth : Option < Instant > ,
185
+ }
186
+
187
+ impl Secret {
188
+ fn is_still_valid ( & self ) -> bool {
189
+ match self . birth {
190
+ Some ( birth) => birth. elapsed ( ) < COOKIE_UPDATE_INTERVAL ,
191
+ None => false ,
192
+ }
193
+ }
185
194
}
186
195
187
196
pub struct Validator {
@@ -197,14 +206,15 @@ impl Validator {
197
206
cookie_key : HASH ! ( LABEL_COOKIE , pk. as_bytes( ) ) . into ( ) ,
198
207
secret : RwLock :: new ( Secret {
199
208
value : [ 0u8 ; SIZE_SECRET ] ,
200
- birth : Instant :: now ( ) - Duration :: new ( 86400 , 0 ) ,
209
+ birth : None ,
201
210
} ) ,
202
211
}
203
212
}
204
213
205
214
fn get_tau ( & self , src : & [ u8 ] ) -> Option < [ u8 ; SIZE_COOKIE ] > {
206
215
let secret = self . secret . read ( ) ;
207
- if secret. birth . elapsed ( ) < COOKIE_UPDATE_INTERVAL {
216
+ if secret. is_still_valid ( )
217
+ {
208
218
Some ( MAC ! ( & secret. value, src) )
209
219
} else {
210
220
None
@@ -215,21 +225,21 @@ impl Validator {
215
225
// check if current value is still valid
216
226
{
217
227
let secret = self . secret . read ( ) ;
218
- if secret. birth . elapsed ( ) < COOKIE_UPDATE_INTERVAL {
228
+ if secret. is_still_valid ( ) {
219
229
return MAC ! ( & secret. value, src) ;
220
230
} ;
221
231
}
222
232
223
233
// take write lock, check again
224
234
{
225
235
let mut secret = self . secret . write ( ) ;
226
- if secret. birth . elapsed ( ) < COOKIE_UPDATE_INTERVAL {
236
+ if secret. is_still_valid ( ) {
227
237
return MAC ! ( & secret. value, src) ;
228
238
} ;
229
239
230
240
// set new random cookie secret
231
241
rng. fill_bytes ( & mut secret. value ) ;
232
- secret. birth = Instant :: now ( ) ;
242
+ secret. birth = Some ( Instant :: now ( ) ) ;
233
243
MAC ! ( & secret. value, src)
234
244
}
235
245
}
0 commit comments