<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://ds7.deltamobile.com/mediawiki/skins/common/feed.css?207"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Erights - User contributions [en]</title>
		<link>http://ds7.deltamobile.com/wiki/Special:Contributions/Zarutian</link>
		<description>From Erights</description>
		<language>en</language>
		<generator>MediaWiki 1.15.5-7</generator>
		<lastBuildDate>Wed, 08 Apr 2026 13:51:06 GMT</lastBuildDate>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */ 2nd edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# E syntax 0.9&lt;br /&gt;
pragma.syntax(&amp;quot;0.9&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  # make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  # to be implemented&lt;br /&gt;
  # used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def ActiveCapCertPrincipal {&lt;br /&gt;
  to coerce(specimen, optEjector) :near {&lt;br /&gt;
    # for now nothing passes this guard&lt;br /&gt;
    throw.eject(optEjector, &amp;quot;guard not yet implimented&amp;quot;) &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def ActiveCapCert__uriGetter&lt;br /&gt;
def ActiveCapCertMaker {&lt;br /&gt;
  to makeFrom(cert :String) :any {&lt;br /&gt;
    def issuer := null   # will be filled in by th cert parsing code&lt;br /&gt;
    def code :EExpr := e`$code` # ditto&lt;br /&gt;
    # check here if signed by issuer as it is pretty expensive.&lt;br /&gt;
    def unsealer(box :any) :any {&lt;br /&gt;
      return getUnsealer(issuer).unseal(box)&lt;br /&gt;
    }&lt;br /&gt;
    def ActiveCapCert {&lt;br /&gt;
      to run(parameters :any) :any {&lt;br /&gt;
        def env := safeScope&lt;br /&gt;
        env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
        env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
        env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
        env with= (&amp;quot;ActiveCapCert__uriGetter&amp;quot;, ActiveCapCert__uriGetter)&lt;br /&gt;
        if (issuer == vatId) {&lt;br /&gt;
          env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
        }&lt;br /&gt;
        return code.eval(env)&lt;br /&gt;
      }  &lt;br /&gt;
      to getSigner() :ActiveCapCertPrincipal {&lt;br /&gt;
        return issuer&lt;br /&gt;
      }&lt;br /&gt;
      to getCode() :EExpr {&lt;br /&gt;
        return code&lt;br /&gt;
      }&lt;br /&gt;
      to __optUncall() :Portrayal {&lt;br /&gt;
        return [ActiveCapCert__uriGetter, &amp;quot;get&amp;quot;, [cert]]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return ActiveCapCert&lt;br /&gt;
  }&lt;br /&gt;
  to makeCert(code :EExpr) :String {&lt;br /&gt;
    # prepend this vats pubkey to the code&lt;br /&gt;
    # and sign it&lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
bind ActiveCapCert__uriGetter {&lt;br /&gt;
  to get(str :String) :any { return ActiveCapCertMaker(str) }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Wed, 05 Jan 2011 12:46:07 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */ Edit stream start&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def ActiveCapCert__uriGetter&lt;br /&gt;
def ActiveCapCertMaker {&lt;br /&gt;
  to makeFrom(cert :String) :any {&lt;br /&gt;
    def issuer := null   // will be filled in by th cert parsing code&lt;br /&gt;
    def code :EExpr := e`$code` // ditto&lt;br /&gt;
    // check here if signed by issuer as it is pretty expensive.&lt;br /&gt;
    def unsealer(box :any) :any {&lt;br /&gt;
      return getUnsealer(issuer).unseal(box)&lt;br /&gt;
    }&lt;br /&gt;
    def ActiveCapCert {&lt;br /&gt;
      to run(parameters :any) :any {&lt;br /&gt;
        def env := safeScope&lt;br /&gt;
        env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
        env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
        env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
        env with= (&amp;quot;ActiveCapCert__uriGetter&amp;quot;, ActiveCapCert__uriGetter)&lt;br /&gt;
        if (issuer == vatId) {&lt;br /&gt;
          env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
        }&lt;br /&gt;
        return code.eval(env)&lt;br /&gt;
      }  &lt;br /&gt;
      to getSigner() :ActiveCapCertPrincipal {&lt;br /&gt;
        return issuer&lt;br /&gt;
      }&lt;br /&gt;
      to getCode() :EExpr {&lt;br /&gt;
        return code&lt;br /&gt;
      }&lt;br /&gt;
      to __optUncall() :Portrayal {&lt;br /&gt;
        return [ActiveCapCert__uriGetter, &amp;quot;get&amp;quot;, [cert]]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return ActiveCapCert&lt;br /&gt;
  }&lt;br /&gt;
  to makeCert(code :EExpr, authorizedParties :List(ActiveCapCertPrincipal)) :String {&lt;br /&gt;
&lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
bind ActiveCapCert__uriGetter {&lt;br /&gt;
  to get(str :String) :any { return ActiveCapCertMaker(str) }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Wed, 05 Jan 2011 12:30:58 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>User:Zarutian</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;... and removed the url I needed to keep.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Instead of trying to keep multiple wiki user pages in sync I just point to one&lt;br /&gt;
http://wiki.tcl.tk/Zarutian&lt;br /&gt;
&lt;br /&gt;
Links to varius pages I am working on:&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian/Authorization Certificates]]&lt;br /&gt;
&lt;br /&gt;
[[Capability-based Active Invocation Certificates]]&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian/Smallcaps]]&lt;/div&gt;</description>
			<pubDate>Tue, 07 Dec 2010 23:02:10 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian</comments>		</item>
		<item>
			<title>User:Zarutian</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;needed to keep a url temporarly&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Instead of trying to keep multiple wiki user pages in sync I just point to one&lt;br /&gt;
http://wiki.tcl.tk/Zarutian&lt;br /&gt;
&lt;br /&gt;
Links to varius pages I am working on:&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian/Authorization Certificates]]&lt;br /&gt;
&lt;br /&gt;
[[Capability-based Active Invocation Certificates]]&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian/Smallcaps]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- extra junk http://9gag.com/gag/54880/ --&amp;gt;&lt;/div&gt;</description>
			<pubDate>Tue, 07 Dec 2010 22:04:48 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian</comments>		</item>
		<item>
			<title>Talk:/Talk:Surprise list</title>
			<link>http://ds7.deltamobile.com/wiki/Talk:/Talk:Surprise_list</link>
			<guid>http://ds7.deltamobile.com/wiki/Talk:/Talk:Surprise_list</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Protected &amp;quot;Talk:/Talk:Surprise list&amp;quot;: Attracts spam for some reason. [edit=autoconfirmed:move=autoconfirmed]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{junk-inhibitor}}&lt;/div&gt;</description>
			<pubDate>Fri, 26 Nov 2010 16:54:52 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:/Talk:Surprise_list</comments>		</item>
		<item>
			<title>Talk:/Talk:Surprise list</title>
			<link>http://ds7.deltamobile.com/wiki/Talk:/Talk:Surprise_list</link>
			<guid>http://ds7.deltamobile.com/wiki/Talk:/Talk:Surprise_list</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;{{junk-inhibitor}}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{junk-inhibitor}}&lt;/div&gt;</description>
			<pubDate>Fri, 26 Nov 2010 16:53:37 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:/Talk:Surprise_list</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */ 6th edit in editsstream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def ActiveCapCert__uriGetter&lt;br /&gt;
def ActiveCapCertMaker(cert :String) :any {&lt;br /&gt;
  def issuer := null   // will be filled in by th cert parsing code&lt;br /&gt;
  def code :EExpr := e`$code` // ditto&lt;br /&gt;
  // check here if signed by issuer as it is pretty expensive.&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  def ActiveCapCert {&lt;br /&gt;
    to run(parameters :any) :any {&lt;br /&gt;
      def env := safeScope&lt;br /&gt;
      env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
      env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
      env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
      env with= (&amp;quot;ActiveCapCert__uriGetter&amp;quot;, ActiveCapCert__uriGetter)&lt;br /&gt;
      if (issuer == vatId) {&lt;br /&gt;
        env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
      }&lt;br /&gt;
      return code.eval(env)&lt;br /&gt;
    }&lt;br /&gt;
    to getSigner() :ActiveCapCertSigner {&lt;br /&gt;
      return issuer&lt;br /&gt;
    }&lt;br /&gt;
    to getCode() :EExpr {&lt;br /&gt;
      return code&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :Portrayal {&lt;br /&gt;
      return [ActiveCapCert__uriGetter, &amp;quot;get&amp;quot;, [cert]]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ActiveCapCert&lt;br /&gt;
}&lt;br /&gt;
bind ActiveCapCert__uriGetter {&lt;br /&gt;
  to get(str :String) :any { return ActiveCapCertMaker(str) }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Sat, 30 Oct 2010 14:47:21 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def ActiveCapCert__uriGetter&lt;br /&gt;
def ActiveCapCertMaker(cert :String) :any {&lt;br /&gt;
  def issuer := null   // will be filled in by th cert parsing code&lt;br /&gt;
  def code :EExpr := e`$code` // ditto&lt;br /&gt;
  // check here if signed by issuer as it is pretty expensive.&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  def ActiveCapCert {&lt;br /&gt;
    to run(parameters :any) :any {&lt;br /&gt;
      def env := safeScope&lt;br /&gt;
      env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
      env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
      env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
      env with= (&amp;quot;ActiveCapCert__uriGetter&amp;quot;, ActiveCapCert__uriGetter)&lt;br /&gt;
      if (issuer == vatId) {&lt;br /&gt;
        env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
      }&lt;br /&gt;
      return code.eval(env)&lt;br /&gt;
    }&lt;br /&gt;
    to getSigner() :ActiveCapCertSigner {&lt;br /&gt;
      return issuer&lt;br /&gt;
    }&lt;br /&gt;
    to getCode() :EExpr {&lt;br /&gt;
      return code&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :Portrayal {&lt;br /&gt;
      return [ActiveCapCert__uriGetter, &amp;quot;get&amp;quot;, [cert]]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ActiveCapCert&lt;br /&gt;
}&lt;br /&gt;
bind ActiveCapCert__uriGetter {&lt;br /&gt;
  to get(str :String) :any { return ActiveCapCertMaker(str) }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Sat, 30 Oct 2010 14:46:03 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */ 5th edit in edits stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def ActiveCapCert__uriGetter&lt;br /&gt;
def ActiveCapCertMaker(cert :String) :any {&lt;br /&gt;
  def issuer := null   // will be filled in by th cert parsing code&lt;br /&gt;
  def code :EExpr := e`$code` // ditto&lt;br /&gt;
  // check here if signed by issuer as it is pretty expensive.&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  def ActiveCapCert {&lt;br /&gt;
    to run(parameters :any) :any {&lt;br /&gt;
      def env := safeScope&lt;br /&gt;
      env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
      env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
      env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
      env with= (&amp;quot;ActiveCapCert__uriGetter&amp;quot;, ActiveCapCert__uriGetter)&lt;br /&gt;
      if (issuer == vatId) {&lt;br /&gt;
        env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
      }&lt;br /&gt;
      return code.eval(env)&lt;br /&gt;
    }&lt;br /&gt;
    to getSigner() :ActiveCapCertSigner { throw(&amp;quot;Not yet implemented&amp;quot;) }}&lt;br /&gt;
    to getCode() :EExpr {&lt;br /&gt;
      return code&lt;br /&gt;
    }&lt;br /&gt;
    to __optUncall() :Portrayal {&lt;br /&gt;
      return [ActiveCapCert__uriGetter, &amp;quot;get&amp;quot;, [cert]]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ActiveCapCert&lt;br /&gt;
}&lt;br /&gt;
bind ActiveCapCert__uriGetter {&lt;br /&gt;
  to get(str :String) :any { return ActiveCapCertMaker(str) }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Sat, 30 Oct 2010 14:44:07 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */ 4th edit in edits stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def ActiveCapCert__uriGetter&lt;br /&gt;
def ActiveCapCertMaker(cert :String) :any {&lt;br /&gt;
  def issuer := null   // will be filled in by th cert parsing code&lt;br /&gt;
  def code :EExpr := e`$code` // ditto&lt;br /&gt;
  // check if signed by issuer&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  def ActiveCapCert {&lt;br /&gt;
    to run(parameters :any) :any {&lt;br /&gt;
      def env := safeScope&lt;br /&gt;
      env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
      env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
      env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
      if (issuer == vatId) {&lt;br /&gt;
        env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
      }&lt;br /&gt;
      return code.eval(env)&lt;br /&gt;
    }&lt;br /&gt;
    to getSigner() :ActiveCapCertSigner { throw(&amp;quot;Not yet implemented&amp;quot;) }}&lt;br /&gt;
    to getCode() :EExpr {&lt;br /&gt;
      return code&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ActiveCapCert&lt;br /&gt;
}&lt;br /&gt;
bind ActiveCapCert__uriGetter {&lt;br /&gt;
  to get(str :String) :any { return ActiveCapCertMaker(str) }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Sat, 30 Oct 2010 14:36:52 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */ 3rd edit in edits stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def ActiveCapCertMaker(cert :String) :any {&lt;br /&gt;
  def issuer := null   // will be filled in by th cert parsing code&lt;br /&gt;
  def code :EExpr := e`$code` // ditto&lt;br /&gt;
  // check if signed by issuer&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  def ActiveCapCert {&lt;br /&gt;
    to run(parameters :any) :any {&lt;br /&gt;
      def env := safeScope&lt;br /&gt;
      env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
      env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
      env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
      if (issuer == vatId) {&lt;br /&gt;
        env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
      }&lt;br /&gt;
      return code.eval(env)&lt;br /&gt;
    }&lt;br /&gt;
    to getSigner() :ActiveCapCertSigner { throw(&amp;quot;Not yet implemented&amp;quot;) }}&lt;br /&gt;
    to getCode() :EExpr {&lt;br /&gt;
      return code&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ActiveCapCert&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Sat, 30 Oct 2010 14:33:31 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */ 2nd edit in edits stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def ActiveCapCertMaker(cert :String) :any {&lt;br /&gt;
  def issuer := null // will be filled in by th cert parsing code&lt;br /&gt;
  def code := null   // ditto&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  def ActiveCapCert {&lt;br /&gt;
    to run(parameters :any) :any {&lt;br /&gt;
      def env := safeScope&lt;br /&gt;
      env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
      env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
      env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
      return code.eval(env)&lt;br /&gt;
    }&lt;br /&gt;
    to getSigner() :ActiveCapCertSigner {}&lt;br /&gt;
    to getCode() :EExpr {}&lt;br /&gt;
  }&lt;br /&gt;
  return ActiveCapCert&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// - older code bellow, will be deleted&lt;br /&gt;
def getSigner(certificate :String) :String {&lt;br /&gt;
  throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
def getCodeOfCert(certificate :String) :EExpr {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return e`$code`&lt;br /&gt;
}&lt;br /&gt;
def signedBy(certificate :String, signer :String) :Bool {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return false&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :String) :any {&lt;br /&gt;
&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(signedBy(certificate, issuer)) {&lt;br /&gt;
    throw(&amp;quot;Certificate not signed by its stated issuer&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
  return getCodeOfCert(certificate).eval(env)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Sat, 30 Oct 2010 14:27:41 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */  Edits stream start&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def ActiveCapCertMaker(cert :String) :any {&lt;br /&gt;
  def ActiveCapCert {&lt;br /&gt;
    to run() {}&lt;br /&gt;
    to getSigner() :ActiveCapCertSigner {}&lt;br /&gt;
    to getCode() :EExpr {}&lt;br /&gt;
    to signedBy(signer :ActiveCapCertSigner) :bool {}&lt;br /&gt;
  }&lt;br /&gt;
  return ActiveCapCert&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// - older code bellow, will be deleted&lt;br /&gt;
def getSigner(certificate :String) :String {&lt;br /&gt;
  throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
def getCodeOfCert(certificate :String) :EExpr {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return e`$code`&lt;br /&gt;
}&lt;br /&gt;
def signedBy(certificate :String, signer :String) :Bool {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return false&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :String) :any {&lt;br /&gt;
  def issuer := getSigner(certificate)&lt;br /&gt;
  def env := safeScope&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(signedBy(certificate, issuer)) {&lt;br /&gt;
    throw(&amp;quot;Certificate not signed by its stated issuer&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
  return getCodeOfCert(certificate).eval(env)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Sat, 30 Oct 2010 14:18:46 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def getSigner(certificate :String) :String {&lt;br /&gt;
  throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
def getCodeOfCert(certificate :String) :EExpr {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return e`$code`&lt;br /&gt;
}&lt;br /&gt;
def signedBy(certificate :String, signer :String) :Bool {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return false&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :String) :any {&lt;br /&gt;
  def issuer := getSigner(certificate)&lt;br /&gt;
  def env := safeScope&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  env with= (&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  env with= (&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  env with= (&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    env with= (&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(signedBy(certificate, issuer)) {&lt;br /&gt;
    throw(&amp;quot;Certificate not signed by its stated issuer&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
  return getCodeOfCert(certificate).eval(env)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Sun, 03 Oct 2010 01:13:05 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def getSigner(certificate :String) :String {&lt;br /&gt;
  throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
def getCodeOfCert(certificate :String) :EExpr {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return e`$code`&lt;br /&gt;
}&lt;br /&gt;
def signedBy(certificate :String, signer :String) :Bool {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return false&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :String) :any {&lt;br /&gt;
  def issuer := getSigner(certificate)&lt;br /&gt;
  def env := safeScope.diverge()&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  env.add(&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  env.add(&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  env.add(&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    env.add(&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(signedBy(certificate, issuer)) {&lt;br /&gt;
    throw(&amp;quot;Certificate not signed by its stated issuer&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
  return getCodeOfCert(certificate).eval(env)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Fri, 24 Sep 2010 11:51:42 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */  added a enumeration of possible usages.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def getSigner(certificate :String) :String {&lt;br /&gt;
  throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
def getCodeOfCert(certificate :String) :EExpr {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return e`$code`&lt;br /&gt;
}&lt;br /&gt;
def signedBy(certificate :String, signer :String) :Bool {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return false&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :String) :any {&lt;br /&gt;
  def issuer := getSigner(certificate)&lt;br /&gt;
  def env := safeScope.diverge()&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  env.add(&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  env.add(&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  env.add(&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    env.add(&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(signedBy(certificate, issuer)) {&lt;br /&gt;
    throw(&amp;quot;Certificate not signed by its stated issuer&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
  return getCodeOfCert(certificate).eval(env)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible usages:&lt;br /&gt;
&lt;br /&gt;
1. On a CapTP connection (the messages from the sending vat are treated like they were signed by that vat).&lt;br /&gt;
2. A chain of simple authorization certs.&lt;br /&gt;
3. A tree of embedded such chains.&lt;br /&gt;
4. A symbolon style of authorizations. (Alice gets an authroization/active cert from Bob that can only be used if Carol gives Alice an authroization/active cert that gives the former cert authority which is given (and possibly attenuated) onward to Alice)&lt;br /&gt;
5. In a PostalRef scenario. (PostalRefs are offline like SturdyRefs but you can send it eventual sends which will then be written out as authroization/active cert(s))&lt;br /&gt;
6. In an authenticated save style (Like in Blizzards Diablo I Battle.net only that any tampering with the save file invalidates it) ( perhaps usefull in scenarious where elib.serial is used).&lt;/div&gt;</description>
			<pubDate>Fri, 24 Sep 2010 11:51:09 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Talk:Walnut/Secure Distributed Computing/index.php</title>
			<link>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/index.php</link>
			<guid>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/index.php</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Protected &amp;quot;Talk:Walnut/Secure Distributed Computing/index.php&amp;quot;: Attracts too much spam [edit=autoconfirmed:move=autoconfirmed]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{junk-inhibitor}}&lt;/div&gt;</description>
			<pubDate>Mon, 13 Sep 2010 16:59:33 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/index.php</comments>		</item>
		<item>
			<title>Talk:Walnut/Secure Distributed Computing/index.php</title>
			<link>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/index.php</link>
			<guid>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/index.php</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Junk Inhibitor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{junk-inhibitor}}&lt;/div&gt;</description>
			<pubDate>Mon, 13 Sep 2010 16:58:22 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/index.php</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;edit 5 in editstream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(wholeNum numOfFields, wholeNum scriptIndex) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash|dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;br /&gt;
&lt;br /&gt;
http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head%3A/src/vm.c&lt;br /&gt;
&lt;br /&gt;
See also http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsEncoder.java?view=markup&lt;br /&gt;
&lt;br /&gt;
And http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsOps.java?view=markup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  # A Tcl procedure that decodes smallcaps bytecode stream&lt;br /&gt;
  proc decode_smallcaps {input} {&lt;br /&gt;
    set output [list]&lt;br /&gt;
    set op [read_byte]&lt;br /&gt;
    switch -exact -- $op {&lt;br /&gt;
      &amp;quot;\x01&amp;quot; { lappend output [list OP_DUP] }&lt;br /&gt;
      &amp;quot;\x02&amp;quot; { lappend output [list OP_POP] }&lt;br /&gt;
      &amp;quot;\x03&amp;quot; { lappend output [list OP_SWAP] }&lt;br /&gt;
      &amp;quot;\x04&amp;quot; { lappend output [list OP_ROT] }&lt;br /&gt;
      &amp;quot;\x05&amp;quot; { lappend output [list [list OP_UNDERDUP OP_RETURN]] }&lt;br /&gt;
      &amp;quot;\x06&amp;quot; { lappend output [list [list OP_RETURN {}]] }&lt;br /&gt;
      &amp;quot;\x07&amp;quot; { lappend output [list unused_bytecode 1] }&lt;br /&gt;
      &amp;quot;\x08&amp;quot; { lappend output [list OP_JUMP [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x09&amp;quot; { lappend output [list OP_BRANCH] }&lt;br /&gt;
      &amp;quot;\x0a&amp;quot; { lappend output [list OP_CALL_ONLY [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0b&amp;quot; { lappend output [list OP_CALL [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0c&amp;quot; { lappend output [list OP_SEND_ONLY [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0d&amp;quot; { lappend output [list OP_SEND [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0e&amp;quot; { lappend output [list OP_EJECTOR_ONLY [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0f&amp;quot; { lappend output [list OP_EJECTOR [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x10&amp;quot; { lappend output [list OP_TRY [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x11&amp;quot; { lappend output [list OP_UNWIND [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x12&amp;quot; { lappend output [list OP_ENDHANDLER] }&lt;br /&gt;
      &amp;quot;\x13&amp;quot; { lappend output [list unused_bytecode 2] }&lt;br /&gt;
      &amp;quot;\x14&amp;quot; { lappend output [list unused_bytecode 3] }&lt;br /&gt;
      &amp;quot;\x15&amp;quot; { lappend output [list unused_bytecode 4] }&lt;br /&gt;
      &amp;quot;\x16&amp;quot; { lappend output [list OP_WHOLENUM [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x17&amp;quot; { lappend output [list OP_NEG_INT [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x18&amp;quot; { lappend output [list OP_FLOAT64 [read_float64]] }&lt;br /&gt;
      &amp;quot;\x19&amp;quot; { lappend output [list OP_CHAR [read_char]] }&lt;br /&gt;
      &amp;quot;\x1a&amp;quot; { lappend output [list OP_STRING [read_string]] }&lt;br /&gt;
      &amp;quot;\x1b&amp;quot; { lappend output [list OP_TWINE ???unknown_arity???]] }&lt;br /&gt;
      &amp;quot;\x1c&amp;quot; { lappend output [list OP_TRUE]] }&lt;br /&gt;
      &amp;quot;\x1d&amp;quot; { lappend output [list OP_FALSE]] }&lt;br /&gt;
      &amp;quot;\x1e&amp;quot; { lappend output [list OP_NULL]] }&lt;br /&gt;
      &amp;quot;\x1f&amp;quot; { lappend output [list OP_SCOPE]] }&lt;br /&gt;
      &amp;quot;\x20&amp;quot; { lappend output [list OP_OBJECT [read_wholeNum] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x21&amp;quot; { lappend output [list OP_LIST_PATT [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x22&amp;quot; { lappend output [list OP_LIST_PATT_ONLY [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x23&amp;quot; { lappend output [list OP_CDR_PATT [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x24&amp;quot; { lappend output [list OP_CDR_PATT_ONLY [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x25&amp;quot; { lappend output [list unused_bytecode 5]] }&lt;br /&gt;
      &amp;quot;\x26&amp;quot; { lappend output [list unused_bytecode 6]] }&lt;br /&gt;
      &amp;quot;\x27&amp;quot; { lappend output [list unused_bytecide 7]] }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return $output&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 09 Sep 2010 12:14:10 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;edit 4 in editstream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(wholeNum numOfFields, wholeNum scriptIndex) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash|dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;br /&gt;
&lt;br /&gt;
http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head%3A/src/vm.c&lt;br /&gt;
&lt;br /&gt;
See also http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsEncoder.java?view=markup&lt;br /&gt;
&lt;br /&gt;
And http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsOps.java?view=markup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
  # A Tcl procedure that decodes smallcaps bytecode stream&lt;br /&gt;
  proc decode_smallcaps {input} {&lt;br /&gt;
    set output [list]&lt;br /&gt;
    set op [read_byte]&lt;br /&gt;
    switch -exact -- $op {&lt;br /&gt;
      &amp;quot;\x01&amp;quot; { lappend output [list OP_DUP] }&lt;br /&gt;
      &amp;quot;\x02&amp;quot; { lappend output [list OP_POP] }&lt;br /&gt;
      &amp;quot;\x03&amp;quot; { lappend output [list OP_SWAP] }&lt;br /&gt;
      &amp;quot;\x04&amp;quot; { lappend output [list OP_ROT] }&lt;br /&gt;
      &amp;quot;\x05&amp;quot; { lappend output [list [list OP_UNDERDUP OP_RETURN]] }&lt;br /&gt;
      &amp;quot;\x06&amp;quot; { lappend output [list [list OP_RETURN {}]] }&lt;br /&gt;
      &amp;quot;\x07&amp;quot; { lappend output [list unused_bytecode 1] }&lt;br /&gt;
      &amp;quot;\x08&amp;quot; { lappend output [list OP_JUMP [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x09&amp;quot; { lappend output [list OP_BRANCH] }&lt;br /&gt;
      &amp;quot;\x0a&amp;quot; { lappend output [list OP_CALL_ONLY [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0b&amp;quot; { lappend output [list OP_CALL [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0c&amp;quot; { lappend output [list OP_SEND_ONLY [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0d&amp;quot; { lappend output [list OP_SEND [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0e&amp;quot; { lappend output [list OP_EJECTOR_ONLY [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0f&amp;quot; { lappend output [list OP_EJECTOR [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x10&amp;quot; { lappend output [list OP_TRY [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x11&amp;quot; { lappend output [list OP_UNWIND [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x12&amp;quot; { lappend output [list OP_ENDHANDLER] }&lt;br /&gt;
      &amp;quot;\x13&amp;quot; { lappend output [list unused_bytecode 2] }&lt;br /&gt;
      &amp;quot;\x14&amp;quot; { lappend output [list unused_bytecode 3] }&lt;br /&gt;
      &amp;quot;\x15&amp;quot; { lappend output [list unused_bytecode 4] }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return $output&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 09 Sep 2010 11:53:56 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;edit 3 in editstream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(wholeNum numOfFields, wholeNum scriptIndex) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash|dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;br /&gt;
&lt;br /&gt;
http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head%3A/src/vm.c&lt;br /&gt;
&lt;br /&gt;
See also http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsEncoder.java?view=markup&lt;br /&gt;
&lt;br /&gt;
And http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsOps.java?view=markup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  # A Tcl procedure that decodes smallcaps bytecode stream&lt;br /&gt;
  proc decode_smallcaps {input} {&lt;br /&gt;
    set output [list]&lt;br /&gt;
    set op [read_byte]&lt;br /&gt;
    switch -exact -- $op {&lt;br /&gt;
      &amp;quot;\x01&amp;quot; { lappend output [list OP_DUP] }&lt;br /&gt;
      &amp;quot;\x02&amp;quot; { lappend output [list OP_POP] }&lt;br /&gt;
      &amp;quot;\x03&amp;quot; { lappend output [list OP_SWAP] }&lt;br /&gt;
      &amp;quot;\x04&amp;quot; { lappend output [list OP_ROT] }&lt;br /&gt;
      &amp;quot;\x05&amp;quot; { lappend output [list [list OP_UNDERDUP OP_RETURN]] }&lt;br /&gt;
      &amp;quot;\x06&amp;quot; { lappend output [list [list OP_RETURN {}]] }&lt;br /&gt;
      &amp;quot;\x07&amp;quot; { lappend output [list unused_bytecode 1] }&lt;br /&gt;
      &amp;quot;\x08&amp;quot; { lappend output [list OP_JUMP [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x09&amp;quot; { lappend output [list OP_BRANCH] }&lt;br /&gt;
      &amp;quot;\x0a&amp;quot; { lappend output [list OP_CALL_ONLY [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0b&amp;quot; { lappend output [list OP_CALL [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0c&amp;quot; { lappend output [list OP_SEND_ONLY [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0d&amp;quot; { lappend output [list OP_SEND [read_string] [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0e&amp;quot; { lappend output [list OP_EJECTOR_ONLY [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x0f&amp;quot; { lappend output [list OP_EJECTOR [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x10&amp;quot; { lappend output [list OP_TRY [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x11&amp;quot; { lappend output [list OP_UNWIND [read_wholeNum]] }&lt;br /&gt;
      &amp;quot;\x12&amp;quot; { lappend output [list OP_ENDHANDLER] }&lt;br /&gt;
      &amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return $output&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 09 Sep 2010 11:50:34 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;edit 2 in editstream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(wholeNum numOfFields, wholeNum scriptIndex) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash|dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;br /&gt;
&lt;br /&gt;
http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head%3A/src/vm.c&lt;br /&gt;
&lt;br /&gt;
See also http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsEncoder.java?view=markup&lt;br /&gt;
&lt;br /&gt;
And http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsOps.java?view=markup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  # A Tcl procedure that decodes smallcaps bytecode stream&lt;br /&gt;
  proc decode_smallcaps {input} {&lt;br /&gt;
    set output [list]&lt;br /&gt;
    set op [read_byte]&lt;br /&gt;
    switch -exact -- $op {&lt;br /&gt;
      &amp;quot;\x01&amp;quot; { lappend output [list OP_DUP] }&lt;br /&gt;
      &amp;quot;\x02&amp;quot; { lappend output [list OP_POP] }&lt;br /&gt;
      &amp;quot;\x03&amp;quot; { lappend output [list OP_SWAP] }&lt;br /&gt;
      &amp;quot;\x04&amp;quot; { lappend output [list OP_ROT] }&lt;br /&gt;
      &amp;quot;\x05&amp;quot; { lappend output [list [list OP_UNDERDUP OP_RETURN]] }&lt;br /&gt;
      &amp;quot;\x06&amp;quot; { lappend output [list [list OP_RETURN {}]] }&lt;br /&gt;
      &amp;quot;\x07&amp;quot; { lappend output [list unused_bytecode 1] }&lt;br /&gt;
      &amp;quot;\x08&amp;quot; { lappend output [list OP_JUMP [read_wholeNum]] }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return $output&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 09 Sep 2010 11:38:07 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Starting edits stream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(&amp;lt;metanote: missing&amp;gt;) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash|dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;br /&gt;
&lt;br /&gt;
http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head%3A/src/vm.c&lt;br /&gt;
&lt;br /&gt;
See also http://epan.cvs.sourceforge.net/viewvc/epan/epan/lib/smallcaps/org/erights/e/elang/smallcaps/SmallcapsEncoder.java?view=markup&lt;/div&gt;</description>
			<pubDate>Thu, 09 Sep 2010 11:20:20 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[[User:Zarutian|Zarutian]] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def getSigner(certificate :String) :String {&lt;br /&gt;
  throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
def getCodeOfCert(certificate :String) :EExpr {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return e`$code`&lt;br /&gt;
}&lt;br /&gt;
def signedBy(certificate :String, signer :String) :Bool {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return false&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :String) :any {&lt;br /&gt;
  def issuer := getSigner(certificate)&lt;br /&gt;
  def env := safeScope.diverge()&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  env.add(&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  env.add(&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  env.add(&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    env.add(&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(signedBy(certificate, issuer)) {&lt;br /&gt;
    throw(&amp;quot;Certificate not signed by its stated issuer&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
  return getCodeOfCert(certificate).eval(env)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</description>
			<pubDate>Sat, 03 Jul 2010 22:23:23 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Second attempt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[Zarutian] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap, does there exists any better way to do so?&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def shared_internal(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return shared_internal(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return shared_internal(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  // to be implemented&lt;br /&gt;
  // used by active certs issued by this vats public key.&lt;br /&gt;
  to get(str :String) :any {&lt;br /&gt;
    throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
def getSigner(certificate :String) :String {&lt;br /&gt;
  throw(&amp;quot;Not yet implemented&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
def getCodeOfCert(certificate :String) :EExpr {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return e`$code`&lt;br /&gt;
}&lt;br /&gt;
def signedBy(certificate :String, signer :String) :Bool {&lt;br /&gt;
  throw(&amp;quot;Not yet fully implemented&amp;quot;)&lt;br /&gt;
  return false&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :String) :any {&lt;br /&gt;
  def issuer := getSigner(certificate)&lt;br /&gt;
  def env := safeScope.diverge()&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  env.add(&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  env.add(&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  env.add(&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    env.add(&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(signedBy(certificate, issuer)) {&lt;br /&gt;
    throw(&amp;quot;Certificate not signed by its stated issuer&amp;quot;)&lt;br /&gt;
  }&lt;br /&gt;
  return getCodeOfCert(certificate).eval(env)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</description>
			<pubDate>Sat, 03 Jul 2010 22:22:15 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>E-on-CL</title>
			<link>http://ds7.deltamobile.com/wiki/E-on-CL</link>
			<guid>http://ds7.deltamobile.com/wiki/E-on-CL</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Reverted edits by 94.142.134.213 (Talk); changed back to last version by Kevin Reid&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an implementation of [[E|E programming language]] in Common Lisp.&lt;br /&gt;
&lt;br /&gt;
There are as yet no releases, but the source is available in a [http://subversion.tigris.org/ Subversion] repository:&lt;br /&gt;
&lt;br /&gt;
: http://switchb.org/svn/e/cl-e/trunk/&lt;br /&gt;
&lt;br /&gt;
==Status, Description==&lt;br /&gt;
&lt;br /&gt;
The full E language is implemented, by compilation to Common Lisp and execution by the underlying CL implementation. The libraries are incomplete.&lt;br /&gt;
&lt;br /&gt;
E-on-CL requires [[E-on-Java]] for:&lt;br /&gt;
* Support for the E parser (which is written in [http://www.antlr.org/ ANTLR].&lt;br /&gt;
* Parts of the library implementation (those &amp;lt;code&amp;gt;[[emaker]]&amp;lt;/code&amp;gt;s which are not different)&lt;br /&gt;
&lt;br /&gt;
There is Updoc and a REPL, written in CL.&lt;br /&gt;
&lt;br /&gt;
IO is limited to:&lt;br /&gt;
* Writing text to stdout and stderr.&lt;br /&gt;
* Reading and writing files as text from absolute pathnames.&lt;br /&gt;
* TCP sockets, as octets or a small selection of character encodings.&lt;br /&gt;
* Unsafely accessing the underlying Lisp system.&lt;br /&gt;
&lt;br /&gt;
===Differences from E-on-Java===&lt;br /&gt;
&lt;br /&gt;
Support for EIO and &amp;lt;code&amp;gt;DeepFrozen&amp;lt;/code&amp;gt; auditing.&lt;br /&gt;
&lt;br /&gt;
throw() and CatchExpr have been changed to reduce information leakage: see [[sealed throw]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;makeEProxyResolver&amp;lt;/code&amp;gt; is replaced with &amp;lt;code&amp;gt;[[makeProxy]]&amp;lt;/code&amp;gt;, a safer interface.&lt;br /&gt;
&lt;br /&gt;
Updoc does not ignore the return value of expressions when the updoc script omits them.&lt;br /&gt;
&lt;br /&gt;
==News==&lt;br /&gt;
&lt;br /&gt;
For major announcements, watch [http://www.eros-os.org/mailman/listinfo/e-lang the e-lang mailing list]. For individual changes to the repository, [http://cia.navi.cx/stats/project/e-on-cl E-on-CL is monitored on cia.navi.cx] which offers status pages, RSS feeds, and IRC messages.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
*A Common Lisp implementation.&amp;lt;p&amp;gt;E-on-CL is designed to be portable, but requires many nonstandard features for full operation. I use [http://www.sbcl.org/ SBCL], and therefore its support is the most complete. Other implementations E-on-CL includes some support for, roughly in order of completeness, are [http://ccl.clozure.com/ Clozure CL], [http://www.cons.org/cmucl/ CMUCL], [http://www.armedbear.org/abcl.html ABCL], [http://clisp.cons.org/ CLISP], [http://www.lispworks.com/downloads/index.html LispWorks], and [http://www.franz.com/downloads/trial.lhtml Allegro CL].  &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Whether E-on-CL works on any given implementation (other than SBCL) will vary as I make changes. If it doesn&amp;amp;rsquo;t run on an implementation you&amp;amp;rsquo;d like to use, please let me know and I&amp;amp;rsquo;ll see what can be done about it.&amp;lt;/p&amp;gt;&lt;br /&gt;
* The [http://www.cliki.net/asdf-install asdf-install]able libraries [http://www.cliki.net/bordeaux-threads bordeaux-threads], [http://www.cliki.net/cl-ppcre cl-ppcre], [http://www.cliki.net/cl-yacc cl-yacc], [http://www.cliki.net/cl-fad cl-fad], [http://www.cliki.net/genhash genhash], [http://www.cliki.net/rt rt], and [http://www.cliki.net/trivial-garbage trivial-garbage].&lt;br /&gt;
* An existing [http://www.erights.org/download/ E-on-Java] installation.&lt;br /&gt;
* One of either:&lt;br /&gt;
** the E-on-Java source distribution, placed at &amp;lt;code&amp;gt;&amp;lt;var&amp;gt;$EHOME&amp;lt;/var&amp;gt;/src&amp;lt;/code&amp;gt; ({{XXX|This is an inappropriate location}}), or&lt;br /&gt;
** the [http://www.cliki.net/asdf-install asdf-install]able libraries [http://www.cliki.net/ZIP ZIP] and [http://www.cliki.net/Salza Salza], which will be used to extract &amp;lt;code&amp;gt;.emaker&amp;lt;/code&amp;gt; files from &amp;lt;code&amp;gt;&amp;lt;var&amp;gt;$EHOME&amp;lt;/var&amp;gt;/e.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;perl&amp;lt;/code&amp;gt;, if you wish to use the standard startup script &amp;lt;code&amp;gt;clrune&amp;lt;/code&amp;gt; (equivalent to &amp;lt;code&amp;gt;rune&amp;lt;/code&amp;gt; in [[E-on-Java]].&lt;br /&gt;
&lt;br /&gt;
==Previous discussion / timeline==&lt;br /&gt;
&lt;br /&gt;
Posts from me on the e-lang list containing information about E-on-CL:&lt;br /&gt;
&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2004-December/010199.html 2004-12-11: Initial announcement]&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2004-December/010210.html Early technical notes on the compilation method]&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2004-December/010208.html Message dispatch and 'native' object definition]&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2004-December/010241.html 2004-12-20: Status update]&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2005-April/010563.html 2005-04-16: Repository available]&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2005-April/010567.html Portability, naming, and usage info]&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2005-April/010587.html More of the same]&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2005-May/010605.html 2005-05-14: Reply to MarkM's comments on the source]&lt;br /&gt;
# [http://www.eros-os.org/pipermail/e-lang/2005-June/010758.html 2005-06-25: Status update]&lt;br /&gt;
# {{XXX|Fill in more recent info here.}}&lt;br /&gt;
&lt;br /&gt;
[[Category:E implementations]]&lt;/div&gt;</description>
			<pubDate>Sat, 12 Jun 2010 12:44:19 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:E-on-CL</comments>		</item>
		<item>
			<title>Den</title>
			<link>http://ds7.deltamobile.com/wiki/Den</link>
			<guid>http://ds7.deltamobile.com/wiki/Den</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Reverted edits by 213.5.71.85 (Talk); changed back to last version by Zarutian&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; [http://den.cubik.org/ den.cubik.org] was once the official web site, but access to it was lost and this page is newer.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den is a distributed [[wikipedia:Multi-user dungeon|MUD]] system written in [[E]] by [[User:Kevin Reid|Kevin Reid]].&lt;br /&gt;
&lt;br /&gt;
It was last tested on [http://www.erights.org/download/0-8-26/ E 0.8.28e].&lt;br /&gt;
&lt;br /&gt;
The source code is available in a Subversion repository at &lt;br /&gt;
: http://switchb.org/svn/den/den/trunk/&lt;br /&gt;
&lt;br /&gt;
==What It Is==&lt;br /&gt;
&lt;br /&gt;
Den is/will be a peer-to-peer MUD system, theoretically supporting [[mutual suspicion]] between parts of its world.&lt;br /&gt;
&lt;br /&gt;
Den's world model is currently room-based, insofar as it cares. I hope to eventually support coordinate systems and graphical UI &amp;amp;mdash; possibly losing the text UI &amp;amp;mdash; but not yet.&lt;br /&gt;
&lt;br /&gt;
Den is definitely not useful or &amp;amp;lsquo;interesting&amp;amp;rsquo; (other than being written in E, perhaps) yet. It is only an experiment in using E. It may or may not eventually become something more widely useful.&lt;br /&gt;
&lt;br /&gt;
==How to use it==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;rune -cpa src/ src/org/cubik/den/boot/den.e-awt&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
; First run:&lt;br /&gt;
: '''&amp;lt;code&amp;gt;-save &amp;lt;var&amp;gt;&amp;amp;lt;filename&amp;amp;gt;&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;&amp;amp;lt;yourNickname&amp;amp;gt;&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;'''&lt;br /&gt;
; Further runs:&lt;br /&gt;
: '''&amp;lt;code&amp;gt;-restore &amp;lt;var&amp;gt;&amp;amp;lt;filename&amp;amp;gt;&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;'''&lt;br /&gt;
; Non-persistent:&lt;br /&gt;
: '''&amp;lt;code&amp;gt;-once &amp;lt;var&amp;gt;&amp;amp;lt;yourNickname&amp;amp;gt;&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
(You may need to increase the JVM's maximum heap or stack size. For Mac OS X, specify '''&amp;lt;code&amp;gt;-J-Xmx500m -J-XX:ThreadStackSize=10240&amp;lt;/code&amp;gt;''' before the other arguments to &amp;lt;code&amp;gt;rune&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Three windows will be opened.&lt;br /&gt;
&lt;br /&gt;
The narrow one at the top contains commands for performing a checkpoint and some other systemwide functions.&lt;br /&gt;
&lt;br /&gt;
A checkpoint will be performed when this window is closed (which also stops the program), or via the &amp;amp;ldquo;Save&amp;amp;rdquo; command in its World menu.&lt;br /&gt;
&lt;br /&gt;
The second is the inspector, which lets you view and manipulate the state of objects making up the world. The &amp;lt;code&amp;gt;&amp;amp;lt;world&amp;amp;gt;&amp;lt;/code&amp;gt; object has a name &amp;lt;code&amp;gt;=&amp;amp;gt;&amp;lt;/code&amp;gt; object mapping for convenience in accessing important objects, and also lists all SturdyRefs currently existing, since they may need to be manually deleted. (This UI is clearly poor and I hope to replace it with something better soon.)&lt;br /&gt;
&lt;br /&gt;
The third (to the right or overlapping the inspector) is the terminal, with which you control a character in text-mud style.&lt;br /&gt;
&lt;br /&gt;
(The default world's &amp;amp;ldquo;&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;&amp;amp;rdquo; exit is a locked door, and to go through it you need to use the command &amp;amp;ldquo;'''&amp;lt;code&amp;gt;go 'in' with key&amp;lt;/code&amp;gt;'''&amp;amp;rdquo;. (I need to write some documentation for the commands&amp;amp;mdash;for now, see &amp;lt;code&amp;gt;org/cubik/den/ui/makeCommandInterpreter.emaker&amp;lt;/code&amp;gt;.))&lt;br /&gt;
&lt;br /&gt;
===Setting up cross-vat travel:===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In the inspector window, select &amp;amp;ldquo;Sturdy Entrance&amp;amp;rdquo; from the &amp;amp;ldquo;Make&amp;amp;rdquo; menu. Choose the room which it will lead to, the name by which it will be known for later editing, and the message shown in that room when something arrives through it. Click Create.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Copy the &amp;lt;code&amp;gt;cap://&amp;lt;/code&amp;gt; URI from the resulting window.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In the other world/vat/Den-instance, select &amp;amp;ldquo;Exit&amp;amp;rdquo; from the &amp;amp;ldquo;Make&amp;amp;rdquo; menu. Choose the room in which it will be placed, the name in that room, and the message when something uses that exit. Select &amp;amp;ldquo;Far&amp;amp;rdquo; and paste in the &amp;lt;code&amp;gt;cap://&amp;lt;/code&amp;gt; URI from step 2. Click Create.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat the above procedure to create an exit for the other direction.&lt;br /&gt;
&lt;br /&gt;
[[Category:Applications]]&lt;/div&gt;</description>
			<pubDate>Thu, 03 Jun 2010 18:19:41 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Den</comments>		</item>
		<item>
			<title>Talk:/w/w/index.php</title>
			<link>http://ds7.deltamobile.com/wiki/Talk:/w/w/index.php</link>
			<guid>http://ds7.deltamobile.com/wiki/Talk:/w/w/index.php</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{junk-inhibitor}}&lt;/div&gt;</description>
			<pubDate>Mon, 31 May 2010 14:46:39 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:/w/w/index.php</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second attempt ==&lt;br /&gt;
[Zarutian] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def unnamed1(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return unnamed1(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return unnamed1(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  to get(str :String) :any {}&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :activecertificate) :any {&lt;br /&gt;
  def issuer := certificate.getSigner()&lt;br /&gt;
  def scope := safeScope.diverge()&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  scope.add(&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  scope.add(&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  scope.add(&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    scope.add(&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(certificate.signedBy(issuer)) {&lt;br /&gt;
    // error! abort.&lt;br /&gt;
    return null&lt;br /&gt;
  }&lt;br /&gt;
  return certificate.getContents().toEterm().evalWith(scope)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</description>
			<pubDate>Sat, 10 Apr 2010 23:52:22 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Hash upgradability</title>
			<link>http://ds7.deltamobile.com/wiki/Hash_upgradability</link>
			<guid>http://ds7.deltamobile.com/wiki/Hash_upgradability</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;E integers have the operation [[Integer#cryptoHash/0|cryptoHash/0]] which performs a SHA-1 hash on the two's complement representation of the number. This will be an unfortunate permanent choice once SHA-1 is broken.&lt;br /&gt;
&lt;br /&gt;
We should switch to an interface which acknowledges the need for hash algorithm upgrade.&lt;br /&gt;
&lt;br /&gt;
—[[User:Kevin Reid|Kevin Reid]] 17:30, 29 August 2009 (CDT)&lt;br /&gt;
&lt;br /&gt;
==Proposals==&lt;br /&gt;
&lt;br /&gt;
* Simple: rename cryptoHash to sha1Hash. Add other algorithms as desired. --[[User:Kevin Reid|Kevin Reid]] 17:30, 29 August 2009 (CDT)&lt;br /&gt;
:Disadvantage of this: Does not allow code to be sensibly generic over hash algorithms without taking an arbitrary verb to call on Integer. --[[User:Kevin Reid|Kevin Reid]] 17:30, 29 August 2009 (CDT)&lt;br /&gt;
&lt;br /&gt;
* Define explicit hash algorithm objects, and provide a standard one which is SHA-1. Also add a provision to ask for the current recommended hash algorithm.&lt;br /&gt;
**Simple: Hash function which takes and returns integers, just extracting the current cryptoHash/0 facility. --[[User:Kevin Reid|Kevin Reid]] 18:09, 29 August 2009 (CDT)&lt;br /&gt;
**Complex: Also take the opportunity to handle (1) hash large data blocks or streams without turning them into integers first and (2) permit returning an array of octets rather than a big integer as the result, when this is more directly useful. See [[HashAlgorithm]] for a proposed protocol. --[[User:Kevin Reid|Kevin Reid]] 18:09, 29 August 2009 (CDT)&lt;br /&gt;
::I support that proposal as it promotes decaupling --[[User:Zarutian|Zarutian]] 11:49, 10 April 2010 (CDT)&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
Designation of hash algorithms by programs, if part of the solution to this issue, should use some sort of well-defined namespace. See [http://groups.google.com/group/friam/browse_frm/thread/76b2a1dc8e72ae4b/e2014c634b1db4c7?#e2014c634b1db4c7 this friam list thread: Apr 2, 2010] for discussion. David Hopwood's [http://www.users.zetnet.co.uk/hopwood/crypto/scan/ Standard Cryptographic Algorithm Naming] is the right sort of thing, but not being maintained.&lt;br /&gt;
&lt;br /&gt;
[[Category:Unresolved design issues]]&lt;/div&gt;</description>
			<pubDate>Sat, 10 Apr 2010 16:49:31 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Hash_upgradability</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Complete concrete syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_sign(concat(issuer script), issuer.privatekey)&lt;br /&gt;
  &lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Zarutian] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def unnamed1(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return unnamed1(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return unnamed1(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  to get(str :String) :any {}&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :activecertificate) :any {&lt;br /&gt;
  def issuer := certificate.getSigner()&lt;br /&gt;
  def scope := safeScope.diverge()&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  scope.add(&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  scope.add(&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  scope.add(&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    scope.add(&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(certificate.signedBy(issuer)) {&lt;br /&gt;
    // error! abort.&lt;br /&gt;
    return null&lt;br /&gt;
  }&lt;br /&gt;
  return certificate.getContents().toEterm().evalWith(scope)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</description>
			<pubDate>Sat, 27 Mar 2010 01:25:00 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Subject, object, operation and permission</title>
			<link>http://ds7.deltamobile.com/wiki/Subject,_object,_operation_and_permission</link>
			<guid>http://ds7.deltamobile.com/wiki/Subject,_object,_operation_and_permission</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;added an ?hidden? link to an paulgraham article. Please remove it if it doesnt belong.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We use the terms '''subject''', '''object''', '''operation''' and '''permission''' consistently with a standard access control literature.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
&lt;br /&gt;
From a security point of view, we recognize '''subjects''' and '''objects'''&lt;br /&gt;
&lt;br /&gt;
'''Subjects''' are active entities (e.g. UNIX processes) with some behavior. '''Subjects''' can designate '''objects''' and try to perform some supported '''operations''' with them.&lt;br /&gt;
&lt;br /&gt;
What kind of operations can be performed with an object depends on its type.&lt;br /&gt;
&lt;br /&gt;
In general, the set of existing objects and subjects changes over time.&lt;br /&gt;
&lt;br /&gt;
'''Permissions''' is a relation that defines which operations on what objects are permitted for particular subjects. One way how to capture permissions is the [[protection matrix]].&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
People (outside capability community) often confuse the following two terms:&lt;br /&gt;
* '''permissions''' (defined in this article)&lt;br /&gt;
* and [[authority]].&lt;br /&gt;
Real security audit cannot be performed without determining the [[authority]] of particular '''subjects'''.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
These are standard notions and they are defined in various other places:&lt;br /&gt;
* in the [http://www.amazon.com/Operating-Systems-Implementation-Prentice-Software/dp/0131429388/ref=sr_1_14?ie=UTF8&amp;amp;s=books&amp;amp;qid=1245137182&amp;amp;sr=8-14 MINIX Book] (Section 5.5)&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Subject_(access_control)#Computer_security in Wikipedia].&lt;br /&gt;
&amp;lt;!-- [http://www.paulgraham.com/reesoo.html] &amp;lt;-- I dont know if this belongs here or not -Zarutian --&amp;gt;&lt;/div&gt;</description>
			<pubDate>Sun, 14 Mar 2010 15:02:50 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Subject,_object,_operation_and_permission</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(&amp;lt;metanote: missing&amp;gt;) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash|dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;br /&gt;
&lt;br /&gt;
http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head%3A/src/vm.c&lt;/div&gt;</description>
			<pubDate>Tue, 09 Mar 2010 13:08:34 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(&amp;lt;metanote: missing&amp;gt;) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;br /&gt;
&lt;br /&gt;
http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head%3A/src/vm.c&lt;br /&gt;
--[[User:Zarutian|Zarutian]] 07:07, 9 March 2010 (CST)&lt;/div&gt;</description>
			<pubDate>Tue, 09 Mar 2010 13:07:38 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(&amp;lt;metanote: missing&amp;gt;) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;br /&gt;
&lt;br /&gt;
http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head%3A/src/vm.c&lt;/div&gt;</description>
			<pubDate>Fri, 05 Mar 2010 16:43:33 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(&amp;lt;metanote: missing&amp;gt;) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale and to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/esrc/com/twistedmatrix/ecru/compiler.emaker&lt;/div&gt;</description>
			<pubDate>Fri, 05 Mar 2010 16:32:15 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(&amp;lt;metanote: missing&amp;gt;) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
&lt;br /&gt;
[[User:dash]] pointed me to http://bazaar.launchpad.net/~washort/ecru/trunk/annotate/head:/doc/smallcaps.txt which is also a bit stale&lt;/div&gt;</description>
			<pubDate>Fri, 05 Mar 2010 16:29:01 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(&amp;lt;metanote: missing&amp;gt;) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT     [optEjector, specimen],[] =&amp;gt; OP_LIST_PATT(n) =&amp;gt; [optEjector, specimen[n-1]..., optEjector, specimen[0]]&lt;br /&gt;
                        metanote: is n a wholenum?&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;/div&gt;</description>
			<pubDate>Fri, 05 Mar 2010 16:17:05 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have gleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;br /&gt;
  0x17 OP_NEG_INT       [],[] =&amp;gt; OP_NEG_INT(wholeNum) =&amp;gt; [-wholeNum],[]&lt;br /&gt;
  0x18 OP_FLOAT64       [],[] =&amp;gt; OP_FLOAT64(float64) =&amp;gt; [float64],[]&lt;br /&gt;
  0x19 OP_CHAR          [],[] =&amp;gt; OP_CHAR(chr) =&amp;gt; [chr],[]&lt;br /&gt;
  0x1A OP_STRING        [],[] =&amp;gt; OP_STRING(str) =&amp;gt; [str],[]&lt;br /&gt;
  0x1B OP_TWINE         [],[] =&amp;gt; OP_TWINE(twine) =&amp;gt; [twine],[]&lt;br /&gt;
  0x1C OP_TRUE          [],[] =&amp;gt; OP_TRUE =&amp;gt; [true],[]&lt;br /&gt;
  0x1D OP_FALSE         [],[] =&amp;gt; OP_FALSE =&amp;gt; [false],[]&lt;br /&gt;
  0x1E OP_NULL          [],[] =&amp;gt; OP_NULL =&amp;gt; [null],[]&lt;br /&gt;
  0x1F OP_SCOPE         [],[] =&amp;gt; OP_SCOPE =&amp;gt; [scope],[]&lt;br /&gt;
  0x20 OP_OBJECT        [ivars..., auditors...],[] =&amp;gt; OP_OBJECT(&amp;lt;metanote: missing&amp;gt;) =&amp;gt; [object],[]&lt;br /&gt;
                        metanote: hypothesis: OP_OBJECT takes these immitiate args:&lt;br /&gt;
                                    wholenum of ivarAuditorpairs to pop of the stack&lt;br /&gt;
                                    some sort of reference to code that handles calls and sends to the object&lt;br /&gt;
  0x21 OP_LIST_PATT&lt;br /&gt;
  0x22 OP_CDR_PATT&lt;br /&gt;
  &lt;br /&gt;
  0x28 OP_NOUN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x30 OP_SLOT&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x38 OP_ASSIGN&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x40 OP_BIND&lt;br /&gt;
    +addrMode&lt;br /&gt;
  0x48 OP_BIND_SLOT&lt;br /&gt;
    +addrMode&lt;/div&gt;</description>
			<pubDate>Fri, 05 Mar 2010 16:12:40 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>Talk:Walnut/Secure Distributed Computing/Capabilities</title>
			<link>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/Capabilities</link>
			<guid>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/Capabilities</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Protected &amp;quot;Talk:Walnut/Secure Distributed Computing/Capabilities&amp;quot;: junk-inhibtion [edit=autoconfirmed:move=autoconfirmed]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{junk-inhibitor}}&lt;/div&gt;</description>
			<pubDate>Fri, 26 Feb 2010 14:24:01 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/Capabilities</comments>		</item>
		<item>
			<title>Talk:Walnut/Secure Distributed Computing/Capabilities</title>
			<link>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/Capabilities</link>
			<guid>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/Capabilities</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{junk-inhibitor}}&lt;/div&gt;</description>
			<pubDate>Fri, 26 Feb 2010 14:23:26 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Walnut/Secure_Distributed_Computing/Capabilities</comments>		</item>
		<item>
			<title>Den</title>
			<link>http://ds7.deltamobile.com/wiki/Den</link>
			<guid>http://ds7.deltamobile.com/wiki/Den</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Reverted edits by 216.45.58.187 (Talk); changed back to last version by Kevin Reid&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; [http://den.cubik.org/ den.cubik.org] was once the official web site, but access to it was lost and this page is newer.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den is a distributed [[wikipedia:Multi-user dungeon|MUD]] system written in [[E]] by [[User:Kevin Reid|Kevin Reid]].&lt;br /&gt;
&lt;br /&gt;
It was last tested on [http://www.erights.org/download/0-8-26/ E 0.8.28e].&lt;br /&gt;
&lt;br /&gt;
The source code is available in a Subversion repository at &lt;br /&gt;
: http://switchb.org/svn/den/den/trunk/&lt;br /&gt;
&lt;br /&gt;
==What It Is==&lt;br /&gt;
&lt;br /&gt;
Den is/will be a peer-to-peer MUD system, theoretically supporting [[mutual suspicion]] between parts of its world.&lt;br /&gt;
&lt;br /&gt;
Den's world model is currently room-based, insofar as it cares. I hope to eventually support coordinate systems and graphical UI &amp;amp;mdash; possibly losing the text UI &amp;amp;mdash; but not yet.&lt;br /&gt;
&lt;br /&gt;
Den is definitely not useful or &amp;amp;lsquo;interesting&amp;amp;rsquo; (other than being written in E, perhaps) yet. It is only an experiment in using E. It may or may not eventually become something more widely useful.&lt;br /&gt;
&lt;br /&gt;
==How to use it==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;rune -cpa src/ src/org/cubik/den/boot/den.e-awt&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
; First run:&lt;br /&gt;
: '''&amp;lt;code&amp;gt;-save &amp;lt;var&amp;gt;&amp;amp;lt;filename&amp;amp;gt;&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;&amp;amp;lt;yourNickname&amp;amp;gt;&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;'''&lt;br /&gt;
; Further runs:&lt;br /&gt;
: '''&amp;lt;code&amp;gt;-restore &amp;lt;var&amp;gt;&amp;amp;lt;filename&amp;amp;gt;&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;'''&lt;br /&gt;
; Non-persistent:&lt;br /&gt;
: '''&amp;lt;code&amp;gt;-once &amp;lt;var&amp;gt;&amp;amp;lt;yourNickname&amp;amp;gt;&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
(You may need to increase the JVM's maximum heap or stack size. For Mac OS X, specify '''&amp;lt;code&amp;gt;-J-Xmx500m -J-XX:ThreadStackSize=10240&amp;lt;/code&amp;gt;''' before the other arguments to &amp;lt;code&amp;gt;rune&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Three windows will be opened.&lt;br /&gt;
&lt;br /&gt;
The narrow one at the top contains commands for performing a checkpoint and some other systemwide functions.&lt;br /&gt;
&lt;br /&gt;
A checkpoint will be performed when this window is closed (which also stops the program), or via the &amp;amp;ldquo;Save&amp;amp;rdquo; command in its World menu.&lt;br /&gt;
&lt;br /&gt;
The second is the inspector, which lets you view and manipulate the state of objects making up the world. The &amp;lt;code&amp;gt;&amp;amp;lt;world&amp;amp;gt;&amp;lt;/code&amp;gt; object has a name &amp;lt;code&amp;gt;=&amp;amp;gt;&amp;lt;/code&amp;gt; object mapping for convenience in accessing important objects, and also lists all SturdyRefs currently existing, since they may need to be manually deleted. (This UI is clearly poor and I hope to replace it with something better soon.)&lt;br /&gt;
&lt;br /&gt;
The third (to the right or overlapping the inspector) is the terminal, with which you control a character in text-mud style.&lt;br /&gt;
&lt;br /&gt;
(The default world's &amp;amp;ldquo;&amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;&amp;amp;rdquo; exit is a locked door, and to go through it you need to use the command &amp;amp;ldquo;'''&amp;lt;code&amp;gt;go 'in' with key&amp;lt;/code&amp;gt;'''&amp;amp;rdquo;. (I need to write some documentation for the commands&amp;amp;mdash;for now, see &amp;lt;code&amp;gt;org/cubik/den/ui/makeCommandInterpreter.emaker&amp;lt;/code&amp;gt;.))&lt;br /&gt;
&lt;br /&gt;
===Setting up cross-vat travel:===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In the inspector window, select &amp;amp;ldquo;Sturdy Entrance&amp;amp;rdquo; from the &amp;amp;ldquo;Make&amp;amp;rdquo; menu. Choose the room which it will lead to, the name by which it will be known for later editing, and the message shown in that room when something arrives through it. Click Create.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Copy the &amp;lt;code&amp;gt;cap://&amp;lt;/code&amp;gt; URI from the resulting window.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In the other world/vat/Den-instance, select &amp;amp;ldquo;Exit&amp;amp;rdquo; from the &amp;amp;ldquo;Make&amp;amp;rdquo; menu. Choose the room in which it will be placed, the name in that room, and the message when something uses that exit. Select &amp;amp;ldquo;Far&amp;amp;rdquo; and paste in the &amp;lt;code&amp;gt;cap://&amp;lt;/code&amp;gt; URI from step 2. Click Create.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat the above procedure to create an exit for the other direction.&lt;br /&gt;
&lt;br /&gt;
[[Category:Applications]]&lt;/div&gt;</description>
			<pubDate>Sat, 20 Feb 2010 18:59:37 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Den</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Complete concrete syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_encrypt(cryptohash(issuer script), issuer.privatekey)&lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Zarutian] my second attempt at if from that direction:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
// E syntax 0.9&lt;br /&gt;
def makeBrandPair := &amp;lt;elib:sealing.makeBrand&amp;gt;&lt;br /&gt;
def makePrinicipalsSealerRegister () :any {&lt;br /&gt;
  // make an FlexMap&lt;br /&gt;
  var register := [].asMap().diverge()&lt;br /&gt;
  def unnamed1(principal :any, i :int(0..1)) :any {&lt;br /&gt;
    if (not(register.maps(principal))) {&lt;br /&gt;
      register.put(principal, makeBrandPair(principal), true)&lt;br /&gt;
    }&lt;br /&gt;
    return register.get(principal).get(i)&lt;br /&gt;
  }&lt;br /&gt;
  def getSealer(principal)   { return unnamed1(principal, 0) }&lt;br /&gt;
  def getUnsealer(principal) { return unnamed1(principal, 1) }&lt;br /&gt;
  return [getSealer, getUnsealer]&lt;br /&gt;
}&lt;br /&gt;
def [getSealer, getUnsealer] := makePrincipalsSealerRegister()&lt;br /&gt;
def swissHash__uriGetter {&lt;br /&gt;
  to get(str :String) :any {}&lt;br /&gt;
}&lt;br /&gt;
def vatId := &amp;lt;&amp;lt;get the public key (or the cryptohash of) of this vat&amp;gt;&amp;gt;&lt;br /&gt;
def evalActiveCertificate(parameters :ConstList, certificate :activecertificate) :any {&lt;br /&gt;
  def issuer := certificate.getSigner()&lt;br /&gt;
  def scope := safeScope.diverge()&lt;br /&gt;
  def unsealer(box :any) :any {&lt;br /&gt;
    return getUnsealer(issuer).unseal(box)&lt;br /&gt;
  }&lt;br /&gt;
  scope.add(&amp;quot;parameters&amp;quot;, parameters)&lt;br /&gt;
  scope.add(&amp;quot;my_unsealer&amp;quot;, unsealer)&lt;br /&gt;
  scope.add(&amp;quot;get_sealerFor&amp;quot;, getSealer)&lt;br /&gt;
  if (issuer == vatId) {&lt;br /&gt;
    scope.add(&amp;quot;swissHash__uriGetter&amp;quot;, swissHash__uriGetter)&lt;br /&gt;
  }&lt;br /&gt;
  if (not(certificate.signedBy(issuer)) {&lt;br /&gt;
    // error! abort.&lt;br /&gt;
    return null&lt;br /&gt;
  }&lt;br /&gt;
  return certificate.getContents().toEterm().evalWith(scope)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</description>
			<pubDate>Fri, 19 Feb 2010 18:13:05 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>Capability-based Active Invocation Certificates</title>
			<link>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</link>
			<guid>http://ds7.deltamobile.com/wiki/Capability-based_Active_Invocation_Certificates</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;/* Complete concrete syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Highlights ==&lt;br /&gt;
&lt;br /&gt;
CapCert is a cryptographic object-capability system relying on signed certificates rather than transmitted secrets. Were all these signed certs transmitted in the clear, confidentiality of the messages would of course be lost. But no integrity would be lost. The basic philosophy, imprecisely stated:&lt;br /&gt;
&lt;br /&gt;
* Use signing key pairs to represent object identity, where the (public) signature verification key designates the object and the (secret) signing key represents the permission to be the object.&lt;br /&gt;
* Designation is not permission, but rather, permission is represented by a tree of signed messages, to be validated as conforming to ocap message rules.&lt;br /&gt;
* Each message is signed by its sender. &lt;br /&gt;
* For the receiver and each argument in the message, the message carries its designation and the prior messages received by this sender, demonstrating that this sender has been permitted to invoke that receiver and those arguments. &lt;br /&gt;
* The sender is implicitly permitted to invoke itself without further demonstration.&lt;br /&gt;
* Initial non-self connectivity is by distinct &amp;quot;initial certs&amp;quot; issued by the designated object to a recipient and conveyed to the recipient by out-of-band means, i.e., not by CapCert invocations.&lt;br /&gt;
* The arguments of a message may instead be code expressing an attenuation of a directly permitted designator. The sender thus grants the recipient only the ability to invoke that attenuation of the sender's permission.&lt;br /&gt;
* Attenuations thus compose along delegation chains. Attenuators are instantiated by the server (vat) of the resource to be attenuated.&lt;br /&gt;
&lt;br /&gt;
The main difference between the idea presented above and the concrete CapCert proposal presented below is that below, the signing keys are per vat. A signing key and an SwissHash (an authority-free designator which is a cryptohash of an object's SwissNumber) together designate an object in a vat.&lt;br /&gt;
&lt;br /&gt;
It is a bizarre side effect of this system that the validatability of messages (that need to be checked by receivers) implies auditability. The auditability here is similar to that provided by Horton but different in at least the following ways:&lt;br /&gt;
* CapCert auditing info is non-repudiable (in a technical, not a legal sense), whereas Horton auditing info is normally repudiable. (A non-repudiable variation of Horton is possible. A repudiable variation of CapCert may not be.)&lt;br /&gt;
* In CapCert, the auditing info is revealed to the target of an invocation, including the chain of prior messages. In Horton, each delegated resource receives info about &amp;quot;who&amp;quot; delegated it to &amp;quot;whom&amp;quot;, but only receives the message by which it is directly invoked.&lt;br /&gt;
We are unaware of any theory of composable auditability, or of reconciling confidentiality with auditability, so it is not yet clear which form of auditability to prefer, or what the other salient differences might be.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Done for now --~~~~ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Material taken from stuff linked from capcert.org to the archives of the E-lang mailing list:&lt;br /&gt;
&lt;br /&gt;
== First message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 17 Oct 2000 14:55:48 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003884.html 1]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
While Alan Kay was heaping criticism on the early Macintosh, &lt;br /&gt;
he also quipped that the Mac was &amp;quot;the first computer good enough to &lt;br /&gt;
criticize&amp;quot;.  Such reminders are important, when one singles out the &lt;br /&gt;
best of a field for intense criticism, while ignoring its crappy cousins.&lt;br /&gt;
&lt;br /&gt;
Similarly, SPKI is the only PKI/Certificate system I know of that's good &lt;br /&gt;
enough to criticize.  As explained in the Ode:&lt;br /&gt;
&lt;br /&gt;
&amp;gt;The enforceable subset of SPKI can be seen as an off-line, auditable, &lt;br /&gt;
&amp;gt;heavyweight, non-confinable, semi-capability system, as opposed to E's &lt;br /&gt;
&amp;gt;on-line, repudiatable-by-default, lightweight, confinable, full-capability &lt;br /&gt;
&amp;gt;system. Perhaps, by comparing these, we may figure out how to build systems &lt;br /&gt;
&amp;gt;with some of the best of both.&lt;br /&gt;
&lt;br /&gt;
SPKI-like certificate technology and real capabilities clearly should be &lt;br /&gt;
able to get along, but until now it wasn't clear how.  The following &lt;br /&gt;
proposal is inspired by Nikita Borisov's &amp;quot;Active Certificates&amp;quot; &lt;br /&gt;
http://www.cs.berkeley.edu/~nikitab/papers/acert-retreat.ppt , although &lt;br /&gt;
Nikita wasn't explicitly thinking in capability terms either, he &lt;br /&gt;
nevertheless provided the bridge.&lt;br /&gt;
&lt;br /&gt;
Development note: I plan to complete hash chaining proposal #1, and its &lt;br /&gt;
application to simplify persistence and Pluribus, for the next release of E. &lt;br /&gt;
Indeed, the reconstruction of Pluribus is the gating item for this next &lt;br /&gt;
release.  The proposal in this note (#2) is more long term.  Neither E nor &lt;br /&gt;
E's current users currently require it, though it would add significant &lt;br /&gt;
value.  So don't expect it anytime soon.  However, because it makes a second &lt;br /&gt;
use of hash chaining to represent cryptographic capabilities, &lt;br /&gt;
it would be good to know early whether it can co-exist with our &lt;br /&gt;
other cryptographic representations of capabilities.  I want to leave the &lt;br /&gt;
door open to implement this proposal later as an upward compatible extension &lt;br /&gt;
of E.  If you see any possible problems on this horizon, please fire away.&lt;br /&gt;
&lt;br /&gt;
Before we get to the &amp;quot;active&amp;quot; stuff, let's strip from SPKI everything that &lt;br /&gt;
isn't capability logic.  It's ok if the result isn't usable at this stage, &lt;br /&gt;
as long as we get back to a usable result once we put the &amp;quot;active&amp;quot; stuff in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                        Deconstructing SPKI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After signature checking and expansion, we see from Section 6 of &lt;br /&gt;
http://www.ietf.org/rfc/rfc2693.txt that there are only two kinds of SPKI &lt;br /&gt;
certificates: Authorization Certificates (or 5-tuples) and Name Certificates &lt;br /&gt;
(4-tuples).  Although the SPKI perspective on names is more capability-like &lt;br /&gt;
than the other PKIs, it is still not the true capability perspective on &lt;br /&gt;
names, so we get rid of the Name Certificate.&lt;br /&gt;
&lt;br /&gt;
We state in the Ode that a SPKI Authorization Certificate corresponds to a &lt;br /&gt;
capability message, but this isn't quite right.  A capability message not &lt;br /&gt;
only authorizes Bob to access Carol, but it packages this authorization &lt;br /&gt;
with information that should communicate to Bob why he's being given the &lt;br /&gt;
argument authorizations (the label &amp;quot;foo&amp;quot;), and in which each individual &lt;br /&gt;
authorization occupies a distinct argument position, corresponding to its &lt;br /&gt;
role in the &amp;quot;why&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So a SPKI Authorization certificate corresponds to an argument in a &lt;br /&gt;
capability message.  An argument in a capability message is normally &lt;br /&gt;
understood to simply be a capability, so what distinction am I drawing?  At &lt;br /&gt;
the capability layer of abstraction, there are no certificates, and the &lt;br /&gt;
arguments of capability messages are simply capabilities.  While at the &lt;br /&gt;
crypto-implementation layer of abstraction, SPKI is a non-bearer protocol.  &lt;br /&gt;
&lt;br /&gt;
An individual SPKI Authorization Certificate implements a capability as &lt;br /&gt;
passed specifically from Alice to Bob.  If Bob then further authorizes Dana, &lt;br /&gt;
this next authorization is the same capability but a different certificate.  &lt;br /&gt;
If E's current SturdyRefs are off-line bearer capabilities, we might say &lt;br /&gt;
that authorization certificates are SturdyArguments -- off-line per-message &lt;br /&gt;
capabilities.&lt;br /&gt;
&lt;br /&gt;
So now let's examine the parts of a SPKI Authorization Certificate with &lt;br /&gt;
regard to representing an argument in a capability message.&lt;br /&gt;
&lt;br /&gt;
1) Issuer:  Fingerprint of the public key corresponding to the private &lt;br /&gt;
signing key of the party sending the message.  The tuple as a whole is also &lt;br /&gt;
signed with the Issuer's signing key.  Great.  We'd keep this.  For us, the &lt;br /&gt;
Issuer would be the Vat, and this fingerprint is the VatID.  In the standard &lt;br /&gt;
example, this is VatID(A).  It's not yet clear whether this field needs to &lt;br /&gt;
be expanded to uniquely designate Alice within VatA.&lt;br /&gt;
&lt;br /&gt;
2) Subject: Fingerprint of the public signature key of the party the message &lt;br /&gt;
is being sent to.  In the standard example, this is VatID(B).  It's not yet &lt;br /&gt;
clear whether this field needs to be expanded to uniquely designate Bob &lt;br /&gt;
within VatB.&lt;br /&gt;
&lt;br /&gt;
3) The infamous do-not-delegate bit.  We need to eradicate this and then &lt;br /&gt;
find a strong cleanser to remove its stench.  (For those new to this list, &lt;br /&gt;
see http://www.erights.org/elib/capability/conspire.html .)&lt;br /&gt;
&lt;br /&gt;
5) Validity dates -- the interval during which the certificate is considered &lt;br /&gt;
valid.  It's not clear whether or not this needs to be primitive.  Also, &lt;br /&gt;
it's most peculiar to include an interval start time rather than just a &lt;br /&gt;
deadline.  Since the deadline corresponds to the expiration time of our &lt;br /&gt;
existing SturdyRefs, I'm inclined to keep the deadline for now.&lt;br /&gt;
&lt;br /&gt;
4) Authorization.  An S-expression which states what rights are being &lt;br /&gt;
authorized.  Intermediaries on the delegation chain can use this &lt;br /&gt;
S-expression language to express subsettings of the rights being passed on.&lt;br /&gt;
Complex rules compose these expressed subsettings to calculate the &lt;br /&gt;
intersection of allowed rights.  This item is where the action is.  &lt;br /&gt;
&lt;br /&gt;
First, we remove everything extraneous from this item.  This S-expression &lt;br /&gt;
language is assumed to bottom out in human readable names, and in wildcards &lt;br /&gt;
over such a names.  From a capability point of view, this name space is &lt;br /&gt;
misguided, and the wildcards are therefore pointless.  The rights at the &lt;br /&gt;
bottom of a subsetting expression should simply be the right to invoke a &lt;br /&gt;
particular object.  With this as the right to be subsetted, the SPKI &lt;br /&gt;
S-expression language is clearly useless as a means to subset it.  This will &lt;br /&gt;
be where Nikita's &amp;quot;Active&amp;quot; ideas become crucial, but for now let's just drop &lt;br /&gt;
all the subsetting logic.  What's left?  A unique unambiguous designator of &lt;br /&gt;
Carol.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Till now, when we wanted a cryptographic representation for designating &lt;br /&gt;
Carol, we always used the pair &amp;lt;VatID(C), swissNumber(Carol)&amp;gt;.  However, if &lt;br /&gt;
we use this representation here, we lose one of the really cool properties &lt;br /&gt;
of Certificates: they can communicate authority without communicating &lt;br /&gt;
secrets.  Indeed, the only information they require one to keep secret is &lt;br /&gt;
one's own private signing key.  Because they rely on signature chains rather &lt;br /&gt;
than secrets, distributed computation stitched together with certificates &lt;br /&gt;
has very strong non-repudiation and auditing properties.  OTOH, it's vastly &lt;br /&gt;
more expensive than on-line secret-based protocols like Pluribus.  Which one &lt;br /&gt;
to use depends on context, so it would be good to be able to switch from &lt;br /&gt;
one to the other while keeping the abstract capability semantics constant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/misplaced-motivational-aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, instead, we need the designator of Carol in the certificate to uniquely &lt;br /&gt;
and unambiguously designate Carol without itself granting the authority to &lt;br /&gt;
invoke Carol.  The authority to invoke Carol comes from the signature chain &lt;br /&gt;
that reflects the sequence of introductions, starting with VatC, by which &lt;br /&gt;
VatB came to attempt to invoke Carol.  Yes, believe it or not, I am &lt;br /&gt;
advocating a kind of separation of designation and authority, but I don't &lt;br /&gt;
believe that this separation has any semantics or presents any dangers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                 Hash Chaining Again&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's say that the Certificate's Authorization field contains, not &lt;br /&gt;
&amp;lt;VatID(C), swissNumber(Carol)&amp;gt;, but &amp;lt;VatID(C), hash(swissNumber(Carol))&amp;gt;.  &lt;br /&gt;
Since we assume hashes are strongly irreversible, knowledge of &lt;br /&gt;
hash(swissNumber(Carol)) provides no knowledge of swissNumber(Carol), and &lt;br /&gt;
only the latter is a secret that provides authority.  This representation &lt;br /&gt;
also makes it easier to see how to interface between the bearer and the &lt;br /&gt;
certificate worlds:&lt;br /&gt;
&lt;br /&gt;
Given a live (a bearer on-line) reference to Carol (and given another &lt;br /&gt;
capability on VatC (the function sturdyRef() that grant the authority to &lt;br /&gt;
burden VatC with a storage obligation), Alice may currently ask VatC for a &lt;br /&gt;
corresponding SturdyRef to Carol that's good until the requested expiration &lt;br /&gt;
date.  A SturdyRef is a bearer off-line reference, so Alice can pass to Bob &lt;br /&gt;
in an on-line message either a live reference or a SturdyRef designating &lt;br /&gt;
Carol.  When Bob wants to invoke Carol, in he hold a SturdyRef, he first &lt;br /&gt;
obtains a live reference from his SturdyReference, and then invokes on it.&lt;br /&gt;
&lt;br /&gt;
Similarly, given a live reference to Carol, we can enable Alice to ask VatC &lt;br /&gt;
for a corresponding Authorization certificate, signed by VatC, authorizing &lt;br /&gt;
VatA to invoke Carol.  Alice, being within VatA, may later use this &lt;br /&gt;
certificate to obtain a live reference to Carol, which she can then invoke on &lt;br /&gt;
directly.  If Alice passes to Bob a derived certificate, signed by VatA &lt;br /&gt;
authorizing VatB to access Carol, and including the previous certificate, &lt;br /&gt;
then Bob may likewise use this certificate chain to obtain from VatC a live &lt;br /&gt;
reference to Carol, which he can then invoke.&lt;br /&gt;
&lt;br /&gt;
The combination of the two hash chaining proposals together look surprising &lt;br /&gt;
natural.  The three numbers correspond to a three level hierarchy of &lt;br /&gt;
authority to a capability:&lt;br /&gt;
&lt;br /&gt;
1) arcHash(swissNumber) provides the authority to be the object, and &lt;br /&gt;
  therefore receive invocations.&lt;br /&gt;
2) swissNumber corresponds provides the authority to invoke the object.&lt;br /&gt;
3) hash(swissNumber) uniquely and unambiguously designates an invokable &lt;br /&gt;
  object, but does not provide the authority to invoke it.  Curiously, it does &lt;br /&gt;
  provide the ability to compare two of these for equality.&lt;br /&gt;
&lt;br /&gt;
It seems fine that each authority implies the ones after it, but not the &lt;br /&gt;
ones before it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       Why we need off-line Messages, &lt;br /&gt;
                             not just off-line Arguments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More later...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Second message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Wed, 18 Oct 2000 14:23:17 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003886.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
                                    Message vs Invocation:&lt;br /&gt;
                                  A Terminology Correction.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the previous note, when I referred to &amp;quot;Message&amp;quot; I usually should have &lt;br /&gt;
said &amp;quot;Invocation&amp;quot;.  An invocation is a pair of a Message and a reference to &lt;br /&gt;
the object that will receive the Message -- the Recipient.  In the &lt;br /&gt;
Granovetter diagram, the fat arrow is a Message containing a reference to &lt;br /&gt;
Carol as an argument.  The fat Message arrow combined with the thin reference &lt;br /&gt;
arrow on which it rides -- the reference to Bob -- together constitute an &lt;br /&gt;
Invocation.  With these definitions, it is clear that an authorization &lt;br /&gt;
certificate represents an Invocation Argument rather than a Message &lt;br /&gt;
Argument, since it authorizes only the Recipient.&lt;br /&gt;
&lt;br /&gt;
The canonical example is a certificate from Alice authorizing Bob to invoke &lt;br /&gt;
Carol.  If it were a Message Argument, then it would authorize whoever the &lt;br /&gt;
Message were sent to, without that having been determined yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           Why we need off-line Invocations, not just off-line Arguments:&lt;br /&gt;
                     Another Lesson from the Confused Deputy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The punch line we all know from the Confused Deputy paper is &amp;quot;Don't separate &lt;br /&gt;
designation from authority.&amp;quot;  But this paper has enough punch lines to last &lt;br /&gt;
a conventional lifetime.  Here's another.&lt;br /&gt;
&lt;br /&gt;
Let's define authorization as the granting of authority.  One may conclude &lt;br /&gt;
from the same tale that, even if designation and authority are kept &lt;br /&gt;
together, &amp;quot;one must not separate authorization from invocation&amp;quot;.  Why?  In a &lt;br /&gt;
normal message-based capability system, the deputy only receives new &lt;br /&gt;
authority as arguments of messages he receives asking him to do something.  &lt;br /&gt;
Each new authority has a separate position in the request, which represents &lt;br /&gt;
its intended role in this request.  Only this context information gives the &lt;br /&gt;
Deputy enough information to know what to do and what NOT to do with the new &lt;br /&gt;
authority he's just been granted.&lt;br /&gt;
&lt;br /&gt;
When authorization is communicated without such context, it's like receiving &lt;br /&gt;
a key in the mail with no hint about what to do with it.  Or it's like an &lt;br /&gt;
object system in which objects respond to the message&lt;br /&gt;
&lt;br /&gt;
    hereIsSomethingYouMayFindUseful(arg)&lt;br /&gt;
&lt;br /&gt;
After an object receives this message, she can invoke arg if she chooses, &lt;br /&gt;
but why would she ever choose to do so?  Were the separation of &lt;br /&gt;
authorization from invocation truly this silly, no one would have thought to &lt;br /&gt;
separate them.  Instead, no one seems to question separating them.  Why?  I &lt;br /&gt;
can think of two reasons, both derived from the ACL paradigm:&lt;br /&gt;
&lt;br /&gt;
1) Ambient Authority.  The following chain of reasoning seems very &lt;br /&gt;
plausible, especially if it's not articulated or examined closely:  If &lt;br /&gt;
object A attempts to perform action X, and object A has enough authority to &lt;br /&gt;
perform action X, then object A's attempt to perform action X should be be &lt;br /&gt;
permitted.  The implicit assumption is that, if A attempts X, then A must &lt;br /&gt;
want to perform X.  If it wants to and it's allow to, clearly it should be &lt;br /&gt;
permitted to.  In such a system, a hereIsSomethingYouMayFindUseful() message &lt;br /&gt;
could simply add arg to the object's ambient authority.&lt;br /&gt;
&lt;br /&gt;
The flaw is the assumption that it wants its attempt to succeed.  A deputy &lt;br /&gt;
only brings to bear on an action those authorities that should be applied to &lt;br /&gt;
the action, because it wishes the action to fail if these authorities are &lt;br /&gt;
inadequate -- even if the deputy itself has further authority.  How does a &lt;br /&gt;
deputy determine which authorities to apply to an action?  In a capability &lt;br /&gt;
system, only according to how the deputy came to hold these authorities -- &lt;br /&gt;
by initial endowment and by receiving them as invocation arguments.&lt;br /&gt;
&lt;br /&gt;
2) Labelling.  In SPKI, an authorization certificate not only authorizes, it &lt;br /&gt;
names the resources that it authorizes access to.  It's like receiving a key &lt;br /&gt;
in the mail that's labelled with the name of the thing it opens.  This &lt;br /&gt;
presumes a namespace that's meaningful among the various parties, &lt;br /&gt;
necessitating that we solve a harder problem before we can solve the easier &lt;br /&gt;
problem.  Our invocation perspective is much like the labelling perspective: &lt;br /&gt;
the message carries a message name (in E, the verb) used by the receiver to &lt;br /&gt;
understand why he's receiving the arguments.  However, the verb labels the &lt;br /&gt;
reason for interacting, not the resource being authorized.  The latter needs &lt;br /&gt;
no name -- the capability is all the designation we need, and all the &lt;br /&gt;
designation we can trust.&lt;br /&gt;
&lt;br /&gt;
Of course, once Alice is invoking Bob rather than just authorizing Bob, now &lt;br /&gt;
Bob, like Carol, is something to be invoked.  Just as Alice or Bob must be &lt;br /&gt;
authorized in order to invoke Carol, so must Alice be authorized to invoke &lt;br /&gt;
Bob.  If invoking is the only means of authorizing, then Alice must be &lt;br /&gt;
authorized to invoke Bob in order for Alice to be able to authorize Bob.  In &lt;br /&gt;
situations where this is enforceable, this both provides the reference arrow &lt;br /&gt;
missing from http://www.erights.org/elib/capability/ode/images/spki.gif and &lt;br /&gt;
removes the asymmetry between Subject and Resource.  Both would simply be &lt;br /&gt;
objects, and shown as circles.  The full Granovetter diagram would be restored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                          The Parts of an Invocation in E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So let's examine and give names to all the parts of an inter-vat Invocation &lt;br /&gt;
in E.  Inter-vat Invocations in E may only be asynchronous, so we examine &lt;br /&gt;
only the eventual (&amp;quot;&amp;lt;-&amp;quot;) send expression:&lt;br /&gt;
&lt;br /&gt;
       recipient &amp;lt;- verb(args...)&lt;br /&gt;
&lt;br /&gt;
which acts like two different expressions depending on context:&lt;br /&gt;
&lt;br /&gt;
a)    define result := recipient &amp;lt;- verb(args...)&lt;br /&gt;
b)    recipient &amp;lt;- verb(args...); null&lt;br /&gt;
&lt;br /&gt;
Both of these asks the recipient to eventually perform the verb-named action &lt;br /&gt;
using the provided arguments.  The request is queued on the vat of the &lt;br /&gt;
recipient to be performed to completion when that vat is done with all prior &lt;br /&gt;
requests.  &lt;br /&gt;
&lt;br /&gt;
#a is the general case: When the send expression occurs in a static context &lt;br /&gt;
where its value is needed (evaluated for value), the send expression &lt;br /&gt;
immediately returns a promise for the outcome of performing the request.  &lt;br /&gt;
This is a tail of a reference arrow whose head is encapsulated in the &lt;br /&gt;
Message.  (This head serves a role much like a lambda continuation, expect &lt;br /&gt;
that it normally provides only data-flow, not control-flow.)  We call this &lt;br /&gt;
arrowhead the Resolver.&lt;br /&gt;
&lt;br /&gt;
#b is an important optimization: When the send expression occurs in a static &lt;br /&gt;
context where the value is not needed (evaluated for effect only), then we &lt;br /&gt;
can avoid creating the promise for the return result.  In both cases, these &lt;br /&gt;
messages are one-way in a control flow sense.  #b is also one-way in a &lt;br /&gt;
data-flow sense.&lt;br /&gt;
&lt;br /&gt;
So, putting it all together, an E on-line Invocation consists of&lt;br /&gt;
&lt;br /&gt;
Invocation&lt;br /&gt;
    Recipient (arrowtail)&lt;br /&gt;
    Message&lt;br /&gt;
        Verb (usually a String.  Always passed by copy.)&lt;br /&gt;
        Args (List of arrowtails conceptually, but may use any passing mode)&lt;br /&gt;
        Resolver (optional.  arrowhead for reporting outcome)&lt;br /&gt;
&lt;br /&gt;
For off-line invocation certificates, let's tentatively make four semantic&lt;br /&gt;
changes.&lt;br /&gt;
&lt;br /&gt;
1) Let's drop the optional Resolver.  It's hard to see any motivation for &lt;br /&gt;
message pipelining in the off-line case.  In the absence of pipelining, most &lt;br /&gt;
of the effects of the encapsulated Resolver can instead be provided with an &lt;br /&gt;
explicit Resolver argument.  This decision does make it awkward to interface &lt;br /&gt;
between the on-line and off-line worlds, so we may revisit it later.&lt;br /&gt;
&lt;br /&gt;
2) Drop the requirement of order-preserving fail-stop at-most-once message &lt;br /&gt;
delivery.  An on-line protocol can provide such guarantees cheaply.  For an &lt;br /&gt;
off-line protocol, the expense would be too great to put at the foundations. &lt;br /&gt;
Instead, we leave it up to the objects interacting via off-line invocations &lt;br /&gt;
to deal with the problems resulting from the absence of these guarantees.  &lt;br /&gt;
I'm quite queasy with this, but it corresponds to the burden placed on the &lt;br /&gt;
programmer by any of the other certificate systems.  Of course, this make it &lt;br /&gt;
yet more awkward to interface the off-line and on-line worlds.&lt;br /&gt;
&lt;br /&gt;
3) Do not provide built-in secrecy.  As with the other PKIs, invocation &lt;br /&gt;
certificates are signed but not encrypted.  If their users wish to &lt;br /&gt;
separately encrypt them, fine.&lt;br /&gt;
&lt;br /&gt;
4) Provide built-in non-repudiation and some measure of auditability, at the &lt;br /&gt;
price of a further loss of privacy.  Indeed, I believe this to be *the* &lt;br /&gt;
tradeoff that should determine whether to use a certificate system or a &lt;br /&gt;
bearer system.  Clearly, both have their place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                Proposed Contents of an E Invocation Certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since we've already got a notation for describing E invocations -- E -- I'll &lt;br /&gt;
use it in the certificate proposal below.  A more politically acceptable &lt;br /&gt;
proposal may use the XML representation of Kernel-E parse trees &lt;br /&gt;
http://www.erights.org/elang/kernel/index.html , since this would be less &lt;br /&gt;
readable and more verbose.  If you wish, consider all the E notation in what &lt;br /&gt;
follows to be syntactic sugar for such XML.&lt;br /&gt;
&lt;br /&gt;
As with any lambda language, E expressions are evaluated within a lexical &lt;br /&gt;
scope.  *.emaker files are evaluated in the E &amp;quot;universal scope&amp;quot; -- a &lt;br /&gt;
immutable scope containing only transitively immutable objects that provide &lt;br /&gt;
no authority -- such as the binding of &amp;quot;true&amp;quot; to the appropriate boolean.  &lt;br /&gt;
The expression in our invocation certificate can be evaluated (for effect &lt;br /&gt;
only) within this scope, but we needs more.  The authorization certificates &lt;br /&gt;
provide further capabilities, but only in this context.  We need a form of &lt;br /&gt;
expression available within this context that wraps the authorization &lt;br /&gt;
certificate data and effectively evaluates to the corresponding object &lt;br /&gt;
reference.  &lt;br /&gt;
&lt;br /&gt;
Let's use E's syntactic sugar for URI expressions, and introduce a binding &lt;br /&gt;
for &amp;quot;auth__uriGetter&amp;quot;.  The expression &amp;lt;auth:...&amp;gt;, with an authorization &lt;br /&gt;
certificate in place of the &amp;quot;...&amp;quot;, evaluates to a capability to the &lt;br /&gt;
authorized object.  Ignoring for a moment the issue of whether it evaluates &lt;br /&gt;
to an on-line or an off-line reference, our standard example would now look &lt;br /&gt;
like:&lt;br /&gt;
&lt;br /&gt;
   def bob := &amp;lt;auth:...Alice's authorization (from somewhere) to invoke Bob...&amp;gt;&lt;br /&gt;
   def carol := &amp;lt;auth:...Bob's authorization from Alice to invoke Carol...&amp;gt;&lt;br /&gt;
   bob &amp;lt;- foo(carol)&lt;br /&gt;
&lt;br /&gt;
The first authorization would be signed by whoever enabled Alice to invoke Bob.&lt;br /&gt;
&lt;br /&gt;
The second authorization would be signed by Alice, and would include Alice's &lt;br /&gt;
authorization to invoke Carol.&lt;br /&gt;
&lt;br /&gt;
The expression as a whole would be signed by Alice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           An Aside: Enabling Stronger Auditing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Should Alice really sign the authorization for Bob to invoke Carol, given &lt;br /&gt;
that she's signing the message as a whole?  Interestingly, we get much &lt;br /&gt;
stronger auditability if the answer is no.  If the answer is yes, then this &lt;br /&gt;
authorization by itself is what Bob would present when invoking Carol, or &lt;br /&gt;
when authorizing someone else to invoke Carol.  If the answer is no, then &lt;br /&gt;
only this invocation as a whole demonstrates Bob's authorization to Carol.&lt;br /&gt;
&lt;br /&gt;
Likewise, one level back on the chain, Alice's inclusion of the &lt;br /&gt;
demonstration that she is authorized to invoke Carol (necessary for her &lt;br /&gt;
authorization of Bob to be valid) would not be an authorization certificate, &lt;br /&gt;
but rather the entire invocation certificate showing why she came to have &lt;br /&gt;
that authority.  &lt;br /&gt;
&lt;br /&gt;
If the argument authorizations aren't signed, and therefore don't need to be &lt;br /&gt;
standalone, then they also don't need to list the &amp;quot;Subject&amp;quot;, since this must &lt;br /&gt;
always be the Recipient (Bob).  They all must also have the same Issuer &lt;br /&gt;
(Alice), so we could list this once rather than per-argument.  All that's &lt;br /&gt;
left or SPKI's 5-tuple is the Carol designation: &amp;lt;vatID(C), &lt;br /&gt;
hash(swissNumber(Carol))&amp;gt;.  The authorization data would consist of this &lt;br /&gt;
plus a chain of earlier Invocation certificates.&lt;br /&gt;
&lt;br /&gt;
The authorization chains are now more like stack tracebacks, whose utility &lt;br /&gt;
for debugging is well known.  Auditing and debugging may be more similar &lt;br /&gt;
than we think.  However, the space overhead may be unreasonable for many uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next Message:  I finally get to the &amp;quot;Active&amp;quot; stuff&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Third message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Tue, 24 Oct 2000 13:52:34 -0700 in [http://www.eros-os.org/pipermail/e-lang/2000-October/003892.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Sorry for teasing, but I realized that there was one other major chunk to &lt;br /&gt;
explain before I could tie this thread together into a proposal for Off-Line &lt;br /&gt;
Active Invocation Certificates (as inspired by Nikita's Active &lt;br /&gt;
(Authorization) Certificates).  &lt;br /&gt;
&lt;br /&gt;
The previous message (#2b) proposes Off-Line Invocation Certificates as an &lt;br /&gt;
off-line derivative of on-line invocation. The addition of &amp;quot;Active&amp;quot; means &lt;br /&gt;
the certificate additionally carries mobile code, as a more flexible &lt;br /&gt;
replacement of the SPKI subsetting language.  Following our methodology, &lt;br /&gt;
support for off-line mobile code should be derived from support for on-line &lt;br /&gt;
mobile code.  While E was always designed for mobile code, we're not there &lt;br /&gt;
yet, so the ideas weren't in concrete form.&lt;br /&gt;
&lt;br /&gt;
This has now been repaired.  &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html is my &lt;br /&gt;
proposal for a remote evaluation service, and syntactic sugar to support it.&lt;br /&gt;
Fire away.  If this proposal survives the initial volley, the off-line &lt;br /&gt;
proposal will be built on it.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fourth message ==&lt;br /&gt;
[[User:Markm|Mark S. Miller]] wrote Sat, 11 Nov 2000 08:44:55 -0800 in [http://www.eros-os.org/pipermail/e-lang/2000-November/003911.html]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
Here is the long delayed next step in this proposal for Capability-based &lt;br /&gt;
Active Invocation Certificates.  For an indefinitely postponed hypothetical &lt;br /&gt;
piece of engineering, this thread is taking up a distressing amount of &lt;br /&gt;
paper.  *If* off-line certificates are indeed useful in an increasingly &lt;br /&gt;
on-line world (a questionable assumption), then I believe this thread will &lt;br /&gt;
prove important.  Thanks for your indulgence.&lt;br /&gt;
&lt;br /&gt;
(Alan and Bill, you guys are the most qualified to address this &lt;br /&gt;
questionable assumption, as you've both been heavily involved in engineering &lt;br /&gt;
efforts with similar goals on both sides of this coin.  (E-Speak 2.2 vs &lt;br /&gt;
E-Speak 3.0/SPKI; Indra &amp;amp; Pluribus vs SPKI).  Is there a compelling &lt;br /&gt;
need for off-line certificates?  Do they address a real problem?)&lt;br /&gt;
&lt;br /&gt;
Previous messages in this thread have already established a strong &lt;br /&gt;
correspondence between Invocation Certificates and E/Pluribus messages -- &lt;br /&gt;
they are simply the off-line and on-line embodiments, respectively, of a &lt;br /&gt;
Granovetter/capability message.  The semantic differences are only due to &lt;br /&gt;
the differences between our notions off-line and on-line (significantly &lt;br /&gt;
clarified in answer to Bill's question), plus that we only define off-line &lt;br /&gt;
certificates to be the equivalent of sendOnly messages -- messages without a &lt;br /&gt;
continuation &lt;br /&gt;
http://www.erights.org/elib/concurrency/msg-passing.html#sendOnly .&lt;br /&gt;
&lt;br /&gt;
The remaining element, and the element that motivated this whole thread in &lt;br /&gt;
the first place, is the not-yet-explained &amp;quot;Active&amp;quot; feature of our &lt;br /&gt;
certificate proposal.  Rather than explain Active certificates directly, &lt;br /&gt;
this message will show the on-line equivalent of this feature: &lt;br /&gt;
Deputizing Remote Vats with Mobile Code.  That's why we introduced the &lt;br /&gt;
Evaluator earlier.&lt;br /&gt;
&lt;br /&gt;
Let's construct the standard deputy scenario &lt;br /&gt;
http://www.erights.org/elib/capability/deputy.html .  Let's say that Alice &lt;br /&gt;
had a prior reference to Mallet and the power, P, and that Alice constructs &lt;br /&gt;
Bob in order to provide Mallet with reduced authority over the power.  For &lt;br /&gt;
example, let's say P is a mutable slot with getValue() and &lt;br /&gt;
setValue(newValue) messages, and that Alice wishes to provide Mallet only &lt;br /&gt;
the authority to see the current value, but not to set it.  As a contrived &lt;br /&gt;
embellishment whose purpose will be clear later, let's say Alice constructs &lt;br /&gt;
Bob to accept but ignore the setValue message.  Alice might define Bob thus:&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            to getValue :any { P getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Alice would then give Mallet&lt;br /&gt;
&lt;br /&gt;
    Mallet foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
However, now let's say Alice, P, and Mallet are all in three separate vats:&lt;br /&gt;
VatA, VatP, and VatM.  The code would then read&lt;br /&gt;
&lt;br /&gt;
    define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker new(P))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;From a security point of view, this is ideal.  Bob is Alice's deputy, and &lt;br /&gt;
Bob runs on VatA, and therefore Alice's TCB.  Alice necessarily &lt;br /&gt;
&amp;quot;trusts&amp;quot; her own TCB, not because she necessarily has higher confidence in &lt;br /&gt;
its trustworthiness, but because she can't help but be fully vulnerable to &lt;br /&gt;
it, so she may as well stop worrying.  Since she already has this &lt;br /&gt;
vulnerability, she does not acquire any new vulnerability by trusting the &lt;br /&gt;
same TCB to run Bob.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, depending on the particulars of the situation, this choice &lt;br /&gt;
may not be ideal from a distributed systems point of view.  Any time Mallet &lt;br /&gt;
wishes to exercise his reduced power, the request has to go through Bob &lt;br /&gt;
(necessary) and therefore through VatA (unfortunate).  Besides the obvious &lt;br /&gt;
performance cost, Alice may be expecting VatA to go off-line soon, or become &lt;br /&gt;
otherwise inaccessible to VatM and VatP.  Let's say Alice also expects VatM &lt;br /&gt;
and VatP to remain accessible to each other.  If Alice were introducing &lt;br /&gt;
Mallet to all of P, our standard Granovetter introduction protocol would put &lt;br /&gt;
VatM and VatP in direct contact, and Alice could drop out of the picture &lt;br /&gt;
without disrupting their further communication.  How can Alice introduce &lt;br /&gt;
Mallet to the &amp;quot;some of P&amp;quot; represented by Bob, and still be able to drop out?&lt;br /&gt;
&lt;br /&gt;
I'm sure you can all see what's coming: there are only two other Vats in the &lt;br /&gt;
picture.  Alice's only two sensible choices are to instantiate Bob on VatM &lt;br /&gt;
or on VatP.  Both subject Alice to greater security risk that Bob on VatA.&lt;br /&gt;
&lt;br /&gt;
Bob on VatM:&lt;br /&gt;
&lt;br /&gt;
If Alice trusts VatM more than Mallet, this can be a sensible choice &lt;br /&gt;
(depending on the nature of trust in VatM).  Alice cannot rationally trust &lt;br /&gt;
VatM less than Mallet.  If she trusts them the same, then this is a bad &lt;br /&gt;
choice, since VatM is being given direct access to P.&lt;br /&gt;
&lt;br /&gt;
Bob on VatP:&lt;br /&gt;
&lt;br /&gt;
P is necessarily vulnerable to VatP, so any dishonest execution of Bob &lt;br /&gt;
that's equivalent to corruption of P creates no loss of security.  What &lt;br /&gt;
greater damage can a corrupt VatP cause?  Alice's intended Bob behavior &lt;br /&gt;
prevents Mallet from sending capabilities to P as argument of setValue &lt;br /&gt;
message.  Is this a form of distributed capability confinement &lt;br /&gt;
http://www.erights.org/elib/capability/dist-confine.html ?  With Bob on &lt;br /&gt;
VatA, it might seem that Mallet and P cannot arrange for Mallet to send &lt;br /&gt;
capabilities to P.  Unfortunately, the getValue message, as currently &lt;br /&gt;
defined, allows P to &amp;quot;send&amp;quot; (reveal, as the outcome of a prior send) an &lt;br /&gt;
arbitrary capability, which is enough to work around the restriction.  &lt;br /&gt;
However, Bob might be more constraining.  A Bob that only allowed integers &lt;br /&gt;
to be gotten from P would prevent Mallet from sending a capability to P.&lt;br /&gt;
&lt;br /&gt;
If we run Bob on VatP and VatP is corrupt (and in cahoots with Mallet and &lt;br /&gt;
P), then it can give to P capabilities from Mallet that Alice coded Bob to &lt;br /&gt;
prevent.  But wait a second, if VatP is corrupt, can't it separately &lt;br /&gt;
establish a channel between Mallet and P?  Only with VatM's cooperation.  So &lt;br /&gt;
we're back to relying on trust in VatM.&lt;br /&gt;
&lt;br /&gt;
When the location question comes up, I suspect capability confinement will &lt;br /&gt;
rarely be a concern (though it's good to check!).  Therefore, when &lt;br /&gt;
non-security issues argue against putting Bob on VatA, security issues will &lt;br /&gt;
typically argue for putting it on VatP.  Note that the non-security issues &lt;br /&gt;
are almost perfectly indifferent between VatP and VatM.&lt;br /&gt;
&lt;br /&gt;
Ok, so how does Alice instantiate Bob on VatP, and give Mallet access to &lt;br /&gt;
that Bob.  An economist turned programmer might say &amp;quot;Assume an Evaluator&amp;quot; &lt;br /&gt;
http://www.erights.org/javadoc/org/erights/e/elang/evm/Evaluator.html .  &lt;br /&gt;
Specifically, an Evaluator on VatP (exported by VatP's TCB), let's say &lt;br /&gt;
called evalP in Alice's scope.  Alice only needs to change her code to:&lt;br /&gt;
&lt;br /&gt;
    meta &amp;lt;- eval(evalP, define BobMaker new(P) :any {&lt;br /&gt;
        define Bob {&lt;br /&gt;
            # returns a promise for the value&lt;br /&gt;
            to getValue :any { P &amp;lt;- getValue }&lt;br /&gt;
            to setValue(newValue) {}&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    Mallet &amp;lt;- foo(BobMaker &amp;lt;- new(P))&lt;br /&gt;
&lt;br /&gt;
This asks the Evaluator on VatP to evaluate the expression defining &lt;br /&gt;
&amp;quot;BobMaker&amp;quot;.  It also defines &amp;quot;BobMaker&amp;quot; in this (Alice's) scope to be a &lt;br /&gt;
promise for that remote BobMaker.  We then send a remote request on this &lt;br /&gt;
BobMaker-promise to create a new Bob (BobMaker &amp;lt;- new(P)).  The value of &lt;br /&gt;
this expression is a promise for Bob, which is then sent to Mallet.&lt;br /&gt;
&lt;br /&gt;
(Just to show off message pipelining &lt;br /&gt;
http://www.erights.org/elib/concurrency/pipeline.html , all three of these &lt;br /&gt;
messages go out immediately, without VatA waiting to hear anything back.)&lt;br /&gt;
&lt;br /&gt;
The analogy with the SPKI subsetting language should be clear: Bob expresses &lt;br /&gt;
a subsetting of the authority of P.  Alice, who has authority P, is giving &lt;br /&gt;
Mallet only that subset, but is handing over the interpretation of her &lt;br /&gt;
subsetting intentions to VatP.  When Mallet goes to exercise his authority, &lt;br /&gt;
the subsetting is enforced by VatP, hopefully according to Alice's &lt;br /&gt;
instructions.&lt;br /&gt;
&lt;br /&gt;
The main difference, due to Nikita, is that we're expressing the subsetting &lt;br /&gt;
in a general purpose programming language.  This allows abstraction as well &lt;br /&gt;
as subsetting-by-thinning.  For example, a covered call option is a deputy &lt;br /&gt;
subsetting-by-abstraction the underlying instrument, such as stock.  One could &lt;br /&gt;
never express this kind of subsetting in a data-language such as SPKI provides.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complete concrete syntax ==&lt;br /&gt;
[[User:Zarutian|Zarutians]] notes:&lt;br /&gt;
&lt;br /&gt;
following is in bnf like form:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
invocation_cert := issuer recipient verb args signature&lt;br /&gt;
issuer := principal&lt;br /&gt;
recipient := SturdyArg | SturdyRef | initcert&lt;br /&gt;
verb := string&lt;br /&gt;
args := arg*&lt;br /&gt;
arg := SturdyArg | passByConstruction&lt;br /&gt;
signature := &amp;lt;crypto signature of the whole cert (issuer, recipient, verb and args)&amp;gt;&lt;br /&gt;
SturdyArg := subject [ invocation_cert ]&lt;br /&gt;
  cert is omitted if VatID of subject is the issuer of this invocation_cert&lt;br /&gt;
VatID := principal&lt;br /&gt;
principal := public-key | cryptohash(public-key)&lt;br /&gt;
swissNr := &amp;lt;/nowiki&amp;gt;[swiss Number]&amp;lt;nowiki&amp;gt;&lt;br /&gt;
initcert := issuer subject granted initcert_signature  -- gives subject an license to use granted as recipiant in an invocation_cert&lt;br /&gt;
subject := VatId hash(swissNr) &lt;br /&gt;
granted := hash(swissNr)  -- points to an object on issuers vat&lt;br /&gt;
initcert_signature := &amp;lt;crypto signature of the whole cert (issuer subject granted)&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Markm|Mark S. Miller]]:&lt;br /&gt;
hmm... this only supports certs that invoke an object on the recipient vat directly.&lt;br /&gt;
So if one wants to build an attenuator via the cert on must direct the invocation at an object that makes the object pointed to by an SturdyArg available to the unserialized representation&lt;br /&gt;
of the attenuator. (Which itself is an passByConstruction arg in that invocation.&lt;br /&gt;
&lt;br /&gt;
How then to make SturdyArg possible exit in serialized object graph carried in passByConstruction arg in the cert?&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: One kludge is to have an publicly aviable deserializer on the subject vat that gets invoked by the capcert.&lt;br /&gt;
The deserialier would be of the form: deserialize(passByConstructionDepiction, exit1, exit2, ..., exitn)&lt;br /&gt;
&lt;br /&gt;
But above is rather nasty kludge. The only otherway to solve this is to make capcert aviable to the deserialization surgeon or, heck, the E evaluator (as an uriGetter).&lt;br /&gt;
&lt;br /&gt;
I havent gotten to the point of how to bridge the online and offline world, that is make it possible for vatConnections to invoke capcerts (which could be solved by an capcert uriGetter as above) and vice versa (other than inducing the subject vat to issue an initcert).&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]] later:&lt;br /&gt;
The proplem in above paragraph can be solved by making hash(swissNr) in the subject form optional. In those cases the VatId much match the one of the vatp connection and refers to the invoking object.&lt;br /&gt;
&lt;br /&gt;
The kludge that markm pointed out can be solved by adding &amp;quot;universal_builder&amp;quot; to the reciepiant form.&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian|Zarutian]]: I am trying to get at the proplem from an different direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
active_cert := issuer script signiture&lt;br /&gt;
issuer := prinicpal&lt;br /&gt;
siginiture := publickey_encrypt(cryptohash(issuer script), issuer.privatekey)&lt;br /&gt;
script := string containing code in E&lt;br /&gt;
&lt;br /&gt;
def principal_seal(thing :any, recipiant :principal) :sealed_box {}&lt;br /&gt;
def principal_unseal(box :sealed_box) :any {}&lt;br /&gt;
def rootbase_get(swissHash :string) :any {}&lt;br /&gt;
&lt;br /&gt;
def do_active_cert(cert :String) :any {&lt;br /&gt;
  // 1. check if the signiture is valid&lt;br /&gt;
  // 2. make a new scope that has&lt;br /&gt;
  //     do_active_cert (this procedure),&lt;br /&gt;
  //     principal_seal,&lt;br /&gt;
  //     principal_unseal that only unseals sealed_boxes ment for the cert issuer&lt;br /&gt;
  //     all the other stuff a safeScope has&lt;br /&gt;
  // 3. run the script in that scope&lt;br /&gt;
  // 4. return any results&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
one issuer is special, the one who is also the VatID.&lt;br /&gt;
active_certs issued by that issuer can invoke (call or eventual send) rootbase_get().&lt;br /&gt;
why? so an tree of active_certs can get the source authority.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</description>
			<pubDate>Sat, 13 Feb 2010 15:02:04 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/Talk:Capability-based_Active_Invocation_Certificates</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have cleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;br /&gt;
  0x12 OP_END_HANDLER   [],[handler] =&amp;gt; OP_END_HANDLER =&amp;gt; [],[]&lt;br /&gt;
  &lt;br /&gt;
  0x16 OP_WHOLE_NUM     [],[] =&amp;gt; OP_WHOLE_NUM(wholeNum) =&amp;gt; [wholeNum],[]&lt;/div&gt;</description>
			<pubDate>Sat, 30 Jan 2010 17:16:52 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have cleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
  &lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;br /&gt;
  0x11 OP_UNWIND        [],[] =&amp;gt; OP_UNWIND(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [rethrower(arg)],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(pc) =&amp;gt; [returner(pc)],[]&lt;/div&gt;</description>
			<pubDate>Sat, 30 Jan 2010 17:13:31 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Still adding notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have cleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic         Effects/Description&lt;br /&gt;
  &lt;br /&gt;
  0x01 OP_DUP           [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x02 OP_POP           [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x03 OP_SWAP          [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x04 OP_ROT           [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x05 OP_RETURN        [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x08 OP_JUMP          [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                        label := ?Waterken Wholenum?&lt;br /&gt;
  0x09 OP_BRANCH        [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0x0A OP_CALL_ONLY     [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0x0B OP_CALL          [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;br /&gt;
                        verb := ?Waterken UTF8 string?&lt;br /&gt;
                        arity := ?Waterken Wholenum?&lt;br /&gt;
&lt;br /&gt;
  0x0E OP_EJECTOR_ONLY  [],[] =&amp;gt; OP_EJECTOR_ONLY(label) =&amp;gt; [ejector],[handler] &lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(_) =&amp;gt; [],[]&lt;br /&gt;
  0x0F OP_EJECTOR       [],[] =&amp;gt; OP_EJECTOR(label) =&amp;gt; [ejector],[handler]&lt;br /&gt;
                        when ejector is invoked: [...],[...] =&amp;gt; ejector(result) =&amp;gt; [result],[]&lt;br /&gt;
  0x10 OP_TRY           [],[] =&amp;gt; OP_TRY(label) =&amp;gt; [],[handler]&lt;br /&gt;
                        when handler is invoked: [...],[...] =&amp;gt; handler(arg) =&amp;gt; [arg],[]&lt;br /&gt;
                        when handler is dropped: [...],[...] =&amp;gt; handler.drop(_) =&amp;gt; [...],[...]&lt;/div&gt;</description>
			<pubDate>Sat, 30 Jan 2010 17:09:51 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Adding to the notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have cleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic      Effects&lt;br /&gt;
  &lt;br /&gt;
  0x1 OP_DUP        [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x2 OP_POP        [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x3 OP_SWAP       [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x4 OP_ROT        [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x5 OP_RETURN     [x],[] =&amp;gt; OP_RETURN&lt;br /&gt;
  &lt;br /&gt;
  0x8 OP_JUMP       [],[] =&amp;gt; OP_JUMP(label) =&amp;gt; [],[]&lt;br /&gt;
                    label := ?Waterken Whole num?&lt;br /&gt;
  0x9 OP_BRANCH     [ootEjector, flag],[] =&amp;gt; OP_BRANCH =&amp;gt; [],[]&lt;br /&gt;
  0xA OP_CALL_ONLY  [recip, args...],[] =&amp;gt; OP_CALL_ONLY(verb, arity) =&amp;gt; [],[]&lt;br /&gt;
  0xB OP_CALL       [recip, args...],[] =&amp;gt; OP_CALL(verb, arity) =&amp;gt; [result],[]&lt;/div&gt;</description>
			<pubDate>Sat, 30 Jan 2010 16:57:51 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian/Smallcaps</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian/Smallcaps</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;Notes on smallcaps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes of what I have cleaned from the incomplete spefication and implementation of Smallcaps.&lt;br /&gt;
&lt;br /&gt;
Smallcaps is a bytecode based format of executable code.&lt;br /&gt;
&lt;br /&gt;
The opcodes are:&lt;br /&gt;
&lt;br /&gt;
  Hex Memnomic  Effects&lt;br /&gt;
&lt;br /&gt;
  0x1 OP_DUP      [x],[] =&amp;gt; OP_DUP =&amp;gt; [x, x],[]&lt;br /&gt;
  0x2 OP_POP      [x],[] =&amp;gt; OP_POP =&amp;gt; [],[]&lt;br /&gt;
  0x3 OP_SWAP     [x, y],[] =&amp;gt; OP_SWAP =&amp;gt; [y, x],[]&lt;br /&gt;
  0x4 OP_ROT      [x, y, z],[] =&amp;gt; OP_ROT =&amp;gt; [y, z, x],[]&lt;br /&gt;
  0x5 OP_RETURN   [x],[] =&amp;gt; OP_RETURN&lt;/div&gt;</description>
			<pubDate>Sat, 30 Jan 2010 16:52:02 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian/Smallcaps</comments>		</item>
		<item>
			<title>User:Zarutian</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Instead of trying to keep multiple wiki user pages in sync I just point to one&lt;br /&gt;
http://wiki.tcl.tk/Zarutian&lt;br /&gt;
&lt;br /&gt;
Links to varius pages I am working on:&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian/Authorization Certificates]]&lt;br /&gt;
&lt;br /&gt;
[[Capability-based Active Invocation Certificates]]&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian/Smallcaps]]&lt;/div&gt;</description>
			<pubDate>Sat, 30 Jan 2010 16:44:22 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian</comments>		</item>
		<item>
			<title>User:Zarutian</title>
			<link>http://ds7.deltamobile.com/wiki/User:Zarutian</link>
			<guid>http://ds7.deltamobile.com/wiki/User:Zarutian</guid>
			<description>&lt;p&gt;Zarutian:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Instead of trying to keep multiple wiki user pages in sync I just point to one&lt;br /&gt;
http://wiki.tcl.tk/Zarutian&lt;br /&gt;
&lt;br /&gt;
Links to varius pages I am working on:&lt;br /&gt;
&lt;br /&gt;
[[User:Zarutian/Authorization Certificates]]&lt;br /&gt;
&lt;br /&gt;
[[Capability-based Active Invocation Certificates]]&lt;br /&gt;
&lt;br /&gt;
[[Smallcaps]]&lt;/div&gt;</description>
			<pubDate>Wed, 27 Jan 2010 20:53:54 GMT</pubDate>			<dc:creator>Zarutian</dc:creator>			<comments>http://ds7.deltamobile.com/wiki/User_talk:Zarutian</comments>		</item>
	</channel>
</rss>