@@ -3806,8 +3806,8 @@ class StubGenerator: public StubCodeGenerator {
38063806 //
38073807 // Inputs:
38083808 // c_rarg0 - byte[] source+offset
3809- // c_rarg1 - byte[] SHA.state
3810- // c_rarg2 - int digest_length
3809+ // c_rarg1 - byte[] SHA.state
3810+ // c_rarg2 - int block_size
38113811 // c_rarg3 - int offset
38123812 // c_rarg4 - int limit
38133813 //
@@ -3829,12 +3829,12 @@ class StubGenerator: public StubCodeGenerator {
38293829
38303830 Register buf = c_rarg0;
38313831 Register state = c_rarg1;
3832- Register digest_length = c_rarg2;
3832+ Register block_size = c_rarg2;
38333833 Register ofs = c_rarg3;
38343834 Register limit = c_rarg4;
38353835
38363836 Label sha3_loop, rounds24_loop;
3837- Label sha3_512, sha3_384_or_224, sha3_256 ;
3837+ Label sha3_512_or_sha3_384, shake128 ;
38383838
38393839 __ stpd (v8, v9, __ pre (sp, -64 ));
38403840 __ stpd (v10, v11, Address (sp, 16 ));
@@ -3870,46 +3870,54 @@ class StubGenerator: public StubCodeGenerator {
38703870 __ eor (v5, __ T8B , v5, v30);
38713871 __ eor (v6, __ T8B , v6, v31);
38723872
3873- // digest_length == 64 , SHA3-512
3874- __ tbnz (digest_length, 6 , sha3_512 );
3873+ // block_size == 72 , SHA3-512; block_size == 104, SHA3-384
3874+ __ tbz (block_size, 7 , sha3_512_or_sha3_384 );
38753875
38763876 __ ld1 (v25, v26, v27, v28, __ T8B , __ post (buf, 32 ));
3877- __ ld1 (v29, v30, __ T8B , __ post (buf, 16 ));
3877+ __ ld1 (v29, v30, v31, __ T8B , __ post (buf, 24 ));
38783878 __ eor (v7, __ T8B , v7, v25);
38793879 __ eor (v8, __ T8B , v8, v26);
38803880 __ eor (v9, __ T8B , v9, v27);
38813881 __ eor (v10, __ T8B , v10, v28);
38823882 __ eor (v11, __ T8B , v11, v29);
38833883 __ eor (v12, __ T8B , v12, v30);
3884+ __ eor (v13, __ T8B , v13, v31);
38843885
3885- // digest_length == 28, SHA3-224; digest_length == 48, SHA3-384
3886- __ tbnz (digest_length, 4 , sha3_384_or_224);
3887-
3888- // SHA3-256
3889- __ ld1 (v25, v26, v27, v28, __ T8B , __ post (buf, 32 ));
3890- __ eor (v13, __ T8B , v13, v25);
3891- __ eor (v14, __ T8B , v14, v26);
3892- __ eor (v15, __ T8B , v15, v27);
3893- __ eor (v16, __ T8B , v16, v28);
3894- __ b (rounds24_loop);
3886+ __ ld1 (v25, v26, v27, __ T8B , __ post (buf, 24 ));
3887+ __ eor (v14, __ T8B , v14, v25);
3888+ __ eor (v15, __ T8B , v15, v26);
3889+ __ eor (v16, __ T8B , v16, v27);
38953890
3896- __ BIND (sha3_384_or_224);
3897- __ tbz (digest_length, 2 , rounds24_loop); // bit 2 cleared? SHA-384
3891+ // block_size == 136, bit4 == 0 and bit5 == 0, SHA3-256 or SHAKE256
3892+ __ andw (c_rarg5, block_size, 48 );
3893+ __ cbzw (c_rarg5, rounds24_loop);
38983894
3899- // SHA3-224
3900- __ ld1 (v25, v26, v27, v28, __ T8B , __ post (buf, 32 ));
3901- __ ld1 (v29, __ T8B , __ post (buf, 8 ));
3902- __ eor (v13, __ T8B , v13, v25);
3903- __ eor (v14, __ T8B , v14, v26);
3904- __ eor (v15, __ T8B , v15, v27);
3905- __ eor (v16, __ T8B , v16, v28);
3906- __ eor (v17, __ T8B , v17, v29);
3895+ __ tbnz (block_size, 5 , shake128);
3896+ // block_size == 144, bit5 == 0, SHA3-244
3897+ __ ldrd (v28, __ post (buf, 8 ));
3898+ __ eor (v17, __ T8B , v17, v28);
39073899 __ b (rounds24_loop);
39083900
3909- __ BIND (sha3_512);
3901+ __ BIND (shake128);
3902+ __ ld1 (v28, v29, v30, v31, __ T8B , __ post (buf, 32 ));
3903+ __ eor (v17, __ T8B , v17, v28);
3904+ __ eor (v18, __ T8B , v18, v29);
3905+ __ eor (v19, __ T8B , v19, v30);
3906+ __ eor (v20, __ T8B , v20, v31);
3907+ __ b (rounds24_loop); // block_size == 168, SHAKE128
3908+
3909+ __ BIND (sha3_512_or_sha3_384);
39103910 __ ld1 (v25, v26, __ T8B , __ post (buf, 16 ));
39113911 __ eor (v7, __ T8B , v7, v25);
39123912 __ eor (v8, __ T8B , v8, v26);
3913+ __ tbz (block_size, 5 , rounds24_loop); // SHA3-512
3914+
3915+ // SHA3-384
3916+ __ ld1 (v27, v28, v29, v30, __ T8B , __ post (buf, 32 ));
3917+ __ eor (v9, __ T8B , v9, v27);
3918+ __ eor (v10, __ T8B , v10, v28);
3919+ __ eor (v11, __ T8B , v11, v29);
3920+ __ eor (v12, __ T8B , v12, v30);
39133921
39143922 __ BIND (rounds24_loop);
39153923 __ subw (rscratch2, rscratch2, 1 );
@@ -3994,10 +4002,7 @@ class StubGenerator: public StubCodeGenerator {
39944002 __ cbnzw (rscratch2, rounds24_loop);
39954003
39964004 if (multi_block) {
3997- // block_size = 200 - 2 * digest_length, ofs += block_size
3998- __ add (ofs, ofs, 200 );
3999- __ sub (ofs, ofs, digest_length, Assembler::LSL , 1 );
4000-
4005+ __ add (ofs, ofs, block_size);
40014006 __ cmp (ofs, limit);
40024007 __ br (Assembler::LE , sha3_loop);
40034008 __ mov (c_rarg0, ofs); // return ofs
0 commit comments