Check input lengths in GCM
diff --git a/library/gcm.c b/library/gcm.c
index e9c37fe..f1a43af 100644
--- a/library/gcm.c
+++ b/library/gcm.c
@@ -197,6 +197,15 @@
     uint64_t orig_len = length * 8;
     uint64_t orig_add_len = add_len * 8;
 
+    /* IV and AD are limited to 2^64 bits, so 2^61 bytes */
+    if( ( (uint64_t) iv_len  ) >> 61 != 0 ||
+        ( (uint64_t) add_len ) >> 61 != 0 ||
+        tag_len > 16 || tag_len < 4 ||
+        length > 0x03FFFFE0llu )
+    {
+        return( POLARSSL_ERR_GCM_BAD_INPUT );
+    }
+
     memset( y, 0x00, 16 );
     memset( work_buf, 0x00, 16 );
     memset( tag, 0x00, tag_len );