client-protocol docs: improve
This commit is contained in:
		
							parent
							
								
									dd6e139c19
								
							
						
					
					
						commit
						51a73d6962
					
				| 
						 | 
					@ -17,12 +17,40 @@ contains the binary SPAKE2 message (the one computed as `X+M*pw` or
 | 
				
			||||||
`Y+N*pw`).
 | 
					`Y+N*pw`).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Upon receiving their peer's `pake` phase, clients compute and remember the
 | 
					Upon receiving their peer's `pake` phase, clients compute and remember the
 | 
				
			||||||
shared key. Then they send the encrypted `version` phase, whose plaintext
 | 
					shared key. They derive the "verifier" (a hash of the shared key) and deliver
 | 
				
			||||||
payload is a UTF-8-encoded JSON-encoded dictionary of metadata. This allows
 | 
					it to the application by calling `got_verifier`: applications can display
 | 
				
			||||||
the two Wormhole instances to signal their ability to do other things (like
 | 
					this to users who want additional assurance (by manually comparing the values
 | 
				
			||||||
"dilate" the wormhole). The version data will also include an `app_versions`
 | 
					from both sides: they ought to be identical). At this point clients also send
 | 
				
			||||||
key which contains a dictionary of metadata provided by the application,
 | 
					the encrypted `version` phase, whose plaintext payload is a UTF-8-encoded
 | 
				
			||||||
allowing apps to perform similar negotiation.
 | 
					JSON-encoded dictionary of metadata. This allows the two Wormhole instances
 | 
				
			||||||
 | 
					to signal their ability to do other things (like "dilate" the wormhole). The
 | 
				
			||||||
 | 
					version data will also include an `app_versions` key which contains a
 | 
				
			||||||
 | 
					dictionary of metadata provided by the application, allowing apps to perform
 | 
				
			||||||
 | 
					similar negotiation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					At this stage, the client knows the supposed shared key, but has not yet seen
 | 
				
			||||||
 | 
					evidence that the peer knows it too. When the first peer message arrives
 | 
				
			||||||
 | 
					(i.e. the first message with a `.side` that does not equal our own), it will
 | 
				
			||||||
 | 
					be decrypted: if this decryption succeeds, then we're confident that
 | 
				
			||||||
 | 
					*somebody* used the same wormhole code as us. This event pushes the client
 | 
				
			||||||
 | 
					mood from "lonely" to "happy".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This might be triggered by the peer's `version` message, but if we had to
 | 
				
			||||||
 | 
					re-establish the Rendezvous Server connection, we might get peer messages out
 | 
				
			||||||
 | 
					of order and see some application-level message first.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When a `version` message is successfully decrypted, the application is
 | 
				
			||||||
 | 
					signaled with `got_version`. When any application message is successfully
 | 
				
			||||||
 | 
					decrypted, `received` is signaled. Application messages are delivered
 | 
				
			||||||
 | 
					strictly in-order: if we see phases 3 then 2 then 1, all three will be
 | 
				
			||||||
 | 
					delivered in sequence after phase 1 is received.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If any message cannot be successfully decrypted, the mood is set to "scary",
 | 
				
			||||||
 | 
					and the wormhole is closed. All pending Deferreds will be errbacked with some
 | 
				
			||||||
 | 
					kind of WormholeError, the nameplate/mailbox will be released, and the
 | 
				
			||||||
 | 
					WebSocket connection will be dropped. If the application calls `close()`, the
 | 
				
			||||||
 | 
					resulting Deferred will not fire until deallocation has finished and the
 | 
				
			||||||
 | 
					WebSocket is closed, and then it will fire with an errback.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Both `version` and all numeric (app-specific) phases are encrypted. The
 | 
					Both `version` and all numeric (app-specific) phases are encrypted. The
 | 
				
			||||||
message body will be the hex-encoded output of a NACL SecretBox, keyed by a
 | 
					message body will be the hex-encoded output of a NACL SecretBox, keyed by a
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user