poly1305: fix bug in starts() and add test for it
diff --git a/library/poly1305.c b/library/poly1305.c
index 14c362d..542a850 100644
--- a/library/poly1305.c
+++ b/library/poly1305.c
@@ -280,6 +280,11 @@
     ctx->acc[1] = 0U;
     ctx->acc[2] = 0U;
     ctx->acc[3] = 0U;
+    ctx->acc[4] = 0U;
+
+    /* Queue initially empty */
+    mbedtls_zeroize( ctx->queue, sizeof( ctx->queue ) );
+    ctx->queue_len = 0U;
 
     return( 0 );
 }
diff --git a/tests/suites/test_suite_chacha20.function b/tests/suites/test_suite_chacha20.function
index fb3ad3e..bac1ef3 100644
--- a/tests/suites/test_suite_chacha20.function
+++ b/tests/suites/test_suite_chacha20.function
@@ -67,8 +67,8 @@
      * Test the streaming API again, piecewise
      */
 
-    /* Don't reset the context of key, in order to test that starts() do the
-     * right thing. */
+    /* Don't free/init the context nor set the key again,
+     * in order to test that starts() does the right thing. */
     TEST_ASSERT( mbedtls_chacha20_starts( &ctx, nonce_str, counter ) == 0 );
 
     memset( output, 0x00, sizeof( output ) );
diff --git a/tests/suites/test_suite_poly1305.function b/tests/suites/test_suite_poly1305.function
index 5ede635..964d129 100644
--- a/tests/suites/test_suite_poly1305.function
+++ b/tests/suites/test_suite_poly1305.function
@@ -11,6 +11,7 @@
     unsigned char mac[16]; /* size set by the standard */
     unsigned char mac_str[33]; /* hex expansion of the above */
     size_t src_len;
+    mbedtls_poly1305_context ctx;
 
     memset( src_str, 0x00, sizeof( src_str ) );
     memset( mac_str, 0x00, sizeof( mac_str ) );
@@ -20,10 +21,45 @@
     src_len = unhexify( src_str, hex_src_string );
     unhexify( key, hex_key_string );
 
+    /*
+     * Test the integrated API
+     */
     mbedtls_poly1305_mac( key, src_str, src_len, mac );
-    hexify( mac_str, mac, 16 );
 
+    hexify( mac_str, mac, 16 );
     TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
+
+    /*
+     * Test the streaming API
+     */
+    mbedtls_poly1305_init( &ctx );
+
+    TEST_ASSERT( mbedtls_poly1305_starts( &ctx, key ) == 0 );
+
+    TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str, src_len ) == 0 );
+
+    TEST_ASSERT( mbedtls_poly1305_finish( &ctx, mac ) == 0 );
+
+    hexify( mac_str, mac, 16 );
+    TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
+
+    /*
+     * Test the streaming API again, piecewise
+     */
+
+    /* Don't free/init the context, in order to test that starts() does the
+     * right thing. */
+    TEST_ASSERT( mbedtls_poly1305_starts( &ctx, key ) == 0 );
+
+    TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str, 1 ) == 0 );
+    TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str + 1, src_len - 1) == 0 );
+
+    TEST_ASSERT( mbedtls_poly1305_finish( &ctx, mac ) == 0 );
+
+    hexify( mac_str, mac, 16 );
+    TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
+
+    mbedtls_poly1305_free( &ctx );
 }
 /* END_CASE */