vault-tree 0.1.0 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -3
- data/CHANGE_LOG.md +15 -0
- data/Gemfile.lock +15 -5
- data/README.md +12 -15
- data/Rakefile +19 -4
- data/features/.nav +11 -0
- data/features/contracts/asymmetric_vault.feature +23 -0
- data/features/contracts/block_chain_key_transfer.feature +34 -0
- data/features/contracts/one_two_three.feature +22 -0
- data/features/contracts/readme.md +111 -0
- data/features/contracts_and_vaults.md +134 -0
- data/features/contributing_to_vault_tree.md +42 -0
- data/features/decision_tree.md +16 -0
- data/features/enforcement_problem.md +20 -0
- data/features/exceptions.feature +56 -5
- data/features/install_and_usage.md +57 -0
- data/features/keywords/assembled_shamir_key.feature +57 -0
- data/features/keywords/contents.feature +24 -0
- data/features/keywords/decryption_key.feature +10 -0
- data/features/keywords/dh_key.feature +56 -0
- data/features/keywords/external_data.feature +11 -0
- data/features/keywords/generated_shamir_key.feature +55 -0
- data/features/keywords/key.feature +38 -0
- data/features/keywords/master_passphrase.feature +68 -0
- data/features/keywords/public_encryption_key.feature +14 -0
- data/features/keywords/random_number.feature +44 -0
- data/features/keywords/readme.md +3 -0
- data/features/keywords/split_key.feature +54 -0
- data/features/keywords/unlocked.feature +51 -0
- data/features/manipulating_contracts.md +84 -0
- data/features/readme.md +6 -0
- data/features/steps/asymmetric_vault.steps.rb +41 -0
- data/features/steps/block_chain_key_transfer.steps.rb +43 -0
- data/features/steps/core.steps.rb +57 -104
- data/features/steps/exceptions.steps.rb +45 -1
- data/features/steps/one_two_three.steps.rb +57 -0
- data/features/steps/secret_sharing.steps.rb +36 -0
- data/features/support/contract_fixtures/asymmetric_vault.0.1.0.json +69 -0
- data/{spec/support/fixtures → features/support/contract_fixtures}/blank_simple_test_contract.json +0 -0
- data/features/support/contract_fixtures/block_chain_key_transfer.0.1.0.json +59 -0
- data/{spec/support/fixtures → features/support/contract_fixtures}/broken_contract.json +0 -0
- data/features/support/contract_fixtures/one_two_three.0.7.0.json +108 -0
- data/{spec/support/fixtures → features/support/contract_fixtures}/simple_test_contract.json +0 -0
- data/features/support/contract_fixtures/template.json +33 -0
- data/features/what_is_vault_tree.md +18 -0
- data/lib/vault-tree.rb +23 -6
- data/lib/vault-tree/contract/close_validator.rb +0 -7
- data/lib/vault-tree/contract/contract.rb +13 -2
- data/lib/vault-tree/contract/doorman.rb +22 -21
- data/lib/vault-tree/contract/vault.rb +18 -2
- data/lib/vault-tree/exceptions/exception_template.erb +0 -0
- data/lib/vault-tree/exceptions/failed_unlock_attempt.rb +6 -0
- data/lib/vault-tree/exceptions/vault_tree_exception.rb +18 -0
- data/lib/vault-tree/keywords/assembled_shamir_key.rb +44 -0
- data/lib/vault-tree/keywords/{vault_contents.rb → contents.rb} +0 -0
- data/lib/vault-tree/keywords/decryption_key.rb +1 -6
- data/lib/vault-tree/keywords/{shared_key.rb → dh_key.rb} +2 -2
- data/lib/vault-tree/keywords/external_data.rb +19 -0
- data/lib/vault-tree/keywords/generated_shamir_key.rb +57 -0
- data/lib/vault-tree/keywords/key.rb +13 -0
- data/lib/vault-tree/keywords/keyword_interpreter.rb +6 -6
- data/lib/vault-tree/keywords/public_encryption_key.rb +1 -5
- data/lib/vault-tree/keywords/random_number.rb +1 -1
- data/lib/vault-tree/keywords/split_key.rb +19 -0
- data/lib/vault-tree/keywords/unlocked.rb +1 -1
- data/lib/vault-tree/lock_smith.rb +182 -0
- data/lib/vault-tree/lock_smith/assembled_shamir_key.rb +64 -0
- data/lib/vault-tree/lock_smith/dh_key_pair.rb +10 -0
- data/lib/vault-tree/lock_smith/generated_shamir_key.rb +65 -0
- data/lib/vault-tree/lock_smith/split_key.rb +23 -0
- data/lib/vault-tree/{config/path_helpers.rb → path_helpers.rb} +26 -2
- data/lib/vault-tree/util/json.rb +1 -0
- data/lib/vault-tree/{config → util}/string.rb +1 -5
- data/lib/vault-tree/version.rb +1 -1
- data/spec/assembled_shamir_key_spec.rb +79 -0
- data/spec/generated_shamir_key_spec.rb +52 -0
- data/spec/lock_smith_spec.rb +90 -0
- data/spec/secret_sharing_spec.rb +43 -0
- data/support/scripts/libsodium_ubuntu.sh +1 -1
- data/vault-tree.gemspec +3 -2
- metadata +123 -41
- data/features/core.feature +0 -44
- data/lib/vault-tree/config/dependencies.rb +0 -4
- data/lib/vault-tree/config/lib.rb +0 -2
- data/lib/vault-tree/lock_smith/asymmetric_cipher.rb +0 -31
- data/lib/vault-tree/lock_smith/crypto_hash.rb +0 -11
- data/lib/vault-tree/lock_smith/digital_signature.rb +0 -32
- data/lib/vault-tree/lock_smith/encryption_key_pair.rb +0 -25
- data/lib/vault-tree/lock_smith/random_number.rb +0 -11
- data/lib/vault-tree/lock_smith/shared_key_pair.rb +0 -12
- data/lib/vault-tree/lock_smith/signing_key_pair.rb +0 -25
- data/lib/vault-tree/lock_smith/symmetric_cipher.rb +0 -25
- data/spec/app/locksmith/asymmetric_cipher_spec.rb +0 -25
- data/spec/app/locksmith/signing_key_pair_spec.rb +0 -22
- data/spec/spec_helper.rb +0 -5
- data/spec/support/fixtures/one_two_three-0.5.0.EXP.json +0 -105
- data/spec/support/fixtures/reference_contract.1.0.0.json +0 -227
data/features/core.feature
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
Feature: Core Functionality
|
2
|
-
|
3
|
-
Scenario: Close And Open With Master Password
|
4
|
-
Given I have a blank reference contract
|
5
|
-
When I lock a message in a vault with my Master Password
|
6
|
-
Then I can recover the message with my Master Password
|
7
|
-
|
8
|
-
Scenario: Close And Open With Random Key
|
9
|
-
Given I have a blank reference contract
|
10
|
-
When I lock away a random vault key
|
11
|
-
And I use the random key to lock a message
|
12
|
-
Then I can recover the message with the Random Key
|
13
|
-
|
14
|
-
Scenario: Transfer Key Via Unlocked Vault
|
15
|
-
Given I have a blank reference contract
|
16
|
-
When I lock away a random vault key
|
17
|
-
And I use the random key to lock a message
|
18
|
-
And I put this random key in an unlocked vault
|
19
|
-
Then another user can recover the message with the Unlocked Random Key
|
20
|
-
|
21
|
-
Scenario: Asymmetric Vault
|
22
|
-
Given I have a blank reference contract
|
23
|
-
And I have access to the another user's unlocked public key
|
24
|
-
And I lock a simple message with a shared key
|
25
|
-
When I transfer the contract to the other user
|
26
|
-
Then they can create a shared key and unlock the message
|
27
|
-
|
28
|
-
Scenario: Example - Alice and Bob Execute a One Two Three Contract
|
29
|
-
Given Alice has the blank contract
|
30
|
-
When she locks all of her attributes
|
31
|
-
And she sends the contract to Bob
|
32
|
-
Then Bob can access her public attributes
|
33
|
-
When Bob locks his attributes
|
34
|
-
And He fills and locks each of the three vaults
|
35
|
-
Then Alice can execute the contract to recover the final message
|
36
|
-
|
37
|
-
Scenario: Example - A Simple Block Chain Key Transfer
|
38
|
-
Given the SENDER has the blank BTC Key Transfer template
|
39
|
-
And the SENDER chooses an origin wallet address and concealed destination address
|
40
|
-
And he locks away the secret BTC signing key
|
41
|
-
When the SENDER transfers the Vault-Tree contract to the RECEIVER
|
42
|
-
Then the RECEIVER can access the origin wallet address
|
43
|
-
When the SENDER reveals the hidden wallet address by Blockchain payment from the origin address
|
44
|
-
Then the RECEIVER can unlock the vault to recover the transfered signing key
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module VaultTree
|
2
|
-
module LockSmith
|
3
|
-
class AsymmetricCipher
|
4
|
-
|
5
|
-
def encrypt(opts)
|
6
|
-
crypto_box(opts[:public_key],opts[:secret_key]).box(opts[:plain_text], :base64)
|
7
|
-
end
|
8
|
-
|
9
|
-
def decrypt(opts)
|
10
|
-
crypto_box(opts[:public_key],opts[:secret_key]).open(opts[:cipher_text], :base64)
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def crypto_box(public_key,private_key)
|
16
|
-
pub = public_key_object(public_key)
|
17
|
-
pri = private_key_object(private_key)
|
18
|
-
box = Crypto::Box.new(pub,pri, :base64)
|
19
|
-
Crypto::RandomNonceBox.new(box)
|
20
|
-
end
|
21
|
-
|
22
|
-
def private_key_object(pri_key)
|
23
|
-
Crypto::PrivateKey.new(pri_key,:base64)
|
24
|
-
end
|
25
|
-
|
26
|
-
def public_key_object(pub_key)
|
27
|
-
Crypto::PublicKey.new(pub_key,:base64)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,32 +0,0 @@
|
|
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
|
@@ -1,25 +0,0 @@
|
|
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
|
@@ -1,25 +0,0 @@
|
|
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
|
@@ -1,25 +0,0 @@
|
|
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
|
@@ -1,25 +0,0 @@
|
|
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
|
@@ -1,22 +0,0 @@
|
|
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
|
data/spec/spec_helper.rb
DELETED
@@ -1,105 +0,0 @@
|
|
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
|
-
}
|
@@ -1,227 +0,0 @@
|
|
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
|
-
}
|