vault-tree 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|