write the tag directly on the ciphertext buffer.
diff --git a/library/psa_crypto.c b/library/psa_crypto.c
index 905b9a8..8cf0df4 100755
--- a/library/psa_crypto.c
+++ b/library/psa_crypto.c
@@ -1489,15 +1489,13 @@
     key_slot_t *slot;
     psa_key_type_t key_type;
     size_t key_bits;
-    unsigned char tag[16];
+    uint8_t *tag;
+    size_t tag_length;
     mbedtls_cipher_id_t cipher_id;
     const mbedtls_cipher_info_t *cipher_info = NULL;
     
     *ciphertext_length = 0;
 
-    if( ciphertext_size < ( plaintext_length + sizeof( tag ) ) )
-        return( PSA_ERROR_INVALID_ARGUMENT );
-
     status = psa_get_key_information( key, &key_type, &key_bits );
     if( status != PSA_SUCCESS )
         return( status );
@@ -1516,6 +1514,15 @@
     if( alg == PSA_ALG_GCM )
     {
         mbedtls_gcm_context gcm;
+        tag_length = 16;
+
+        //make sure we have place to hold the tag in the ciphertext buffer
+        if( ciphertext_size < ( plaintext_length + tag_length ) )
+            return( PSA_ERROR_INVALID_ARGUMENT );
+
+        //update the tag pointer to point to the end of the ciphertext_length
+        tag = ciphertext + plaintext_length;
+
         mbedtls_gcm_init( &gcm );
         ret = mbedtls_gcm_setkey( &gcm, cipher_id,
                                   slot->data.raw.data,
@@ -1529,22 +1536,26 @@
                                          plaintext_length, nonce,
                                          nonce_length, additional_data,
                                          additional_data_length, plaintext,
-                                         ciphertext, sizeof( tag ), tag );
-        if( ret != 0 )
-        {
-            mbedtls_gcm_free( &gcm );
-            mbedtls_zeroize( ciphertext, plaintext_length );
-            return( mbedtls_to_psa_error( ret ) );
-        }
-
+                                         ciphertext, tag_length, tag );
         mbedtls_gcm_free( &gcm );
     }
     else if( alg == PSA_ALG_CCM )
     {
         mbedtls_ccm_context ccm;
+        tag_length = 16;
+
         if( nonce_length < 7 || nonce_length > 13 )
             return( PSA_ERROR_INVALID_ARGUMENT );
 
+        //make sure we have place to hold the tag in the ciphertext buffer
+        if( ciphertext_size < ( plaintext_length + tag_length ) )
+            return( PSA_ERROR_INVALID_ARGUMENT );
+
+        //update the tag pointer to point to the end of the ciphertext_length
+        tag = ciphertext + plaintext_length;
+
+
+
         mbedtls_ccm_init( &ccm );
         ret = mbedtls_ccm_setkey( &ccm, cipher_id,
                                   slot->data.raw.data, key_bits );
@@ -1557,22 +1568,21 @@
                                            nonce, nonce_length, additional_data,
                                            additional_data_length,
                                            plaintext, ciphertext,
-                                           tag, sizeof( tag ) );
-        if( ret != 0 )
-        {
-            mbedtls_ccm_free( &ccm );
-            memset( ciphertext, 0, plaintext_length );
-            return( mbedtls_to_psa_error( ret ) );
-        }
-
+                                           tag, tag_length );
         mbedtls_ccm_free( &ccm );
     }
     else
     {
         return( PSA_ERROR_NOT_SUPPORTED );
     }
-    memcpy( ciphertext + plaintext_length, tag, sizeof( tag ) );
-    *ciphertext_length = plaintext_length + sizeof( tag );
+    
+    if( ret != 0 )
+    {
+        memset( ciphertext, 0, ciphertext_size );
+        return( mbedtls_to_psa_error( ret ) );
+    }
+    
+    *ciphertext_length = plaintext_length + tag_length;
     return( PSA_SUCCESS );
 }