code: func padToBlockSize(payload []byte, blockSize int) (prefix, finalBlock []byte) {
  	overrun := len(payload) % blockSize
  	paddingLen := blockSize - overrun
  	prefix = payload[:len(payload)-overrun]
  	finalBlock = make([]byte, blockSize)
  	copy(finalBlock, payload[len(payload)-overrun:])
  	for i := overrun; i < blockSize; i++ {
  		finalBlock[i] = byte(paddingLen - 1)
  	}
  	return
  }
docs: // padToBlockSize calculates the needed padding block, if any, for a payload.
  // On exit, prefix aliases payload and extends to the end of the last full
  // block of payload. finalBlock is a fresh slice which contains the contents of
  // any suffix of payload as well as the needed padding to make finalBlock a
  // full block.