+Version 0.2.11
+- Changed the meaning of GNUTLS_E_REHANDSHAKE value. If this value
+ is returned, then the caller should perform a handshake or send
+ an alert to the peer.
+
Version 0.2.10 (5/11/2001)
- Corrected bugs and improved non blocking IO
- Added hooks to use external database to store sessions
}
return 0;
-#else /* this does not seem to work - yet */
+#else /* this does seem to work - now */
uint8 type;
if (state->security_parameters.entity == GNUTLS_SERVER) {
}
type = ((uint8 *) data)[0];
if (type == GNUTLS_HELLO_REQUEST)
- return gnutls_handshake(cd, state);
+ return GNUTLS_E_REHANDSHAKE;
else {
gnutls_assert();
return GNUTLS_E_UNEXPECTED_PACKET;
if (recv_type == GNUTLS_HANDSHAKE) {
/* we may get a hello request */
ret = _gnutls_recv_hello_request( cd, state, tmpdata, tmplen);
- if (ret < 0) {
- gnutls_assert();
- } else /* inform the caller */
- ret = GNUTLS_E_REHANDSHAKE;
} else {
gnutls_assert();
ret = GNUTLS_E_UNEXPECTED_PACKET;
* difference is that is accepts a GNUTLS state.
* Returns the number of bytes received, zero on EOF, or
* a negative error code.
+ *
+ * If this function returns GNUTLS_E_REHANDSHAKE, then you must
+ * either send an alert containing NO_RENEGOTIATION, or perform a
+ * handshake. (only a client may receive this message)
+ *
**/
ssize_t gnutls_read(SOCKET cd, GNUTLS_STATE state, void *data, size_t sizeofdata) {
return gnutls_recv_int( cd, state, GNUTLS_APPLICATION_DATA, -1, data, sizeofdata);
} else {
if (ret==GNUTLS_E_WARNING_ALERT_RECEIVED || ret==GNUTLS_E_FATAL_ALERT_RECEIVED)
printf("* Received alert [%d]\n", gnutls_get_last_alert(state));
- if (ret==GNUTLS_E_REHANDSHAKE)
- printf("* Rehandshake was performed\n");
-
+ if (ret==GNUTLS_E_REHANDSHAKE) {
+ do {
+ ret = gnutls_handshake( sd, state);
+ } while( ret==GNUTLS_E_AGAIN || ret==GNUTLS_E_INTERRUPTED);
+ if (ret==0) printf("* Rehandshake was performed\n");
+ else {
+ printf("* Rehandshake Failed [%d]\n", ret);
+ }
+ }
if (ret > 0) {
printf("- Received[%d]: ", ret);
for (ii=0;ii<ret;ii++) {