Start using client IP in HelloVerifyRequest

Dummy fixed key for now.
diff --git a/library/ssl_srv.c b/library/ssl_srv.c
index eac553f..521552d 100644
--- a/library/ssl_srv.c
+++ b/library/ssl_srv.c
@@ -1137,25 +1137,68 @@
 #endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
 
 #if defined(POLARSSL_SSL_PROTO_DTLS)
+
+/*
+ * If DTLS is in use, then at least one of SHA-1, SHA-256, SHA-512 is
+ * available. Try SHA-256 first, 512 wastes resources since we need to stay
+ * with max 32 bytes of cookie for DTLS 1.0
+ */
+#if defined(POLARSSL_SHA256_C)
+#define HVR_MD      POLARSSL_MD_SHA256
+#define HVR_MD_LEN  32
+#define HVR_MD_USE  32
+#elif defined(POLARSSL_SHA512_C)
+#define HVR_MD      POLARSSL_MD_SHA384
+#define HVR_MD_LEN  48
+#define HVR_MD_USE  32
+#elif defined(POLARSSL_SHA1_C)
+#define HVR_MD      POLARSSL_MD_SHA1
+#define HVR_MD_LEN  20
+#define HVR_MD_USE  20
+#else
+#error "DTLS hello verify needs SHA-1 or SHA-2"
+#endif
+
 /*
  * Generate cookie for DTLS ClientHello verification
  */
 static int ssl_generate_verify_cookie( ssl_context *ssl )
 {
+    int ret;
     unsigned char *cookie = ssl->handshake->verify_cookie;
     unsigned char cookie_len;
+    unsigned char hmac_out[HVR_MD_LEN];
+    unsigned char hmac_key[32] = { 0 }; /* temporary! */
+    md_context_t hmac_ctx;
+
+    md_init( &hmac_ctx );
 
     polarssl_free( cookie );
 
-    cookie_len = 16; /* fixed for now */
+    cookie_len = HVR_MD_LEN;
+
     if( ( cookie = polarssl_malloc( cookie_len ) ) == NULL )
     {
         SSL_DEBUG_MSG( 1, ( "malloc (%d bytes) failed\n", cookie_len ) );
         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
     }
 
-    /* Dummy, fixed string for now */
-    memset( cookie, 0x2a, cookie_len );
+    /* Do a HMAC of client id */
+    ret = md_init_ctx( &hmac_ctx, md_info_from_type( HVR_MD ) );
+    if( ret != 0 )
+    {
+        SSL_DEBUG_RET( 0, "md_init_ctx", ret );
+        return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
+    }
+
+    /* Only possible error is if hmac_ctx wasn't initialized */
+    (void) md_hmac_starts( &hmac_ctx, hmac_key, sizeof( hmac_key ) );
+    (void) md_hmac_update( &hmac_ctx, ssl->cli_id, ssl->cli_id_len );
+    (void) md_hmac_finish( &hmac_ctx, hmac_out );
+
+    memcpy( cookie, hmac_out, HVR_MD_USE );
+
+    md_free( &hmac_ctx );
 
     ssl->handshake->verify_cookie = cookie;
     ssl->handshake->verify_cookie_len = cookie_len;