code: func composeContentBlocks31(w io.Writer, contentData []byte) {
  	index := uint32(0)
  	offset := 0
  	for offset < len(contentData) {
  		var hash [32]byte
  		var length uint32
  		var data []byte
  
  		if len(contentData[offset:]) >= blockSplitRate {
  			data = append(data, contentData[offset:]...)
  		} else {
  			data = append(data, contentData...)
  		}
  
  		length = uint32(len(data))
  		hash = sha256.Sum256(data)
  
  		binary.Write(w, binary.LittleEndian, index)
  		binary.Write(w, binary.LittleEndian, hash)
  		binary.Write(w, binary.LittleEndian, length)
  		binary.Write(w, binary.LittleEndian, data)
  		index++
  		offset = offset + blockSplitRate
  	}
  	binary.Write(w, binary.LittleEndian, index)
  	binary.Write(w, binary.LittleEndian, [32]byte{})
  	binary.Write(w, binary.LittleEndian, uint32(0))
  }
docs: // composeBlocks31 composes every content block into a INDEX-SHA-LENGTH-DATA block scheme (Kdbx v3.1)