vault-tree 0.3.4 → 0.6.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.
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
@@ -0,0 +1,24 @@
1
+ Feature: External Key
2
+
3
+ EXTERNAL_KEY ensures your password is run through a secure hash before it is used to
4
+ lock contents. Hashing guarentees a properly padded vault key and keeps the locked vault
5
+ more secure if you have a weak password.
6
+
7
+ Scenario: Close And Open Using and External Key
8
+ Given the blank contract:
9
+ """javascript
10
+ {
11
+ "header": {},
12
+ "vaults": {
13
+ "message":{
14
+ "description": "Simple Congratulations Message",
15
+ "fill_with": "EXTERNAL_INPUT['msg']",
16
+ "lock_with": "EXTERNAL_KEY['secret']",
17
+ "unlock_with": "EXTERNAL_KEY['secret']",
18
+ "contents": ""
19
+ }
20
+ }
21
+ }
22
+ """
23
+ When I lock the external input in a vault using an external key
24
+ Then I can recover the input message using the same key
@@ -20,13 +20,13 @@ Feature: Key
20
20
  "random_vault_key":{
21
21
  "description":"Random Number",
22
22
  "fill_with": "RANDOM_NUMBER",
23
- "lock_with": "MASTER_PASSPHRASE",
24
- "unlock_with": "MASTER_PASSPHRASE",
23
+ "lock_with": "UNLOCKED",
24
+ "unlock_with": "UNLOCKED",
25
25
  "contents": ""
26
26
  },
27
27
  "message":{
28
28
  "description": "Simple Congratulations Message",
29
- "fill_with": "EXTERNAL_DATA",
29
+ "fill_with": "EXTERNAL_INPUT['msg']",
30
30
  "lock_with": "KEY['random_vault_key']",
31
31
  "unlock_with": "KEY['random_vault_key']",
32
32
  "contents": ""
@@ -23,14 +23,14 @@ Scenario: Close And Open With Random Key
23
23
  "random_vault_key":{
24
24
  "description":"Random Number",
25
25
  "fill_with": "RANDOM_NUMBER",
26
- "lock_with": "MASTER_PASSPHRASE",
27
- "unlock_with": "MASTER_PASSPHRASE",
26
+ "lock_with": "UNLOCKED",
27
+ "unlock_with": "UNLOCKED",
28
28
  "contents": ""
29
29
  },
30
30
 
31
31
  "message_locked_with_random":{
32
32
  "description":"A simple message locked with a random number",
33
- "fill_with": "EXTERNAL_DATA",
33
+ "fill_with": "EXTERNAL_INPUT['msg']",
34
34
  "lock_with": "KEY['random_vault_key']",
35
35
  "unlock_with": "KEY['random_vault_key']",
36
36
  "contents": ""
@@ -0,0 +1,29 @@
1
+ Feature: Shamir Key Shares
2
+
3
+ ```
4
+ SHAMIR_KEY_SHARES
5
+ ```
6
+
7
+ is used to fill a vault with a collection of secret shares
8
+ that have been obtained by breaking up a random secret key
9
+ with the Shamir Secret Sharing Algorithm.
10
+
11
+ Scenario: Lock away a collection of shamir key shares
12
+ Given the blank contract:
13
+ """javascript
14
+ {
15
+ "header": {},
16
+ "vaults": {
17
+
18
+ "share_collection":{
19
+ "fill_with": "SHAMIR_KEY_SHARES['5','3']",
20
+ "lock_with": "UNLOCKED",
21
+ "unlock_with": "UNLOCKED",
22
+ "contents": ""
23
+ }
24
+ }
25
+ }
26
+ """
27
+ When I lock away the shamir key share collection
28
+ Then a random key is generated and split with the shamir secret sharing algorithm
29
+ And I can open the vault to recover the JSON representation of the secret shares
@@ -0,0 +1,40 @@
1
+ Feature: Shamir Share
2
+
3
+ Scenario: Lock Secret Shares in thier respective vaults
4
+ Given the blank contract:
5
+ """javascript
6
+ {
7
+ "header": {},
8
+ "vaults": {
9
+
10
+ "share_collection":{
11
+ "fill_with": "SHAMIR_KEY_SHARES['3','2']",
12
+ "lock_with": "UNLOCKED",
13
+ "unlock_with": "UNLOCKED",
14
+ "contents": ""
15
+ },
16
+ "share_1":{
17
+ "fill_with": "SHAMIR_SHARE['share_collection','1']",
18
+ "lock_with": "UNLOCKED",
19
+ "unlock_with": "UNLOCKED",
20
+ "contents": ""
21
+ },
22
+ "share_2":{
23
+ "fill_with": "SHAMIR_SHARE['share_collection','2']",
24
+ "lock_with": "UNLOCKED",
25
+ "unlock_with": "UNLOCKED",
26
+ "contents": ""
27
+ },
28
+ "share_3":{
29
+ "fill_with": "SHAMIR_SHARE['share_collection','3']",
30
+ "lock_with": "UNLOCKED",
31
+ "unlock_with": "UNLOCKED",
32
+ "contents": ""
33
+ }
34
+ }
35
+ }
36
+ """
37
+ When I lock away the shamir key share collection
38
+ Then a random key is generated and split with the shamir secret sharing algorithm
39
+ When I fill an individual vault with the SECRET_SHARES keyword
40
+ Then the library takes the approprate share from the collection vault and locks it away
@@ -3,7 +3,7 @@ Feature: Split Key
3
3
  ```javascript
4
4
  SPLIT_KEY['id_1','id_2','id_3']
5
5
  ```
6
- Split Key is a simple for of secret sharing.
6
+ Split Key is a simple form of secret sharing.
7
7
 
8
8
  Scenario: Close And Open With Split Key
9
9
  Given the blank contract:
@@ -13,22 +13,22 @@ Scenario: Close And Open With Split Key
13
13
  "vaults": {
14
14
  "a_consent_key":{
15
15
  "fill_with": "RANDOM_NUMBER",
16
- "lock_with": "EXTERNAL_DATA",
17
- "unlock_with": "EXTERNAL_DATA",
16
+ "lock_with": "EXTERNAL_KEY['a_secret']",
17
+ "unlock_with": "EXTERNAL_KEY['a_secret']",
18
18
  "contents": ""
19
19
  },
20
20
 
21
21
  "b_consent_key":{
22
22
  "fill_with": "RANDOM_NUMBER",
23
- "lock_with": "EXTERNAL_DATA",
24
- "unlock_with": "EXTERNAL_DATA",
23
+ "lock_with": "EXTERNAL_KEY['b_secret']",
24
+ "unlock_with": "EXTERNAL_KEY['b_secret']",
25
25
  "contents": ""
26
26
  },
27
27
 
28
28
  "c_consent_key":{
29
29
  "fill_with": "RANDOM_NUMBER",
30
- "lock_with": "EXTERNAL_DATA",
31
- "unlock_with": "EXTERNAL_DATA",
30
+ "lock_with": "EXTERNAL_KEY['c_secret']",
31
+ "unlock_with": "EXTERNAL_KEY['c_secret']",
32
32
  "contents": ""
33
33
  },
34
34
 
@@ -40,7 +40,7 @@ Scenario: Close And Open With Split Key
40
40
  },
41
41
 
42
42
  "abc_consent_message":{
43
- "fill_with": "EXTERNAL_DATA",
43
+ "fill_with": "EXTERNAL_INPUT['consent_message']",
44
44
  "lock_with": "KEY['abc_joint_consent_key']",
45
45
  "unlock_with": "KEY['abc_joint_consent_key']",
46
46
  "contents": ""
@@ -49,6 +49,7 @@ Scenario: Close And Open With Split Key
49
49
  }
50
50
  """
51
51
  And Consent keys for parties A, B, and C
52
- When I lock a message in a vault using a split key
52
+ When I lock a away the consent keys
53
+ And I lock a message in a vault using a split key
53
54
  Then I can recover the message if each party gives consent
54
55
  And I cannot recover the message if one party fails to give consent
@@ -18,13 +18,13 @@ Scenario: Transfer Key Via Unlocked Vault
18
18
  "random_vault_key":{
19
19
  "description":"Random Number",
20
20
  "fill_with": "RANDOM_NUMBER",
21
- "lock_with": "MASTER_PASSPHRASE",
22
- "unlock_with": "MASTER_PASSPHRASE",
21
+ "lock_with": "UNLOCKED",
22
+ "unlock_with": "UNLOCKED",
23
23
  "contents": ""
24
24
  },
25
25
  "message_locked_with_random":{
26
26
  "description":"A simple message locked with a random number",
27
- "fill_with": "EXTERNAL_DATA",
27
+ "fill_with": "EXTERNAL_INPUT['msg']",
28
28
  "lock_with": "KEY['random_vault_key']",
29
29
  "unlock_with": "KEY['random_vault_key']",
30
30
  "contents": ""
data/features/readme.md CHANGED
@@ -3,4 +3,4 @@
3
3
  If you are coming to this page from a redirect and are unfamiliar with Vault Tree,
4
4
  take a look at the [Homepage] for an overview of the project.
5
5
 
6
- [Homepage]: http://vault-tree.org
6
+ [Homepage]: http://vaulttree.github.io
@@ -1,41 +1,34 @@
1
- Given(/^Alice has the blank asymmetric vault contract$/) do
2
- contract_path = VaultTree::PathHelpers.core_contracts('asymmetric_vault.0.1.0.json')
3
- @contract_json = File.read(contract_path)
4
- end
5
-
6
- When(/^she locks all of her public and private keys$/) do
7
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ALICE_SECURE_PASS', external_data: {})
8
- @contract = @contract.close_vault('alice_contract_secret')
9
- @contract = @contract.close_vault('alice_decryption_key')
10
- @contract = @contract.close_vault('alice_public_encryption_key')
1
+ When(/^Alice locks all of her public and private keys$/) do
2
+ @acs_key = "#{VaultTree::LockSmith.new(message: 'ALICE_SECURE_PASS').secure_hash}"
3
+ @contract = VaultTree::Contract.new(@contract).close_vault('alice_contract_secret', acs_key: @acs_key)
4
+ @contract = VaultTree::Contract.new(@contract).close_vault('alice_decryption_key', acs_key: @acs_key)
5
+ @contract = VaultTree::Contract.new(@contract).close_vault('alice_public_encryption_key', acs_key: @acs_key)
11
6
  end
12
7
 
13
8
  When(/^she sends the contract to Bob over the internet$/) do
14
- @contract_json = @contract.as_json
15
- @bobs_external_data = {"message" => "CONGRATS ALICE! YOU UNLOCKED THE SECRET MESSAGE WITH A DH KEY."}
16
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'BOB_SECURE_PASS', external_data: @bobs_external_data)
9
+ @bcs_key = "#{VaultTree::LockSmith.new(message: 'BOB_SECURE_PASS').secure_hash}"
17
10
  end
18
11
 
19
12
  Then(/^Bob can access of her public keys but not her private keys$/) do
20
- @contents = @contract.retrieve_contents('alice_public_encryption_key')
13
+ @contents = VaultTree::Contract.new(@contract).open_vault('alice_public_encryption_key')
21
14
  end
22
15
 
23
16
  When(/^Bob locks his public and private keys$/) do
24
- @contract = @contract.close_vault('bob_decryption_key')
25
- @contract = @contract.close_vault('bob_public_encryption_key')
17
+ @contract = VaultTree::Contract.new(@contract).close_vault('bob_decryption_key', bcs_key: @bcs_key)
18
+ @contract = VaultTree::Contract.new(@contract).close_vault('bob_public_encryption_key', bcs_key: @bcs_key)
26
19
  end
27
20
 
28
21
  When(/^He fills and locks the vault containing the message using a DH_KEY$/) do
29
- @contract = @contract.close_vault('message')
22
+ @msg = "CONGRATS ALICE! YOU UNLOCKED THE SECRET MESSAGE WITH A DH KEY."
23
+ @contract = VaultTree::Contract.new(@contract).close_vault('message', msg: @msg, bcs_key: @bcs_key)
30
24
  end
31
25
 
32
26
 
33
27
  When(/^he sends the contract back to Alice over the internet$/) do
34
- @contract_json = @contract.as_json
35
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ALICE_SECURE_PASS', external_data: {})
28
+ @contract = VaultTree::Contract.new(@contract).as_json
36
29
  end
37
30
 
38
31
  Then(/^Alice can unlock the message with a DH_KEY$/) do
39
- puts @contract.retrieve_contents('message')
40
- @contract.retrieve_contents('message').should == @bobs_external_data['message']
32
+ puts VaultTree::Contract.new(@contract).open_vault('message', acs_key: @acs_key)
33
+ VaultTree::Contract.new(@contract).open_vault('message', acs_key: @acs_key).should == @msg
41
34
  end
@@ -1,43 +1,38 @@
1
1
  Given(/^the SENDER has the blank contract template$/) do
2
- contract_path = VaultTree::PathHelpers.core_contracts('block_chain_key_transfer.0.1.0.json')
3
- @contract_json = File.read(contract_path)
4
2
  end
5
3
 
6
4
  Given(/^the SENDER chooses an origin address and a concealed destination address$/) do
7
- @sender_external_data =
8
- {
9
- 'sender_origin_wallet_address' => '1XJEBF8EUBF855NEBHVENPFE9JE74E',
10
- 'sender_concealed_destination_wallet_address' => '1JVKE8HD5JDHFEJHF678JEH8DEJGHE',
11
- 'sender_btc_signing_key' => 'BITCOIN_SIGNING_KEY_KEEP_IT_SECRET'
12
- }
13
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'SENDER_SECURE_PASS', external_data: @sender_external_data)
14
- @contract = @contract.close_vault('sender_origin_wallet_address')
15
- @contract = @contract.close_vault('sender_concealed_destination_wallet_address')
5
+ @sender_secret = "#{VaultTree::LockSmith.new(message: 'SENDER_SECURE_PASS').secure_hash}"
6
+ @sender_origin_wallet_address = '1XJEBF8EUBF855NEBHVENPFE9JE74E'
7
+ @sender_concealed_destination_wallet_address = '1JVKE8HD5JDHFEJHF678JEH8DEJGHE'
8
+ @sender_btc_signing_key = 'BITCOIN_SIGNING_KEY_KEEP_IT_SECRET'
9
+
10
+ @contract = VaultTree::Contract.new(@contract).close_vault('sender_concealed_destination_wallet_address', scdwa: @sender_concealed_destination_wallet_address, ss_key: @sender_secret)
11
+ @contract = VaultTree::Contract.new(@contract).close_vault('sender_origin_wallet_address', sowa: @sender_origin_wallet_address, ss_key: @sender_secret)
16
12
  end
17
13
 
18
14
  Given(/^he locks away the secret BTC signing key$/) do
19
- @contract = @contract.close_vault('sender_btc_signing_key')
15
+ @contract = VaultTree::Contract.new(@contract).close_vault('sender_btc_signing_key', ssk: @sender_btc_signing_key, ss_key: @sender_secret)
20
16
  end
21
17
 
22
18
  When(/^the SENDER transfers the contract to the RECEIVER$/) do
23
- @contract_json_over_the_wire = @contract.as_json
24
- @contract = VaultTree::Contract.new(@contract_json_over_the_wire, master_passphrase: 'RECEIVER_SECURE_PASS')
19
+ @contract_json_over_the_wire = VaultTree::Contract.new(@contract).as_json
20
+ @contract = VaultTree::Contract.new(@contract_json_over_the_wire).as_json
25
21
  end
26
22
 
27
23
  Then(/^the RECEIVER can access the origin wallet address$/) do
28
- @contract.retrieve_contents('sender_origin_wallet_address').should == @sender_external_data['sender_origin_wallet_address']
24
+ @receiver_secret = "#{VaultTree::LockSmith.new(message: 'RECEIVER_SECURE_PASS').secure_hash}"
25
+ VaultTree::Contract.new(@contract).open_vault('sender_origin_wallet_address', rs_key: @receiver_secret).should == @sender_origin_wallet_address
29
26
  end
30
27
 
31
28
  When(/^the SENDER reveals the hidden wallet address by transfering bitcoins from the origin address$/) do
32
- @contract_json = @contract.as_json # save the json state
33
- wallet_address_from_watching_blockchain = @sender_external_data['sender_concealed_destination_wallet_address']
34
- @receiver_external_data = { 'receiver_revealed_destination_wallet_address' => wallet_address_from_watching_blockchain}
35
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'RECEIVER_SECURE_PASS', external_data: @receiver_external_data)
36
- @contract = @contract.close_vault('receiver_revealed_destination_wallet_address')
29
+ @contract = VaultTree::Contract.new(@contract).as_json # save the json state
30
+ wallet_address_from_watching_blockchain = @sender_concealed_destination_wallet_address # This is made public on the chain
31
+ @contract = VaultTree::Contract.new(@contract).close_vault('receiver_revealed_destination_wallet_address', rs_key: @receiver_secret, rrdwa: wallet_address_from_watching_blockchain)
37
32
  end
38
33
 
39
34
  Then(/^the RECEIVER can unlock the vault to recover the transfered signing key$/) do
40
- transfered_secret_key = @contract.retrieve_contents('sender_btc_signing_key')
41
- transfered_secret_key.should == @sender_external_data['sender_btc_signing_key']
35
+ transfered_secret_key = VaultTree::Contract.new(@contract).open_vault('sender_btc_signing_key', rs_key: @receiver_secret)
36
+ transfered_secret_key.should == @sender_btc_signing_key
42
37
  puts "PROPERLY TRANSFERED: #{transfered_secret_key} !"
43
38
  end
@@ -1,121 +1,110 @@
1
- Given(/^I have a blank reference contract$/) do
2
- contract_path = VaultTree::PathHelpers.reference_contract
3
- @contract_json = File.read(contract_path)
4
- end
5
-
6
- When(/^I lock a message in a vault with my Master Password$/) do
7
- @external_data = {"message" => "CONGRATS! YOU OPENED THE VAULT."}
8
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS', external_data: @external_data)
9
- @contract = @contract.close_vault('message')
10
- end
11
-
12
- Then(/^I can recover the message with my Master Password$/) do
13
- @contract.retrieve_contents('message').should == @external_data['message']
14
- end
15
-
16
1
  When(/^I lock away a random vault key$/) do
17
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS')
18
- @contract = @contract.close_vault('random_vault_key')
2
+ @contract = VaultTree::Contract.new(@contract).as_json
3
+ @contract = VaultTree::Contract.new(@contract).close_vault('random_vault_key')
19
4
  end
20
5
 
21
6
  When(/^I use the random key to lock a message$/) do
22
- @external_data = {"message_locked_with_random" => "CONGRATS! YOU OPENED THE VAULT WITH A RANDOM KEY."}
23
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS', external_data: @external_data)
24
- @contract = @contract.close_vault('message_locked_with_random')
7
+ @contract = VaultTree::Contract.new(@contract).as_json
8
+ @msg = "CONGRATS! YOU OPENED THE VAULT."
9
+ @contract = VaultTree::Contract.new(@contract).close_vault('message_locked_with_random', msg: @msg)
25
10
  end
26
11
 
27
12
  Then(/^I can recover the message with the Random Key$/) do
28
- @contract.retrieve_contents('message_locked_with_random').should == @external_data['message_locked_with_random']
13
+ VaultTree::Contract.new(@contract).open_vault('message_locked_with_random').should == @msg
29
14
  end
30
15
 
31
16
  When(/^I put this random key in an unlocked vault$/) do
32
- @contract = @contract.close_vault('unlocked_random_key')
17
+ @contract = VaultTree::Contract.new(@contract).close_vault('unlocked_random_key')
33
18
  end
34
19
 
35
20
  Then(/^another user can recover the message with the Unlocked Random Key$/) do
36
- @contract = @contract.close_vault('message_locked_with_unlocked_random_number')
37
- @contract_json = @contract.as_json
38
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ANOTHER_SECURE_PASS')
39
- @contract.retrieve_contents('message_locked_with_unlocked_random_number').should == @external_data['message_locked_with_random']
21
+ @contract = VaultTree::Contract.new(@contract).close_vault('message_locked_with_unlocked_random_number')
22
+ @contract = VaultTree::Contract.new(@contract).as_json
23
+ VaultTree::Contract.new(@contract).open_vault('message_locked_with_unlocked_random_number').should == @msg
40
24
  end
41
25
 
42
26
  Given(/^I have access to the another user's unlocked public key$/) do
43
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ANOTHER_USERS_SECURE_PASS')
44
- @contract = @contract.close_vault('another_decryption_key')
45
- @contract = @contract.close_vault('another_public_key')
46
- @contract_json = @contract.as_json
47
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS')
48
- @contract = @contract.close_vault('my_decryption_key')
49
- @contract = @contract.close_vault('my_public_key')
27
+ @contract = VaultTree::Contract.new(@contract).as_json
28
+ @contract = VaultTree::Contract.new(@contract).close_vault('another_decryption_key')
29
+ @contract = VaultTree::Contract.new(@contract).close_vault('another_public_key')
30
+ @contract = VaultTree::Contract.new(@contract).as_json
31
+ @contract = VaultTree::Contract.new(@contract).as_json
32
+ @contract = VaultTree::Contract.new(@contract).close_vault('my_decryption_key')
33
+ @contract = VaultTree::Contract.new(@contract).close_vault('my_public_key')
50
34
  end
51
35
 
52
36
  Given(/^I lock a simple message with a DH Key$/) do
53
- @contract_json = @contract.as_json
54
- @external_data = {"asymmetric_message" => "CONGRATS! YOU OPENED THE ASYMMETRIC VAULT."}
55
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS', external_data: @external_data)
56
- @contract = @contract.close_vault('asymmetric_message')
37
+ @contract = VaultTree::Contract.new(@contract).as_json
38
+ @asymmetric_message = "CONGRATS! YOU OPENED THE ASYMMETRIC VAULT."
39
+ @contract = VaultTree::Contract.new(@contract).close_vault('asymmetric_message', asymmetric_message: @asymmetric_message)
57
40
  end
58
41
 
59
42
  When(/^I transfer the contract to the other user$/) do
60
- @contract_json = @contract.as_json
61
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'ANOTHER_USERS_SECURE_PASS')
43
+ @contract = VaultTree::Contract.new(@contract).as_json
62
44
  end
63
45
 
64
46
  Then(/^they can create a DH Key and unlock the message$/) do
65
- @contract.retrieve_contents('asymmetric_message').should == @external_data['asymmetric_message']
47
+ VaultTree::Contract.new(@contract).open_vault('asymmetric_message').should == @asymmetric_message
66
48
  end
67
49
 
68
50
  Given(/^Consent keys for parties A, B, and C$/) do
69
- @locking_consent_keys = {
70
- "a_consent_key" => "A_SECRET_CONSENT_KEY",
71
- "b_consent_key" => "B_SECRET_CONSENT_KEY",
72
- "c_consent_key" => "C_SECRET_CONSENT_KEY"
73
- }
51
+ @a_secret = "A_SECRET_CONSENT_KEY"
52
+ @b_secret = "B_SECRET_CONSENT_KEY"
53
+ @c_secret = "C_SECRET_CONSENT_KEY"
54
+ end
55
+
56
+ When(/^I lock a away the consent keys$/) do
57
+ @contract = VaultTree::Contract.new(@contract).close_vault('a_consent_key', a_secret: @a_secret)
58
+ @contract = VaultTree::Contract.new(@contract).close_vault('b_consent_key', b_secret: @b_secret)
59
+ @contract = VaultTree::Contract.new(@contract).close_vault('c_consent_key', c_secret: @c_secret)
60
+ @contract = VaultTree::Contract.new(@contract).as_json
74
61
  end
75
62
 
76
63
  When(/^I lock a message in a vault using a split key$/) do
77
- @message = {"abc_consent_message" => "A, B, AND C ALL AGREED TO OPEN THE VAULT." }
78
- @external_data = @locking_consent_keys.merge(@message)
79
- @contract = VaultTree::Contract.new(@contract_json, external_data: @external_data)
80
- @contract = @contract.close_vault('a_consent_key')
81
- @contract = @contract.close_vault('b_consent_key')
82
- @contract = @contract.close_vault('c_consent_key')
83
- @contract = @contract.close_vault('abc_joint_consent_key')
84
- @contract = @contract.close_vault('abc_consent_message')
85
- @contract_json = @contract.as_json
64
+ @abc_consent_message = "A, B, AND C ALL AGREED TO OPEN THE VAULT."
65
+ @contract = VaultTree::Contract.new(@contract).close_vault('abc_joint_consent_key',
66
+ a_secret: @a_secret,
67
+ b_secret: @b_secret,
68
+ c_secret: @c_secret)
69
+ @contract = VaultTree::Contract.new(@contract).close_vault('abc_consent_message',
70
+ consent_message: @abc_consent_message,
71
+ a_secret: @a_secret,
72
+ b_secret: @b_secret,
73
+ c_secret: @c_secret)
74
+ @contract = VaultTree::Contract.new(@contract).as_json
86
75
  end
87
76
 
88
77
  Then(/^I can recover the message if each party gives consent$/) do
89
- @unlocking_consent_keys = {
90
- "a_consent_key" => "A_SECRET_CONSENT_KEY",
91
- "b_consent_key" => "B_SECRET_CONSENT_KEY",
92
- "c_consent_key" => "C_SECRET_CONSENT_KEY"
78
+ @unlocking_consent = {
79
+ a_secret: "A_SECRET_CONSENT_KEY",
80
+ b_secret: "B_SECRET_CONSENT_KEY",
81
+ c_secret: "C_SECRET_CONSENT_KEY"
93
82
  }
94
- @contract = VaultTree::Contract.new(@contract_json, external_data: @unlocking_consent_keys)
95
- @contract.retrieve_contents('abc_consent_message').should == @external_data['abc_consent_message']
96
- puts @contract.retrieve_contents('abc_consent_message')
83
+ @contract = VaultTree::Contract.new(@contract).as_json
84
+ VaultTree::Contract.new(@contract).open_vault('abc_consent_message', @unlocking_consent).should == @abc_consent_message
85
+ puts VaultTree::Contract.new(@contract).open_vault('abc_consent_message', @unlocking_consent)
97
86
  end
98
87
 
99
88
  Then(/^I cannot recover the message if one party fails to give consent$/) do
100
89
  @incomplete_unlocking_consent_keys = {
101
- "a_consent_key" => "A_WRONG_SECRET_CONSENT_KEY",
102
- "b_consent_key" => "B_SECRET_CONSENT_KEY",
103
- "c_consent_key" => "C_SECRET_CONSENT_KEY"
90
+ a_secret: "A_WRONG_SECRET_CONSENT_KEY",
91
+ b_secret: "B_SECRET_CONSENT_KEY",
92
+ c_secret: "C_SECRET_CONSENT_KEY"
104
93
  }
105
- @contract = VaultTree::Contract.new(@contract_json, external_data: @incomplete_unlocking_consent_keys)
106
- expect{@contract.retrieve_contents('abc_consent_message')}.to raise_error(VaultTree::Exceptions::FailedUnlockAttempt)
94
+ @contract = VaultTree::Contract.new(@contract).as_json
95
+ expect{VaultTree::Contract.new(@contract).open_vault('abc_consent_message',@incomplete_unlocking_consent_keys)}.to raise_error(VaultTree::Exceptions::FailedUnlockAttempt)
107
96
  end
108
97
 
109
98
  Given(/^the blank contract:$/) do |string|
110
- @contract_json = string
99
+ @contract = string
111
100
  end
112
101
 
113
102
  When(/^I lock a message in a vault using a symmetric vault key$/) do
114
- @external_data = {"message" => "CONGRATS! YOU OPENED THE VAULT."}
115
- @contract = VaultTree::Contract.new(@contract_json, master_passphrase: 'MY_SECURE_PASS', external_data: @external_data)
116
- @contract = @contract.close_vault('message')
103
+ @contract = VaultTree::Contract.new(@contract).as_json
104
+ @msg = "CONGRATS! YOU OPENED THE VAULT."
105
+ @contract = VaultTree::Contract.new(@contract).close_vault('message', msg: @msg)
117
106
  end
118
107
 
119
108
  Then(/^I can recover the message using the same key$/) do
120
- @contract.retrieve_contents('message').should == @external_data['message']
109
+ VaultTree::Contract.new(@contract).open_vault('message').should == @msg
121
110
  end