11package net .i2p .crypto .eddsa ;
22
33import java .io .ByteArrayOutputStream ;
4- import java .math .BigInteger ;
54import java .nio .ByteBuffer ;
65import java .security .InvalidKeyException ;
76import java .security .MessageDigest ;
1312import java .util .Arrays ;
1413
1514import net .i2p .crypto .eddsa .math .Curve ;
16- import net .i2p .crypto .eddsa .math .FieldElement ;
1715import net .i2p .crypto .eddsa .math .GroupElement ;
18- import net .i2p .crypto .eddsa .math .LittleEndianEncoding ;
16+ import net .i2p .crypto .eddsa .math .ScalarOps ;
1917
2018/**
2119 * @author str4d
@@ -25,7 +23,6 @@ public class EdDSAEngine extends Signature {
2523 private MessageDigest digest ;
2624 private final ByteArrayOutputStream baos ;
2725 private EdDSAKey key ;
28- private static final LittleEndianEncoding leEnc = new LittleEndianEncoding ();
2926
3027 /**
3128 * No specific hash requested, allows any EdDSA key.
@@ -112,20 +109,16 @@ protected void engineUpdate(byte[] b, int off, int len)
112109 @ Override
113110 protected byte [] engineSign () throws SignatureException {
114111 Curve curve = key .getParams ().getCurve ();
115- BigInteger l = key .getParams ().getL ();
116- BigInteger a = ((EdDSAPrivateKey ) key ).geta ();
112+ ScalarOps sc = key .getParams ().getScalarOps ();
113+ byte [] a = ((EdDSAPrivateKey ) key ).geta ();
117114
118115 byte [] message = baos .toByteArray ();
119116 // r = H(h_b,...,h_2b-1,M)
120117 byte [] r = digest .digest (message );
121- // From the Ed25519 paper:
122- // Here we interpret 2b-bit strings in little-endian form as integers in
123- // {0, 1,..., 2^(2b)-1}.
124- BigInteger rBI = leEnc .decode (r );
125118
126119 // r mod l
127120 // Reduces r from 64 bytes to 32 bytes
128- r = leEnc . encode ( rBI . mod ( l ), curve . getField (). getb ()/ 8 );
121+ r = sc . reduce ( r );
129122
130123 // R = rB
131124 GroupElement R = key .getParams ().getB ().scalarMultiply (r );
@@ -134,12 +127,14 @@ protected byte[] engineSign() throws SignatureException {
134127 // S = (r + H(Rbar,Abar,M)*a) mod l
135128 digest .update (Rbyte );
136129 digest .update (((EdDSAPrivateKey ) key ).getAbyte ());
137- FieldElement S = curve .fromBigInteger (leEnc .decode (digest .digest (message )).multiply (a ).add (rBI ).mod (l ));
130+ byte [] h = digest .digest (message );
131+ h = sc .reduce (h );
132+ byte [] S = sc .multiplyAndAdd (h , a , r );
138133
139134 // R+S
140135 int b = curve .getField ().getb ();
141136 ByteBuffer out = ByteBuffer .allocate (b /4 );
142- out .put (Rbyte ).put (S . toByteArray () );
137+ out .put (Rbyte ).put (S );
143138 return out .array ();
144139 }
145140
@@ -158,7 +153,7 @@ protected boolean engineVerify(byte[] sigBytes) throws SignatureException {
158153 byte [] h = digest .digest (message );
159154
160155 // h mod l
161- h = leEnc . encode ( leEnc . decode ( h ). mod ( key .getParams ().getL ()), b / 8 );
156+ h = key .getParams ().getScalarOps (). reduce ( h );
162157
163158 byte [] Sbyte = Arrays .copyOfRange (sigBytes , b /8 , b /4 );
164159 // R = SB - H(Rbar,Abar,M)A
0 commit comments