Semantics, languages and tools for layered attestation
This Copland phrase represents an attempt to add an explicit appraisal action to the client’s set of behaviors during the attestation.
*bank: @client @bank [attest bank sys] -> (appraise client bank +<- prove client id)
Starting with the Copland phrase from the Simple complete sequence example, we have added a measurement called
appraise
, which the client performs locally on bank
. After
receiving the result attest
, the client first performs appraise
and then proceeds to perform prove
as before. This measurement
ordering is indicated by the use of the sequential split operator <
.
The client combines these results sequentially and returns them to the
bank, producing the final evidence.
Of course, the client does not take a prove
measurement if the
result of attest
is unacceptable. For this reason, appraise
must
precede prove
, as it does in this phrase. A future version of
Copland could include support for conditional branching based on the
result of an intermediate appraisal such as we see here. This would
allow one or another phrase to execute based on intermediate appraisal
results.
One important detail of this particular sequential composition is the
way in which the appraise
and prove
measurements receive the
incoming evidence, the result of attest
. The +
to the left of the
sequential split operator <
indicates that the measurement on the
left, appraise
, receives the incoming evidence as input. By
contrast, the -
to the right of <
indicates that prove
does not
receive the incoming evidence. We can use splitting operators with
different input evidence functions to represent dependencies
succinctly.
This operator best captures how appraise
and prove
depend
differently on the result of attest
. The appraise
operation takes
the attest
result as a direct input and outputs, in some sense,
either “acceptable” or “unacceptable”. The result of appraise
directly depends on the result of attest
. On the other hand,
prove
depends on the attest
result via its dependence on the
result of appraise
, but the result of the prove
operation is
independent of the value of attest
. Thus, prove
need not receive
the result of attest
.
The final evidence type produced by this Copland phrase is
s(m(msp(appraise, client, bank), client, m(msp(attest, bank, sys), bank, mt)), m(msp(prove, client, id), client, mt))
This says that we sequentially join the result of appraise
, which
takes the result of attest
as input, with the result of prove
,
which does not have any inputs. In this case, appraise
takes place
before prove
, and since appraise
depends on the result of attest
attest
, this last must take place before either.
Our final outstanding concern deals with the format of the final
evidence. This template suggests that the final evidence is a bundle
of three measurements that has a certain sequential structure. In our
scenario, however, the bank only receives the client’s prove
result
at the end of the attestation. We would thus like to “sink” the
intermediate attest
result in such a way that prove
still depends
on it (via appraise
) but where it does not appear in the final
evidence. We take up this improvement in the next example.