jchambers / java-otp

A one-time password (HOTP/TOTP) library for Java
MIT License
455 stars 122 forks source link

NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer #25

Closed vitsin closed 3 years ago

vitsin commented 3 years ago

The following code as is from test ExampleApp.java returns error:

Exception in thread "main" java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;
    at com.eatthepath.otp.HmacOneTimePasswordGenerator.generateOneTimePassword(HmacOneTimePasswordGenerator.java:140)
    at com.eatthepath.otp.TimeBasedOneTimePasswordGenerator.generateOneTimePassword(TimeBasedOneTimePasswordGenerator.java:143)
    at com.eatthepath.otp.TimeBasedOneTimePasswordGenerator.generateOneTimePasswordString(TimeBasedOneTimePasswordGenerator.java:175)
    at com.eatthepath.otp.TimeBasedOneTimePasswordGenerator.generateOneTimePasswordString(TimeBasedOneTimePasswordGenerator.java:160)
    at simple.ExampleApp.main(ExampleApp.java:30)
package simple;

import javax.crypto.KeyGenerator;

import com.eatthepath.otp.TimeBasedOneTimePasswordGenerator;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;

public class ExampleApp {
    public static void main(final String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
        final TimeBasedOneTimePasswordGenerator totp = new TimeBasedOneTimePasswordGenerator();

        final Key key;
        {
            final KeyGenerator keyGenerator = KeyGenerator.getInstance(totp.getAlgorithm());

            // Key length should match the length of the HMAC output (160 bits for SHA-1, 256 bits
            // for SHA-256, and 512 bits for SHA-512).
            keyGenerator.init(160);

            key = keyGenerator.generateKey();
        }

        final Instant now = Instant.now();
        final Instant later = now.plus(totp.getTimeStep());

        System.out.println("Current password: " + totp.generateOneTimePasswordString(key, now));
        System.out.println("Future password:  " + totp.generateOneTimePasswordString(key, later));
    }
}
vitsin commented 3 years ago

Running on Java 1.8.0 u281

jchambers commented 3 years ago

I am unable to reproduce the problem and strongly, strongly suspect some kind of JVM. java.nio.ByteBuffer.clear() has been part of the JDK since Java 7.

I'm going to move this to a discussion because it appears to be a request for general support rather than a bug report or feature request.