Java vs.Golang para HOTP (rfc-4226)

Estoy tratando de implementar HOTP (rfc-4226) en Golang y estoy luchando para generar un HOTP válido. Puedo generarlo en Java, pero por alguna razón mi implementación en Golang es diferente. Aquí están las muestras:

public static String constructOTP(final Long counter, final String key)
        throws NoSuchAlgorithmException, DecoderException, InvalidKeyException {
    final Mac mac = Mac.getInstance("HmacSHA512");

    final byte[] binaryKey = Hex.decodeHex(key.toCharArray());

    mac.init(new SecretKeySpec(binaryKey, "HmacSHA512"));
    final byte[] b = ByteBuffer.allocate(8).putLong(counter).array();
    byte[] computedOtp = mac.doFinal(b);

    return new String(Hex.encodeHex(computedOtp));
}

y en Go:

func getOTP(counter uint64, key string) string {
    str, err := hex.DecodeString(key)
    if err != nil {
        panic(err)
    }
    h := hmac.New(sha512.New, str)
    bs := make([]byte, 8)
    binary.BigEndian.PutUint64(bs, counter)
    h.Write(bs)
    return base64.StdEncoding.EncodeToString(h.Sum(nil))
}

Creo que el problema es que la línea Java:ByteBuffer.allocate(8).putLong(counter).array(); genera una matriz de bytes diferente a la línea Go:binary.BigEndian.PutUint64(bs, counter).

En Java, se genera la siguiente matriz de bytes:83 -116 -9 -98 115 -126 -3 -48 y en Go:83 140 247 158 115 130 253 207.

¿Alguien sabe la diferencia en las dos líneas y cómo puedo portar la línea de Java para ir?

Respuestas a la pregunta(1)

Su respuesta a la pregunta