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 );
 }
 
