vault-tree 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/.gitignore +26 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +43 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +118 -0
  6. data/Rakefile +17 -0
  7. data/VagrantFile +30 -0
  8. data/features/core.feature +44 -0
  9. data/features/exceptions.feature +41 -0
  10. data/features/steps/core.steps.rb +168 -0
  11. data/features/steps/exceptions.steps.rb +103 -0
  12. data/features/support/env.rb +1 -0
  13. data/features/world.rb +3 -0
  14. data/lib/vault-tree.rb +7 -0
  15. data/lib/vault-tree/config/dependencies.rb +4 -0
  16. data/lib/vault-tree/config/lib.rb +2 -0
  17. data/lib/vault-tree/config/path_helpers.rb +49 -0
  18. data/lib/vault-tree/config/string.rb +25 -0
  19. data/lib/vault-tree/contract/close_validator.rb +35 -0
  20. data/lib/vault-tree/contract/contract.rb +85 -0
  21. data/lib/vault-tree/contract/contract_presenter.rb +27 -0
  22. data/lib/vault-tree/contract/doorman.rb +112 -0
  23. data/lib/vault-tree/contract/null_vault.rb +16 -0
  24. data/lib/vault-tree/contract/open_validator.rb +20 -0
  25. data/lib/vault-tree/contract/vault.rb +96 -0
  26. data/lib/vault-tree/exceptions/empty_vault.rb +8 -0
  27. data/lib/vault-tree/exceptions/fill_attempt_master_password.rb +6 -0
  28. data/lib/vault-tree/exceptions/invalid_signature.rb +0 -0
  29. data/lib/vault-tree/exceptions/malformed_json.rb +0 -0
  30. data/lib/vault-tree/exceptions/missing_external_data.rb +6 -0
  31. data/lib/vault-tree/exceptions/missing_partner_decryption_key.rb +6 -0
  32. data/lib/vault-tree/exceptions/missing_passphrase.rb +6 -0
  33. data/lib/vault-tree/exceptions/non_unique_vault_id.rb +0 -0
  34. data/lib/vault-tree/exceptions/unsupported_keyword.rb +6 -0
  35. data/lib/vault-tree/exceptions/vault_does_not_exist.rb +6 -0
  36. data/lib/vault-tree/exceptions/vault_tree_exception.rb +6 -0
  37. data/lib/vault-tree/keywords/decryption_key.rb +14 -0
  38. data/lib/vault-tree/keywords/external_data.rb +13 -0
  39. data/lib/vault-tree/keywords/keyword.rb +19 -0
  40. data/lib/vault-tree/keywords/keyword_interpreter.rb +45 -0
  41. data/lib/vault-tree/keywords/master_passphrase.rb +9 -0
  42. data/lib/vault-tree/keywords/public_encryption_key.rb +27 -0
  43. data/lib/vault-tree/keywords/random_number.rb +9 -0
  44. data/lib/vault-tree/keywords/shared_key.rb +24 -0
  45. data/lib/vault-tree/keywords/unlocked.rb +9 -0
  46. data/lib/vault-tree/keywords/vault_contents.rb +13 -0
  47. data/lib/vault-tree/lock_smith/asymmetric_cipher.rb +31 -0
  48. data/lib/vault-tree/lock_smith/crypto_hash.rb +11 -0
  49. data/lib/vault-tree/lock_smith/digital_signature.rb +32 -0
  50. data/lib/vault-tree/lock_smith/encryption_key_pair.rb +25 -0
  51. data/lib/vault-tree/lock_smith/null_vault.rb +4 -0
  52. data/lib/vault-tree/lock_smith/random_number.rb +11 -0
  53. data/lib/vault-tree/lock_smith/shared_key_pair.rb +12 -0
  54. data/lib/vault-tree/lock_smith/signing_key_pair.rb +25 -0
  55. data/lib/vault-tree/lock_smith/symmetric_cipher.rb +25 -0
  56. data/lib/vault-tree/util/json.rb +16 -0
  57. data/lib/vault-tree/version.rb +3 -0
  58. data/spec/app/locksmith/asymmetric_cipher_spec.rb +25 -0
  59. data/spec/app/locksmith/signing_key_pair_spec.rb +22 -0
  60. data/spec/spec_helper.rb +5 -0
  61. data/spec/support/fixtures/blank_simple_test_contract.json +14 -0
  62. data/spec/support/fixtures/broken_contract.json +55 -0
  63. data/spec/support/fixtures/one_two_three-0.5.0.EXP.json +105 -0
  64. data/spec/support/fixtures/reference_contract.1.0.0.json +227 -0
  65. data/spec/support/fixtures/simple_test_contract.json +14 -0
  66. data/support/cookbooks/ark/.gitignore +12 -0
  67. data/support/cookbooks/ark/.kitchen.yml +34 -0
  68. data/support/cookbooks/ark/.travis.yml +6 -0
  69. data/support/cookbooks/ark/Berksfile +9 -0
  70. data/support/cookbooks/ark/CHANGELOG.md +87 -0
  71. data/support/cookbooks/ark/CONTRIBUTING.md +257 -0
  72. data/support/cookbooks/ark/README.md +301 -0
  73. data/support/cookbooks/ark/Rakefile +36 -0
  74. data/support/cookbooks/ark/TESTING.md +25 -0
  75. data/support/cookbooks/ark/Toftfile +15 -0
  76. data/support/cookbooks/ark/attributes/default.rb +6 -0
  77. data/support/cookbooks/ark/chefignore +96 -0
  78. data/support/cookbooks/ark/files/default/foo.tar.gz +0 -0
  79. data/support/cookbooks/ark/files/default/foo.tbz +0 -0
  80. data/support/cookbooks/ark/files/default/foo.tgz +0 -0
  81. data/support/cookbooks/ark/files/default/foo.zip +0 -0
  82. data/support/cookbooks/ark/files/default/tests/minitest/default_test.rb +0 -0
  83. data/support/cookbooks/ark/files/default/tests/minitest/support/helpers.rb +0 -0
  84. data/support/cookbooks/ark/files/default/tests/minitest/test_test.rb +94 -0
  85. data/support/cookbooks/ark/libraries/default.rb +167 -0
  86. data/support/cookbooks/ark/metadata.rb +13 -0
  87. data/support/cookbooks/ark/providers/default.rb +370 -0
  88. data/support/cookbooks/ark/recipes/default.rb +31 -0
  89. data/support/cookbooks/ark/recipes/test.rb +138 -0
  90. data/support/cookbooks/ark/resources/default.rb +54 -0
  91. data/support/cookbooks/ark/templates/default/add_to_path.sh.erb +1 -0
  92. data/support/cookbooks/ark/test/support/Gemfile +4 -0
  93. data/support/cookbooks/build-essential/README.md +24 -0
  94. data/support/cookbooks/build-essential/metadata.rb +10 -0
  95. data/support/cookbooks/build-essential/recipes/default.rb +45 -0
  96. data/support/cookbooks/chruby/.gitignore +15 -0
  97. data/support/cookbooks/chruby/.kitchen.yml +26 -0
  98. data/support/cookbooks/chruby/.ruby_version +1 -0
  99. data/support/cookbooks/chruby/Berksfile +3 -0
  100. data/support/cookbooks/chruby/Gemfile +7 -0
  101. data/support/cookbooks/chruby/LICENSE +14 -0
  102. data/support/cookbooks/chruby/README.md +92 -0
  103. data/support/cookbooks/chruby/Rakefile +7 -0
  104. data/support/cookbooks/chruby/Thorfile +6 -0
  105. data/support/cookbooks/chruby/Vagrantfile +86 -0
  106. data/support/cookbooks/chruby/attributes/default.rb +10 -0
  107. data/support/cookbooks/chruby/chefignore +96 -0
  108. data/support/cookbooks/chruby/metadata.rb +11 -0
  109. data/support/cookbooks/chruby/recipes/default.rb +43 -0
  110. data/support/cookbooks/chruby/recipes/system.rb +25 -0
  111. data/support/cookbooks/chruby/templates/default/chruby.sh.erb +22 -0
  112. data/support/cookbooks/chruby/test/integration/default/bash/embedded_test.sh +1 -0
  113. data/support/cookbooks/git/.gitignore +14 -0
  114. data/support/cookbooks/git/.kitchen.yml +46 -0
  115. data/support/cookbooks/git/Berksfile +8 -0
  116. data/support/cookbooks/git/CHANGELOG.md +87 -0
  117. data/support/cookbooks/git/CONTRIBUTING +29 -0
  118. data/support/cookbooks/git/Gemfile +3 -0
  119. data/support/cookbooks/git/LICENSE +201 -0
  120. data/support/cookbooks/git/README.md +115 -0
  121. data/support/cookbooks/git/TESTING.md +25 -0
  122. data/support/cookbooks/git/attributes/default.rb +40 -0
  123. data/support/cookbooks/git/metadata.rb +35 -0
  124. data/support/cookbooks/git/recipes/default.rb +53 -0
  125. data/support/cookbooks/git/recipes/server.rb +58 -0
  126. data/support/cookbooks/git/recipes/source.rb +49 -0
  127. data/support/cookbooks/git/recipes/windows.rb +37 -0
  128. data/support/cookbooks/git/templates/default/git-xinetd.d.erb +10 -0
  129. data/support/cookbooks/git/templates/default/sv-git-daemon-log-run.erb +2 -0
  130. data/support/cookbooks/git/templates/default/sv-git-daemon-run.erb +3 -0
  131. data/support/cookbooks/install_ruby/README.md +3 -0
  132. data/support/cookbooks/install_ruby/metadata.rb +10 -0
  133. data/support/cookbooks/install_ruby/recipes/default.rb +14 -0
  134. data/support/cookbooks/ruby_build/.gitignore +6 -0
  135. data/support/cookbooks/ruby_build/.kitchen.yml +31 -0
  136. data/support/cookbooks/ruby_build/.travis.yml +4 -0
  137. data/support/cookbooks/ruby_build/Berksfile +10 -0
  138. data/support/cookbooks/ruby_build/CHANGELOG.md +72 -0
  139. data/support/cookbooks/ruby_build/Gemfile +14 -0
  140. data/support/cookbooks/ruby_build/README.md +338 -0
  141. data/support/cookbooks/ruby_build/Rakefile +21 -0
  142. data/support/cookbooks/ruby_build/attributes/default.rb +67 -0
  143. data/support/cookbooks/ruby_build/chefignore +53 -0
  144. data/support/cookbooks/ruby_build/libraries/ruby_build_recipe_helpers.rb +40 -0
  145. data/support/cookbooks/ruby_build/metadata.rb +18 -0
  146. data/support/cookbooks/ruby_build/providers/ruby.rb +88 -0
  147. data/support/cookbooks/ruby_build/recipes/default.rb +69 -0
  148. data/support/cookbooks/ruby_build/resources/ruby.rb +33 -0
  149. data/support/cookbooks/ruby_build/test/cookbooks/alltherubies/metadata.rb +10 -0
  150. data/support/cookbooks/ruby_build/test/cookbooks/alltherubies/recipes/default.rb +59 -0
  151. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/_verify_tests.bash +33 -0
  152. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.8.7.bats +29 -0
  153. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.9.2.bats +18 -0
  154. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.9.3.bats +18 -0
  155. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_2.0.0.bats +18 -0
  156. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_jruby.bats +20 -0
  157. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_rbx.bats +18 -0
  158. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_ree.bats +19 -0
  159. data/support/cookbooks/ruby_build/test/integration/installation/bats/installation.bats +6 -0
  160. data/support/scripts/libsodium_ubuntu.sh +80 -0
  161. data/support/tasks/.gitkeep +0 -0
  162. data/support/tasks/libsodium_install.rb +57 -0
  163. data/vault-tree.gemspec +26 -0
  164. metadata +305 -0
@@ -0,0 +1,32 @@
1
+ module VaultTree
2
+ module LockSmith
3
+ class DigitalSignature
4
+ attr_reader :signing_key, :verify_key, :message, :signature
5
+
6
+ def initialize(opts = {})
7
+ @message = opts[:message]
8
+ @signing_key = opts[:signing_key]
9
+ @verify_key = opts[:verify_key]
10
+ @signature = opts[:signature]
11
+ end
12
+
13
+ def generate
14
+ sig_generator.sign(message, :base64)
15
+ end
16
+
17
+ def verify
18
+ sig_verifier.verify(@message, @signature, :base64)
19
+ end
20
+
21
+ private
22
+
23
+ def sig_generator
24
+ Crypto::SigningKey.new(signing_key, :base64)
25
+ end
26
+
27
+ def sig_verifier
28
+ Crypto::VerifyKey.new(verify_key, :base64)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,25 @@
1
+ module VaultTree
2
+ module LockSmith
3
+ class EncryptionKeyPair
4
+
5
+ def generate_private_key
6
+ Crypto::PrivateKey.generate.to_s(:base64)
7
+ end
8
+
9
+ def public_key(pk)
10
+ lib_public_key(pk).to_s(:base64)
11
+ end
12
+
13
+ private
14
+
15
+ def lib_private_key(s)
16
+ Crypto::PrivateKey.new(s,:base64)
17
+ end
18
+
19
+ def lib_public_key(pk)
20
+ lib_private_key(pk).public_key
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,4 @@
1
+ module LockSmith
2
+ class NullVault
3
+ end
4
+ end
@@ -0,0 +1,11 @@
1
+ module VaultTree
2
+ module LockSmith
3
+ class RandomNumber
4
+
5
+ def self.compute
6
+ CryptoHash.compute rand(1000000000000)
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module VaultTree
2
+ module LockSmith
3
+ class SharedKeyPair
4
+ attr_reader :public_key, :secret_key
5
+
6
+ def initialize(opts)
7
+ @public_key = opts[:public_key]
8
+ @secret_key = opts[:secret_key]
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ module VaultTree
2
+ module LockSmith
3
+ class SigningKeyPair
4
+
5
+ def signing_key
6
+ lib_signing_key.to_s(:base64)
7
+ end
8
+
9
+ def verify_key
10
+ lib_verify_key.to_s(:base64)
11
+ end
12
+
13
+ private
14
+
15
+ def lib_signing_key
16
+ @lib_signing_key ||= Crypto::SigningKey.generate
17
+ end
18
+
19
+ def lib_verify_key
20
+ lib_signing_key.verify_key
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module VaultTree
2
+ module LockSmith
3
+ class SymmetricCipher
4
+
5
+ def encrypt(opts = {})
6
+ key = CryptoHash.compute(opts[:key])
7
+ plain_text = opts[:plain_text]
8
+ box_from_key(key).box(plain_text, :base64)
9
+ end
10
+
11
+ def decrypt(opts = {})
12
+ key = CryptoHash.compute(opts[:key])
13
+ cipher_text = opts[:cipher_text]
14
+ box_from_key(key).open(cipher_text , :base64)
15
+ end
16
+
17
+ private
18
+
19
+ def box_from_key(key)
20
+ sb = Crypto::SecretBox.new(key,:base64)
21
+ rnb = Crypto::RandomNonceBox.new(sb)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ require 'json'
2
+ module VaultTree
3
+ module Support
4
+ module JSON
5
+ extend self
6
+
7
+ def encode(ruby_hash)
8
+ ::JSON.generate(ruby_hash)
9
+ end
10
+
11
+ def decode(json)
12
+ ::JSON.parse(json)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module VaultTree
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ module VaultTree
4
+ describe 'AsymmetricCipher' do
5
+
6
+ before :each do
7
+ alice_key_pair = LockSmith::EncryptionKeyPair.new
8
+ @alice_priv_key = alice_key_pair.generate_private_key
9
+ @alice_pub_key = alice_key_pair.public_key(@alice_priv_key)
10
+ bob_key_pair = LockSmith::EncryptionKeyPair.new
11
+ @bob_priv_key = bob_key_pair.generate_private_key
12
+ @bob_pub_key = bob_key_pair.public_key(@bob_priv_key)
13
+ @message = 'ENCRYPT_ME!'
14
+ @asymmetric_cipher = LockSmith::AsymmetricCipher.new
15
+ end
16
+
17
+ describe '#encrypt | #decrypt' do
18
+ it 'Bob can encrypt with alice pub key and Alice can decrypt' do
19
+ cipher_text = @asymmetric_cipher.encrypt(public_key: @alice_pub_key, secret_key: @bob_priv_key, plain_text: @message)
20
+ plain_text = @asymmetric_cipher.decrypt(public_key: @bob_pub_key, secret_key: @alice_priv_key, cipher_text: cipher_text)
21
+ plain_text.should == @message
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ module VaultTree
3
+ module LockSmith
4
+
5
+ describe 'SigningKeyPair' do
6
+ describe '#new' do
7
+
8
+ before :each do
9
+ @signing_key_pair = SigningKeyPair.new
10
+ end
11
+
12
+ it 'generates a new private key' do
13
+ @signing_key_pair.signing_key.should be_an_instance_of(String)
14
+ end
15
+
16
+ it 'generates a new public key' do
17
+ @signing_key_pair.verify_key.should be_an_instance_of(String)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ require_relative '../lib/vault-tree'
2
+
3
+ RSpec.configure do |config|
4
+ config.color_enabled = true
5
+ end
@@ -0,0 +1,14 @@
1
+ {
2
+ "header": {},
3
+ "vaults": {
4
+
5
+ "simple_message":{
6
+ "owner": "tester",
7
+ "fill_with": "EXTERNAL_DATA",
8
+ "lock_with": "MASTER_PASSPHRASE",
9
+ "unlock_with": "MASTER_PASSPHRASE",
10
+ "contents": ""
11
+ }
12
+
13
+ }
14
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "header": {
3
+
4
+ "title":"Broken Contract",
5
+ "summary":"This is a test fixture for ensuring proper exception handling. These are examples of what NOT to do.",
6
+ "contributers":"Andrew Bashelor"
7
+ },
8
+ "vaults": {
9
+
10
+ "empty_vault":{
11
+ "fill_with": "RANDOM_NUMBER",
12
+ "lock_with": "MASTER_PASSPHRASE",
13
+ "unlock_with": "MASTER_PASSPHRASE",
14
+ "contents": ""
15
+ },
16
+
17
+ "unsupported_keyword":{
18
+ "fill_with": "UNSUPPORTED_KEYWORD",
19
+ "lock_with": "UNLOCKED",
20
+ "unlock_with": "UNLOCKED",
21
+ "contents": ""
22
+ },
23
+
24
+ "fill_with_master_pass_vault":{
25
+ "fill_with": "MASTER_PASSPHRASE",
26
+ "lock_with": "UNLOCKED",
27
+ "unlock_with": "UNLOCKED",
28
+ "contents": ""
29
+ },
30
+
31
+ "missing_external_data_vault":{
32
+ "fill_with": "EXTERNAL_DATA",
33
+ "lock_with": "UNLOCKED",
34
+ "unlock_with": "UNLOCKED",
35
+ "contents": ""
36
+ },
37
+
38
+ "empty_decryption_key":{
39
+ "description": "Leave this empty.",
40
+ "fill_with": "DECRYPTION_KEY",
41
+ "lock_with": "UNLOCKED",
42
+ "unlock_with": "UNLOCKED",
43
+ "contents": ""
44
+ },
45
+
46
+ "orphaned_public_key":{
47
+ "description": "Attempt to establish a public key with first building a decryption key",
48
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['empty_decryption_key']",
49
+ "lock_with": "UNLOCKED",
50
+ "unlock_with": "UNLOCKED",
51
+ "contents": ""
52
+ }
53
+
54
+ }
55
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ "header": {},
3
+ "vaults": {
4
+
5
+ "bob_contract_secret":{
6
+ "owner": "bob",
7
+ "fill_with": "RANDOM_NUMBER",
8
+ "lock_with": "MASTER_PASSPHRASE",
9
+ "unlock_with": "MASTER_PASSPHRASE",
10
+ "contents": ""
11
+ },
12
+
13
+ "alice_contract_secret":{
14
+ "owner": "alice",
15
+ "fill_with": "RANDOM_NUMBER",
16
+ "lock_with": "MASTER_PASSPHRASE",
17
+ "unlock_with": "MASTER_PASSPHRASE",
18
+ "contents": ""
19
+ },
20
+
21
+ "alice_public_encryption_key":{
22
+ "owner": "alice",
23
+ "fill_with": "PUBLIC_ENCRYPTION_KEY",
24
+ "lock_with": "UNLOCKED",
25
+ "unlock_with": "UNLOCKED",
26
+ "contents": ""
27
+ },
28
+
29
+ "bob_public_encryption_key":{
30
+ "owner": "bob",
31
+ "fill_with": "PUBLIC_ENCRYPTION_KEY",
32
+ "lock_with": "UNLOCKED",
33
+ "unlock_with": "UNLOCKED",
34
+ "contents": ""
35
+ },
36
+
37
+ "alice_decryption_key":{
38
+ "owner": "alice",
39
+ "fill_with": "DECRYPTION_KEY",
40
+ "lock_with": "VAULT_CONTENTS['alice_contract_secret']",
41
+ "unlock_with": "VAULT_CONTENTS['alice_contract_secret']",
42
+ "contents": ""
43
+ },
44
+
45
+ "bob_decryption_key":{
46
+ "owner": "bob",
47
+ "fill_with": "DECRYPTION_KEY",
48
+ "lock_with": "VAULT_CONTENTS['bob_contract_secret']",
49
+ "unlock_with": "VAULT_CONTENTS['bob_contract_secret']",
50
+ "contents": ""
51
+ },
52
+
53
+ "congratulations_message":{
54
+ "owner": "bob",
55
+ "fill_with": "EXTERNAL_DATA",
56
+ "lock_with": "VAULT_CONTENTS['bob_contract_secret']",
57
+ "unlock_with": "VAULT_CONTENTS['bob_contract_secret']",
58
+ "contents": ""
59
+ },
60
+
61
+ "vault_two_key":{
62
+ "owner": "bob",
63
+ "fill_with": "RANDOM_NUMBER",
64
+ "lock_with": "VAULT_CONTENTS['bob_contract_secret']",
65
+ "unlock_with": "VAULT_CONTENTS['bob_contract_secret']",
66
+ "contents": ""
67
+ },
68
+
69
+ "vault_three_key":{
70
+ "owner": "bob",
71
+ "fill_with": "RANDOM_NUMBER",
72
+ "lock_with": "VAULT_CONTENTS['bob_contract_secret']",
73
+ "unlock_with": "VAULT_CONTENTS['bob_contract_secret']",
74
+ "contents": ""
75
+ },
76
+
77
+ "first":{
78
+ "owner": "bob",
79
+ "fill_with": "VAULT_CONTENTS['vault_two_key']",
80
+ "lock_with": "VAULT_CONTENTS['alice_public_encryption_key']",
81
+ "unlock_with": "VAULT_CONTENTS['alice_decryption_key']",
82
+ "lock_type": "ASYMMETRIC_MUTUAL_AUTH",
83
+ "asym_auth_with": "VAULT_CONTENTS['bob_decryption_key']",
84
+ "asym_verify_with": "VAULT_CONTENTS['bob_public_encryption_key']",
85
+ "contents": ""
86
+ },
87
+
88
+ "second":{
89
+ "owner": "bob",
90
+ "fill_with": "VAULT_CONTENTS['vault_three_key']",
91
+ "lock_with": "VAULT_CONTENTS['vault_two_key']",
92
+ "unlock_with": "VAULT_CONTENTS['first']",
93
+ "contents": ""
94
+ },
95
+
96
+ "third":{
97
+ "owner": "bob",
98
+ "fill_with": "VAULT_CONTENTS['congratulations_message']",
99
+ "lock_with": "VAULT_CONTENTS['vault_three_key']",
100
+ "unlock_with": "VAULT_CONTENTS['second']",
101
+ "contents": ""
102
+ }
103
+
104
+ }
105
+ }
@@ -0,0 +1,227 @@
1
+ {
2
+ "header": {
3
+ "title":"Reference Contract 1.0.0",
4
+ "description":"This is a test fixture. It is a contract built to use all Vault Tree functionality"
5
+ },
6
+ "vaults": {
7
+
8
+ "bob_contract_secret":{
9
+ "description":"contract specific password to lock private information",
10
+ "fill_with": "RANDOM_NUMBER",
11
+ "lock_with": "MASTER_PASSPHRASE",
12
+ "unlock_with": "MASTER_PASSPHRASE",
13
+ "contents": ""
14
+ },
15
+
16
+ "alice_contract_secret":{
17
+ "description":"contract specific password to lock private information",
18
+ "fill_with": "RANDOM_NUMBER",
19
+ "lock_with": "MASTER_PASSPHRASE",
20
+ "unlock_with": "MASTER_PASSPHRASE",
21
+ "contents": ""
22
+ },
23
+
24
+ "alice_public_encryption_key":{
25
+ "description":"public key for asymmetric encryption",
26
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['alice_decryption_key']",
27
+ "lock_with": "UNLOCKED",
28
+ "unlock_with": "UNLOCKED",
29
+ "contents": ""
30
+ },
31
+
32
+ "bob_public_encryption_key":{
33
+ "description":"public key for asymmetric encryption",
34
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['bob_decryption_key']",
35
+ "lock_with": "UNLOCKED",
36
+ "unlock_with": "UNLOCKED",
37
+ "contents": ""
38
+ },
39
+
40
+ "alice_decryption_key":{
41
+ "description":"private key for asymmetric decryption",
42
+ "fill_with": "DECRYPTION_KEY",
43
+ "lock_with": "CONTENTS['alice_contract_secret']",
44
+ "unlock_with": "CONTENTS['alice_contract_secret']",
45
+ "contents": ""
46
+ },
47
+
48
+ "bob_decryption_key":{
49
+ "description":"private key for asymmetric decryption",
50
+ "fill_with": "DECRYPTION_KEY",
51
+ "lock_with": "CONTENTS['bob_contract_secret']",
52
+ "unlock_with": "CONTENTS['bob_contract_secret']",
53
+ "contents": ""
54
+ },
55
+
56
+ "congratulations_message":{
57
+ "description":"A simple message for Bob to put in the final vault",
58
+ "fill_with": "EXTERNAL_DATA",
59
+ "lock_with": "CONTENTS['bob_contract_secret']",
60
+ "unlock_with": "CONTENTS['bob_contract_secret']",
61
+ "contents": ""
62
+ },
63
+
64
+ "vault_two_key":{
65
+ "description":"Key to lock vault two. Once Bob locks the second vault he will put this key inside vault one.",
66
+ "fill_with": "RANDOM_NUMBER",
67
+ "lock_with": "CONTENTS['bob_contract_secret']",
68
+ "unlock_with": "CONTENTS['bob_contract_secret']",
69
+ "contents": ""
70
+ },
71
+
72
+ "vault_three_key":{
73
+ "description":"Key to lock vault three. Once Bob locks the third vault he will put this key inside vault two.",
74
+ "fill_with": "RANDOM_NUMBER",
75
+ "lock_with": "CONTENTS['bob_contract_secret']",
76
+ "unlock_with": "CONTENTS['bob_contract_secret']",
77
+ "contents": ""
78
+ },
79
+
80
+ "first":{
81
+ "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.",
82
+ "fill_with": "CONTENTS['vault_two_key']",
83
+ "lock_with": "SHARED_KEY['alice_public_encryption_key','bob_decryption_key']",
84
+ "unlock_with": "SHARED_KEY['bob_public_encryption_key','alice_decryption_key']",
85
+ "contents": ""
86
+ },
87
+
88
+ "second":{
89
+ "description":"Alice unlocks this vault with the key held in the first vault.",
90
+ "fill_with": "CONTENTS['vault_three_key']",
91
+ "lock_with": "CONTENTS['vault_two_key']",
92
+ "unlock_with": "CONTENTS['first']",
93
+ "contents": ""
94
+ },
95
+
96
+ "third":{
97
+ "description":"Contains a simple message. Unlock the key found in the second vault.",
98
+ "fill_with": "CONTENTS['congratulations_message']",
99
+ "lock_with": "CONTENTS['vault_three_key']",
100
+ "unlock_with": "CONTENTS['second']",
101
+ "contents": ""
102
+ },
103
+
104
+ "sender_btc_signing_key":{
105
+ "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.",
106
+ "fill_with": "EXTERNAL_DATA",
107
+ "lock_with": "CONTENTS['sender_concealed_destination_wallet_address']",
108
+ "unlock_with": "CONTENTS['receiver_revealed_destination_wallet_address']",
109
+ "contents": ""
110
+ },
111
+
112
+ "sender_origin_wallet_address":{
113
+ "description":"SENDER origin wallet address. Chosen by SENDER and known in advance to RECEIVER.",
114
+ "fill_with": "EXTERNAL_DATA",
115
+ "lock_with": "UNLOCKED",
116
+ "unlock_with": "UNLOCKED",
117
+ "contents": ""
118
+ },
119
+
120
+ "sender_concealed_destination_wallet_address":{
121
+ "description":"SENDER concealed copy of the destination wallet address. This wallet address is kept secret until SENDER chosed to transfer BTC to it",
122
+ "fill_with": "EXTERNAL_DATA",
123
+ "lock_with": "CONTENTS['sender_secret']",
124
+ "unlock_with": "CONTENTS['sender_secret']",
125
+ "contents": ""
126
+ },
127
+
128
+ "receiver_revealed_destination_wallet_address":{
129
+ "description":"RECEIVER monitors the Block Chain and fills this vault with the newly revealied destination address.",
130
+ "fill_with": "EXTERNAL_DATA",
131
+ "lock_with": "CONTENTS['receiver_secret']",
132
+ "unlock_with": "CONTENTS['receiver_secret']",
133
+ "contents": ""
134
+ },
135
+
136
+ "receiver_secret":{
137
+ "fill_with": "RANDOM_NUMBER",
138
+ "lock_with": "MASTER_PASSPHRASE",
139
+ "unlock_with": "MASTER_PASSPHRASE",
140
+ "contents": ""
141
+ },
142
+
143
+ "sender_secret":{
144
+ "description":"Contract specific password for SENDER. Used to Lock the SENDER private information.",
145
+ "fill_with": "RANDOM_NUMBER",
146
+ "lock_with": "MASTER_PASSPHRASE",
147
+ "unlock_with": "MASTER_PASSPHRASE",
148
+ "contents": ""
149
+ },
150
+
151
+
152
+ "message":{
153
+ "description":"Vault with a simple message.",
154
+ "fill_with": "EXTERNAL_DATA",
155
+ "lock_with": "MASTER_PASSPHRASE",
156
+ "unlock_with": "MASTER_PASSPHRASE",
157
+ "contents": ""
158
+ },
159
+
160
+ "random_vault_key":{
161
+ "description":"Random Number",
162
+ "fill_with": "RANDOM_NUMBER",
163
+ "lock_with": "MASTER_PASSPHRASE",
164
+ "unlock_with": "MASTER_PASSPHRASE",
165
+ "contents": ""
166
+ },
167
+
168
+ "message_locked_with_random":{
169
+ "description":"A simple message locked with a random number",
170
+ "fill_with": "EXTERNAL_DATA",
171
+ "lock_with": "CONTENTS['random_vault_key']",
172
+ "unlock_with": "CONTENTS['random_vault_key']",
173
+ "contents": ""
174
+ },
175
+
176
+ "message_locked_with_unlocked_random_number":{
177
+ "fill_with": "CONTENTS['message_locked_with_random']",
178
+ "lock_with": "CONTENTS['unlocked_random_key']",
179
+ "unlock_with": "CONTENTS['unlocked_random_key']",
180
+ "contents": ""
181
+ },
182
+
183
+ "unlocked_random_key":{
184
+ "description":"An unlocked random key",
185
+ "fill_with": "CONTENTS['random_vault_key']",
186
+ "lock_with": "UNLOCKED",
187
+ "unlock_with": "UNLOCKED",
188
+ "contents": ""
189
+ },
190
+
191
+ "another_decryption_key":{
192
+ "fill_with": "DECRYPTION_KEY",
193
+ "lock_with": "MASTER_PASSPHRASE",
194
+ "unlock_with": "MASTER_PASSPHRASE",
195
+ "contents": ""
196
+ },
197
+
198
+ "another_public_key":{
199
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['another_decryption_key']",
200
+ "lock_with": "UNLOCKED",
201
+ "unlock_with": "UNLOCKED",
202
+ "contents": ""
203
+ },
204
+
205
+ "my_decryption_key":{
206
+ "fill_with": "DECRYPTION_KEY",
207
+ "lock_with": "MASTER_PASSPHRASE",
208
+ "unlock_with": "MASTER_PASSPHRASE",
209
+ "contents": ""
210
+ },
211
+
212
+ "my_public_key":{
213
+ "fill_with": "PUBLIC_ENCRYPTION_KEY['my_decryption_key']",
214
+ "lock_with": "UNLOCKED",
215
+ "unlock_with": "UNLOCKED",
216
+ "contents": ""
217
+ },
218
+
219
+ "asymmetric_message":{
220
+ "fill_with": "EXTERNAL_DATA",
221
+ "lock_with": "SHARED_KEY['another_public_key','my_decryption_key']",
222
+ "unlock_with": "SHARED_KEY['my_public_key','another_decryption_key']",
223
+ "contents": ""
224
+ }
225
+
226
+ }
227
+ }