vault-tree 0.1.0 → 0.3.3
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.
- 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
|
-
}
|