vault-tree 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +26 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +43 -0
- data/LICENSE.txt +22 -0
- data/README.md +118 -0
- data/Rakefile +17 -0
- data/VagrantFile +30 -0
- data/features/core.feature +44 -0
- data/features/exceptions.feature +41 -0
- data/features/steps/core.steps.rb +168 -0
- data/features/steps/exceptions.steps.rb +103 -0
- data/features/support/env.rb +1 -0
- data/features/world.rb +3 -0
- data/lib/vault-tree.rb +7 -0
- data/lib/vault-tree/config/dependencies.rb +4 -0
- data/lib/vault-tree/config/lib.rb +2 -0
- data/lib/vault-tree/config/path_helpers.rb +49 -0
- data/lib/vault-tree/config/string.rb +25 -0
- data/lib/vault-tree/contract/close_validator.rb +35 -0
- data/lib/vault-tree/contract/contract.rb +85 -0
- data/lib/vault-tree/contract/contract_presenter.rb +27 -0
- data/lib/vault-tree/contract/doorman.rb +112 -0
- data/lib/vault-tree/contract/null_vault.rb +16 -0
- data/lib/vault-tree/contract/open_validator.rb +20 -0
- data/lib/vault-tree/contract/vault.rb +96 -0
- data/lib/vault-tree/exceptions/empty_vault.rb +8 -0
- data/lib/vault-tree/exceptions/fill_attempt_master_password.rb +6 -0
- data/lib/vault-tree/exceptions/invalid_signature.rb +0 -0
- data/lib/vault-tree/exceptions/malformed_json.rb +0 -0
- data/lib/vault-tree/exceptions/missing_external_data.rb +6 -0
- data/lib/vault-tree/exceptions/missing_partner_decryption_key.rb +6 -0
- data/lib/vault-tree/exceptions/missing_passphrase.rb +6 -0
- data/lib/vault-tree/exceptions/non_unique_vault_id.rb +0 -0
- data/lib/vault-tree/exceptions/unsupported_keyword.rb +6 -0
- data/lib/vault-tree/exceptions/vault_does_not_exist.rb +6 -0
- data/lib/vault-tree/exceptions/vault_tree_exception.rb +6 -0
- data/lib/vault-tree/keywords/decryption_key.rb +14 -0
- data/lib/vault-tree/keywords/external_data.rb +13 -0
- data/lib/vault-tree/keywords/keyword.rb +19 -0
- data/lib/vault-tree/keywords/keyword_interpreter.rb +45 -0
- data/lib/vault-tree/keywords/master_passphrase.rb +9 -0
- data/lib/vault-tree/keywords/public_encryption_key.rb +27 -0
- data/lib/vault-tree/keywords/random_number.rb +9 -0
- data/lib/vault-tree/keywords/shared_key.rb +24 -0
- data/lib/vault-tree/keywords/unlocked.rb +9 -0
- data/lib/vault-tree/keywords/vault_contents.rb +13 -0
- data/lib/vault-tree/lock_smith/asymmetric_cipher.rb +31 -0
- data/lib/vault-tree/lock_smith/crypto_hash.rb +11 -0
- data/lib/vault-tree/lock_smith/digital_signature.rb +32 -0
- data/lib/vault-tree/lock_smith/encryption_key_pair.rb +25 -0
- data/lib/vault-tree/lock_smith/null_vault.rb +4 -0
- data/lib/vault-tree/lock_smith/random_number.rb +11 -0
- data/lib/vault-tree/lock_smith/shared_key_pair.rb +12 -0
- data/lib/vault-tree/lock_smith/signing_key_pair.rb +25 -0
- data/lib/vault-tree/lock_smith/symmetric_cipher.rb +25 -0
- data/lib/vault-tree/util/json.rb +16 -0
- data/lib/vault-tree/version.rb +3 -0
- data/spec/app/locksmith/asymmetric_cipher_spec.rb +25 -0
- data/spec/app/locksmith/signing_key_pair_spec.rb +22 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/fixtures/blank_simple_test_contract.json +14 -0
- data/spec/support/fixtures/broken_contract.json +55 -0
- data/spec/support/fixtures/one_two_three-0.5.0.EXP.json +105 -0
- data/spec/support/fixtures/reference_contract.1.0.0.json +227 -0
- data/spec/support/fixtures/simple_test_contract.json +14 -0
- data/support/cookbooks/ark/.gitignore +12 -0
- data/support/cookbooks/ark/.kitchen.yml +34 -0
- data/support/cookbooks/ark/.travis.yml +6 -0
- data/support/cookbooks/ark/Berksfile +9 -0
- data/support/cookbooks/ark/CHANGELOG.md +87 -0
- data/support/cookbooks/ark/CONTRIBUTING.md +257 -0
- data/support/cookbooks/ark/README.md +301 -0
- data/support/cookbooks/ark/Rakefile +36 -0
- data/support/cookbooks/ark/TESTING.md +25 -0
- data/support/cookbooks/ark/Toftfile +15 -0
- data/support/cookbooks/ark/attributes/default.rb +6 -0
- data/support/cookbooks/ark/chefignore +96 -0
- data/support/cookbooks/ark/files/default/foo.tar.gz +0 -0
- data/support/cookbooks/ark/files/default/foo.tbz +0 -0
- data/support/cookbooks/ark/files/default/foo.tgz +0 -0
- data/support/cookbooks/ark/files/default/foo.zip +0 -0
- data/support/cookbooks/ark/files/default/tests/minitest/default_test.rb +0 -0
- data/support/cookbooks/ark/files/default/tests/minitest/support/helpers.rb +0 -0
- data/support/cookbooks/ark/files/default/tests/minitest/test_test.rb +94 -0
- data/support/cookbooks/ark/libraries/default.rb +167 -0
- data/support/cookbooks/ark/metadata.rb +13 -0
- data/support/cookbooks/ark/providers/default.rb +370 -0
- data/support/cookbooks/ark/recipes/default.rb +31 -0
- data/support/cookbooks/ark/recipes/test.rb +138 -0
- data/support/cookbooks/ark/resources/default.rb +54 -0
- data/support/cookbooks/ark/templates/default/add_to_path.sh.erb +1 -0
- data/support/cookbooks/ark/test/support/Gemfile +4 -0
- data/support/cookbooks/build-essential/README.md +24 -0
- data/support/cookbooks/build-essential/metadata.rb +10 -0
- data/support/cookbooks/build-essential/recipes/default.rb +45 -0
- data/support/cookbooks/chruby/.gitignore +15 -0
- data/support/cookbooks/chruby/.kitchen.yml +26 -0
- data/support/cookbooks/chruby/.ruby_version +1 -0
- data/support/cookbooks/chruby/Berksfile +3 -0
- data/support/cookbooks/chruby/Gemfile +7 -0
- data/support/cookbooks/chruby/LICENSE +14 -0
- data/support/cookbooks/chruby/README.md +92 -0
- data/support/cookbooks/chruby/Rakefile +7 -0
- data/support/cookbooks/chruby/Thorfile +6 -0
- data/support/cookbooks/chruby/Vagrantfile +86 -0
- data/support/cookbooks/chruby/attributes/default.rb +10 -0
- data/support/cookbooks/chruby/chefignore +96 -0
- data/support/cookbooks/chruby/metadata.rb +11 -0
- data/support/cookbooks/chruby/recipes/default.rb +43 -0
- data/support/cookbooks/chruby/recipes/system.rb +25 -0
- data/support/cookbooks/chruby/templates/default/chruby.sh.erb +22 -0
- data/support/cookbooks/chruby/test/integration/default/bash/embedded_test.sh +1 -0
- data/support/cookbooks/git/.gitignore +14 -0
- data/support/cookbooks/git/.kitchen.yml +46 -0
- data/support/cookbooks/git/Berksfile +8 -0
- data/support/cookbooks/git/CHANGELOG.md +87 -0
- data/support/cookbooks/git/CONTRIBUTING +29 -0
- data/support/cookbooks/git/Gemfile +3 -0
- data/support/cookbooks/git/LICENSE +201 -0
- data/support/cookbooks/git/README.md +115 -0
- data/support/cookbooks/git/TESTING.md +25 -0
- data/support/cookbooks/git/attributes/default.rb +40 -0
- data/support/cookbooks/git/metadata.rb +35 -0
- data/support/cookbooks/git/recipes/default.rb +53 -0
- data/support/cookbooks/git/recipes/server.rb +58 -0
- data/support/cookbooks/git/recipes/source.rb +49 -0
- data/support/cookbooks/git/recipes/windows.rb +37 -0
- data/support/cookbooks/git/templates/default/git-xinetd.d.erb +10 -0
- data/support/cookbooks/git/templates/default/sv-git-daemon-log-run.erb +2 -0
- data/support/cookbooks/git/templates/default/sv-git-daemon-run.erb +3 -0
- data/support/cookbooks/install_ruby/README.md +3 -0
- data/support/cookbooks/install_ruby/metadata.rb +10 -0
- data/support/cookbooks/install_ruby/recipes/default.rb +14 -0
- data/support/cookbooks/ruby_build/.gitignore +6 -0
- data/support/cookbooks/ruby_build/.kitchen.yml +31 -0
- data/support/cookbooks/ruby_build/.travis.yml +4 -0
- data/support/cookbooks/ruby_build/Berksfile +10 -0
- data/support/cookbooks/ruby_build/CHANGELOG.md +72 -0
- data/support/cookbooks/ruby_build/Gemfile +14 -0
- data/support/cookbooks/ruby_build/README.md +338 -0
- data/support/cookbooks/ruby_build/Rakefile +21 -0
- data/support/cookbooks/ruby_build/attributes/default.rb +67 -0
- data/support/cookbooks/ruby_build/chefignore +53 -0
- data/support/cookbooks/ruby_build/libraries/ruby_build_recipe_helpers.rb +40 -0
- data/support/cookbooks/ruby_build/metadata.rb +18 -0
- data/support/cookbooks/ruby_build/providers/ruby.rb +88 -0
- data/support/cookbooks/ruby_build/recipes/default.rb +69 -0
- data/support/cookbooks/ruby_build/resources/ruby.rb +33 -0
- data/support/cookbooks/ruby_build/test/cookbooks/alltherubies/metadata.rb +10 -0
- data/support/cookbooks/ruby_build/test/cookbooks/alltherubies/recipes/default.rb +59 -0
- data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/_verify_tests.bash +33 -0
- data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.8.7.bats +29 -0
- data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.9.2.bats +18 -0
- data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.9.3.bats +18 -0
- data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_2.0.0.bats +18 -0
- data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_jruby.bats +20 -0
- data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_rbx.bats +18 -0
- data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_ree.bats +19 -0
- data/support/cookbooks/ruby_build/test/integration/installation/bats/installation.bats +6 -0
- data/support/scripts/libsodium_ubuntu.sh +80 -0
- data/support/tasks/.gitkeep +0 -0
- data/support/tasks/libsodium_install.rb +57 -0
- data/vault-tree.gemspec +26 -0
- metadata +305 -0
data/.gitignore
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# simple_cove generated
|
|
2
|
+
coverage
|
|
3
|
+
coverage.data
|
|
4
|
+
|
|
5
|
+
# rdoc generated
|
|
6
|
+
rdoc
|
|
7
|
+
|
|
8
|
+
# yard generated
|
|
9
|
+
doc
|
|
10
|
+
.yardoc
|
|
11
|
+
|
|
12
|
+
# bundler
|
|
13
|
+
.bundle
|
|
14
|
+
|
|
15
|
+
# jeweler generated
|
|
16
|
+
pkg
|
|
17
|
+
|
|
18
|
+
# Vagrant
|
|
19
|
+
.vagrant/
|
|
20
|
+
package.box
|
|
21
|
+
|
|
22
|
+
# ignore contracts directory
|
|
23
|
+
contracts/
|
|
24
|
+
|
|
25
|
+
# ignore built gem
|
|
26
|
+
*.gem
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
vault-tree (0.1.3)
|
|
5
|
+
rbnacl (= 1.1.0)
|
|
6
|
+
require_all
|
|
7
|
+
|
|
8
|
+
GEM
|
|
9
|
+
remote: http://rubygems.org/
|
|
10
|
+
specs:
|
|
11
|
+
builder (3.2.2)
|
|
12
|
+
cucumber (1.3.8)
|
|
13
|
+
builder (>= 2.1.2)
|
|
14
|
+
diff-lcs (>= 1.1.3)
|
|
15
|
+
gherkin (~> 2.12.1)
|
|
16
|
+
multi_json (>= 1.7.5, < 2.0)
|
|
17
|
+
multi_test (>= 0.0.2)
|
|
18
|
+
diff-lcs (1.2.4)
|
|
19
|
+
ffi (1.9.3)
|
|
20
|
+
gherkin (2.12.2)
|
|
21
|
+
multi_json (~> 1.3)
|
|
22
|
+
multi_json (1.8.1)
|
|
23
|
+
multi_test (0.0.2)
|
|
24
|
+
rbnacl (1.1.0)
|
|
25
|
+
ffi
|
|
26
|
+
require_all (1.3.2)
|
|
27
|
+
rspec (2.14.1)
|
|
28
|
+
rspec-core (~> 2.14.0)
|
|
29
|
+
rspec-expectations (~> 2.14.0)
|
|
30
|
+
rspec-mocks (~> 2.14.0)
|
|
31
|
+
rspec-core (2.14.5)
|
|
32
|
+
rspec-expectations (2.14.3)
|
|
33
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
|
34
|
+
rspec-mocks (2.14.3)
|
|
35
|
+
|
|
36
|
+
PLATFORMS
|
|
37
|
+
ruby
|
|
38
|
+
|
|
39
|
+
DEPENDENCIES
|
|
40
|
+
bundler (~> 1.3)
|
|
41
|
+
cucumber
|
|
42
|
+
rspec
|
|
43
|
+
vault-tree!
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2013 Andrew Bashelor
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
## Vault Tree
|
|
2
|
+
|
|
3
|
+
_The Self Enforcing Contract_
|
|
4
|
+
|
|
5
|
+
Vault Tree is a collection of tools for building and executing distributed cryptographic contracts.
|
|
6
|
+
|
|
7
|
+
Before you begin make sure you checkout the [Vault Tree Homepage] for an overview of the project.
|
|
8
|
+
|
|
9
|
+
[Vault Tree Homepage]: http://www.vault-tree.org
|
|
10
|
+
|
|
11
|
+
### Welcome!
|
|
12
|
+
|
|
13
|
+
The Vault Tree Project consists of:
|
|
14
|
+
|
|
15
|
+
* A JSON based DSL for building Distributed Crytographic Contracts
|
|
16
|
+
* A a Ruby library to execute these contracts
|
|
17
|
+
* A Github [Contracts Repository] that acts as a focal point of collaboration for developers writing and testing interesting crytographic contracts
|
|
18
|
+
|
|
19
|
+
[Contracts Repository]: https://github.com/VaultTree/contracts
|
|
20
|
+
|
|
21
|
+
### Install
|
|
22
|
+
|
|
23
|
+
Before you start:
|
|
24
|
+
|
|
25
|
+
* If you just want to use Vault Tree to build and execute contracts go to the [Contracts Repository].
|
|
26
|
+
* To use the library in your application or want to contribute code, you're in the right place.
|
|
27
|
+
* Before you pull the trigger on the install remember we have a Vagrant Box.
|
|
28
|
+
|
|
29
|
+
[Contracts Repository]: https://github.com/VaultTree/contracts
|
|
30
|
+
|
|
31
|
+
Okay, lets begin.
|
|
32
|
+
|
|
33
|
+
As a prerequisite get [libsodium] on you machine. This is the underlying cryptographic library that Vault Tree depends on.
|
|
34
|
+
|
|
35
|
+
[libsodium]: https://github.com/jedisct1/libsodium
|
|
36
|
+
|
|
37
|
+
* If you are on _OSX_ there is a [brew] package available. So just:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
brew install libsodium
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
[brew]: http://brew.sh/
|
|
44
|
+
|
|
45
|
+
* If you're on a Debian based system, there is no _apt-get_ package that I know of, but there
|
|
46
|
+
are some helpful install scripts on the web. I've checked one of these in at:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
vault-tree/support/scripts/libsodium_ubuntu.sh
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
* If you're on Windows, the Vagrant install gives you a Linux virtual machine that helps you to pretend that you're not on Windows.
|
|
53
|
+
|
|
54
|
+
Now that you have libsodium, if you're a Ruby developer you know the drill from here:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
gem install vault-tree
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
and then
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
require 'vault-tree'
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
somewhere before you use it.
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
### Vagrant
|
|
70
|
+
|
|
71
|
+
I think it should be easy for you to get a Vault Tree development environment up and running. If you don't know about Vagrant, you should, it's awesome!
|
|
72
|
+
|
|
73
|
+
* Follow the [Vagrant] download and install steps
|
|
74
|
+
* Clone the Vault Tree Repo and go into it:
|
|
75
|
+
|
|
76
|
+
[Vagrant]: http://www.vagrantup.com/
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
git clone git@github.com:VaultTree/vault-tree.git
|
|
80
|
+
cd ~/path/to/vault-tree/
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Now you just need to Vagrant Up!
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
vagrant up
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
This will download and boot a pre-packaged Linux virtual machine with Vault-Tree and all dependencies already installed.
|
|
90
|
+
|
|
91
|
+
Once your VM is downloaded and built. You can go inside with:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
vagrant shh
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
As a developer working on Vault Tree you can now go to the VM's directory:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
/vagrant
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
and run `rake`. This will run all the tests and put you in a good spot to start exploring the code.
|
|
104
|
+
|
|
105
|
+
If you're not already familiar, take a few minutes to learn about how Vagrant will [sync your files] to and from the guest machine.
|
|
106
|
+
|
|
107
|
+
[sync your files]: http://docs.vagrantup.com/v2/getting-started/synced_folders.html
|
|
108
|
+
|
|
109
|
+
### Is it production ready?
|
|
110
|
+
|
|
111
|
+
Absolutely not. We have a long way to go.
|
|
112
|
+
|
|
113
|
+
Here are some of the big issues that I could use your help on as we move to version 1.0:
|
|
114
|
+
|
|
115
|
+
* This is a crypto application so vulnerabilities need to be identified and corrected. We need more eyes in this area.
|
|
116
|
+
* We we need to figure out if the supported keywords are sufficient to implement basic secure computation schemes.
|
|
117
|
+
- For example, Digital Signatures and HMACs are not implemented but could be.
|
|
118
|
+
- Should they be implemented? What is the use case? Ect. We need to have these conversations.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'lib/vault-tree.rb'
|
|
2
|
+
require 'cucumber'
|
|
3
|
+
require 'cucumber/rake/task'
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
5
|
+
require "bundler/gem_tasks"
|
|
6
|
+
|
|
7
|
+
task :default => 'spec'
|
|
8
|
+
|
|
9
|
+
Cucumber::Rake::Task.new('cuke') do |t|
|
|
10
|
+
# -r means you require all support files first
|
|
11
|
+
# this allows you to organize and run by subdirectory
|
|
12
|
+
t.cucumber_opts = "-r features features --format pretty"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
task :spec => 'cuke' do
|
|
16
|
+
STDOUT.write %x[rspec --format doc]
|
|
17
|
+
end
|
data/VagrantFile
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Vagrant::Config.run do |config|
|
|
2
|
+
config.vm.box = "vault-tree-box"
|
|
3
|
+
config.vm.box_url = "http://vault-tree-box.s3.amazonaws.com/package.box"
|
|
4
|
+
#config.vm.provision :chef_solo do |chef|
|
|
5
|
+
# chef.cookbooks_path = "support/cookbooks"
|
|
6
|
+
# chef.add_recipe("git")
|
|
7
|
+
# chef.add_recipe("build-essential")
|
|
8
|
+
# chef.add_recipe("ruby_build")
|
|
9
|
+
# chef.add_recipe("chruby")
|
|
10
|
+
# chef.add_recipe("install_ruby")
|
|
11
|
+
#end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
module VagrantHelpers
|
|
15
|
+
module PathHelpers
|
|
16
|
+
extend self
|
|
17
|
+
|
|
18
|
+
def provision_dir
|
|
19
|
+
"#{project_dir}/lib/vagrant"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def project_dir
|
|
23
|
+
File.expand_path(current_dir_rel)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def current_dir_rel
|
|
27
|
+
File.dirname(__FILE__)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Feature: Core Functionality
|
|
2
|
+
|
|
3
|
+
Scenario: Close And Open With Master Password
|
|
4
|
+
Given I have a blank reference contract
|
|
5
|
+
When I lock a message in a vault with my Master Password
|
|
6
|
+
Then I can recover the message with my Master Password
|
|
7
|
+
|
|
8
|
+
Scenario: Close And Open With Random Key
|
|
9
|
+
Given I have a blank reference contract
|
|
10
|
+
When I lock away a random vault key
|
|
11
|
+
And I use the random key to lock a message
|
|
12
|
+
Then I can recover the message with the Random Key
|
|
13
|
+
|
|
14
|
+
Scenario: Transfer Key Via Unlocked Vault
|
|
15
|
+
Given I have a blank reference contract
|
|
16
|
+
When I lock away a random vault key
|
|
17
|
+
And I use the random key to lock a message
|
|
18
|
+
And I put this random key in an unlocked vault
|
|
19
|
+
Then another user can recover the message with the Unlocked Random Key
|
|
20
|
+
|
|
21
|
+
Scenario: Asymmetric Vault
|
|
22
|
+
Given I have a blank reference contract
|
|
23
|
+
And I have access to the another user's unlocked public key
|
|
24
|
+
And I lock a simple message with a shared key
|
|
25
|
+
When I transfer the contract to the other user
|
|
26
|
+
Then they can create a shared key and unlock the message
|
|
27
|
+
|
|
28
|
+
Scenario: Example - Alice and Bob Execute a One Two Three Contract
|
|
29
|
+
Given Alice has the blank contract
|
|
30
|
+
When she locks all of her attributes
|
|
31
|
+
And she sends the contract to Bob
|
|
32
|
+
Then Bob can access her public attributes
|
|
33
|
+
When Bob locks his attributes
|
|
34
|
+
And He fills and locks each of the three vaults
|
|
35
|
+
Then Alice can execute the contract to recover the final message
|
|
36
|
+
|
|
37
|
+
Scenario: Example - A Simple Block Chain Key Transfer
|
|
38
|
+
Given the SENDER has the blank BTC Key Transfer template
|
|
39
|
+
And the SENDER chooses an origin wallet address and concealed destination address
|
|
40
|
+
And he locks away the secret BTC signing key
|
|
41
|
+
When the SENDER transfers the Vault-Tree contract to the RECEIVER
|
|
42
|
+
Then the RECEIVER can access the origin wallet address
|
|
43
|
+
When the SENDER reveals the hidden wallet address by Blockchain payment from the origin address
|
|
44
|
+
Then the RECEIVER can unlock the vault to recover the transfered signing key
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
Feature: Vault Tree Exceptions
|
|
2
|
+
|
|
3
|
+
Scenario: Empty Vault
|
|
4
|
+
Given the broken contract
|
|
5
|
+
When I attempt to open an empty vault
|
|
6
|
+
Then an EmptyVault exception is raised
|
|
7
|
+
|
|
8
|
+
Scenario: Attempted Fill with Master Password
|
|
9
|
+
Given the broken contract
|
|
10
|
+
When I attempt fill a vault with my Master Password
|
|
11
|
+
Then a FillAttemptMasterPassword exception is raised
|
|
12
|
+
|
|
13
|
+
Scenario: Missing External Data
|
|
14
|
+
Given the broken contract
|
|
15
|
+
When I attempt fill a vault with External Data that does not exists
|
|
16
|
+
Then a MissingExternalData exception is raised
|
|
17
|
+
|
|
18
|
+
Scenario: Missing Passphrase
|
|
19
|
+
Given a valid blank contract
|
|
20
|
+
When I attempt fill a vault without providing a master passphrase
|
|
21
|
+
Then a MissingPassphrase exception is raised
|
|
22
|
+
|
|
23
|
+
Scenario: Unsupported Keyword
|
|
24
|
+
Given the broken contract
|
|
25
|
+
When I attempt fill a vault with an unsupported Keyword
|
|
26
|
+
Then an UnsupportedKeyword exception is raised
|
|
27
|
+
|
|
28
|
+
Scenario: Vault Does Not Exists on Retrieval
|
|
29
|
+
Given the broken contract
|
|
30
|
+
When I attempt to open a vault that does not exists
|
|
31
|
+
Then a VaultDoesNotExist exception is raised
|
|
32
|
+
|
|
33
|
+
Scenario: Vault Does Not Exists on Closing
|
|
34
|
+
Given the broken contract
|
|
35
|
+
When I attempt to close a vault that does not exists
|
|
36
|
+
Then a VaultDoesNotExist exception is raised
|
|
37
|
+
|
|
38
|
+
Scenario: Missing Partner Decryption Key
|
|
39
|
+
Given the broken contract
|
|
40
|
+
When I attempt to fill with an encryption key without first establishing the decryption key
|
|
41
|
+
Then a MissingPartnerDecryptionKey exception is raised
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
Given(/^Alice has the blank contract$/) do
|
|
2
|
+
contract_path = VaultTree::PathHelpers.reference_contract
|
|
3
|
+
@contract_json = File.read(contract_path)
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
# Change this to just attributes vice public attributes
|
|
7
|
+
When(/^she locks all of her attributes$/) do
|
|
8
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ALICE_SECURE_PASS', external_data: {})
|
|
9
|
+
@contract = @contract.close_vault('alice_decryption_key')
|
|
10
|
+
@contract = @contract.close_vault('alice_public_encryption_key')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
When(/^she sends the contract to Bob$/) do
|
|
14
|
+
@contract_json = @contract.as_json
|
|
15
|
+
@bobs_external_data = {"congratulations_message" => "CONGRATS! YOU OPENED THE THIRD VAULT."}
|
|
16
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'BOB_SECURE_PASS', external_data: @bobs_external_data)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
Then(/^Bob can access her public attributes$/) do
|
|
20
|
+
@contents = @contract.retrieve_contents('alice_public_encryption_key')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
When(/^Bob locks his attributes$/) do
|
|
24
|
+
|
|
25
|
+
@contract = @contract.close_vault('bob_decryption_key')
|
|
26
|
+
# Verify can reopen
|
|
27
|
+
@contract.retrieve_contents('bob_decryption_key')
|
|
28
|
+
|
|
29
|
+
@contract = @contract.close_vault('congratulations_message')
|
|
30
|
+
# Verify can reopen
|
|
31
|
+
@contract.retrieve_contents('congratulations_message')
|
|
32
|
+
|
|
33
|
+
@contract = @contract.close_vault('vault_two_key')
|
|
34
|
+
# Verify they can reopen
|
|
35
|
+
@contract.retrieve_contents('vault_two_key')
|
|
36
|
+
|
|
37
|
+
@contract = @contract.close_vault('vault_three_key')
|
|
38
|
+
# Verify they can reopen
|
|
39
|
+
@contract.retrieve_contents('vault_three_key')
|
|
40
|
+
|
|
41
|
+
@contract = @contract.close_vault('bob_public_encryption_key')
|
|
42
|
+
# Verify they can reopen
|
|
43
|
+
@contract.retrieve_contents('bob_public_encryption_key')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
When(/^He fills and locks each of the three vaults$/) do
|
|
47
|
+
@contract = @contract.close_vault('first')
|
|
48
|
+
@contract = @contract.close_vault('second')
|
|
49
|
+
@contract = @contract.close_vault('third')
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
Then(/^Alice can execute the contract to recover the final message$/) do
|
|
53
|
+
@contract_json = @contract.as_json
|
|
54
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ALICE_SECURE_PASS', external_data: {})
|
|
55
|
+
puts @contract.retrieve_contents('third')
|
|
56
|
+
@contract.retrieve_contents('third').should == @bobs_external_data['congratulations_message']
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
Given(/^the SENDER has the blank BTC Key Transfer template$/) do
|
|
60
|
+
contract_path = VaultTree::PathHelpers.reference_contract
|
|
61
|
+
@contract_json = File.read(contract_path)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
Given(/^the SENDER chooses an origin wallet address and concealed destination address$/) do
|
|
65
|
+
@sender_external_data =
|
|
66
|
+
{
|
|
67
|
+
'sender_origin_wallet_address' => '1XJEBF8EUBF855NEBHVENPFE9JE74E',
|
|
68
|
+
'sender_concealed_destination_wallet_address' => '1JVKE8HD5JDHFEJHF678JEH8DEJGHE',
|
|
69
|
+
'sender_btc_signing_key' => 'BITCOIN_SIGNING_KEY_KEEP_IT_SECRET'
|
|
70
|
+
}
|
|
71
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'SENDER_SECURE_PASS', external_data: @sender_external_data)
|
|
72
|
+
@contract = @contract.close_vault('sender_origin_wallet_address')
|
|
73
|
+
@contract = @contract.close_vault('sender_concealed_destination_wallet_address')
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
Given(/^he locks away the secret BTC signing key$/) do
|
|
77
|
+
@contract = @contract.close_vault('sender_btc_signing_key')
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
When(/^the SENDER transfers the Vault\-Tree contract to the RECEIVER$/) do
|
|
81
|
+
@contract_json_over_the_wire = @contract.as_json
|
|
82
|
+
@contract = VaultTree::Contract.new(@contract_json_over_the_wire, master_passphrase: 'RECEIVER_SECURE_PASS')
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
Then(/^the RECEIVER can access the origin wallet address$/) do
|
|
86
|
+
@contract.retrieve_contents('sender_origin_wallet_address').should == @sender_external_data['sender_origin_wallet_address']
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
When(/^the SENDER reveals the hidden wallet address by Blockchain payment from the origin address$/) do
|
|
90
|
+
@contract_json = @contract.as_json # save the json state
|
|
91
|
+
wallet_address_from_watching_blockchain = @sender_external_data['sender_concealed_destination_wallet_address']
|
|
92
|
+
@receiver_external_data = { 'receiver_revealed_destination_wallet_address' => wallet_address_from_watching_blockchain}
|
|
93
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'RECEIVER_SECURE_PASS', external_data: @receiver_external_data)
|
|
94
|
+
@contract = @contract.close_vault('receiver_revealed_destination_wallet_address')
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
Then(/^the RECEIVER can unlock the vault to recover the transfered signing key$/) do
|
|
98
|
+
transfered_secret_key = @contract.retrieve_contents('sender_btc_signing_key')
|
|
99
|
+
transfered_secret_key.should == @sender_external_data['sender_btc_signing_key']
|
|
100
|
+
puts "PROPERLY TRANSFERED: #{transfered_secret_key} !"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
Given(/^I have a blank reference contract$/) do
|
|
104
|
+
contract_path = VaultTree::PathHelpers.reference_contract
|
|
105
|
+
@contract_json = File.read(contract_path)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
When(/^I lock a message in a vault with my Master Password$/) do
|
|
109
|
+
@external_data = {"message" => "CONGRATS! YOU OPENED THE VAULT."}
|
|
110
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS', external_data: @external_data)
|
|
111
|
+
@contract = @contract.close_vault('message')
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
Then(/^I can recover the message with my Master Password$/) do
|
|
115
|
+
@contract.retrieve_contents('message').should == @external_data['message']
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
When(/^I lock away a random vault key$/) do
|
|
119
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS')
|
|
120
|
+
@contract = @contract.close_vault('random_vault_key')
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
When(/^I use the random key to lock a message$/) do
|
|
124
|
+
@external_data = {"message_locked_with_random" => "CONGRATS! YOU OPENED THE VAULT WITH A RANDOM KEY."}
|
|
125
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS', external_data: @external_data)
|
|
126
|
+
@contract = @contract.close_vault('message_locked_with_random')
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
Then(/^I can recover the message with the Random Key$/) do
|
|
130
|
+
@contract.retrieve_contents('message_locked_with_random').should == @external_data['message_locked_with_random']
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
When(/^I put this random key in an unlocked vault$/) do
|
|
134
|
+
@contract = @contract.close_vault('unlocked_random_key')
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
Then(/^another user can recover the message with the Unlocked Random Key$/) do
|
|
138
|
+
@contract = @contract.close_vault('message_locked_with_unlocked_random_number')
|
|
139
|
+
@contract_json = @contract.as_json
|
|
140
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ANOTHER_SECURE_PASS')
|
|
141
|
+
@contract.retrieve_contents('message_locked_with_unlocked_random_number').should == @external_data['message_locked_with_random']
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
Given(/^I have access to the another user's unlocked public key$/) do
|
|
145
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ANOTHER_USERS_SECURE_PASS')
|
|
146
|
+
@contract = @contract.close_vault('another_decryption_key')
|
|
147
|
+
@contract = @contract.close_vault('another_public_key')
|
|
148
|
+
@contract_json = @contract.as_json
|
|
149
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS')
|
|
150
|
+
@contract = @contract.close_vault('my_decryption_key')
|
|
151
|
+
@contract = @contract.close_vault('my_public_key')
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
Given(/^I lock a simple message with a shared key$/) do
|
|
155
|
+
@contract_json = @contract.as_json
|
|
156
|
+
@external_data = {"asymmetric_message" => "CONGRATS! YOU OPENED THE ASYMMETRIC VAULT."}
|
|
157
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS', external_data: @external_data)
|
|
158
|
+
@contract = @contract.close_vault('asymmetric_message')
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
When(/^I transfer the contract to the other user$/) do
|
|
162
|
+
@contract_json = @contract.as_json
|
|
163
|
+
@contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ANOTHER_USERS_SECURE_PASS')
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
Then(/^they can create a shared key and unlock the message$/) do
|
|
167
|
+
@contract.retrieve_contents('asymmetric_message').should == @external_data['asymmetric_message']
|
|
168
|
+
end
|