code: func concatKDF(hash hash.Hash, z, s1 []byte, kdLen int) (k []byte, err error) {
  	if s1 == nil {
  		s1 = make([]byte, 0)
  	}
  
  	reps := ((kdLen + 7) * 8) / (hash.BlockSize() * 8)
  	if big.NewInt(int64(reps)).Cmp(big2To32M1) > 0 {
  		fmt.Println(big2To32M1)
  		return nil, ErrKeyDataTooLong
  	}
  
  	counter := []byte{0, 0, 0, 1}
  	k = make([]byte, 0)
  
  	for i := 0; i <= reps; i++ {
  		hash.Write(counter)
  		hash.Write(z)
  		hash.Write(s1)
  		k = append(k, hash.Sum(nil)...)
  		hash.Reset()
  		incCounter(counter)
  	}
  
  	k = k[:kdLen]
  	return
  }
docs: // NIST SP 800-56 Concatenation Key Derivation Function (see section 5.8.1).