From 9a47d1320e070ee77e05070632a0521859ed94f4 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Mon, 17 Aug 2026 16:32:15 -0400 Subject: [PATCH] Use a more "constant-time" approach for validating one-time passwords --- .../java/com/eatthepath/otp/HmacOneTimePasswordGenerator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/eatthepath/otp/HmacOneTimePasswordGenerator.java b/src/main/java/com/eatthepath/otp/HmacOneTimePasswordGenerator.java index 94d2635..16abf3d 100644 --- a/src/main/java/com/eatthepath/otp/HmacOneTimePasswordGenerator.java +++ b/src/main/java/com/eatthepath/otp/HmacOneTimePasswordGenerator.java @@ -275,7 +275,9 @@ public boolean validateOneTimePassword(final SecretKey key, final long counter, * @see HOTP: An HMAC-Based One-Time Password Algorithm (RFC 4226) - Security Requirements */ public boolean validateOneTimePassword(final SecretKey key, final long counter, final int oneTimePassword) throws InvalidKeyException { - return generateOneTimePassword(key, counter) == oneTimePassword; + // This looks a little goofy, but the idea is to ward off any CPU-specific optimizations that might make + // direct integer comparison a not-constant-time operation + return (generateOneTimePassword(key, counter) ^ oneTimePassword) == 0; } /**