Make the Google Authenticator Protobuf parser more complete

I don't think Google Authenticator actually currently supports any of these
extra digit/algorithm options, but they're specified in the proto file, so we
should support them for completeness sake.
This commit is contained in:
Alexander Bakker 2020-12-07 21:24:28 +01:00
parent 735c086726
commit 6a5323b12b
2 changed files with 52 additions and 10 deletions

View file

@ -216,13 +216,46 @@ public class GoogleAuthInfo implements Serializable {
for (GoogleAuthProtos.MigrationPayload.OtpParameters params : payload.getOtpParametersList()) { for (GoogleAuthProtos.MigrationPayload.OtpParameters params : payload.getOtpParametersList()) {
OtpInfo otp; OtpInfo otp;
try { try {
int digits;
switch (params.getDigits()) {
case DIGIT_COUNT_UNSPECIFIED:
// intentional fallthrough
case DIGIT_COUNT_SIX:
digits = 6;
break;
case DIGIT_COUNT_EIGHT:
digits = 8;
break;
default:
throw new GoogleAuthInfoException(String.format("Unsupported digits: %d", params.getDigits().ordinal()));
}
String algo;
switch (params.getAlgorithm()) {
case ALGORITHM_UNSPECIFIED:
// intentional fallthrough
case ALGORITHM_SHA1:
algo = "SHA1";
break;
case ALGORITHM_SHA256:
algo = "SHA256";
break;
case ALGORITHM_SHA512:
algo = "SHA512";
break;
default:
throw new GoogleAuthInfoException(String.format("Unsupported hash algorithm: %d", params.getAlgorithm().ordinal()));
}
byte[] secret = params.getSecret().toByteArray(); byte[] secret = params.getSecret().toByteArray();
switch (params.getType()) { switch (params.getType()) {
case OTP_HOTP: case OTP_TYPE_UNSPECIFIED:
otp = new HotpInfo(secret, params.getCounter()); // intentional fallthrough
case OTP_TYPE_TOTP:
otp = new TotpInfo(secret, algo, digits, 30);
break; break;
case OTP_TOTP: case OTP_TYPE_HOTP:
otp = new TotpInfo(secret); otp = new HotpInfo(secret, algo, digits, params.getCounter());
break; break;
default: default:
throw new GoogleAuthInfoException(String.format("Unsupported algorithm: %d", params.getType().ordinal())); throw new GoogleAuthInfoException(String.format("Unsupported algorithm: %d", params.getType().ordinal()));

View file

@ -5,14 +5,23 @@ option java_outer_classname = "GoogleAuthProtos";
message MigrationPayload { message MigrationPayload {
enum Algorithm { enum Algorithm {
ALGO_INVALID = 0; ALGORITHM_UNSPECIFIED = 0;
ALGO_SHA1 = 1; ALGORITHM_SHA1 = 1;
ALGORITHM_SHA256 = 2;
ALGORITHM_SHA512 = 3;
ALGORITHM_MD5 = 4;
}
enum DigitCount {
DIGIT_COUNT_UNSPECIFIED = 0;
DIGIT_COUNT_SIX = 1;
DIGIT_COUNT_EIGHT = 2;
} }
enum OtpType { enum OtpType {
OTP_INVALID = 0; OTP_TYPE_UNSPECIFIED = 0;
OTP_HOTP = 1; OTP_TYPE_HOTP = 1;
OTP_TOTP = 2; OTP_TYPE_TOTP = 2;
} }
message OtpParameters { message OtpParameters {
@ -20,7 +29,7 @@ message MigrationPayload {
string name = 2; string name = 2;
string issuer = 3; string issuer = 3;
Algorithm algorithm = 4; Algorithm algorithm = 4;
int32 digits = 5; DigitCount digits = 5;
OtpType type = 6; OtpType type = 6;
int64 counter = 7; int64 counter = 7;
} }