/**

* EdDSA-Java by str4d
*
* To the extent possible under law, the person who associated CC0 with
* EdDSA-Java has waived all copyright and related or neighboring rights
* to EdDSA-Java.
*
* You should have received a copy of the CC0 legalcode along with this
* work. If not, see <https://creativecommons.org/publicdomain/zero/1.0/>.
*
*/

package net.i2p.crypto.eddsa.math;

/**

* Common interface for all $(b-1)$-bit encodings of elements
* of EdDSA finite fields.
* @author str4d
*
*/

public abstract class Encoding {

protected Field f;

public synchronized void setField(Field f) {
    if (this.f != null)
        throw new IllegalStateException("already set");
    this.f = f;
}

/**
 * Encode a FieldElement in its $(b-1)$-bit encoding.
 * @param x the FieldElement to encode
 * @return the $(b-1)$-bit encoding of this FieldElement.
 */
public abstract byte[] encode(FieldElement x);

/**
 * Decode a FieldElement from its $(b-1)$-bit encoding.
 * The highest bit is masked out.
 * @param in the $(b-1)$-bit encoding of a FieldElement.
 * @return the FieldElement represented by 'val'.
 */
public abstract FieldElement decode(byte[] in);

/**
 * From the Ed25519 paper:<br>
 * $x$ is negative if the $(b-1)$-bit encoding of $x$ is lexicographically larger
 * than the $(b-1)$-bit encoding of -x. If $q$ is an odd prime and the encoding
 * is the little-endian representation of $\{0, 1,\dots, q-1\}$ then the negative
 * elements of $F_q$ are $\{1, 3, 5,\dots, q-2\}$.
 * @param x the FieldElement to check
 * @return true if negative
 */
public abstract boolean isNegative(FieldElement x);

}