Skip to content
Wide Area Verified Exchange - version 3
Go Other
  1. Go 99.7%
  2. Other 0.3%
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
asn1
auditor
cli
consts
contracts
eapi
engine
geth
iapi
jedistore
jediutils
localdb
originalstorage
paper_benchmarks
policy
policyutils/rtree
serdes
storage
tst
utils
waved
wve
.gitignore
Gopkg.lock
Gopkg.toml
LICENSE
README.md
checkMonet.js
checksigners.js

README.md

WAVE is an Authentication Verification Engine

This is version 3 of WAVE, which is not yet ready for production use. If you are looking for the widely-deployed BOSS WAVE system, please go to github.com/immesys/bw2

What's new

WAVE version 3 is no longer built on top of a blockchain, instead we have a horizontally scalable VLDM-based storage tier. We also have increased privacy of Attestations (formerly Delegations of Trust or DOTs) by adding a reverse-discoverable decryption mechanism.

Basic tutorial

Grab a release from the release tab. This will contain two binaries: waved which runs as a background process providing wave services, and wv the command line utility. We hope to have an installer in the near future, but for now you can either run waved with systemd (a unit file is provided) or in another tab.

Creating some entities to work with

Lets create some entities to represent an organisation:

./wv mke -o company.namespace --nopassphrase
wrote entity: company.namespace
./wv mke -o alice --nopassphrase
wrote entity: alice

Lets also create a permission set which is an entity that uniquely identifies the meaning of a set of permission strings. This is so that one person's idea of what read means doesn't accidentally get confused with another person's idea. It is likely that an application developer would create a permission set for their application:

./wv mke -o myapp --nopassphrase

Granting permissions

Now lets say that the company grants alice the permission to read all resources within the company namespace.

./wv rtgrant --attester company.namespace --indirections 5 --subject alice myapp:read@company.namespace/*
wrote attestation: att_GyBM5VDtIDPuWYSx6Cw6XVmeFbmdZLi5hL0qy9Acl-0jyQ==.pem
published attestation

With this, alice should be able to prove she has permissions on a resource, like company.namespace/foo:

./wv rtprove --subject alice myapp:read@company.namespace/foo
Synchronized 3/3 entities
Perspective graph sync complete
wrote proof: proof_2018-07-25T15:48:47-07:00.pem

The proof has been written out to a file, anyone can verify the proof as follows:

./wv verify proof_2018-07-25T15\:48\:47-07\:00.pem
Referenced attestations:
 [00] Hash: GyBM5VDtIDPuWYSx6Cw6XVmeFbmdZLi5hL0qy9Acl-0jyQ==
Paths:
 [00] 00
Subject: GyBVOAZJXLDqWGncj2C-yieCwy8vsfT8QDl6u0V-ds3Z-Q==
SubjectLoc: default
Expires: 2018-08-24 15:40:58 -0700 PDT
Policy: RTree
 Namespace: GyBIOr311-I6UE_9T0lYIoIZsLZaSWRWyuz8SJsrUJs3vw==
 Indirections: 5
 Statements:
 [00] Permission set: GyDYbnBfVzeJTzUcPgFF3IeY0VuhmRSMEZwusAp_WKndJw==
      Permissions: read
      URI: *

This yields a policy that shows the permissions that the proof is proving alice has.

Naming entities

In the above examples, we could easily refer to alice, myapp and company.namespace because the files existed in the current directory. We would otherwise have to refer to these entities by their full hash. To make it easier, WAVE also has a directory mechanism that allows you to name other entities and share those names with other people. Lets name the myapp entity superapp. For now we will show public names that anyone can read:

./wv name --attester company.namespace --public myapp superapp
name "superapp" -> "GyDYbnBfVzeJTzUcPgFF3IeY0VuhmRSMEZwusAp_WKndJw==" created successfully

Now lets also say that alice decides to name her company acme but she wants this to be a private name that only she can see:

./wv name --attester alice company.namespace acme
name "acme" -> "GyBIOr311-I6UE_9T0lYIoIZsLZaSWRWyuz8SJsrUJs3vw==" created successfully

Alice can now refer to the app permission set as superapp.acme because she has privately named the company namespace entity acme and that entity publicly named the permission set entity superapp:

./wv resolve --perspective alice superapp.acme
Perspective graph sync complete
"superapp.acme":
= Entity
  Location: default
      Hash: GyDYbnBfVzeJTzUcPgFF3IeY0VuhmRSMEZwusAp_WKndJw==
  Known as: superapp.acme
   Created: 2018-07-25 15:46:10 -0700 PDT
   Expires: 2018-08-24 15:46:10 -0700 PDT
  Validity:
   - Valid: true
   - Expired: false
   - Malformed: false
   - Revoked: false
   - Message:

Lets say there is another employee the company knows as bob:

./wv mke -o bob.ent --nopassphrase
wrote entity: bob.ent
./wv name --attester company.namespace --public bob.ent bob
name "bob" -> "GyDepqXkTWQB6zyMfBi6ZabkkWMXVTd64nJZg_9W4mXZJg==" created successfully

Alice can now grant permissions to bob using the names that the company created:

./wv rtgrant --attester alice --subject bob.acme superapp.acme:read@acme/*
wrote attestation: att_GyDe_hk7nBWHft3m61dzYa3-iHorXCDxRc0MZxRMX8NFmw==.pem
published attestation

And bob can prove that, after he names the company as well:

./wv name --attester bob company.namespace acme
name "acme" -> "GyBIOr311-I6UE_9T0lYIoIZsLZaSWRWyuz8SJsrUJs3vw==" created successfully
./wv rtprove --subject bob superapp.acme:read@acme/foo
Perspective graph sync complete
wrote proof: proof_2018-07-25T16:33:01-07:00.pem
You can’t perform that action at this time.