Skip to content

Commit 7bb490c

Browse files
committed
8370318: AES-GCM vector intrinsic may read out of bounds (x86_64, AVX-512)
Reviewed-by: kvn, roland
1 parent 6f8d07a commit 7bb490c

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/hotspot/cpu/x86/stubGenerator_x86_64.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@ class StubGenerator: public StubCodeGenerator {
393393
XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, XMMRegister xmm8);
394394
void ghash_last_8_avx2(Register subkeyHtbl);
395395

396+
void check_key_offset(Register key, int offset, int load_size);
397+
396398
// Load key and shuffle operation
397399
void ev_load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask);
398400
void ev_load_key(XMMRegister xmmdst, Register key, int offset, Register rscratch);

src/hotspot/cpu/x86/stubGenerator_x86_64_aes.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1759,25 +1759,43 @@ void StubGenerator::roundDeclast(XMMRegister xmm_reg) {
17591759
__ vaesdeclast(xmm8, xmm8, xmm_reg, Assembler::AVX_512bit);
17601760
}
17611761

1762+
// Check incoming byte offset against the int[] len. key is the pointer to the int[0].
1763+
// This check happens often, so it is important for it to be very compact.
1764+
void StubGenerator::check_key_offset(Register key, int offset, int load_size) {
1765+
#ifdef ASSERT
1766+
Address key_length(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT));
1767+
assert((offset + load_size) % 4 == 0, "Alignment is good: %d + %d", offset, load_size);
1768+
int end_offset = (offset + load_size) / 4;
1769+
Label L_good;
1770+
__ cmpl(key_length, end_offset);
1771+
__ jccb(Assembler::greaterEqual, L_good);
1772+
__ hlt();
1773+
__ bind(L_good);
1774+
#endif
1775+
}
17621776

17631777
// Utility routine for loading a 128-bit key word in little endian format
17641778
void StubGenerator::load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask) {
1779+
check_key_offset(key, offset, 16);
17651780
__ movdqu(xmmdst, Address(key, offset));
17661781
__ pshufb(xmmdst, xmm_shuf_mask);
17671782
}
17681783

17691784
void StubGenerator::load_key(XMMRegister xmmdst, Register key, int offset, Register rscratch) {
1785+
check_key_offset(key, offset, 16);
17701786
__ movdqu(xmmdst, Address(key, offset));
17711787
__ pshufb(xmmdst, ExternalAddress(key_shuffle_mask_addr()), rscratch);
17721788
}
17731789

17741790
void StubGenerator::ev_load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask) {
1791+
check_key_offset(key, offset, 16);
17751792
__ movdqu(xmmdst, Address(key, offset));
17761793
__ pshufb(xmmdst, xmm_shuf_mask);
17771794
__ evshufi64x2(xmmdst, xmmdst, xmmdst, 0x0, Assembler::AVX_512bit);
17781795
}
17791796

17801797
void StubGenerator::ev_load_key(XMMRegister xmmdst, Register key, int offset, Register rscratch) {
1798+
check_key_offset(key, offset, 16);
17811799
__ movdqu(xmmdst, Address(key, offset));
17821800
__ pshufb(xmmdst, ExternalAddress(key_shuffle_mask_addr()), rscratch);
17831801
__ evshufi64x2(xmmdst, xmmdst, xmmdst, 0x0, Assembler::AVX_512bit);
@@ -3205,12 +3223,12 @@ void StubGenerator::ghash16_encrypt_parallel16_avx512(Register in, Register out,
32053223

32063224
//AES round 9
32073225
roundEncode(AESKEY2, B00_03, B04_07, B08_11, B12_15);
3208-
ev_load_key(AESKEY2, key, 11 * 16, rbx);
32093226
//AES rounds up to 11 (AES192) or 13 (AES256)
32103227
//AES128 is done
32113228
__ cmpl(NROUNDS, 52);
32123229
__ jcc(Assembler::less, last_aes_rnd);
32133230
__ bind(aes_192);
3231+
ev_load_key(AESKEY2, key, 11 * 16, rbx);
32143232
roundEncode(AESKEY1, B00_03, B04_07, B08_11, B12_15);
32153233
ev_load_key(AESKEY1, key, 12 * 16, rbx);
32163234
roundEncode(AESKEY2, B00_03, B04_07, B08_11, B12_15);

0 commit comments

Comments
 (0)