github.com/decred/dcrlnd@v0.7.6/fuzz/brontide/random_init_enc_dec.go (about)

     1  //go:build gofuzz
     2  // +build gofuzz
     3  
     4  package brontidefuzz
     5  
     6  import (
     7  	"bytes"
     8  	"math"
     9  )
    10  
    11  // Fuzz_random_init_enc_dec is a go-fuzz harness that tests round-trip
    12  // encryption and decryption between the initiator and the responder.
    13  func Fuzz_random_init_enc_dec(data []byte) int {
    14  	// Ensure that length of message is not greater than max allowed size.
    15  	if len(data) > math.MaxUint16 {
    16  		return 1
    17  	}
    18  
    19  	// This will return brontide machines with random keys.
    20  	initiator, responder := getBrontideMachines()
    21  
    22  	// Complete the brontide handshake.
    23  	completeHandshake(initiator, responder)
    24  
    25  	var b bytes.Buffer
    26  
    27  	// Encrypt the message using WriteMessage w/ initiator machine.
    28  	if err := initiator.WriteMessage(data); err != nil {
    29  		nilAndPanic(initiator, responder, err)
    30  	}
    31  
    32  	// Flush the encrypted message w/ initiator machine.
    33  	if _, err := initiator.Flush(&b); err != nil {
    34  		nilAndPanic(initiator, responder, err)
    35  	}
    36  
    37  	// Decrypt the ciphertext using ReadMessage w/ responder machine.
    38  	plaintext, err := responder.ReadMessage(&b)
    39  	if err != nil {
    40  		nilAndPanic(initiator, responder, err)
    41  	}
    42  
    43  	// Check that the decrypted message and the original message are equal.
    44  	if !bytes.Equal(data, plaintext) {
    45  		nilAndPanic(initiator, responder, nil)
    46  	}
    47  
    48  	return 1
    49  }