document client-to-client protocol
This commit is contained in:
		
							parent
							
								
									9314c6918f
								
							
						
					
					
						commit
						187e14862d
					
				
							
								
								
									
										33
									
								
								docs/client-protocol.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								docs/client-protocol.md
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| # Client-to-Client Protocol | ||||
| 
 | ||||
| Wormhole clients do not talk directly to each other (at least at first): they | ||||
| only connect directly to the Rendezvous Server. They ask this server to | ||||
| convey messages to the other client (via the `add` command and the `message` | ||||
| response). This document explains the format of these client-to-client | ||||
| messages. | ||||
| 
 | ||||
| Each such message contains a "phase" string, and a hex-encoded binary "body". | ||||
| 
 | ||||
| Any phase which is purely numeric (`^\d+$`) is reserved for application data, | ||||
| and will be delivered in numeric order. All other phases are reserved for the | ||||
| Wormhole client itself. Clients will ignore any phase they do not recognize. | ||||
| 
 | ||||
| Immediately upon opening the mailbox, clients send the `pake` phase, which | ||||
| contains the binary SPAKE2 message (the one computed as `X+M*pw` or | ||||
| `Y+N*pw`). | ||||
| 
 | ||||
| Upon receiving their peer's `pake` phase, clients compute and remember the | ||||
| shared key. Then they send the encrypted `version` phase, whose plaintext | ||||
| payload is a UTF-8-encoded 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. | ||||
| 
 | ||||
| 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 | ||||
| phase+side -specific key (computed with HKDF-SHA256, using the shared PAKE | ||||
| key as the secret input, and `wormhole:phase:%s%s % (SHA256(side), | ||||
| SHA256(phase))` as the CTXinfo), with a random nonce. | ||||
| 
 | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user