diff --git a/programs/psa/aead_psa.c b/programs/psa/aead_psa.c
index 5ed32a5..2f0663d 100644
--- a/programs/psa/aead_psa.c
+++ b/programs/psa/aead_psa.c
@@ -1,9 +1,29 @@
-/*
- * This is a simple example of multi-part AEAD computation using the PSA
- * Crypto API. It comes with a companion program aead_non_psa.c, which does
- * the same operations with the legacy Cipher API. The goal is that comparing the
- * two programs will help people migrating to the PSA Crypto API.
+/**
+ * PSA API multi-part AEAD demonstration.
  *
+ * This program AEAD-encrypts a message, using the algorithm and key size
+ * specified on the command line, using the multi-part API.
+ *
+ * It comes with a companion program aead_non_psa.c, which does the same
+ * operations with the legacy Cipher API. The goal is that comparing the two
+ * programs will help people migrating to the PSA Crypto API.
+ *
+ * When used with multi-part AEAD operations, the `mbedtls_cipher_context`
+ * serves a triple purpose (1) hold the key, (2) store the algorithm when no
+ * operation is active, and (3) save progress information for the current
+ * operation. With PSA those roles are held by disinct objects: (1) a
+ * psa_key_id_t to hold the key, a (2) psa_algorithm_t to represent the
+ * algorithm, and (3) a psa_operation_t for multi-part progress.
+ *
+ * On the other hand, with PSA, the algorithms encodes the desired tag length;
+ * with Cipher the desired tag length needs to be tracked separately.
+ *
+ * This program and its companion aead_non_psa.c illustrate this by doing the
+ * same sequence of multi-part AEAD computation with both APIs; looking at the
+ * two side by side should make the differences and similarities clear.
+ */
+
+/*
  *  Copyright The Mbed TLS Contributors
  *  SPDX-License-Identifier: Apache-2.0
  *
@@ -20,26 +40,18 @@
  *  limitations under the License.
  */
 
-/*
- * When used with multi-part AEAD operations, the `mbedtls_cipher_context`
- * serves a triple purpose (1) hold the key, (2) store the algorithm when no
- * operation is active, and (3) save progress information for the current
- * operation. With PSA those roles are held by disinct objects: (1) a
- * psa_key_id_t to hold the key, a (2) psa_algorithm_t to represent the
- * algorithm, and (3) a psa_operation_t for multi-part progress.
- *
- * On the other hand, with PSA, the algorithms encodes the desired tag length;
- * with Cipher the desired tag length needs to be tracked separately.
- *
- * This program and its compation aead_non_psa.c illustrate this by doing the
- * same sequence of multi-part AEAD computation with both APIs; looking at the
- * two side by side should make the differences and similarities clear.
- */
-
-#include <stdio.h>
-
+/* First include Mbed TLS headers to get the Mbed TLS configuration and
+ * platform definitions that we'll use in this program. Also include
+ * standard C headers for functions we'll use here. */
 #include "mbedtls/build_info.h"
 
+#include "psa/crypto.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+/* If the build options we need are not enabled, compile a placeholder. */
 #if !defined(MBEDTLS_PSA_CRYPTO_C) || \
     !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_GCM_C) || \
     !defined(MBEDTLS_CHACHAPOLY_C) || \
@@ -54,52 +66,68 @@
 }
 #else
 
-#include <string.h>
+/* The real program starts here. */
 
-#include "psa/crypto.h"
-
-/*
- * Dummy data and helper functions
- */
 const char usage[] = "Usage: aead_psa [aes128-gcm|aes256-gcm|aes128-gcm_8|chachapoly]";
 
+/* Dummy data for encryption: IV/nonce, additional data, 2-part message */
 const unsigned char iv1[12] = { 0x00 };
 const unsigned char add_data1[] = { 0x01, 0x02 };
 const unsigned char msg1_part1[] = { 0x03, 0x04 };
 const unsigned char msg1_part2[] = { 0x05, 0x06, 0x07 };
 
+/* Dummy data (2nd message) */
 const unsigned char iv2[12] = { 0x10 };
 const unsigned char add_data2[] = { 0x11, 0x12 };
 const unsigned char msg2_part1[] = { 0x13, 0x14 };
 const unsigned char msg2_part2[] = { 0x15, 0x16, 0x17 };
 
+/* This must at least the sum of the length of the 2 parts for each message.
+ * This is a macro for the sake of compilers with insufficient C99 support. */
 #define MSG_MAX_SIZE 5
 
+/* Dummy key material - never do this in production!
+ * 32-byte is enough to all the key size supported by this program. */
 const unsigned char key_bytes[32] = { 0x2a };
 
-void print_out( const char *title, unsigned char *out, size_t len )
+/* Print the contents of a buffer in hex */
+void print_buf( const char *title, uint8_t *buf, size_t len )
 {
     printf( "%s:", title );
     for( size_t i = 0; i < len; i++ )
-        printf( " %02x", out[i] );
+        printf( " %02x", buf[i] );
     printf( "\n" );
 }
 
-#define CHK( code )     \
-    do {                \
-        status = code;     \
-        if( status != PSA_SUCCESS ) { \
-            printf( "%03d: status = %d\n", __LINE__, status ); \
-            goto exit;  \
-        } \
-    } while( 0 )
+/* Run a PSA function and bail out if it fails. */
+#define PSA_CHECK( expr )                                       \
+    do                                                          \
+    {                                                           \
+        status = ( expr );                                      \
+        if( status != PSA_SUCCESS )                             \
+        {                                                       \
+            printf( "Error %d at line %d: %s\n",                \
+                    (int) status,                               \
+                    __LINE__,                                   \
+                    #expr );                                    \
+            goto exit;                                          \
+        }                                                       \
+    }                                                           \
+    while( 0 )
 
+/*
+ * Prepare encryption material:
+ * - interpret command-line argument
+ * - set up key
+ * - outputs: key and algorithm, which together hold all the information
+ */
 static psa_status_t aead_prepare( const char *info,
                                   psa_key_id_t *key,
                                   psa_algorithm_t *alg )
 {
     psa_status_t status;
 
+    /* Convert arg to alg + key_bits + key_type */
     size_t key_bits;
     psa_key_type_t key_type;
     if( strcmp( info, "aes128-gcm" ) == 0 ) {
@@ -123,18 +151,26 @@
         return( PSA_ERROR_INVALID_ARGUMENT );
     }
 
+    /* Prepare key attibutes */
     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
     psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
     psa_set_key_algorithm( &attributes, *alg );
     psa_set_key_type( &attributes, key_type );
-    psa_set_key_bits( &attributes, key_bits );
+    psa_set_key_bits( &attributes, key_bits ); // optional
 
-    CHK( psa_import_key( &attributes, key_bytes, key_bits / 8, key ) );
+    /* Import key */
+    PSA_CHECK( psa_import_key( &attributes, key_bytes, key_bits / 8, key ) );
 
 exit:
     return( status );
 }
 
+/*
+ * Print out some information.
+ *
+ * All of this information was present in the command line argument, but his
+ * function demonstrates how each piece can be recovered from (key, alg).
+ */
 static void aead_info( psa_key_id_t key, psa_algorithm_t alg )
 {
     psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
@@ -155,6 +191,9 @@
             type_str, (unsigned) key_bits, base_str, (unsigned) tag_len );
 }
 
+/*
+ * Encrypt a 2-part message.
+ */
 static int aead_encrypt( psa_key_id_t key, psa_algorithm_t alg,
         const unsigned char *iv, size_t iv_len,
         const unsigned char *ad, size_t ad_len,
@@ -168,29 +207,31 @@
     unsigned char tag[PSA_AEAD_TAG_MAX_SIZE];
 
     psa_aead_operation_t op = PSA_AEAD_OPERATION_INIT;
-    CHK( psa_aead_encrypt_setup( &op, key, alg ) );
+    PSA_CHECK( psa_aead_encrypt_setup( &op, key, alg ) );
 
-    CHK( psa_aead_set_nonce( &op, iv, iv_len ) );
-    CHK( psa_aead_update_ad( &op, ad, ad_len ) );
-    CHK( psa_aead_update( &op, pa, pa_len, p, end - p, &olen ) );
+    PSA_CHECK( psa_aead_set_nonce( &op, iv, iv_len ) );
+    PSA_CHECK( psa_aead_update_ad( &op, ad, ad_len ) );
+    PSA_CHECK( psa_aead_update( &op, pa, pa_len, p, end - p, &olen ) );
     p += olen;
-    CHK( psa_aead_update( &op, pb, pb_len, p, end - p, &olen ) );
+    PSA_CHECK( psa_aead_update( &op, pb, pb_len, p, end - p, &olen ) );
     p += olen;
-    CHK( psa_aead_finish( &op, p, end - p, &olen,
+    PSA_CHECK( psa_aead_finish( &op, p, end - p, &olen,
                                tag, sizeof( tag ), &olen_tag ) );
     p += olen;
     memcpy( p, tag, olen_tag );
     p += olen_tag;
 
     olen = p - out;
-    print_out( "out", out, olen );
+    print_buf( "out", out, olen );
 
 exit:
-    /* required on errors, harmless on success */
-    psa_aead_abort( &op );
+    psa_aead_abort( &op ); // required on errors, harmless on success
     return( status );
 }
 
+/*
+ * AEAD demo: set up key/alg, print out info, encrypt messages.
+ */
 static psa_status_t aead_demo( const char *info )
 {
     psa_status_t status;
@@ -198,15 +239,15 @@
     psa_key_id_t key;
     psa_algorithm_t alg;
 
-    CHK( aead_prepare( info, &key, &alg ) );
+    PSA_CHECK( aead_prepare( info, &key, &alg ) );
 
     aead_info( key, alg );
 
-    CHK( aead_encrypt( key, alg,
+    PSA_CHECK( aead_encrypt( key, alg,
                        iv1, sizeof( iv1 ), add_data1, sizeof( add_data1 ),
                        msg1_part1, sizeof( msg1_part1 ),
                        msg1_part2, sizeof( msg1_part2 ) ) );
-    CHK( aead_encrypt( key, alg,
+    PSA_CHECK( aead_encrypt( key, alg,
                        iv2, sizeof( iv2 ), add_data2, sizeof( add_data2 ),
                        msg2_part1, sizeof( msg2_part1 ),
                        msg2_part2, sizeof( msg2_part2 ) ) );
@@ -222,17 +263,26 @@
  */
 int main( int argc, char **argv )
 {
+    psa_status_t status = PSA_SUCCESS;
+
+    /* Check usage */
     if( argc != 2 )
     {
         puts( usage );
-        return( 1 );
+        return( EXIT_FAILURE );
     }
 
-    psa_status_t status = psa_crypto_init();
-    if( status != PSA_SUCCESS )
-        printf( "psa init: %d\n", status );
+    /* Initialize the PSA crypto library. */
+    PSA_CHECK( psa_crypto_init( ) );
 
-    aead_demo( argv[1] );
+    /* Run the demo */
+    PSA_CHECK( aead_demo( argv[1] ) );
+
+    /* Deinitialize the PSA crypto library. */
+    mbedtls_psa_crypto_free( );
+
+exit:
+    return( status == PSA_SUCCESS ? EXIT_SUCCESS : EXIT_FAILURE );
 }
 
 #endif
