vault-tree 0.3.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. data/.gitignore +3 -0
  2. data/.rspec +1 -0
  3. data/CHANGE_LOG.md +27 -0
  4. data/README.md +15 -73
  5. data/features/contracts/asymmetric_vault.feature +69 -2
  6. data/features/contracts/block_chain_key_transfer.feature +59 -0
  7. data/features/contracts/one_two_three.feature +109 -1
  8. data/features/contracts/readme.md +5 -6
  9. data/features/contracts_and_vaults.md +19 -24
  10. data/features/decision_tree.md +1 -1
  11. data/features/exceptions.feature +54 -43
  12. data/features/install_and_usage.md +38 -33
  13. data/features/keywords/assembled_shamir_key.feature +17 -17
  14. data/features/keywords/dh_key.feature +5 -5
  15. data/features/keywords/external_input.feature +35 -0
  16. data/features/keywords/external_key.feature +24 -0
  17. data/features/keywords/key.feature +3 -3
  18. data/features/keywords/random_number.feature +3 -3
  19. data/features/keywords/shamir_key_shares.feature +29 -0
  20. data/features/keywords/shamir_share.feature +40 -0
  21. data/features/keywords/split_key.feature +10 -9
  22. data/features/keywords/unlocked.feature +3 -3
  23. data/features/readme.md +1 -1
  24. data/features/steps/asymmetric_vault.steps.rb +14 -21
  25. data/features/steps/block_chain_key_transfer.steps.rb +17 -22
  26. data/features/steps/core.steps.rb +60 -71
  27. data/features/steps/exceptions.steps.rb +27 -64
  28. data/features/steps/external_input.steps.rb +17 -0
  29. data/features/steps/one_two_three.steps.rb +21 -27
  30. data/features/steps/secret_sharing.steps.rb +36 -19
  31. data/lib/vault-tree.rb +1 -1
  32. data/lib/vault-tree/contract/content_ciphertext.rb +33 -0
  33. data/lib/vault-tree/contract/content_plaintext.rb +33 -0
  34. data/lib/vault-tree/contract/contract.rb +15 -72
  35. data/lib/vault-tree/contract/contract_header.rb +11 -0
  36. data/lib/vault-tree/contract/vault.rb +24 -74
  37. data/lib/vault-tree/contract/vault_key.rb +21 -0
  38. data/lib/vault-tree/contract/vault_list.rb +56 -0
  39. data/lib/vault-tree/exceptions/empty_vault.rb +18 -3
  40. data/lib/vault-tree/exceptions/failed_lock_attempt.rb +18 -0
  41. data/lib/vault-tree/exceptions/failed_unlock_attempt.rb +23 -1
  42. data/lib/vault-tree/exceptions/invalid_external_input.rb +16 -0
  43. data/lib/vault-tree/exceptions/{missing_passphrase.rb → invalid_shamir_split.rb} +2 -1
  44. data/lib/vault-tree/exceptions/library_exception.rb +64 -0
  45. data/lib/vault-tree/exceptions/missing_partner_decryption_key.rb +11 -1
  46. data/lib/vault-tree/exceptions/unsupported_keyword.rb +17 -1
  47. data/lib/vault-tree/exceptions/vault_does_not_exist.rb +8 -1
  48. data/lib/vault-tree/keywords/assembled_shamir_key.rb +1 -1
  49. data/lib/vault-tree/keywords/contents.rb +1 -1
  50. data/lib/vault-tree/keywords/dh_key.rb +2 -2
  51. data/lib/vault-tree/keywords/external_input.rb +58 -0
  52. data/lib/vault-tree/keywords/external_key.rb +20 -0
  53. data/lib/vault-tree/keywords/key.rb +7 -1
  54. data/lib/vault-tree/keywords/keyword_interpreter.rb +5 -3
  55. data/lib/vault-tree/keywords/public_encryption_key.rb +1 -5
  56. data/lib/vault-tree/keywords/shamir_key_shares.rb +18 -0
  57. data/lib/vault-tree/keywords/shamir_share.rb +18 -0
  58. data/lib/vault-tree/keywords/split_key.rb +1 -1
  59. data/lib/vault-tree/lock_smith.rb +7 -8
  60. data/lib/vault-tree/lock_smith/{generated_shamir_key.rb → shamir_key_shares.rb} +22 -21
  61. data/lib/vault-tree/lock_smith/{split_key.rb → split_key_crypto.rb} +0 -0
  62. data/lib/vault-tree/version.rb +1 -1
  63. data/spec/assembled_shamir_key_spec.rb +0 -1
  64. data/spec/custom_exception_spec.rb +81 -0
  65. data/spec/lock_smith_spec.rb +0 -48
  66. data/spec/secret_sharing_spec.rb +0 -1
  67. data/spec/shamir_key_shares_spec.rb +27 -0
  68. data/vault-tree.gemspec +1 -1
  69. metadata +33 -139
  70. data/Gemfile.lock +0 -53
  71. data/VagrantFile +0 -30
  72. data/features/keywords/external_data.feature +0 -11
  73. data/features/keywords/generated_shamir_key.feature +0 -55
  74. data/features/keywords/master_passphrase.feature +0 -68
  75. data/features/manipulating_contracts.md +0 -84
  76. data/features/support/contract_fixtures/asymmetric_vault.0.1.0.json +0 -69
  77. data/features/support/contract_fixtures/blank_simple_test_contract.json +0 -14
  78. data/features/support/contract_fixtures/block_chain_key_transfer.0.1.0.json +0 -59
  79. data/features/support/contract_fixtures/broken_contract.json +0 -55
  80. data/features/support/contract_fixtures/one_two_three.0.7.0.json +0 -108
  81. data/features/support/contract_fixtures/simple_test_contract.json +0 -14
  82. data/features/support/contract_fixtures/template.json +0 -33
  83. data/lib/vault-tree/contract/close_validator.rb +0 -28
  84. data/lib/vault-tree/contract/doorman.rb +0 -113
  85. data/lib/vault-tree/contract/open_validator.rb +0 -20
  86. data/lib/vault-tree/exceptions/exception_template.erb +0 -0
  87. data/lib/vault-tree/exceptions/fill_attempt_master_password.rb +0 -6
  88. data/lib/vault-tree/exceptions/missing_external_data.rb +0 -6
  89. data/lib/vault-tree/exceptions/vault_tree_exception.rb +0 -25
  90. data/lib/vault-tree/keywords/external_data.rb +0 -32
  91. data/lib/vault-tree/keywords/generated_shamir_key.rb +0 -57
  92. data/lib/vault-tree/keywords/master_passphrase.rb +0 -9
  93. data/spec/generated_shamir_key_spec.rb +0 -52
  94. data/support/cookbooks/ark/.gitignore +0 -12
  95. data/support/cookbooks/ark/.kitchen.yml +0 -34
  96. data/support/cookbooks/ark/.travis.yml +0 -6
  97. data/support/cookbooks/ark/Berksfile +0 -9
  98. data/support/cookbooks/ark/CHANGELOG.md +0 -87
  99. data/support/cookbooks/ark/CONTRIBUTING.md +0 -257
  100. data/support/cookbooks/ark/README.md +0 -301
  101. data/support/cookbooks/ark/Rakefile +0 -36
  102. data/support/cookbooks/ark/TESTING.md +0 -25
  103. data/support/cookbooks/ark/Toftfile +0 -15
  104. data/support/cookbooks/ark/attributes/default.rb +0 -6
  105. data/support/cookbooks/ark/chefignore +0 -96
  106. data/support/cookbooks/ark/files/default/foo.tar.gz +0 -0
  107. data/support/cookbooks/ark/files/default/foo.tbz +0 -0
  108. data/support/cookbooks/ark/files/default/foo.tgz +0 -0
  109. data/support/cookbooks/ark/files/default/foo.zip +0 -0
  110. data/support/cookbooks/ark/files/default/tests/minitest/default_test.rb +0 -0
  111. data/support/cookbooks/ark/files/default/tests/minitest/support/helpers.rb +0 -0
  112. data/support/cookbooks/ark/files/default/tests/minitest/test_test.rb +0 -94
  113. data/support/cookbooks/ark/libraries/default.rb +0 -167
  114. data/support/cookbooks/ark/metadata.rb +0 -13
  115. data/support/cookbooks/ark/providers/default.rb +0 -370
  116. data/support/cookbooks/ark/recipes/default.rb +0 -31
  117. data/support/cookbooks/ark/recipes/test.rb +0 -138
  118. data/support/cookbooks/ark/resources/default.rb +0 -54
  119. data/support/cookbooks/ark/templates/default/add_to_path.sh.erb +0 -1
  120. data/support/cookbooks/ark/test/support/Gemfile +0 -4
  121. data/support/cookbooks/build-essential/README.md +0 -24
  122. data/support/cookbooks/build-essential/metadata.rb +0 -10
  123. data/support/cookbooks/build-essential/recipes/default.rb +0 -45
  124. data/support/cookbooks/chruby/.gitignore +0 -15
  125. data/support/cookbooks/chruby/.kitchen.yml +0 -26
  126. data/support/cookbooks/chruby/.ruby_version +0 -1
  127. data/support/cookbooks/chruby/Berksfile +0 -3
  128. data/support/cookbooks/chruby/Gemfile +0 -7
  129. data/support/cookbooks/chruby/LICENSE +0 -14
  130. data/support/cookbooks/chruby/README.md +0 -92
  131. data/support/cookbooks/chruby/Rakefile +0 -7
  132. data/support/cookbooks/chruby/Thorfile +0 -6
  133. data/support/cookbooks/chruby/Vagrantfile +0 -86
  134. data/support/cookbooks/chruby/attributes/default.rb +0 -10
  135. data/support/cookbooks/chruby/chefignore +0 -96
  136. data/support/cookbooks/chruby/metadata.rb +0 -11
  137. data/support/cookbooks/chruby/recipes/default.rb +0 -43
  138. data/support/cookbooks/chruby/recipes/system.rb +0 -25
  139. data/support/cookbooks/chruby/templates/default/chruby.sh.erb +0 -22
  140. data/support/cookbooks/chruby/test/integration/default/bash/embedded_test.sh +0 -1
  141. data/support/cookbooks/git/.gitignore +0 -14
  142. data/support/cookbooks/git/.kitchen.yml +0 -46
  143. data/support/cookbooks/git/Berksfile +0 -8
  144. data/support/cookbooks/git/CHANGELOG.md +0 -87
  145. data/support/cookbooks/git/CONTRIBUTING +0 -29
  146. data/support/cookbooks/git/Gemfile +0 -3
  147. data/support/cookbooks/git/LICENSE +0 -201
  148. data/support/cookbooks/git/README.md +0 -115
  149. data/support/cookbooks/git/TESTING.md +0 -25
  150. data/support/cookbooks/git/attributes/default.rb +0 -40
  151. data/support/cookbooks/git/metadata.rb +0 -35
  152. data/support/cookbooks/git/recipes/default.rb +0 -53
  153. data/support/cookbooks/git/recipes/server.rb +0 -58
  154. data/support/cookbooks/git/recipes/source.rb +0 -49
  155. data/support/cookbooks/git/recipes/windows.rb +0 -37
  156. data/support/cookbooks/git/templates/default/git-xinetd.d.erb +0 -10
  157. data/support/cookbooks/git/templates/default/sv-git-daemon-log-run.erb +0 -2
  158. data/support/cookbooks/git/templates/default/sv-git-daemon-run.erb +0 -3
  159. data/support/cookbooks/install_ruby/README.md +0 -3
  160. data/support/cookbooks/install_ruby/metadata.rb +0 -10
  161. data/support/cookbooks/install_ruby/recipes/default.rb +0 -14
  162. data/support/cookbooks/ruby_build/.gitignore +0 -6
  163. data/support/cookbooks/ruby_build/.kitchen.yml +0 -31
  164. data/support/cookbooks/ruby_build/.travis.yml +0 -4
  165. data/support/cookbooks/ruby_build/Berksfile +0 -10
  166. data/support/cookbooks/ruby_build/CHANGELOG.md +0 -72
  167. data/support/cookbooks/ruby_build/Gemfile +0 -14
  168. data/support/cookbooks/ruby_build/README.md +0 -338
  169. data/support/cookbooks/ruby_build/Rakefile +0 -21
  170. data/support/cookbooks/ruby_build/attributes/default.rb +0 -67
  171. data/support/cookbooks/ruby_build/chefignore +0 -53
  172. data/support/cookbooks/ruby_build/libraries/ruby_build_recipe_helpers.rb +0 -40
  173. data/support/cookbooks/ruby_build/metadata.rb +0 -18
  174. data/support/cookbooks/ruby_build/providers/ruby.rb +0 -88
  175. data/support/cookbooks/ruby_build/recipes/default.rb +0 -69
  176. data/support/cookbooks/ruby_build/resources/ruby.rb +0 -33
  177. data/support/cookbooks/ruby_build/test/cookbooks/alltherubies/metadata.rb +0 -10
  178. data/support/cookbooks/ruby_build/test/cookbooks/alltherubies/recipes/default.rb +0 -59
  179. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/_verify_tests.bash +0 -33
  180. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.8.7.bats +0 -29
  181. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.9.2.bats +0 -18
  182. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.9.3.bats +0 -18
  183. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_2.0.0.bats +0 -18
  184. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_jruby.bats +0 -20
  185. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_rbx.bats +0 -18
  186. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_ree.bats +0 -19
  187. data/support/cookbooks/ruby_build/test/integration/installation/bats/installation.bats +0 -6
  188. data/support/scripts/libsodium_ubuntu.sh +0 -80
  189. data/support/tasks/.gitkeep +0 -0
  190. data/support/tasks/libsodium_install.rb +0 -57
data/.gitignore CHANGED
@@ -1,3 +1,6 @@
1
+ # Do not Check In Gemfile.lock
2
+ Gemfile.lock
3
+
1
4
  # simple_cove generated
2
5
  coverage
3
6
  coverage.data
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/CHANGE_LOG.md CHANGED
@@ -1,3 +1,30 @@
1
+ ## 0.6.0
2
+
3
+ * Return JSON from close_vault method
4
+ - now open_vault and close_vault return as string
5
+ * Update tests to support new public interface
6
+
7
+ ## 0.3.17
8
+
9
+ * Remove support for EXTERNAL_DATA Keyword
10
+ * Use EXTERNAL_INPUT Insead
11
+
12
+ ## 0.3.16
13
+
14
+ * Remove support for GENERATED_SHAMIR_KEY Keyword
15
+
16
+ ## 0.3.7
17
+
18
+ * Add Better Exception Messaging
19
+ * Verbose Messaging when Vault Tree Exceptions are thrown
20
+ * Log the Message to STDOUT
21
+ * Pattern for implementing future custom exceptions
22
+
23
+ ## 0.3.5
24
+
25
+ * Remove support for MASTER_PASSPHRASE Keyword.
26
+ * MASTER_PASSPHRASE has been removed from example contracts.
27
+
1
28
  ## 0.3.4
2
29
 
3
30
  * Bug Fix in Exception Handling
data/README.md CHANGED
@@ -1,32 +1,18 @@
1
+ [![Code Climate](https://codeclimate.com/github/VaultTree/vault-tree.png)](https://codeclimate.com/github/VaultTree/vault-tree)
2
+
1
3
  ## Vault Tree
2
4
 
3
5
  _The Self Enforcing Contract_
4
6
 
5
- Vault Tree is a collection of tools for building and executing distributed cryptographic contracts.
7
+ Vault Tree helps you build crypto-based business logic into your application.
6
8
 
7
9
  Before you begin make sure you checkout the [Vault Tree Homepage] for an overview of the project.
8
10
 
9
- [Vault Tree Homepage]: http://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 focal point of collaboration for developers writing and testing interesting crytographic contracts
18
-
11
+ [Vault Tree Homepage]: http://vaulttree.github.io
19
12
 
20
13
  ### Install
21
14
 
22
- Before you start:
23
-
24
- * To use the library in your application or want to contribute code, you're in the right place.
25
- * Before you pull the trigger on the install remember we have a Vagrant Box.
26
-
27
- Okay, lets begin.
28
-
29
- As a prerequisite get [libsodium] (>= 0.4.3) on you machine. This is the underlying cryptographic library that Vault Tree depends on.
15
+ As a prerequisite, get [libsodium] version (>= 0.4.3) on you machine. This is the underlying cryptographic library that Vault Tree depends on.
30
16
 
31
17
  [libsodium]: https://github.com/jedisct1/libsodium
32
18
 
@@ -39,13 +25,7 @@ As a prerequisite get [libsodium] (>= 0.4.3) on you machine. This is the underly
39
25
  [brew]: http://brew.sh/
40
26
 
41
27
  * If you're on a Debian based system, there is no _apt-get_ package that I know of, but there
42
- are some helpful install scripts on the web. I've checked one of these in at:
43
-
44
- ```
45
- vault-tree/support/scripts/libsodium_ubuntu.sh
46
- ```
47
-
48
- * 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.
28
+ are some helpful install scripts on the web.
49
29
 
50
30
  Now that you have libsodium, if you're a Ruby developer you know the drill from here:
51
31
 
@@ -61,55 +41,17 @@ require 'vault-tree'
61
41
 
62
42
  somewhere before you use it.
63
43
 
44
+ ### Usage
64
45
 
65
- ### Vagrant
66
-
67
- 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!
68
-
69
- * Follow the [Vagrant] download and install steps
70
- * Clone the Vault Tree Repo and go into it:
71
-
72
- [Vagrant]: http://www.vagrantup.com/
73
-
74
- ```
75
- git clone git@github.com:VaultTree/vault-tree.git
76
- cd ~/path/to/vault-tree/
77
- ```
78
-
79
- Now you just need to Vagrant Up!
80
-
81
- ```
82
- vagrant up
83
- ```
84
-
85
- This will download and boot a pre-packaged Linux virtual machine with Vault-Tree and all dependencies already installed.
86
-
87
- Once your VM is downloaded and built. You can go inside with:
88
-
89
- ```
90
- vagrant ssh
91
- ```
92
-
93
- As a developer working on Vault Tree you can now go to the VM's directory:
94
-
95
- ```
96
- /vagrant
97
- ```
98
-
99
- and run `bundle` then `rake`. This will grab your dependincies, run all the tests, and leave you in a good spot to start exploring the code.
100
-
101
- 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.
102
-
103
- [sync your files]: http://docs.vagrantup.com/v2/getting-started/synced_folders.html
46
+ The [Documentation] is filled with examples of how to execute Vault Tree contracts.
104
47
 
105
- ### Is it production ready?
48
+ Also, a great way to get going is to simply run the tests:
106
49
 
107
- Are you serious? This project has like ... 1 fork and 1 star (Thanks Eric!).
108
- We have a long way to go.
50
+ * clone the repo
51
+ * bundle your dependencies
52
+ * run `rake`
109
53
 
110
- Here are some of the big issues that I'm thinking about as we move to version 1.0:
54
+ You should see a full suite of green tests that will give you plenty of living
55
+ examples of how to use Vault Tree in your own application.
111
56
 
112
- * This is a crypto application so vulnerabilities need to be identified and corrected. We need more eyes in this area.
113
- * We we need to figure out if the supported keywords are sufficient to implement basic secure computation schemes.
114
- - For example, Digital Signatures are not implemented but could be.
115
- - Should they be implemented? What is the use case? Ect. We need to have these conversations.
57
+ [Documentation]: https://www.relishapp.com/vault-tree/vault-tree/docs
@@ -13,8 +13,75 @@ Feature: Asymmetric Vaults
13
13
  key and the reciprocal public key
14
14
 
15
15
  Scenario: Bob Locks and Alice Unlocks with a Shared Key
16
- Given Alice has the blank asymmetric vault contract
17
- When she locks all of her public and private keys
16
+ Given the blank contract:
17
+ """javascript
18
+ {
19
+ "header": {
20
+ "title":"Asymmetric Vault",
21
+ "description":"Demonstrated use of a Vault Tree Asymmetric Vault"
22
+ },
23
+ "vaults": {
24
+ "bob_contract_secret":{
25
+ "description":"Contract specific password to lock private information",
26
+ "fill_with": "RANDOM_NUMBER",
27
+ "lock_with": "EXTERNAL_INPUT['bcs_key']",
28
+ "unlock_with": "EXTERNAL_INPUT['bcs_key']",
29
+ "contents": ""
30
+ },
31
+
32
+ "alice_contract_secret":{
33
+ "description":"Contract specific password to lock private information",
34
+ "fill_with": "RANDOM_NUMBER",
35
+ "lock_with": "EXTERNAL_INPUT['acs_key']",
36
+ "unlock_with": "EXTERNAL_INPUT['acs_key']",
37
+ "contents": ""
38
+ },
39
+
40
+ "alice_public_encryption_key":{
41
+ "description":"Public key for asymmetric encryption",
42
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['alice_decryption_key']",
43
+ "lock_with": "UNLOCKED",
44
+ "unlock_with": "UNLOCKED",
45
+ "contents": ""
46
+ },
47
+
48
+ "bob_public_encryption_key":{
49
+ "description":"Public key for asymmetric encryption",
50
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['bob_decryption_key']",
51
+ "lock_with": "UNLOCKED",
52
+ "unlock_with": "UNLOCKED",
53
+ "contents": ""
54
+ },
55
+
56
+ "alice_decryption_key":{
57
+ "description":"Private key for asymmetric decryption",
58
+ "fill_with": "DECRYPTION_KEY",
59
+ "lock_with": "KEY['alice_contract_secret']",
60
+ "unlock_with": "KEY['alice_contract_secret']",
61
+ "contents": ""
62
+ },
63
+
64
+ "bob_decryption_key":{
65
+ "description":"Private key for asymmetric decryption",
66
+ "fill_with": "DECRYPTION_KEY",
67
+ "lock_with": "KEY['bob_contract_secret']",
68
+ "unlock_with": "KEY['bob_contract_secret']",
69
+ "contents": ""
70
+ },
71
+
72
+ "message":{
73
+ "description":"This is an asymmetric vault. It contains a secret message.",
74
+ "fill_with": "EXTERNAL_INPUT['msg']",
75
+ "lock_with": "DH_KEY['alice_public_encryption_key','bob_decryption_key']",
76
+ "unlock_with": "DH_KEY['bob_public_encryption_key','alice_decryption_key']",
77
+ "contents": ""
78
+ }
79
+
80
+
81
+ }
82
+ }
83
+ """
84
+ When Alice locks all of her public and private keys
18
85
  And she sends the contract to Bob over the internet
19
86
  Then Bob can access of her public keys but not her private keys
20
87
  When Bob locks his public and private keys
@@ -25,6 +25,65 @@ Feature: Block Chain Key Transfer
25
25
 
26
26
  Scenario: SENDER Transfers a BTC Signing Key to the RECEIVER
27
27
 
28
+ Given the blank contract:
29
+ """javascript
30
+ {
31
+ "header": {
32
+ "title":"Block Chain Key Transfer",
33
+ "description":"A simple key transfer sheme utilizing a revealed BTC Wallet Address. This can be used as step within the execution of a larger contract."
34
+ },
35
+ "vaults": {
36
+
37
+ "sender_btc_signing_key":{
38
+ "description":"This is the secret Bitcoin Signing Key that SENDER wishes to transfer to RECEIVER. The RECEIVER can unlock only after he has the revealed address.",
39
+ "fill_with": "EXTERNAL_INPUT['ssk']",
40
+ "lock_with": "KEY['sender_concealed_destination_wallet_address']",
41
+ "unlock_with": "KEY['receiver_revealed_destination_wallet_address']",
42
+ "contents": ""
43
+ },
44
+
45
+ "sender_origin_wallet_address":{
46
+ "description":"SENDER origin wallet address. Chosen by SENDER and known in advance to RECEIVER.",
47
+ "fill_with": "EXTERNAL_INPUT['sowa']",
48
+ "lock_with": "UNLOCKED",
49
+ "unlock_with": "UNLOCKED",
50
+ "contents": ""
51
+ },
52
+
53
+ "sender_concealed_destination_wallet_address":{
54
+ "description":"SENDER concealed copy of the destination wallet address. This wallet address is kept secret until SENDER chosed to transfer BTC to it",
55
+ "fill_with": "EXTERNAL_INPUT['scdwa']",
56
+ "lock_with": "KEY['sender_secret']",
57
+ "unlock_with": "KEY['sender_secret']",
58
+ "contents": ""
59
+ },
60
+
61
+ "receiver_revealed_destination_wallet_address":{
62
+ "description":"RECEIVER monitors the Block Chain and fills this vault with the newly revealied destination address.",
63
+ "fill_with": "EXTERNAL_INPUT['rrdwa']",
64
+ "lock_with": "KEY['receiver_secret']",
65
+ "unlock_with": "KEY['receiver_secret']",
66
+ "contents": ""
67
+ },
68
+
69
+ "receiver_secret":{
70
+ "fill_with": "RANDOM_NUMBER",
71
+ "lock_with": "EXTERNAL_INPUT['rs_key']",
72
+ "unlock_with": "EXTERNAL_INPUT['rs_key']",
73
+ "contents": ""
74
+ },
75
+
76
+ "sender_secret":{
77
+ "description":"Contract specific password for SENDER. Used to Lock the SENDER private information.",
78
+ "fill_with": "RANDOM_NUMBER",
79
+ "lock_with": "EXTERNAL_INPUT['ss_key']",
80
+ "unlock_with": "EXTERNAL_INPUT['ss_key']",
81
+ "contents": ""
82
+ }
83
+
84
+ }
85
+ }
86
+ """
28
87
  Given the SENDER has the blank contract template
29
88
  And the SENDER chooses an origin address and a concealed destination address
30
89
  And he locks away the secret BTC signing key
@@ -13,7 +13,115 @@ Feature: One-Two-Three Contract
13
13
  appropriate keys
14
14
 
15
15
  Scenario: Alice and Bob Execute the One Two Three Contract
16
- Given Alice has the blank contract
16
+ Given the blank contract:
17
+ """javascript
18
+ {
19
+ "header": {
20
+ "title":"One Two Three",
21
+ "description":"A simple contract to test the full Vault Tree stack. Open each vault to proceed to the next one. Unlock the congratulations message"
22
+ },
23
+ "vaults": {
24
+
25
+ "bob_contract_secret":{
26
+ "description":"contract specific password to lock private information",
27
+ "fill_with": "RANDOM_NUMBER",
28
+ "lock_with": "EXTERNAL_INPUT['bcs_key']",
29
+ "unlock_with": "EXTERNAL_INPUT['bcs_key']",
30
+ "contents": ""
31
+ },
32
+
33
+ "alice_contract_secret":{
34
+ "description":"contract specific password to lock private information",
35
+ "fill_with": "RANDOM_NUMBER",
36
+ "lock_with": "EXTERNAL_INPUT['acs_key']",
37
+ "unlock_with": "EXTERNAL_INPUT['acs_key']",
38
+ "contents": ""
39
+ },
40
+
41
+ "alice_public_encryption_key":{
42
+ "description":"public key for asymmetric encryption",
43
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['alice_decryption_key']",
44
+ "lock_with": "UNLOCKED",
45
+ "unlock_with": "UNLOCKED",
46
+ "contents": ""
47
+ },
48
+
49
+ "bob_public_encryption_key":{
50
+ "description":"public key for asymmetric encryption",
51
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['bob_decryption_key']",
52
+ "lock_with": "UNLOCKED",
53
+ "unlock_with": "UNLOCKED",
54
+ "contents": ""
55
+ },
56
+
57
+ "alice_decryption_key":{
58
+ "description":"private key for asymmetric decryption",
59
+ "fill_with": "DECRYPTION_KEY",
60
+ "lock_with": "KEY['alice_contract_secret']",
61
+ "unlock_with": "KEY['alice_contract_secret']",
62
+ "contents": ""
63
+ },
64
+
65
+ "bob_decryption_key":{
66
+ "description":"private key for asymmetric decryption",
67
+ "fill_with": "DECRYPTION_KEY",
68
+ "lock_with": "KEY['bob_contract_secret']",
69
+ "unlock_with": "KEY['bob_contract_secret']",
70
+ "contents": ""
71
+ },
72
+
73
+ "congratulations_message":{
74
+ "description":"A simple message for Bob to put in the final vault",
75
+ "fill_with": "EXTERNAL_INPUT['msg']",
76
+ "lock_with": "KEY['bob_contract_secret']",
77
+ "unlock_with": "KEY['bob_contract_secret']",
78
+ "contents": ""
79
+ },
80
+
81
+ "vault_two_key":{
82
+ "description":"Key to lock vault two. Once Bob locks the second vault he will put this key inside vault one.",
83
+ "fill_with": "RANDOM_NUMBER",
84
+ "lock_with": "KEY['bob_contract_secret']",
85
+ "unlock_with": "KEY['bob_contract_secret']",
86
+ "contents": ""
87
+ },
88
+
89
+ "vault_three_key":{
90
+ "description":"Key to lock vault three. Once Bob locks the third vault he will put this key inside vault two.",
91
+ "fill_with": "RANDOM_NUMBER",
92
+ "lock_with": "KEY['bob_contract_secret']",
93
+ "unlock_with": "KEY['bob_contract_secret']",
94
+ "contents": ""
95
+ },
96
+
97
+ "first":{
98
+ "description":"This is an asymmetric vault with mutual authentication. It contains the key to vault two and is locked by Bob, with Alices public key. Only Alice can unlock it.",
99
+ "fill_with": "CONTENTS['vault_two_key']",
100
+ "lock_with": "DH_KEY['alice_public_encryption_key','bob_decryption_key']",
101
+ "unlock_with": "DH_KEY['bob_public_encryption_key','alice_decryption_key']",
102
+ "contents": ""
103
+ },
104
+
105
+ "second":{
106
+ "description":"Alice unlocks this vault with the key held in the first vault.",
107
+ "fill_with": "CONTENTS['vault_three_key']",
108
+ "lock_with": "KEY['vault_two_key']",
109
+ "unlock_with": "KEY['first']",
110
+ "contents": ""
111
+ },
112
+
113
+ "third":{
114
+ "description":"Contains a simple message. Unlock the key found in the second vault.",
115
+ "fill_with": "CONTENTS['congratulations_message']",
116
+ "lock_with": "KEY['vault_three_key']",
117
+ "unlock_with": "KEY['second']",
118
+ "contents": ""
119
+ }
120
+
121
+ }
122
+ }
123
+ """
124
+ And Alice has the blank contract
17
125
  When she locks all of her attributes
18
126
  And she sends the contract to Bob
19
127
  Then Bob can access all of her public attributes
@@ -7,7 +7,7 @@ need to know:
7
7
  - The **Vaults** section, which can be any collection of _vaults_ that form the
8
8
  contract.
9
9
  * The way in which you, the contract author, organize the vaults will determine the **Self-Enforcing Terms** of your contract.
10
- * Each vault will typically contain either an **external data** string that is provided by one of the contract
10
+ * Each vault will typically contain either an **external input** string that is provided by one of the contract
11
11
  participants, or a key to anther vault.
12
12
 
13
13
  ### Writing and Simulating Contracts
@@ -47,7 +47,6 @@ Well, what if we associate each one of these steps in the scenario with some sim
47
47
 
48
48
  ```Ruby
49
49
  # This file: "features/core/one_two_three/one_two_three.steps.rb"
50
- # Associated Contract: "core/one_two_three.0.7.0.json"
51
50
 
52
51
  Given(/^Alice has the blank contract$/) do
53
52
  contract_path = VaultTree::ContractsRepo::PathHelpers.core_contracts('one_two_three.0.7.0.json')
@@ -55,15 +54,15 @@ Given(/^Alice has the blank contract$/) do
55
54
  end
56
55
 
57
56
  When(/^she locks all of her attributes$/) do
58
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ALICE_SECURE_PASS', external_data: {})
57
+ @contract = VaultTree::Contract.new(@contract_json)
59
58
  @contract = @contract.close_vault('alice_decryption_key')
60
59
  @contract = @contract.close_vault('alice_public_encryption_key')
61
60
  end
62
61
 
63
62
  When(/^she sends the contract to Bob$/) do
64
63
  @contract_json = @contract.as_json
65
- @bobs_external_data = {"congratulations_message" => "CONGRATS! YOU OPENED THE THIRD VAULT."}
66
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'BOB_SECURE_PASS', external_data: @bobs_external_data)
64
+ @bobs_external_input = {"congratulations_message" => "CONGRATS! YOU OPENED THE THIRD VAULT."}
65
+ @contract = VaultTree::Contract.new(@contract_json, @bobs_external_input)
67
66
  end
68
67
  ```
69
68
 
@@ -87,7 +86,7 @@ community off to a good start.
87
86
  I'll update these in the coming months as we get some more experience writing simple contracts.
88
87
 
89
88
  * The Vault Tree interpreter is stateless and always takes a contract as an input
90
- * All external data required for contract execution must be provided to the
89
+ * All external input required for contract execution must be provided to the
91
90
  interpreter by the run time that is invoking the API. For example, there are no
92
91
  plans for the interpreter to make any network requests or do file IO.
93
92