public class Ed25519LittleEndianEncoding extends Encoding
Reviewed/commented by Bloody Rookie (nemproject@gmx.de)
Constructor and Description |
---|
Ed25519LittleEndianEncoding() |
Modifier and Type | Method and Description |
---|---|
FieldElement |
decode(byte[] in)
Decodes a given field element in its 10 byte $2^{25.5}$ representation.
|
byte[] |
encode(FieldElement x)
Encodes a given field element in its 32 byte representation.
|
boolean |
isNegative(FieldElement x)
Is the FieldElement negative in this encoding?
|
public byte[] encode(FieldElement x)
The idea for the modulo $p$ reduction algorithm is as follows:
Then $q = [2^{-255} * (h + 19 * 2^{-25} * h_9 + 1/2)]$ where $[x] = floor(x)$.
We begin with some very raw estimation for the bounds of some expressions:
$$ \begin{equation} |h| \lt 2^{230} * 2^{30} = 2^{260} \Rightarrow |r + q * p| \lt 2^{260} \Rightarrow |q| \lt 2^{10}. \\ \Rightarrow -1/4 \le a := 19^2 * 2^{-255} * q \lt 1/4. \\ |h - 2^{230} * h_9| = |h_0 + \dots + 2^{204} * h_8| \lt 2^{204} * 2^{30} = 2^{234}. \\ \Rightarrow -1/4 \le b := 19 * 2^{-255} * (h - 2^{230} * h_9) \lt 1/4 \end{equation} $$
Therefore $0 \lt 1/2 - a - b \lt 1$.
Set $x := r + 19 * 2^{-255} * r + 1/2 - a - b$. Then:
$$ 0 \le x \lt 255 - 20 + 19 + 1 = 2^{255} \\ \Rightarrow 0 \le 2^{-255} * x \lt 1. $$
Since $q$ is an integer we have
$$ [q + 2^{-255} * x] = q \quad (1) $$
Have a closer look at $x$:
$$ \begin{align} x &= h - q * (2^{255} - 19) + 19 * 2^{-255} * (h - q * (2^{255} - 19)) + 1/2 - 19^2 * 2^{-255} * q - 19 * 2^{-255} * (h - 2^{230} * h_9) \\ &= h - q * 2^{255} + 19 * q + 19 * 2^{-255} * h - 19 * q + 19^2 * 2^{-255} * q + 1/2 - 19^2 * 2^{-255} * q - 19 * 2^{-255} * h + 19 * 2^{-25} * h_9 \\ &= h + 19 * 2^{-25} * h_9 + 1/2 - q^{255}. \end{align} $$
Inserting the expression for $x$ into $(1)$ we get the desired expression for $q$.
public FieldElement decode(byte[] in)
public boolean isNegative(FieldElement x)
Return true if $x$ is in $\{1,3,5,\dots,q-2\}$
Return false if $x$ is in $\{0,2,4,\dots,q-1\}$
Preconditions:
isNegative
in class Encoding
x
- the FieldElement to checkCopyright © 2019. All rights reserved.