2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								<pre>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								  BIP:     XXX
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								  Title:   Out of Band Address Exchange using Encrypted PaymentRequests
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								  Authors: Matt David <matt@netki.com>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								           Justin Newton <justin@netki.com>
							 
						 
					
						
							
								
									
										
										
										
											2015-12-07 09:42:25 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								           Aaron Voisine <voisine@gmail.com>
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								  Status:  Draft
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								  Type:    Informational
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								  Created: 2015-11-20
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								</pre>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								==Abstract==
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								This BIP is an extension to BIP70 that extends the payment protocol to prevent PaymentRequet interception / modification 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								during transmission using ephemeral key encryption. This also allows permissioned release of a PaymentRequest to a requestor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								and allows a requestor to supply a certificate and signature to the PaymentRequest creator.
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								"OPTIONAL" in this document are to be interpreted as described in RFC 2119.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								==Motivation==
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								The motiviation for defining this extension to the BIP-70 Payment Protocol is to allow 2 parties to exchange payment 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								information in a permissioned and encrypted way such that wallet address communication can become a more automated process.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								Additionally, this extension allows for the requestor of a PaymentRequest to supply a certificate and signature in order
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								to facilitate identification for address release.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								==Definitions==
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:30:04 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								{| class="wikitable"
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| Sender    || Entity wishing to transfer value that they control
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| Receiver  || Entity receiving a value transfer
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								|}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 13:26:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								==Acronyms==
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:30:04 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								{| class="wikitable"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								! Acronym !! Expanded !! Description
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| IR || InvoiceRequest || A request to create and return an encrypted PaymentRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| RPR || ReturnPaymentRequest  || A message returned based on a submitted InvoiceRequest containing an encrypted PaymentRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								|}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 13:26:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								==New Messages==
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 13:26:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								===InvoiceRequest===
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								The InvoiceRequest message allows a Sender to send information to the Receiver such that they can create and return a ReturnPaymentRequest.
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								<pre>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								message InvoiceRequest {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        required bytes  sender_public_key = 1;              // Sender's EC Public Key
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        optional uint64 amount = 2 [default = 0];           // amount is integer-number-of-satoshis
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        optional string pki_type = 3 [default = "none"];    // none / x509+sha256
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        optional bytes  pki_data = 4;                       // Depends on pki_type
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        optional string notification_url = 5;               // URL to notify on ReturnPaymentRequest ready
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        optional bytes  signature = 6;                      // PKI-dependent signature
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								</pre>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:30:04 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								{| class="wikitable"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								! Field Name !! Description
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:32:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								| sender_public_key     || Sender's EC Public Key
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								| amount                || amount is integer-number-of-satoshis (default: 0)
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								| pki_type              || none / x509+sha256 (default: "none")
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								| pki_data              || Depends on pki_type
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 13:26:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| notification_url      || Secure (usually HTTPS) location where a ReturnPaymentRequest (see below) may be sent when ready
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								| signature             || PKI-dependent signature
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								|}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 13:26:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								===ReturnPaymentRequest===
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								The ReturnPaymentRequest message is an encapsulating message that allows the transmission of an encrypted, serialized PaymentRequest.
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								<pre>
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								message ReturnPaymentRequest {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        required bytes encrypted_payment_request = 1;      // Encrypted, Serialized PaymentRequest
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        required bytes receiver_public_key = 2;            // Receiver's EC Public Key
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        required bytes ephemeral_public_key = 3;           // Public Key of keypair created with ECDH-derived secret point
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								        required bytes payment_request_hash = 4;           // SHA256 of Serialized PaymentRequest
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								</pre>
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:30:04 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								{| class="wikitable"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								! Field Name</b> !! Description
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| encrypted_payment_request || AES-256-CBC Encrypted Serialized PaymentRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| receiver_public_key       || Receiver's EC Public Key
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| ephemeral_public_key      || Ephemeral EC Public Key
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:31:09 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								|-
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								| payment_request_hash      || SHA256 Hash of Non-Encrypted, Serialized PaymentRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								|}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								==InvoiceRequest / ReturnPaymentRequest Process==
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								===Overview===
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:33:06 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								# Sender creates InvoiceRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								# Sender transmits InvoiceRequest to Receiver
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:33:06 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								# Receiver validates InvoiceRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								# Receiver creates PaymentRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:33:06 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								# Receiver encrypts the PaymentRequest
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								# Receiver creates ReturnPaymentRequest (containing an encrypted PaymentRequest)
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								# Receiver transmits ReturnPaymentRequest to Sender
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								# Sender validates ReturnPaymentRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:33:06 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								# Sender decrypts and validates encrypted PaymentRequest
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								This overview flow is illustrated below:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								<img src=bip-ir/overview_flow.png></img>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 13:26:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								===Message Interaction Details===
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								====InvoiceRequest====
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								Sender must transmit InvoiceRequest to Receiver (or Receiver's agent) via TLS-protected HTTP. Sender transmitting InvoiceRequest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								messages must set appropriate Content-Type headers as specified here:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								<pre>Content-Type: application/bitcoin-invoicerequest</pre>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								====ReturnPaymentRequest====
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								Receiver must transmit ReturnPaymentRequest to Sender (or Sender's agent) via TLS-protected HTTP. Receiver transmitting
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								ReturnPaymentRequest messages must set appropritate Content-Type headers as specified here:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								<pre>Content-Type: application/bitcoin-returnpaymentrequest</pre>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								====Message or Communication Errors====
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								An invalid or unparsable message or communications error must be communicated to the party that initiated the communication. This
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								should be done through standard HTTP Status Code messaging ([https://tools.ietf.org/html/rfc7231 RFC 7231 Section 6]).
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								===InvoiceRequest Message Creation===
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Create an InvoiceRequest message
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 13:26:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								* sender_public_key MUST be set to the public key of an EC keypair.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Amount is optional
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Set notification_url to URL that the Receiver will submit completed ReturnPaymentRequest to
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* If NOT including certificate, set pki_type to "none"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* If including certificate:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								** Set pki_type to "x509+sha256"
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:40:43 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								** Set pki_data as it would be set in BIP-0070 (see [https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki#Certificates Certificates]) section)
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								** Sign InvoiceRequest with signature == "" using the X509 Certificate's private key
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								===InvoiceRequest Validation===
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Validate sender_public_key is a valid EC public key
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Validate notification_url if set, contains characters deemed valid for a URL (avoiding XSS related characters, etc).
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* If pki_type is None, InvoiceRequest is VALID
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* If pki_type is x509+sha256 and signature is valid for the serialized InvoiceRequest where signature is set to "", InvoiceRequest is VALID
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								===ReturnPaymentRequest Message Creation and PaymentRequest Encryption===
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								* Encrypt the serialized PaymentRequest using AES-256-CBC setup as described in <b>ECDH Point Generation and AES-256 (CBC Mode) Setup (see below)</b>
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Create ReturnPaymentRequest message
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Set encrypted_payment_request to be the encrypted value of the PaymentRequest
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Set receiver_public_key to the Receiver's EC public key (of which the private key was previously used in ECDH secret point calculation)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Set ephemeral_public_key to the public key of an EC keypair created using the secret point's X value.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Set payment_request_hash to generated SHA256 hash of the serialized PaymentRequest (without encryption)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								===ReturnPaymentRequest Validation and Decryption===
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Validate ephemeral_public_key matches public key of an EC keypair created using the secret point's X value.
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 15:16:32 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								* Decrypt the serialized PaymentRequest using AES-256-CBC setup as described in <b>ECDH Point Generation and AES-256 (CBC Mode) Setup (see below)</b>
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Validate payment_request_hash matches SHA256 of the decrypted, serialized PaymentRequest
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Deserialize the serialized PaymentRequest
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-04 11:10:01 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								===ECDH Point Generation and AES-256 (CBC Mode) Setup===
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
										 
							
							
								* Generate the '''secret point''' using [https://en.wikipedia.org/wiki/Elliptic_curve_Diffie– 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Initialize [http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf HMAC_DRBG] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								** Use '''secret point's''' X value for Entropy
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								** Use Sender's public key for Nonce
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* Initialize AES-256 in CBC Mode
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								** Use HMAC_DRBG.GENERATE(32) as the Encryption Key (256 bits)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								** Use HMAC_DRBG.GENERATE(16) as the Initialization Vector (IV) (128 bits)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-12-03 17:24:29 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								==Reference==
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* [[bip-0070.mediawiki|BIP70 - Payment Protocol]]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
										 
							
							
								* [https://en.wikipedia.org/wiki/Elliptic_curve_Diffie– 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
								
									
								 
							
							
								* [http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf HMAC_DRBG]
							 
						 
					
						
							
								
									
										
										
										
											2015-12-07 09:42:25 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
								
									
								 
							
							
								* [https://tools.ietf.org/html/rfc6979 RFC6979]