RFC4226 реализация Java-приложения HOTP

Я попытался скопировать коды HOTPAlgorithm.java(HOTPAlgorithm.java) и сравнил его с официальной реализацией образца HOTP RFC 4226 (RFC4226 Page 27), найденный на стр. 27 официального документа RFC4226. И HOTPAlgorithm.java, и реализация в RFC4226 написаны тем же автором, который является Лорен Харт и установлен в версию 1.0. Оба кода являются одними и теми же эссенциально из моего сравнения.

Я попытался запустить тестовый вектор для 6-значных кодов HOTP (без изменения HOTPAlgorithm.java script) и заметил, что исходные коды, приведенные в RFC4226 и HOTPAlgorithm.java, вызывают разные результаты тестового вектора по опубликованным результатам RFC4226 с точно такой же настройкой.

Есть ли несоответствие в кодах Java, опубликованных RFC4226 примерами кодов Java и HOTPAlogrithm.java при сравнении с тестовыми векторами RFC4226?

Результаты тестов с кодов Java HOTPAlgorithm.java и RFC4226 (оба дают одинаковые результаты):

755224
030356
132975
957805
463120
994243
844697
570244
487336
025740

Тест-векторы из публикации RFC4226 (RFC4226 Page 32)

755224
287082
359152
969429
338314
254676
287922
162583
399871
520489

Я что-то упустил или есть расхождения между официально опубликованными образцовыми кодами и официально опубликованными результатами?

Ответ 1

Измените

int otp = binary % DIGITS_POWER[codeDigits];

Для

int otp = (int) (binary % Math.pow(10, codeDigits));

или

int otp = binary % 1000000;

Ответ 2

Изменение в Math.pow() не имело никакого значения, но я думаю, что вы можете сделать вызов generateOTP() с 0 в качестве значения параметра truncationOffset. Попытка этого с -1 дает эталонные тестовые векторы.