@@ -16,7 +16,7 @@ public class MayoSigner
1616 implements MessageSigner
1717{
1818 private SecureRandom random ;
19- MayoParameters params ;
19+ private MayoParameters params ;
2020 private MayoPublicKeyParameters pubKey ;
2121 private MayoPrivateKeyParameters privKey ;
2222
@@ -57,6 +57,7 @@ public byte[] generateSignature(byte[] message)
5757 int v = params .getV ();
5858 int o = params .getO ();
5959 int n = params .getN ();
60+ int m = params .getM ();
6061 int vbytes = params .getVBytes ();
6162 int oBytes = params .getOBytes ();
6263 int saltBytes = params .getSaltBytes ();
@@ -66,16 +67,17 @@ public byte[] generateSignature(byte[] message)
6667 int digestBytes = params .getDigestBytes ();
6768 int skSeedBytes = params .getSkSeedBytes ();
6869 byte [] tenc = new byte [params .getMBytes ()];
69- byte [] t = new byte [params . getM () ];
70- byte [] y = new byte [params . getM () ];
70+ byte [] t = new byte [m ];
71+ byte [] y = new byte [m ];
7172 byte [] salt = new byte [saltBytes ];
7273 byte [] V = new byte [k * vbytes + params .getRBytes ()];
7374 byte [] Vdec = new byte [v * k ];
7475 int ok = k * o ;
75- byte [] A = new byte [((params .getM () + 7 ) / 8 * 8 ) * (ok + 1 )];
76- byte [] x = new byte [k * n ];
76+ int nk = k * n ;
77+ byte [] A = new byte [((m + 7 ) / 8 * 8 ) * (ok + 1 )];
78+ byte [] x = new byte [nk ];
7779 byte [] r = new byte [ok + 1 ];
78- byte [] s = new byte [k * n ];
80+ byte [] s = new byte [nk ];
7981 byte [] tmp = new byte [digestBytes + saltBytes + skSeedBytes + 1 ];
8082 byte [] sig = new byte [params .getSigBytes ()];
8183 long [] P = new long [p1Limbs + params .getP2Limbs ()];
@@ -121,9 +123,9 @@ public byte[] generateSignature(byte[] message)
121123 {
122124 // Multiply the m-vector at P1 for the current matrix entry,
123125 // and accumulate into acc for row r.
124- GF16Utils .mVecMulAdd (mVecLimbs , P , bsMatEntriesUsed , O [co + j ] & 0xFF , P , iomVecLimbs + jmVecLimbs );
126+ GF16Utils .mVecMulAdd (mVecLimbs , P , bsMatEntriesUsed , O [co + j ], P , iomVecLimbs + jmVecLimbs );
125127 // Similarly, accumulate into acc for row c.
126- GF16Utils .mVecMulAdd (mVecLimbs , P , bsMatEntriesUsed , O [io + j ] & 0xFF , P , comVecLimbs + jmVecLimbs );
128+ GF16Utils .mVecMulAdd (mVecLimbs , P , bsMatEntriesUsed , O [io + j ], P , comVecLimbs + jmVecLimbs );
127129 }
128130 bsMatEntriesUsed += mVecLimbs ;
129131 }
@@ -150,9 +152,10 @@ public byte[] generateSignature(byte[] message)
150152 System .arraycopy (salt , 0 , tmp , digestBytes , saltBytes );
151153 shake .update (tmp , 0 , digestBytes + saltBytes );
152154 shake .doFinal (tenc , 0 , params .getMBytes ());
153- Utils .decode (tenc , t , params . getM () );
155+ Utils .decode (tenc , t , m );
154156 int size = v * k * mVecLimbs ;
155157 long [] Pv = new long [size ];
158+ byte [] Ox = new byte [v ];
156159 for (int ctr = 0 ; ctr <= 255 ; ctr ++)
157160 {
158161 tmp [tmp .length - 1 ] = (byte )ctr ;
@@ -182,12 +185,12 @@ public byte[] generateSignature(byte[] message)
182185 computeA (Mtmp , A );
183186
184187 // Clear trailing bytes
185- // for (int i = 0; i < params.getM() ; ++i)
188+ // for (int i = 0; i < m ; ++i)
186189// {
187190// A[(i + 1) * (ok + 1) - 1] = 0;
188191// }
189192
190- Utils .decode (V , k * vbytes , r , 0 , ok );
193+ Utils .decode (V , k * vbytes , r , ok );
191194
192195 if (sampleSolution (params , A , y , r , x ))
193196 {
@@ -201,16 +204,16 @@ public byte[] generateSignature(byte[] message)
201204 }
202205
203206 // Compute final signature components
204- byte [] Ox = new byte [ v ];
205- for (int i = 0 ; i < k ; i ++)
207+
208+ for (int i = 0 , io = 0 , in = 0 , iv = 0 ; i < k ; i ++, io += o , in += n , iv += v )
206209 {
207- GF16Utils .matMul (O , x , i * o , Ox , o , n - o );
208- Bytes .xor (v , Vdec , i * v , Ox , s , i * n );
209- System .arraycopy (x , i * o , s , i * n + n - o , o );
210+ GF16Utils .matMul (O , x , io , Ox , o , v );
211+ Bytes .xor (v , Vdec , iv , Ox , s , in );
212+ System .arraycopy (x , io , s , in + v , o );
210213 }
211214
212215 // Encode and add salt
213- Utils .encode (s , sig , n * k );
216+ Utils .encode (s , sig , nk );
214217 System .arraycopy (salt , 0 , sig , sig .length - saltBytes , saltBytes );
215218
216219 return Arrays .concatenate (sig , message );
@@ -294,13 +297,12 @@ void computeRHS(long[] vPv, byte[] t, byte[] y)
294297 final int k = params .getK ();
295298 final int [] fTail = params .getFTail ();
296299
297- final int topPos = ((m - 1 ) & 15 ) * 4 ;
300+ final int topPos = ((m - 1 ) & 15 ) << 2 ;
298301
299302 // Zero out tails of m_vecs if necessary
300303 if ((m & 15 ) != 0 )
301304 {
302- long mask = 1L << ((m & 15 ) << 2 );
303- mask -= 1 ;
305+ long mask = (1L << ((m & 15 ) << 2 )) - 1 ;
304306 final int kSquared = k * k ;
305307
306308 for (int i = 0 , index = mVecLimbs - 1 ; i < kSquared ; i ++, index += mVecLimbs )
@@ -409,7 +411,7 @@ void computeA(long[] Mtmp, byte[] AOut)
409411 }
410412 }
411413
412- for (int i = 0 , io = 0 ; i < k ; i ++, io += o )
414+ for (int i = 0 , io = 0 , iomVecLimbs = 0 ; i < k ; i ++, io += o , iomVecLimbs += omVecLimbs )
413415 {
414416 for (int j = k - 1 , jomVecLimbs = j * omVecLimbs , jo = j * o ; j >= i ; j --, jomVecLimbs -= omVecLimbs , jo -= o )
415417 {
@@ -433,13 +435,11 @@ void computeA(long[] Mtmp, byte[] AOut)
433435 if (i != j )
434436 {
435437 // Process Mi
436- int miOffset = i * mVecLimbs * o ;
437438 for (int c = 0 , cmVecLimbs = 0 ; c < o ; c ++, cmVecLimbs += mVecLimbs )
438439 {
439440 for (int limb = 0 , limbAWidhth = 0 ; limb < mVecLimbs ; limb ++, limbAWidhth += AWidth )
440441 {
441- long value = Mtmp [miOffset + limb + cmVecLimbs ];
442-
442+ long value = Mtmp [iomVecLimbs + limb + cmVecLimbs ];
443443 int aIndex = jo + c + wordsToShift + limbAWidhth ;
444444 A [aIndex ] ^= value << bitsToShift ;
445445
@@ -461,7 +461,7 @@ void computeA(long[] Mtmp, byte[] AOut)
461461 }
462462
463463 // Transpose blocks
464- for (int c = 0 ; c < AWidth * ((m + (k + 1 ) * k / 2 + 15 ) >>> 4 ); c += 16 )
464+ for (int c = 0 ; c < AWidth * ((m + ((( k + 1 ) * k ) >> 1 ) + 15 ) >>> 4 ); c += 16 )
465465 {
466466 transpose16x16Nibbles (A , c );
467467 }
@@ -554,8 +554,7 @@ private static void transpose16x16Nibbles(long[] M, int offset)
554554 }
555555 }
556556
557- boolean sampleSolution (MayoParameters params , byte [] A , byte [] y ,
558- byte [] r , byte [] x )
557+ boolean sampleSolution (MayoParameters params , byte [] A , byte [] y , byte [] r , byte [] x )
559558 {
560559 final int k = params .getK ();
561560 final int o = params .getO ();
@@ -576,19 +575,19 @@ boolean sampleSolution(MayoParameters params, byte[] A, byte[] y,
576575 GF16Utils .matMul (A , r , 0 , Ar , ok + 1 , m );
577576
578577 // Update last column of A with y - Ar
579- for (int i = 0 ; i < m ; i ++)
578+ for (int i = 0 , idx = ok ; i < m ; i ++, idx += ok + 1 )
580579 {
581- A [ok + i * ( ok + 1 ) ] = (byte )(y [i ] ^ Ar [i ]);
580+ A [idx ] = (byte )(y [i ] ^ Ar [i ]);
582581 }
583582
584583 // Perform row echelon form transformation
585584 ef (A , m , aCols );
586585
587586 // Check matrix rank
588587 boolean fullRank = false ;
589- for (int i = 0 ; i < aCols - 1 ; i ++)
588+ for (int i = 0 , idx = ( m - 1 ) * aCols ; i < aCols - 1 ; i ++, idx ++)
590589 {
591- fullRank |= (A [( m - 1 ) * aCols + i ] != 0 );
590+ fullRank |= (A [idx ] != 0 );
592591 }
593592 if (!fullRank )
594593 {
@@ -609,7 +608,6 @@ boolean sampleSolution(MayoParameters params, byte[] A, byte[] y,
609608 byte u = (byte )(correctCol & ~finished & A [rowAcols + aCols - 1 ]);
610609 x [col ] ^= u ;
611610
612-
613611 // Update matrix entries
614612 for (int i = 0 , iaCols_col = col , iaCols_aCols1 = aCols - 1 ; i < row ; i += 8 ,
615613 iaCols_col += aCols << 3 , iaCols_aCols1 += aCols << 3 )
@@ -647,7 +645,7 @@ boolean sampleSolution(MayoParameters params, byte[] A, byte[] y,
647645 void ef (byte [] A , int nrows , int ncols )
648646 {
649647 // Each 64-bit long can hold 16 nibbles (16 GF(16) elements).
650- int rowLen = (ncols + 15 ) / 16 ;
648+ int rowLen = (ncols + 15 ) >> 4 ;
651649
652650 // Allocate temporary arrays.
653651 long [] pivotRow = new long [rowLen ];
@@ -686,11 +684,8 @@ void ef(byte[] A, int nrows, int ncols)
686684 int upperBound = Math .min (nrows - 1 , pivotCol );
687685
688686 // Zero out pivot row buffers.
689- for (int i = 0 ; i < rowLen ; i ++)
690- {
691- pivotRow [i ] = 0 ;
692- pivotRow2 [i ] = 0 ;
693- }
687+ Arrays .clear (pivotRow );
688+ Arrays .clear (pivotRow2 );
694689
695690 // Try to select a pivot row in constant time.
696691 int pivot = 0 ;
0 commit comments