Overall the code looks good and works well in my tests. A few remarks (but ACK otherwise):
> AC_ARG_ENABLE( > [aead-modes], > [AS_HELP_STRING([--disable-aead-modes], [disable AEAD crypto modes > @<:@default=yes@:>@])], > , > [enable_aead_modes="yes"] > ) I would not make this user configurable. If it wasn't for RHEL5 I even would throw out 0.9.8 support and always compile it in. { + /* Get the key we will use to encrypt the packet. */ tls_pre_encrypt (c->c2.tls_multi, &c->c2.buf, &co); + /* If using P_DATA_V2, prepend the 1-byte opcode and 3-byte peer-id to the + * packet before openvpn_encrypt(), so we can authenticate the opcode too. + */ + if (c->c2.buf.len > 0 && !c->c2.tls_multi->opt.server && c->c2.tls_multi->use_peer_id) The latter part of that if might be turned into a small inline fuction to make it clearer. Or alternatively a local boolean variable to be used in both if places. > /* Prepare IV */ > { > struct buffer iv_buffer; > struct packet_id_net pin; > const int iv_len = cipher_ctx_iv_length (ctx->cipher); > > ASSERT (iv_len >= 12 && iv_len <= OPENVPN_MAX_IV_LENGTH); A comment about the 12 would be nice here. (=> 96 bits ....) > /* set_tag() call required for older OpenSSL versions only */ What does older mean in this context? Add an idef or atleast specify the version in the file. > const int ad_size = BPTR (buf) - ad_start - tag_size; ad_size can be 0. Did you check what hte PolarSSL/OpenSSL function do on a 0 byte call? Also add for the manpage: diff --git a/doc/openvpn.8 b/doc/openvpn.8 index 6b97fc9..30faff3 100644 --- a/doc/openvpn.8 +++ b/doc/openvpn.8 @@ -3991,6 +3991,10 @@ Set .B alg=none to disable authentication. +If a AEAD +.B \-\-cipher +is selected like AES-128-GCM is used the authentication of that cipher is used for the data channel packets. + For more information on HMAC see .I http://www.cs.ucsd.edu/users/mihir/papers/hmac.html .\"********************************************************* Arne