>> I have just PRed a draft version of two BIPs I recently wrote. >> https://github.com/bitcoin/bips/pull/362 > > I suggest running a spellchecker ;) Thanks. Will do. > * why would you not allow encryption on non-pre-approved connections? The encryption should be optional. The proposed authentication scheme does take care of the identity-management and therefor prevent MITM attacks. Without the identity management, you might not detect sending/receiving encrypted data from/to a MITM. > * we just removed (ssl) encryption from the JSON interface, how do you suggest > this encryption to be implemented without openSSL? The proposed encryption schema is based on ECDSA/ECDH (implemented in libsecp256k1) and AES256CBC (implementation is on the way see https://github.com/bitcoin/bitcoin/pull/7689). OpenSSL is not required. > * What is the reason for using the p2p code to connect a wallet to a node? > I suggest using one of the other connection methods to connect to the node. > This avoids a change in the bitcoin protocol for a very specific usecase. Most known use-case: SPV. > * Why do you want to do a per-message encryption (wrapping the original)? > Smaller messages that contain predictable content and are able to be matched > to the unencrypted versions on the wire send to other nodes will open this > scheme up to various old statistical attacks. It's probably extremely inefficient to create a constant time stream. Even most SSL/SSH application leak information because of the communication message characteristics. The current wrapping message proposal is not very efficient. I will change it so that the p2p message header will contain the encryption metadata. This should lead to a tiny overhead. > >> Responding peers must ignore (banning would lead to fingerprinting) the > requesting peer after 5 unsuccessfully authentication tries to avoid resource > attacks. > > Any implementation of that kind would itself again be open to resource > attacks. > Why 5? Do you want to allow a node to make a typo? Good point. Maybe one false try should lead to ignoring the peer. > > >> To ensure that no message was dropped or blocked, the complete communication > must be hashed (sha256). Both peers keep the SHA256 context of the encryption > session. The complete enc message (leaving out the hash itself) > must be added to the hash-context by both parties. Before sending a > enc command, the sha256 context will be copied and finalized. > > You write "the complete communication must be hashed" and every message has a > hash of the state until it is at that point. > I think you need to explain how that works specifically. This is a relative simple concept and does not require rehashing the whole communication. You just append the "new data". Some pseudocode: SHA256CTX ctx; // first com SHA256CTX_Update(ctx, 1stmessage); // copy context SHA256CTX ctxnew = ctx; // finalize the copied context sha256hash = SHA256CTX_Finalize(ctxnew); //use as checksum hash //////// next message SHA256CTX_Update(ctx, 2ndmessage); // copy context SHA256CTX ctxnew = ctx; // finalize the copied context sha256hash = SHA256CTX_Finalize(ctxnew); //use as checksum hash ... etc.