58 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | // +build gofuzz | ||
|  | 
 | ||
|  | package blake2b | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"encoding/binary" | ||
|  | ) | ||
|  | 
 | ||
|  | func Fuzz(data []byte) int { | ||
|  | 	// Make sure the data confirms to the input model | ||
|  | 	if len(data) != 211 { | ||
|  | 		return 0 | ||
|  | 	} | ||
|  | 	// Parse everything and call all the implementations | ||
|  | 	var ( | ||
|  | 		rounds = binary.BigEndian.Uint16(data[0:2]) | ||
|  | 
 | ||
|  | 		h [8]uint64 | ||
|  | 		m [16]uint64 | ||
|  | 		t [2]uint64 | ||
|  | 		f uint64 | ||
|  | 	) | ||
|  | 	for i := 0; i < 8; i++ { | ||
|  | 		offset := 2 + i*8 | ||
|  | 		h[i] = binary.LittleEndian.Uint64(data[offset : offset+8]) | ||
|  | 	} | ||
|  | 	for i := 0; i < 16; i++ { | ||
|  | 		offset := 66 + i*8 | ||
|  | 		m[i] = binary.LittleEndian.Uint64(data[offset : offset+8]) | ||
|  | 	} | ||
|  | 	t[0] = binary.LittleEndian.Uint64(data[194:202]) | ||
|  | 	t[1] = binary.LittleEndian.Uint64(data[202:210]) | ||
|  | 
 | ||
|  | 	if data[210]%2 == 1 { // Avoid spinning the fuzzer to hit 0/1 | ||
|  | 		f = 0xFFFFFFFFFFFFFFFF | ||
|  | 	} | ||
|  | 	// Run the blake2b compression on all instruction sets and cross reference | ||
|  | 	want := h | ||
|  | 	fGeneric(&want, &m, t[0], t[1], f, uint64(rounds)) | ||
|  | 
 | ||
|  | 	have := h | ||
|  | 	fSSE4(&have, &m, t[0], t[1], f, uint64(rounds)) | ||
|  | 	if have != want { | ||
|  | 		panic("SSE4 mismatches generic algo") | ||
|  | 	} | ||
|  | 	have = h | ||
|  | 	fAVX(&have, &m, t[0], t[1], f, uint64(rounds)) | ||
|  | 	if have != want { | ||
|  | 		panic("AVX mismatches generic algo") | ||
|  | 	} | ||
|  | 	have = h | ||
|  | 	fAVX2(&have, &m, t[0], t[1], f, uint64(rounds)) | ||
|  | 	if have != want { | ||
|  | 		panic("AVX2 mismatches generic algo") | ||
|  | 	} | ||
|  | 	return 1 | ||
|  | } |