1010class SABEREngine
1111{
1212 // constant parameters
13- public static final int SABER_EQ = 13 ;
1413 public static final int SABER_EP = 10 ;
1514 public static final int SABER_N = 256 ;
1615
@@ -26,6 +25,8 @@ class SABEREngine
2625 private final int SABER_ET ;
2726
2827 private final int SABER_POLYCOINBYTES ;
28+ private final int SABER_EQ ;
29+
2930 private final int SABER_POLYBYTES ;
3031 private final int SABER_POLYVECBYTES ;
3132 private final int SABER_POLYCOMPRESSEDBYTES ;
@@ -106,7 +107,6 @@ public Utils getUtils()
106107
107108 public int getSessionKeySize ()
108109 {
109- // return SABER_KEYBYTES;
110110 return defaultKeySize / 8 ;
111111 }
112112 public int getCipherTextSize ()
@@ -122,9 +122,16 @@ public int getPrivateKeySize()
122122 return SABER_SECRETKEYBYTES ;
123123 }
124124
125- public SABEREngine (int l , int defaultKeySize )
125+ private final boolean usingAES ;
126+ protected final boolean usingEffectiveMasking ;
127+
128+ protected final Symmetric symmetric ;
129+
130+ public SABEREngine (int l , int defaultKeySize , boolean usingAES , boolean usingEffectiveMasking )
126131 {
127132 this .defaultKeySize = defaultKeySize ;
133+ this .usingAES = usingAES ;
134+ this .usingEffectiveMasking = usingEffectiveMasking ;
128135
129136 this .SABER_L = l ;
130137 if (l == 2 )
@@ -142,7 +149,27 @@ else if(l == 3)
142149 this .SABER_MU = 6 ;
143150 this .SABER_ET = 6 ;
144151 }
145- this .SABER_POLYCOINBYTES = (SABER_MU * SABER_N / 8 );
152+
153+ if (usingAES )
154+ {
155+ symmetric = new Symmetric .AesSymmetric ();
156+ }
157+ else
158+ {
159+ symmetric = new Symmetric .ShakeSymmetric ();
160+ }
161+
162+ if (usingEffectiveMasking )
163+ {
164+ this .SABER_EQ = 12 ;
165+ this .SABER_POLYCOINBYTES = (2 * SABER_N / 8 );
166+ }
167+ else
168+ {
169+ this .SABER_EQ = 13 ;
170+ this .SABER_POLYCOINBYTES = (SABER_MU * SABER_N / 8 );
171+ }
172+
146173 this .SABER_POLYBYTES = (SABER_EQ * SABER_N / 8 );
147174 this .SABER_POLYVECBYTES = (SABER_L * SABER_POLYBYTES );
148175 this .SABER_POLYCOMPRESSEDBYTES = (SABER_EP * SABER_N / 8 );
@@ -172,9 +199,7 @@ private void indcpa_kem_keypair(byte[] pk, byte[] sk, SecureRandom random)
172199
173200 random .nextBytes (seed_A );
174201
175- Xof digest = new SHAKEDigest (128 );
176- digest .update (seed_A , 0 , SABER_SEEDBYTES );
177- digest .doFinal (seed_A , 0 , SABER_SEEDBYTES );
202+ symmetric .prf (seed_A , seed_A , SABER_SEEDBYTES , SABER_SEEDBYTES );
178203
179204 random .nextBytes (seed_s );
180205
@@ -203,12 +228,12 @@ public int crypto_kem_keypair(byte[] pk, byte[]sk, SecureRandom random)
203228 int i ;
204229 indcpa_kem_keypair (pk , sk , random ); // sk[0:SABER_INDCPA_SECRETKEYBYTES-1] <-- sk
205230 for (i = 0 ; i < SABER_INDCPA_PUBLICKEYBYTES ; i ++)
231+ {
206232 sk [i + SABER_INDCPA_SECRETKEYBYTES ] = pk [i ]; // sk[SABER_INDCPA_SECRETKEYBYTES:SABER_INDCPA_SECRETKEYBYTES+SABER_INDCPA_SECRETKEYBYTES-1] <-- pk
233+ }
207234
208235 // Then hash(pk) is appended.
209- SHA3Digest digest = new SHA3Digest (256 );
210- digest .update (pk , 0 , SABER_INDCPA_PUBLICKEYBYTES );
211- digest .doFinal (sk , SABER_SECRETKEYBYTES - 64 );
236+ symmetric .hash_h (sk , pk , SABER_SECRETKEYBYTES - 64 );
212237
213238 // Remaining part of sk contains a pseudo-random number.
214239 byte [] nonce = new byte [SABER_KEYBYTES ];
@@ -265,40 +290,30 @@ public int crypto_kem_enc(byte[] c, byte[] k, byte[] pk, SecureRandom random)
265290 byte [] nonce = new byte [32 ];
266291 random .nextBytes (nonce );
267292
268- SHA3Digest digest_256 = new SHA3Digest (256 );
269- SHA3Digest digest_512 = new SHA3Digest (512 );
270-
271293 // BUF[0:31] <-- random message (will be used as the key for client) Note: hash doesnot release system RNG output
272- digest_256 .update (nonce , 0 , 32 );
273- digest_256 .doFinal (nonce , 0 );
294+ symmetric .hash_h (nonce , nonce , 0 );
274295 System .arraycopy (nonce , 0 , buf , 0 , 32 );
275296
276297 // BUF[32:63] <-- Hash(public key); Multitarget countermeasure for coins + contributory KEM
277- digest_256 .update (pk , 0 , SABER_INDCPA_PUBLICKEYBYTES );
278- digest_256 .doFinal (buf , 32 );
298+ symmetric .hash_h (buf , pk , 32 );
279299
280300 // kr[0:63] <-- Hash(buf[0:63]);
281- digest_512 .update (buf , 0 , 64 );
282- digest_512 .doFinal (kr , 0 );
301+ symmetric .hash_g (kr , buf );
283302
284303 // K^ <-- kr[0:31]
285304 // noiseseed (r) <-- kr[32:63];
286305 // buf[0:31] contains message; kr[32:63] contains randomness r;
287306 indcpa_kem_enc (buf , Arrays .copyOfRange (kr , 32 , kr .length ), pk , c );
288307
289- digest_256 .update (c , 0 , SABER_BYTES_CCA_DEC );
290- digest_256 .doFinal (kr , 32 );
308+ symmetric .hash_h (kr , c , 32 );
291309
292310 // hash concatenation of pre-k and h(c) to k
293311 //todo support 128 and 192 bit keys
294312 byte [] temp_k = new byte [32 ];
295- digest_256 .update (kr , 0 , 64 );
296- digest_256 .doFinal (temp_k , 0 );
297313
314+ symmetric .hash_h (temp_k , kr , 0 );
298315 System .arraycopy (temp_k ,0 , k , 0 , defaultKeySize /8 );
299316
300-
301-
302317 return 0 ;
303318 }
304319
@@ -335,31 +350,27 @@ public int crypto_kem_dec(byte[] k, byte[] c, byte[] sk)
335350
336351 // Multitarget countermeasure for coins + contributory KEM
337352 for (i = 0 ; i < 32 ; i ++) // Save hash by storing h(pk) in sk
353+ {
338354 buf [32 + i ] = sk [SABER_SECRETKEYBYTES - 64 + i ];
355+ }
339356
340-
341- SHA3Digest digest_256 = new SHA3Digest (256 );
342- SHA3Digest digest_512 = new SHA3Digest (512 );
343-
344- digest_512 .update (buf , 0 , 64 );
345- digest_512 .doFinal (kr , 0 );
357+ symmetric .hash_g (kr , buf );
346358
347359 indcpa_kem_enc (buf , Arrays .copyOfRange (kr , 32 , kr .length ), pk , cmp );
348360
349361 fail = verify (c , cmp , SABER_BYTES_CCA_DEC );
350362
351363 // overwrite coins in kr with h(c)
352364
353- digest_256 .update (c , 0 , SABER_BYTES_CCA_DEC );
354- digest_256 .doFinal (kr , 32 );
365+ symmetric .hash_h (kr , c , 32 );
355366
356367 cmov (kr , sk , SABER_SECRETKEYBYTES - SABER_KEYBYTES , SABER_KEYBYTES , (byte ) fail );
357368
358369 // hash concatenation of pre-k and h(c) to k
359370 //todo support 128 and 192 bit keys
360371 byte [] temp_k = new byte [32 ];
361- digest_256 . update ( kr , 0 , 64 );
362- digest_256 . doFinal (temp_k , 0 );
372+
373+ symmetric . hash_h (temp_k , kr , 0 );
363374
364375 System .arraycopy (temp_k ,0 , k , 0 , defaultKeySize /8 );
365376 return 0 ;
0 commit comments