vulncheck: add witness data structures

The added data structures are based on the internal discussion and
proposed design document.

Cherry-picked: https://go-review.googlesource.com/c/exp/+/379574

Change-Id: I59f9aff02655226cdab437e43771dd79889375b5
Reviewed-on: https://go-review.googlesource.com/c/vuln/+/395053
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/vulncheck/witness.go b/vulncheck/witness.go
new file mode 100644
index 0000000..8e2d420
--- /dev/null
+++ b/vulncheck/witness.go
@@ -0,0 +1,25 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package vulncheck
+
+// ImportChain is sequence of import paths starting with
+// a client package and ending with a package with some
+// known vulnerabilities.
+type ImportChain []*PkgNode
+
+// CallStack models a trace of function calls starting
+// with a client function or method and ending with a
+// call to a vulnerable symbol.
+type CallStack []StackEntry
+
+// StackEntry models an element of a call stack.
+type StackEntry struct {
+	// Function provides information on the function whose frame is on the stack.
+	Function *FuncNode
+
+	// Call provides information on the call site inducing this stack frame.
+	// nil when the frame represents an entry point of the stack.
+	Call *CallSite
+}