A decentralized Public Key Infrastructure that supports privacy-friendly social verification
Bogdan Kulynych Marios Isaakidis
Modern key distribution with ClaimChains
N E X T L E A P
Carmela Troncoso George Danezis
photo by lisa cee
Modern key distribution with ClaimChains A decentralized Public Key - - PowerPoint PPT Presentation
Modern key distribution with ClaimChains A decentralized Public Key Infrastructure that supports privacy-friendly social verification Bogdan Kulynych Marios Isaakidis N E X T L E A P Carmela Troncoso George Danezis photo by lisa cee
A decentralized Public Key Infrastructure that supports privacy-friendly social verification
Bogdan Kulynych Marios Isaakidis
N E X T L E A P
Carmela Troncoso George Danezis
photo by lisa cee
HIGH-INTEGRITY Tamper proof Authenticity
HIGH-INTEGRITY Tamper proof Authenticity DECENTRALIZATION Availability Censorship-resistant Global consensus
Cryptocurrency chains
Powerful abstraction for identities Global namespace No mechanism for social validation All transactions are public Users need to buy coins and pay for transaction fees Resource expensive HEAD BLOCK HEADER
. . . TRANSACTIONS
. . .
Federated “Merkle prefix tree” chains
Accountability Easy discovery Efficient Do not prevent equivocation Centralization
–
Single point of failure
–
Surveillance keybase.io CONIKS CONIKS
ROOT i = 001… v = valueX H(child0, child1) 1 1 1 1 1 1 1 Leaf nodes are ordered using a Verifiable Random Function i = 000… v = valueY
photo by Wendi Halet
claim – all readers get the same content
claim – all readers get the same content
cross-hash
readers get the same content
… while preserving privacy
cross-hash
generic claims
linked ClaimChains
evidence (“ClaimChain forks”)
Block index Timestamp Nonce ClaimChain version BLOCK MAP Merkle prefix tree with all claims and capabilities CLAIMCHAIN METADATA
Pointers to previous blocks Signature under pkSIG
ROOT
label = bob@riseup.net claim = 0515b693e5
ROOT
label = bob@riseup.net claim = 0515b693e5
1) Compute claim key k = VRF ( || nonce)
ROOT
label = bob@riseup.net claim = 0515b693e5
1) Compute claim key k = VRF ( || nonce) 2) Calculate the index of the leaf node: i = SHA256( k || “lookup” )
ROOT
label = bob@riseup.net claim = 0515b693e5
1) Compute claim key k = VRF ( || nonce) 2) Calculate the index of the leaf node: i = SHA256( k || “lookup” ) 3) Generate a symm. enc. key K = SHA256( k || “enc” )
ROOT
label = bob@riseup.net claim = 0515b693e5
1) Compute claim key k = VRF ( || nonce) 2) Calculate the index of the leaf node: i = SHA256( k || “lookup” ) 3) Generate a symm. enc. key K = SHA256( k || “enc” ) 4) Encrypt claim content C = EncK( VRFproof + “0515b693e5” )
ROOT
label = bob@riseup.net claim = 0515b693e5
1) Compute claim key k = VRF ( || nonce) 2) Calculate the index of the leaf node: i = SHA256( k || “lookup” ) 3) Generate a symm. enc. key K = SHA256( k || “enc” ) 4) Encrypt claim content C = EncK( VRFproof + “0515b693e5” ) i = 0110... v = C
ROOT
i = 0110... v = C
ROOT
i = 0110... v = C 1) Establish DH shared secret s between and
ROOT
i = 0110... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” )
ROOT
i = 0110... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” ) 3) Derive the symm. enc. key K = SHA256( nonce || s || “enc” )
ROOT
i = 0110... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” ) 3) Derive the symm. enc. key K = SHA256( nonce || s || “enc” ) 4) Encrypt claim key VRF ( || nonce) C = EncK( k )
ROOT
i = 0110... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” ) 3) Derive the symm. enc. key K = SHA256( nonce || s || “enc” ) 4) Encrypt claim key VRF ( || nonce) C = EncK( k ) i = 1010... v = C
ROOT i = 0110... v = C i = 1010... v = C
ROOT i = 0110... v = C i = 1010... v = C 1) Establish DH shared secret s between and
ROOT i = 0110... v = C i = 1010... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” )
ROOT i = 0110... v = C i = 1010... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” ) 3) Derive the symm. enc. key K = SHA256( nonce || s || “enc” )
ROOT i = 0110... v = C i = 1010... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” ) 3) Derive the symm. enc. key K = SHA256( nonce || s || “enc” ) 4) Retrieve capability block and decrypt it with K Result: key for ‘s claim i = 1010... v = C
ROOT i = 0110... v = C i = 1010... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” ) 3) Derive the symm. enc. key K = SHA256( nonce || s || “enc” ) 4) Retrieve capability block and decrypt it with K Result: key for ‘s claim 5) Retrieve ‘s claim and decrypt it i = 1010... v = C i = 0110... v = C
ROOT i = 0110... v = C i = 1010... v = C 1) Establish DH shared secret s between and 2) Derive the capability lookup key i = SHA256 ( nonce || s || “lookup” ) 3) Derive the symm. enc. key K = SHA256( nonce || s || “enc” ) 4) Retrieve capability block and decrypt it with K Result: key for ‘s claim 5) Retrieve ‘s claim and decrypt it 6) Verify VRFproof i = 1010... v = C i = 0110... v = C
– Cryptographic games to define security and privacy properties – Formally verified implementation
@misaakidis
photo by alcidecota
Claim map construction time Cumulative block storage size
Key propagation in a fully decentralized setting
Outgoing bandwidth cost Email encryption status (%)
ROOT 1 1 1 1 1 1 1
ROOT 1 1 1 1 1 1 1 (alice@riseup.net, 0x1A2B3C) VRFpkVRF(alice@riseup.net) = 01011...
ROOT 1 1 1 1 1 1 1 (alice@riseup.net, 0x1A2B3C) VRFpkVRF(alice@riseup.net) = 01011...
ROOT 1 1 1 1 1 1 1 (alice@riseup.net, 0x1A2B3C) VRFpkVRF(alice@riseup.net) = 01011... ROOT i = 01011… v =0x1A2B
ROOT 1 1 1 1 1 1 1 (alice@riseup.net, 0x1A2B3C) VRFpkVRF(alice@riseup.net) = 01011... ROOT i = 01011… v =0x1A2B i = 01011… v =0x1A2B
ROOT 1 1 1 1 1 1 1
ROOT 1 1 1 1 1 1 1 VRFpkVRF(bob@riseup.net) = 11001...
ROOT 1 1 1 1 1 1 1 VRFpkVRF(bob@riseup.net) = 11001...
ROOT 1 1 1 1 1 1 1 VRFpkVRF(bob@riseup.net) = 11001... ROOT i = 11011… v =0xFFFF
ROOT 1 1 1 1 1 1 1 VRFpkVRF(bob@riseup.net) = 11001... ROOT i = 11011… v =0xFFFF
ROOT 1 1 1 1 1 1 1 VRFpkVRF(bob@riseup.net) = 11001... ROOT i = 11011… v =0xFFFF i = 11011… v =0xFFFF