packages feed

cpsa-4.4.9: doc/src/cpsa4manual/troubleshooting.tex

\chapter {Troubleshooting}
\label{ch:troubleshooting}

The {\cpsa} tool is a complicated one and many errors are possible in
its use.  In this chapter we discuss these errors, from the simplest
to the most complex, and offer suggestions as to how to resolve them.

\section{Non-termination}
\label{sec:bounds}

The {\cpsa} tool is not guaranteed to complete its search on all
well-formed inputs.  The problem space {\cpsa} attempts to perform
includes some Turing-undecidable problems.

Because of this, the tool has two bail-out conditions that users should be
aware of:

\begin{itemize}

\index{strand bound}
\item The {\bf strand bound} causes the tool to abort its analysis if any
skeleton it analyzes has more strands than the bound.  By default, the strand
bound is 12.

\index{step limit}
\item The {\bf step limit} causes the tool to abort its analysis if during
the analysis of a single input \texttt{defskeleton} or \texttt{defgoal}, the
number of skeletons it processes exceeds the limit.  By default, the step limit
is 2000.

\index{depth limit}
\item The {\bf depth limit} causes the tool to not analyze skeletons
  more steps away from the initial point of view than the bound.
  There is no depth limit by default.  Skeletons that are unrealized and not
  analyzed due to the depth limit are marked with ``\texttt{(fringe)}''.

\end{itemize}

If you execute an analysis and the tool says ``Strand bound exceeded''
or ``Step limit reached,'' then that bail-out condition has come into play.
This may indicate an analysis that would never terminate, but it may also be
the case that the strand bound or step limit is too small, and a larger one will
enable the analysis to complete.

Unlike the strand bound and the step limit, the depth limit never
triggers an error condition, and can thus be useful for multi-skeleton
analyses in which one of the earlier skeletons would otherwise have a
non-terminating analysis.

The step limit, depth limit, and strand bound can be adjusted through the
\texttt{limit}, \texttt{depth}, and \texttt{bound} options, respectively.  See
Section~\ref{sec:options}.

\index{interrupting}
Note that sometimes, a user may become impatient waiting for an
analysis to either complete or bail out.  When this happens, the user should
not hesitate to interrupt the tool; the tool will output a partial result that can
be graphed so the user can examing the analysis done so far.

An analysis that doesn't terminate does not necessarily represent an
insecure protocol, it may just indicate a protocol where a more clever
analysis is required than {\cpsa}'s automated one.

\subsection{Configuring the search}
There are cases in which the default {\cpsa} analysis does not
terminate, but a non-default analysis would terminate.  The tool has
several default settings that influence the search but can be
configured:

\begin{itemize}
\index{try-old-strands option}
\index{reverse-nodes option}
\index{options!try-old-strands}
\index{options!reverse-nodes}
\item {\bf Node precedence.}  In a skeleton with multiple unrealized
  receptions, the tool will, by default, focus on the topmost
  unrealized node of the rightmost strand that contains an unrealized
  node.  If you find that an analysis gets into a large search space
  due to exploring those unrealized receptions first, you could alter
  this order with the \texttt{reverse-nodes} or
  \texttt{try-old-strands} options.  The latter will prioritize the
  leftmost strands over the rightmost, while the former will
  prioritize the bottom-most unrealized node in the strand rather than
  the topmost. These can be used individually or jointly, yielding
  three extra non-default search strategies.

\index{check-nonces option}
\index{options!check-nonces}
\item {\bf Critical term precedence.}  Occasionally, a reception will
  arise that is unrealized and multiple critical terms are available.
  In particular, there are cases where a term contains both a
  hard-to-explain encryption and a restricted nonce.  For instance, in
  the Kerberos protocol, the ticket $\enc{k,a,b}{SK(b,s)}$ can serve
  as both a critical encryption (because $SK(b,s)$ may be declared
  non-originating) and a critical term (because $k$ is uniquely
  originating).  By default, {\cpsa} will treat the encryption as the
  critical term because this tends to lead to learning more in fewer
  steps, but this choice can be reversed by using the
  \texttt{check-nonces} option.

\index{priority}
\item {\bf Priority.}  The tool contains an ability to declare a
  priority for certain receptions that differs from the default.
  Priority takes precedence over all other search orderings.  See
  Section~\ref{sec:decl_syntax} for the format requirements for
  declaring priorities, and the \texttt{priority\_test.scm} example in the
  examples directory.

  Note that the default priority is 5, and priority 0 indicates that
  the tool should never bother solving tests at those nodes.  This may
  be of use, for instance, if solving one particular node leads to
  infinite analysis, but other nodes would result in a quick
  determination that a skeleton is dead.
\end{itemize}

\section{Error messages}
\label{sec:errors}

In this section, we provide an alphabetical listing of error messages
/ failures that may arise during {\cpsa} execution.  If you get an error
message not included here, it likely represents a bug and should be reported
to the tool maintainers.

\begin{itemize}
\item \textbf{``[ASSERT FAILED] [...]''}.  This kind of error should
  not occur.  If you see this happen, please contact the tool maintainers
  and make a bug report!

\item \textbf{``Aborting after applying 500 rules and more are
  applicable''}.  This most likely indicates a circular use of rules.

\item \textbf{``Algebra.absenceSubst: bad absence assertion''} or
  \textbf{``Algebra.nullifyOne: unexpected pattern''} The
  \texttt{absent} declaration must be declared on a pair where the
  first element is an \scap{rndx} variable and the second element is 
  an exponent.
  % or a \scap{base} term.
  %
  These errors should not occur if you did not give {\cpsa} an input
  with an absent declaration.

\item \textbf{``Algebra.inv: Cannot invert a variable of sort mesg''}.
  Variables of the \texttt{mesg} sort should never be used as the key
  in an encryption.  {\cpsa} uses a single function symbol to represent
  both symmetric and asymmetric encryption, and when the key is a variable
  of sort \texttt{mesg}, it is ambiguous which is meant.  As a result,
  it is unclear what the decryption key would be for such a message.  When
  {\cpsa} tries to calculate the decryption key when the encryption key
  is a variable of sort \texttt{mesg}, this error is produced.

\item \textbf{``Atom not unique at node''}.  This occurs when a
  formula has been specified including a \texttt{uniq-at} predicate in
  the antecedent that is untrue.

\item \textbf{``Bad char [...]''}.  This error message comes from a
  low-level parser trying to understand S-expressions.  When parsing
  an S-expression, any non-whitespace that isn't a parenthesis is an
  ``atom'' but we expect atoms to be symbols, numbers, or quoted
  strings, and only certain characters are allowed in these.  An atom
  that starts with a digit is expected to be a number, for instance, so
  subsequent non-digits will cause an error of this kind.  The characters
  allowed in symbols include all alphanumeric characters and the following
  punctuation marks: \verb|+, -, *, /, <, =, >, !, ?, :, $,|  \verb|%, _, &, ~, ^|.

\item \textbf{``Bad height'' / ``Bad position in role'' / ``Negative
  position in role''}.  A \texttt{defstrand} includes a specification
  of a height (the length of the instance) but that height must be
  positive and must not exceed the length of the role.

\item \textbf{``Bad str-prec''}.  Your goal included a
  \texttt{str-prec} predicate among node variables associated with
  different roles.  In other words, your formula has attempted to make
  a single strand that includes events from distinct roles.

\item \textbf{``Close of unopened list''}.  Your input has an erroneous
  close-paren.

\item \textbf{``Disallowed bare exponent''}.  See
  Section~\ref{sec:dh}.  The tool requires that within roles and
  skeletons, any exponent occurring outside an exponentiation
  function must be of sort \texttt{rndx}.

\item \textbf{``Domain does not match range''}.  This error message
  occurs when {\cpsa} is trying to understand the variable assignment
  you have specified in a \texttt{defstrand}.  You may have defined
  the value of a parameter more than once, or your definition may have
  a type mismatch.  For instance if $a$ is a parameter role expected
  to be of the name type, and you declare $t$ to be a text variable,
  then including \texttt{(a t)} in a defstrand will produce this
  error.

\item \textbf{``Duplicate role [...] in protocol [...]''}.  The roles
  in a protocol must have distinct names.  This error occurs if you
  have two protocols with the same name.

\item \textbf{``Duplicate variable declaration for [...]''}.  Within
  any \texttt{vars} statement, any symbol may be used for a variable
  name, but each variable name can be declared only once.

\item \textbf{``End of input in string''}.  You included a quote-delimited
  string but didn't close it before the end of the input file.

\item \textbf{``Equals not allowed in antecedent''}.  The \texttt{equals}
  predicate may only be used on the conclusion side of a \texttt{defgoal}.

\item \textbf{``Expansion limit exceeded''}.  This most likely indicates
  a circular use of macros.  The limit of expansion of a macro within a macro is
  hard-coded in the tool as depth 1000.

\item \textbf{``Expecting [...] to be [a/an ...]''}.  You have a type
  error in your use of a function symbol.  For instance if
  \texttt{(pubk a)} is to be loaded within a particular variable
  declaration scope, the $a$ variable should be of the $\scap{name}$
  sort.

\item \textbf{``Expecting a node variable'' / ``Expecting an algebra
  term''}.  Certain predicates within a \texttt{defgoal} expect one of
  their inputs to be a declared node variable (or to be a non-node
  variable).  If a variable used in such an input is declared
  otherwise, this error message is produced.

\item \textbf{``Expecting an atom''}.  Certain declarations, in particular
  the \texttt{uniq-orig}, \texttt{uniq-gen}, and \texttt{non-orig} ones,
  are expected to be used on atomic terms rather than compound ones.

\item \textbf{``Expecting terms in algebra [...]''}. This is a
  historical artifact resulting from the fact that the algebra has two
  names. If you specify one name as a runtime parameter (or in the
  herald) that is different from the name used in the
  \texttt{defprotocol} form, this error will result.

\item \textbf{``Expts must first be received, rndxs first
    sent''}. If the first occurrence of a variables of the
  \texttt{expt} sort is in a transmission, it could resolve to any
  multiplication of exponents and so is underspecified. When receiving
  an exponent, there is no way to ensure it was not chosen to be some
  multiplication of other exponents, so we can assume its sort is
  \texttt{rndx}. Hence the rule described by the error. 
% \item \textbf{``Role not well formed: variable [...] not
%     obtained''}.  Variables of the %$\scap{base}$ or
%   $\scap{expr}$ sort must be ``obtained'' when used in roles, meaning
%   that the first occurrence must be in a reception.
  
\item \textbf{``Identifier [...] unknown''}.  This is a relatively common
  user-caused error that occurs when you try to use a variable not declared
  in your \texttt{vars} declaration.

\item \textbf{``Include depth exceeded with file [...]''}.  Most
  likely, this indicates a circular use of the \texttt{include}
  command.  The limit of inclusion within an included file is depth
  16.

\item \textbf{``Keyword [...] unknown''}.  The tool was expecting the symbol
  to specify an algebra function symbol, but it didn't match any of the available
  ones.  This most commonly indicates that the user forgot to include a
  function symbol name at the beginning of a list when describing a term.  One of
  the most common forms of this mistake is to include \texttt{(send (a b))} in
  a trace of a role, when the user intended to model the sending of the pair $(a,b)$.
  The proper input would be \texttt{(send (cat a b))}.

  Because of this type of mistake, it is recommended to avoid using variables
  in your model that are the same as function symbol names such as
  ``ltk'' or ``pubk''.

\item \textbf{``In a rule equality check, cannot find a binding for
  some variable''}.  An equality in a rule is receiving a variable
  that has not been bound by a length or parameter predicate.  Try
  moving the equality to the end of the conjunction in which it
  occurs.

\item \textbf{``In rule [...], parameter predicate for [...] did not
  get a strand''}.  This message occurs when a strand variable is not
  bound by a length predicate.

\item \textbf{``In rule [...], [...] did not get a strand''}.
  This message occurs when a strand variable is not bound by a length
  predicate.

\item \textbf{``In rule [...], [...] did not get a term}.  This
  message occurs when an algebra variable is not bound by a parameter
  predicate.

\item \textbf{``Malformed [...]''}.  Generally speaking, this indicates
  a syntax error.  Consult the grammar in Chapter~\ref{ch:input} for the
  syntax requirements for the type of object the tool claims was malformed.
  Double-check that you have spelled required keywords correctly, and that
  your parentheses are matched.

\item \textbf{``Malformed association list''}.  This refers to one of
  the ``-alist'' symbols in the grammar; these may occur in skeletons,
  goals, protocols, or roles.

  Association lists are lists of S-expressions, each of which is a
  list that starts with a symbol.  This error would occur if you had,
  for instance, a symbol or a number, or an S-expression starting with
  a number as an input to a \texttt{defrole} or \texttt{defskeleton}.

\item \textbf{``Malformed input''}.  Top level S-expressions in your
  input file must be one of the following: \texttt{defprotocol,
    defskeleton, defgoal, comment,} or \texttt{herald}.  The tool also
  recognizes \texttt{defpreskeleton} as a synonym for
  \texttt{defskeleton}.  If you have an S-expression at the top level
  that is other than one of these, this is the error message you will
  see.

\item \textbf{``Malformed pair -- nodes in same strand''}.  In a
  \texttt{defskeleton} you are prohibited from specifying orderings
  between nodes in the same strand.

  This is not the case for \texttt{leadsto} relationships.

\item \textbf{``No strands''}.  Your \texttt{defskeleton} did not include
  any strands at all; it must include at least one.

\item \textbf{``Node occurs in more than one role predicate''}.  Node
  variables in a goal must occur within a role position predicate, but
  should not occur within more than one within their defined scope.

\item \textbf{``Priority declaration disallowed on [...]''}.
  Prioritization has no effect except on events that need an
  explanation.  If you try to change the default priority of a
  \texttt{send} or \texttt{stor} event, this is assumed to be a
  mistake and the tool produces this error.

\item \textbf{``Protocol [...] unknown''}.  This error occurs when you
  have a \texttt{defskeleton} or \texttt{defgoal} with a protocol name
  not matching any \texttt{defprotocol} so far present in the file.

\item \textbf{``Role [...] not found in [...]''}.  You included a
  \texttt{defstrand} referencing a role that does not exist in the
  protocol definition.

\item \textbf{``Role in parameter pred differs from role position
  pred''}.  A node variable in a formula should occur in a role
  position predicate but may also occur in node parameter predicates.
  However, node parameter predicates for a given node variable should
  match the role of the role position predicate the variable occurs
  in.

\item \textbf{``Role not well formed: role trace is a prefix of a
    listener''}.  {\cpsa} disallows the use of roles that begin with
  the reception of some message followed by the transmission of that
  same message, because there is an ambiguity as to whether an
  instance is a listener or an instance of a protocol role.  This
  should not be a problem because beginning a role in this manner is
  quite unusual, but if it is necessary for you to do so we recommend
  the reception be paired with a tag constant such as \texttt{(cat
    "regular role" [...])}.

\item \textbf{``Role not well formed: non-orig [...] carried''}.  The
  \texttt{non-orig} declaration specifies that a certain atomic value
  not be carried (see Section~\ref{sec:secrecy_assumptions}).  You
  have made such a declaration but a plain (full-height) instance of
  your role violates the rule.

\item \textbf{``Role not well formed: uniq-orig/uniq-gen [...] doesn't
    originate/generate''}. The \texttt{uniq-orig} declaration in a
  role requires the declared value to originate, i.e., its first
  carried occurrence is in a transmission. The role probably has an
  earlier carried reception of the value. Similarly \texttt{uniq-gen}
  requires the first occurrence (whether carried or not) to be in a
  transmission. See Section~\ref{sec:secrecy_assumptions} for an
  explanation of ``carried.''
  % The \texttt{uniq-orig} declaration states not only that the
  % declared value originates on a regular strand uniquely (see
  % Section~\ref{sec:secrecy_assumptions}), but also states that the
  % apparent origination point is the unique origination point of that
  % value.  As such, you may only use the \texttt{uniq-orig}
  % declaration on a value that does originate somewhere.  If you
  % declare a value \texttt{uniq-orig} on a role but it does not
  % originate on that role, you get this error. Similarly for
  % \texttt{uniq-gen}

\item \textbf{``Role not well formed: variable [...] not acquired''}.
  Variables of the $\scap{mesg}$ sort must be ``acquired'' when used
  in roles.  This means that the first occurrence of the variable must
  be a \emph{carried} occurrence in a reception event.  See
Section~\ref{sec:secrecy_assumptions} for an explanation of
``carried.''


\item \textbf{``[Role / Skeleton] not well formed: inequality
    conditions violated''}.  A \texttt{neq} declaration is false where
  it is first declared: in a role or skeleton definition.

\item \textbf{``[Role / Skeleton] not well formed: lt declarations
    form a cycle''}.  The \texttt{lt} declarations present in a role
  or in a skeleton are already violated in the role or skeleton
  definition.

\item \textbf{``[Role / Skeleton] not well formed: subsort
    requirements violated''}.  The \texttt{subsort} declarations
  present in the role or skeleton being defined are already violated.

\item \textbf{``Skeleton not well formed: a variable in [...] is not in some trace''}.
  A \texttt{defskeleton} causes this error when a variable used in a declaration
  does not appear in any of the traces.

\item \textbf{``Skeleton not well formed: cycle found in ordered pairs''}.
  The ordering edges (strand succession plus ordered pairs) of a skeleton should form
  an acyclic graph.  A cycle represents circular causality which should not be possible in
  any real execution.

\item \textbf{``Skeleton not well formed: non-orig [...] carried''}.  The \texttt{non-orig}
  declaration specifies that a certain atomic value not be carried
  (see Section~\ref{sec:secrecy_assumptions}).  You have made such a declaration but your
  \texttt{defskeleton} violates the rule.

\item \textbf{``Skeleton not well formed: ordered pairs not well formed''}.
  This error occurs when an ordering is specified between the wrong types of events.
  In {\cpsa}, an ordering must be such that the earlier node has an outgoing type, so
  for instance an ordering directly between two reception events is disallowed.

% \item \textbf{``Skeleton not well formed: uniq-orig [...] doesn't
%     originate''}.  The \texttt{uniq-orig} declaration states not only
%   that the declared value originates on a regular strand uniquely (see
%   Section~\ref{sec:secrecy_assumptions}), but also states that the
%   apparent origination point is the unique origination point of that
%   value.  As such, you may only use the \texttt{uniq-orig} declaration
%   on a value that does originate somewhere.  If you declare a value
%   \texttt{uniq-orig} on a skeleton but it does not originate in the
%   skeleton, you get this error.

%   Similarly, \textbf{``...: uniq-gen [...] doesn't generate''}
%   represents a detected error in that \texttt{uniq-gen} states that
%   not only does the given value generate (see
%   Section~\ref{sec:secrecy_assumptions}) uniquely, but that its apparent
%   generation point is that generation point.  As such, a generation
%   point is expected.

\item \textbf{``Sort [...] not recognized''}.  You attempted to declare a variable
  to be of a sort not present in the algebra. There is likely a typo
  in one of the sorts.

\item \textbf{``Terms in [role/skeleton] not well formed''}.  This error occurs
  when you have constructed a term using a function symbol that
  expects inputs of a certain sort, but your inputs are not of that
  sort.  For instance, in \texttt{(ltk a b)}, \texttt{a} and
  \texttt{b} must be variables of the \texttt{name} sort, or they are not
  well-formed.  To resolve: double-check your variable declarations and
  your use of function symbols.

  % This may also occur if you use the \texttt{node} sort in a role or skeleton; that
  % sort should only be used in a goal declaration.

\item \textbf{``Too many locations in declaration''}.  You have a
  native declaration that appears to include two or more
  locations in it.  All native declarations allow at most one
  location.

\item \textbf{``Type mismatch in equals''}.  The \texttt{equals} predicate
  in a \texttt{defgoal} can be used to compare node variables or to compare
  algebra variables, but cannot be used to compare node variables to algebra
  variables.

\item \textbf{``Unbound variable in [...]''}.  In a \texttt{defgoal},
  variables must meet specific binding requirements.  See Chapter~\ref{ch:goals}
  for details.  This error indicates that you have provided a formula that the
  tool rejects for this reason.

\item \textbf{``Unexpected end of input in list''}.  One of the most frequent
  user errors---you didn't include close parens for all your S-expressions.

\end{itemize}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: "cpsa4manual"
%%% End: