-
Notifications
You must be signed in to change notification settings - Fork 116
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add sample code generator to assist with setup verification work flow
- Loading branch information
1 parent
6a04769
commit c120521
Showing
4 changed files
with
99 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
totp/src/main/java/dev/samstevens/totp/code/SampleCodeGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package dev.samstevens.totp.code; | ||
|
||
import dev.samstevens.totp.exceptions.CodeGenerationException; | ||
import dev.samstevens.totp.time.TimeProvider; | ||
|
||
public class SampleCodeGenerator { | ||
private final CodeGenerator codeGenerator; | ||
private final TimeProvider timeProvider; | ||
private int timePeriod = 30; | ||
private int allowedTimePeriodDiscrepancy = 1; | ||
|
||
public SampleCodeGenerator(final CodeGenerator codeGenerator, | ||
final TimeProvider timeProvider) { | ||
this.codeGenerator = codeGenerator; | ||
this.timeProvider = timeProvider; | ||
} | ||
|
||
public void setTimePeriod(int timePeriod) { | ||
this.timePeriod = timePeriod; | ||
} | ||
|
||
public void setAllowedTimePeriodDiscrepancy(int allowedTimePeriodDiscrepancy) { | ||
this.allowedTimePeriodDiscrepancy = allowedTimePeriodDiscrepancy; | ||
} | ||
|
||
/** | ||
* Generate sample codes based on the current time. | ||
*/ | ||
public String[] generateCodes(final String secret) throws CodeGenerationException { | ||
final String[] sampleCodes = new String[allowedTimePeriodDiscrepancy + allowedTimePeriodDiscrepancy + 1]; | ||
long currentBucket = Math.floorDiv(timeProvider.getTime(), timePeriod); | ||
|
||
for (int x = 0, i = -allowedTimePeriodDiscrepancy; i <= allowedTimePeriodDiscrepancy; i++, x++) { | ||
sampleCodes[x] = codeGenerator.generate(secret, currentBucket + i); | ||
} | ||
return sampleCodes; | ||
} | ||
} |
34 changes: 34 additions & 0 deletions
34
totp/src/test/java/dev/samstevens/totp/code/SampleCodeGeneratorTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package dev.samstevens.totp.code; | ||
|
||
import static org.junit.jupiter.api.Assertions.*; | ||
import org.junit.jupiter.api.Test; | ||
|
||
import dev.samstevens.totp.exceptions.CodeGenerationException; | ||
import dev.samstevens.totp.secret.DefaultSecretGenerator; | ||
import dev.samstevens.totp.time.SystemTimeProvider; | ||
import dev.samstevens.totp.time.TimeProvider; | ||
|
||
public class SampleCodeGeneratorTest { | ||
@Test | ||
public void testGenerateSampleCodes() throws CodeGenerationException { | ||
final DefaultSecretGenerator generator = new DefaultSecretGenerator(); | ||
final String secret = generator.generate(); | ||
|
||
final TimeProvider timeProvider = new SystemTimeProvider(); | ||
|
||
final SampleCodeGenerator sampleGenerator = new SampleCodeGenerator( | ||
new DefaultCodeGenerator(), timeProvider); | ||
sampleGenerator.setTimePeriod(30); | ||
sampleGenerator.setAllowedTimePeriodDiscrepancy(2); | ||
|
||
final DefaultCodeVerifier verifier = new DefaultCodeVerifier(new DefaultCodeGenerator(), timeProvider); | ||
verifier.setTimePeriod(30); | ||
verifier.setAllowedTimePeriodDiscrepancy(2); | ||
|
||
final String[] sampleCodes = sampleGenerator.generateCodes(secret); | ||
assertEquals(5, sampleCodes.length); | ||
for (String sampleCode: sampleCodes) { | ||
assertTrue(verifier.isValidCode(secret, sampleCode)); | ||
} | ||
} | ||
} |