> -----Original Message-----
> From: David Sommerseth [mailto:openvpn.l...@topphemmelig.net]
> Sent: dinsdag 5 juli 2011 20:11
> 
> More comments in between ... look carefully.
> 
Thanks, I've answered your comments inline too :)

> [...snip...]
> > + * @subsection key_generation_method_2 Key method 2
> > + *
> > + * -# The client generates random material in the following amounts:
> > + *    - Pre-master secret: 48 bytes
> > + *    - Client's PRF seed for master secret: 32 bytes
> > + *    - Client's PRF seed for %key expansion: 32 bytes
> > + * -# The client sends its share of random material to the server.
> > + * -# The server generates random material in the following amounts:
> > + *    - Server's PRF seed for master secret: 32 bytes
> > + *    - Server's PRF seed for %key expansion: 32 bytes
> > + * -# The server computes the %key expansion using its own and the
> > + *    client's random material.
> > + * -# The server sends its share of random material to the client.
> > + * -# The client computes the %key expansion using its own and the
> > + *    server's random material.
> > + *
> > + * %Key method 2 %key expansion is performed by the \c
> > + * generate_key_expansion() function.  Please refer to its source
> code for
> > + * details of the %key expansion process.
> 
> My memory is a bit rusty ... but isn't this part of the standard KEX
> process in SSL/TLS?
> 

Yes, but this one is used for setting up the data channel keys, not the control 
channel keys. I believe it's based on OpenSSL's PRF.

> > +/**
> > + * Insert a plaintext buffer into the TLS module.
> > + *
> > + * After successfully processing the data, the data in \a buf is
> zeroized,
> 
> I believe "zeroed" is a better expression ... found more places.
> 

Hmm, I thought zeroisation was the common term in the crypto world 
(http://en.wikipedia.org/wiki/Zeroisation).

> [...snip...]
> > + * This function cleans up a \c key_state structure.  It frees the
> > + * associated SSL-BIO, and the structures allocated for the \link
> reliable
> > + * Reliability Layer\endlink.
> > + *
> > + * @param ks           - A pointer to the \c key_state structure to
> be
> > + *                       cleaned up.
> > + * @param clear        - Whether the memory allocated for the \a ks
> object
> > + *                       should be overwritten with 0s.
> 
> Wouldn't it be better to say "... ks object should be zeroed" ?
> 

Cleared/zeroised would probably be better still, but I think this still makes 
matters pretty clear. 

> 
> [...snip...]
> > + * @param clear        - Whether the memory allocated for the \a
> session
> > + *                       object should be overwritten with 0s.
> > + */
> >  static void
> >  tls_session_free (struct tls_session *session, bool clear)
> 
> Same comment as above
> 
> > -/*
> > - * OpenVPN Protocol, taken from ssl.h in OpenVPN source code.
> > - *
> > - * TCP/UDP Packet:  This represents the top-level encapsulation.
> > - *
> > - * TCP/UDP packet format:
> > - *
> > - *   Packet length (16 bits, unsigned) -- TCP only, always sent as
> > - *       plaintext.  Since TCP is a stream protocol, the packet
> > - *       length words define the packetization of the stream.
> > - *
> > - *   Packet opcode/key_id (8 bits) -- TLS only, not used in
> > - *       pre-shared secret mode.
> > - *            packet message type, a P_* constant (high 5 bits)
> > - *            key_id (low 3 bits, see key_id in struct tls_session
> > - *              below for comment).  The key_id refers to an
> > - *              already negotiated TLS session.  OpenVPN seamlessly
> > - *              renegotiates the TLS session by using a new key_id
> > - *              for the new session.  Overlap (controlled by
> > - *              user definable parameters) between old and new TLS
> > - *              sessions is allowed, providing a seamless transition
> > - *              during tunnel operation.
> > - *
> > - *   Payload (n bytes), which may be a P_CONTROL, P_ACK, or P_DATA
> > - *       message.
> > - * Message types:
> > - *
> > - *  P_CONTROL_HARD_RESET_CLIENT_V1 -- Key method 1, initial key from
> > - *    client, forget previous state.
> > - *
> > - *  P_CONTROL_HARD_RESET_SERVER_V1 -- Key method 2, initial key
> > - *    from server, forget previous state.
> > - *
> > - *  P_CONTROL_SOFT_RESET_V1 -- New key, with a graceful transition
> > - *    from old to new key in the sense that a transition window
> > - *    exists where both the old or new key_id can be used.  OpenVPN
> > - *    uses two different forms of key_id.  The first form is 64 bits
> > - *    and is used for all P_CONTROL messages.  P_DATA messages on
> the
> > - *    other hand use a shortened key_id of 3 bits for efficiency
> > - *    reasons since the vast majority of OpenVPN packets in an
> > - *    active tunnel will be P_DATA messages.  The 64 bit form
> > - *    is referred to as a session_id, while the 3 bit form is
> > - *    referred to as a key_id.
> > - *
> > - *  P_CONTROL_V1 -- Control channel packet (usually TLS ciphertext).
> > - *
> > - *  P_ACK_V1 -- Acknowledgement for P_CONTROL packets received.
> > - *
> > - *  P_DATA_V1 -- Data channel packet containing actual tunnel data
> > - *    ciphertext.
> > - *
> > - *  P_CONTROL_HARD_RESET_CLIENT_V2 -- Key method 2, initial key from
> > - *   client, forget previous state.
> > - *
> > - *  P_CONTROL_HARD_RESET_SERVER_V2 -- Key method 2, initial key from
> > - *   server, forget previous state.
> > - *
> > - * P_CONTROL* and P_ACK Payload:  The P_CONTROL message type
> > - * indicates a TLS ciphertext packet which has been encapsulated
> > - * inside of a reliability layer.  The reliability layer is
> > - * implemented as a straightforward ACK and retransmit model.
> 
> Is this documented somewhere else?  The same goes for the following
> message
> types.  Seems to be some details here which is missing in the previous
> description of the key methods.
> 
> 
> > - * P_CONTROL message format:
> > - *
> > - *   local session_id (random 64 bit value to identify TLS session).
> > - *   HMAC signature of entire encapsulation header for integrity
> > - *       check if --tls-auth is specified (usually 16 or 20 bytes).
> > - *   packet-id for replay protection (4 or 8 bytes, includes
> > - *       sequence number and optional time_t timestamp).
> > - *   P_ACK packet_id array length (1 byte).
> > - *   P_ACK packet-id array (if length > 0).
> > - *   P_ACK remote session_id (if length > 0).
> > - *   message packet-id (4 bytes).
> > - *   TLS payload ciphertext (n bytes) (only for P_CONTROL).
> > - *
> > - * Once the TLS session has been initialized and authenticated,
> > - * the TLS channel is used to exchange random key material for
> > - * bidirectional cipher and HMAC keys which will be
> > - * used to secure actual tunnel packets.  OpenVPN currently
> > - * implements two key methods.  Key method 1 directly
> > - * derives keys using random bits obtained from the RAND_bytes
> > - * OpenSSL function.  Key method 2 mixes random key material
> > - * from both sides of the connection using the TLS PRF mixing
> > - * function.  Key method 2 is the preferred method and is the
> default
> > - * for OpenVPN 2.0.
> > - *
> > - * TLS plaintext content:
> > - *
> > - * TLS plaintext packet (if key_method == 1):
> > - *
> > - *   Cipher key length in bytes (1 byte).
> > - *   Cipher key (n bytes).
> > - *   HMAC key length in bytes (1 byte).
> > - *   HMAC key (n bytes).
> > - *   Options string (n bytes, null terminated, client/server options
> > - *       string should match).
> > - *
> > - * TLS plaintext packet (if key_method == 2):
> > - *
> > - *   Literal 0 (4 bytes).
> > - *   key_method type (1 byte).
> > - *   key_source structure (pre_master only defined for client ->
> > - *       server).
> > - *   options_string_length, including null (2 bytes).
> > - *   Options string (n bytes, null terminated, client/server options
> > - *       string must match).
> > - *   [The username/password data below is optional, record can end
> > - *       at this point.]
> > - *   username_string_length, including null (2 bytes).
> > - *   Username string (n bytes, null terminated).
> > - *   password_string_length, including null (2 bytes).
> > - *   Password string (n bytes, null terminated).
> > - *
> > - * The P_DATA payload represents encrypted, encapsulated tunnel
> > - * packets which tend to be either IP packets or Ethernet frames.
> > - * This is essentially the "payload" of the VPN.
> > - *
> > - * P_DATA message content:
> > - *   HMAC of ciphertext IV + ciphertext (if not disabled by
> > - *       --auth none).
> > - *   Ciphertext IV (size is cipher-dependent, if not disabled by
> > - *       --no-iv).
> > - *   Tunnel packet ciphertext.
> > - *
> > - * P_DATA plaintext
> > - *   packet_id (4 or 8 bytes, if not disabled by --no-replay).
> > - *       In SSL/TLS mode, 4 bytes are used because the
> implementation
> > - *       can force a TLS renegotation before 2^32 packets are sent.
> > - *       In pre-shared key mode, 8 bytes are used (sequence number
> > - *       and time_t value) to allow long-term key usage without
> > - *       packet_id collisions.
> > - *   User plaintext (n bytes).
> > - *
> > - * Notes:
> > - *   (1) ACK messages can be encoded in either the dedicated
> > - *       P_ACK record or they can be prepended to a P_CONTROL
> message.
> > - *   (2) P_DATA and P_CONTROL/P_ACK use independent packet-id
> > - *       sequences because P_DATA is an unreliable channel while
> > - *       P_CONTROL/P_ACK is a reliable channel.  Each use their
> > - *       own independent HMAC keys.
> > - *   (3) Note that when --tls-auth is used, all message types are
> > - *       protected with an HMAC signature, even the initial packets
> > - *       of the TLS handshake.  This makes it easy for OpenVPN to
> > - *       throw away bogus packets quickly, without wasting resources
> > - *       on attempting a TLS handshake which will ultimately fail.
> > - */
> 
> Just beginning to wonder if this big block is moved over to
> doxygen/doc_protocol_overview.h?
> 

You're right, the block was moved out to a documentation-only header to improve 
legibility of the actual source code. I just double checked to see if anything 
was missing, but it seems complete. 
(https://github.com/andj/openvpn-ssl-refactoring/blob/4970f1485d4d2117ccb3b1932965809fc51d8efe/doxygen/doc_protocol_overview.h)

> [...snip...]
> 
> Generally looks good.  Some "typos" here, but this can be fixed in an
> additional patch.  I'm mostly concerned about the big block which this
> patch seems to remove.  If it is moved to other files, then it is fine.
> 
> So that this needs to be solved with an additional patch and confirm
> that
> the documentation taken out of this file is not lost, then I'll give
> this
> one an ACK.
> 

Thanks! If you think it's necessary I'll change the "should be overwritten with 
0s." in a patch, other than that, are you satisfied with the answers?

Kind Regards,

Adriaan de Jong

Reply via email to