Skip to content

Commit 5953a47

Browse files
committed
blake2s: use proper Go frame sizes
Currently blake2s's assembly routines claim they have a zero byte frame and manually subtract upwards of 704 bytes from the stack pointer without cooperating with Go's ABI. As a result, these functions may not grow the stack when necessary, leading to memory corruption. Fix this by using the correct stack frame sizes so the generated stack growth prologue is correct, and aligning the SP up instead of down. Change-Id: Ic426338c45c94a2c01d549860c2295a0ee9200bf Reviewed-on: https://go-review.googlesource.com/31583 Reviewed-by: Adam Langley <[email protected]> Reviewed-by: Andreas Auernhammer <[email protected]> Reviewed-by: Minux Ma <[email protected]>
1 parent f620851 commit 5953a47

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

blake2s/blake2s_386.s

+10-6
Original file line numberDiff line numberDiff line change
@@ -290,16 +290,18 @@ GLOBL counter<>(SB), (NOPTR+RODATA), $16
290290
MOVL t, 8*4+off+576(dst)
291291

292292
// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
293-
TEXT ·hashBlocksSSE2(SB), 4, $0-24
293+
TEXT ·hashBlocksSSE2(SB), 4, $672-24 // frame = 656 + 16 byte alignment
294294
MOVL h+0(FP), AX
295295
MOVL c+4(FP), BX
296296
MOVL flag+8(FP), CX
297297
MOVL blocks_base+12(FP), SI
298298
MOVL blocks_len+16(FP), DX
299299

300300
MOVL SP, BP
301-
ANDL $0xFFFFFFF0, SP
302-
SUBL $(16+16+640), SP
301+
MOVL SP, DI
302+
ADDL $15, DI
303+
ANDL $~15, DI
304+
MOVL DI, SP
303305

304306
MOVL CX, 8(SP)
305307
MOVL 0(BX), CX
@@ -357,16 +359,18 @@ loop:
357359
RET
358360

359361
// func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
360-
TEXT ·hashBlocksSSSE3(SB), 4, $0-24
362+
TEXT ·hashBlocksSSSE3(SB), 4, $704-24 // frame = 688 + 16 byte alignment
361363
MOVL h+0(FP), AX
362364
MOVL c+4(FP), BX
363365
MOVL flag+8(FP), CX
364366
MOVL blocks_base+12(FP), SI
365367
MOVL blocks_len+16(FP), DX
366368

367369
MOVL SP, BP
368-
ANDL $0xFFFFFFF0, SP
369-
SUBL $(16+16+640+32), SP
370+
MOVL SP, DI
371+
ADDL $15, DI
372+
ANDL $~15, DI
373+
MOVL DI, SP
370374

371375
MOVL CX, 8(SP)
372376
MOVL 0(BX), CX

blake2s/blake2s_amd64.s

+11-9
Original file line numberDiff line numberDiff line change
@@ -364,16 +364,18 @@ GLOBL counter<>(SB), (NOPTR+RODATA), $16
364364
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0); \
365365
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
366366

367-
#define HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, stack_size, BLAKE2s_FUNC) \
367+
#define HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, BLAKE2s_FUNC) \
368368
MOVQ h, AX; \
369369
MOVQ c, BX; \
370370
MOVL flag, CX; \
371371
MOVQ blocks_base, SI; \
372372
MOVQ blocks_len, DX; \
373373
\
374374
MOVQ SP, BP; \
375-
ANDQ $0xFFFFFFFFFFFFFFF0, SP; \
376-
SUBQ $(16+16+stack_size), SP; \
375+
MOVQ SP, R9; \
376+
ADDQ $15, R9; \
377+
ANDQ $~15, R9; \
378+
MOVQ R9, SP; \
377379
\
378380
MOVQ 0(BX), R9; \
379381
MOVQ R9, 0(SP); \
@@ -421,18 +423,18 @@ GLOBL counter<>(SB), (NOPTR+RODATA), $16
421423
MOVQ BP, SP
422424

423425
// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
424-
TEXT ·hashBlocksSSE2(SB), 4, $0-48
425-
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), 640, BLAKE2s_SSE2)
426+
TEXT ·hashBlocksSSE2(SB), 4, $672-48 // frame = 656 + 16 byte alignment
427+
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE2)
426428
RET
427429

428430
// func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
429-
TEXT ·hashBlocksSSSE3(SB), 4, $0-48
430-
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), 640, BLAKE2s_SSSE3)
431+
TEXT ·hashBlocksSSSE3(SB), 4, $672-48 // frame = 656 + 16 byte alignment
432+
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSSE3)
431433
RET
432434

433435
// func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
434-
TEXT ·hashBlocksSSE4(SB), 4, $0-48
435-
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), 0, BLAKE2s_SSE4)
436+
TEXT ·hashBlocksSSE4(SB), 4, $16-48 // frame = 0 + 16 byte alignment
437+
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE4)
436438
RET
437439

438440
// func supportSSE4() bool

0 commit comments

Comments
 (0)