Tests for PSA ITS over files

This commit is contained in:
Gilles Peskine 2018-11-16 22:24:38 +01:00
parent 6194dc2062
commit bc1f272750
4 changed files with 276 additions and 2 deletions

View File

@ -133,7 +133,7 @@ psa_status_t psa_its_get( psa_storage_uid_t uid,
status = psa_its_read_file( uid, &info, &stream );
if( status != PSA_SUCCESS )
goto exit;
status = PSA_ERROR_DATA_CORRUPT;
status = PSA_ERROR_INVALID_ARGUMENT;
if( data_offset + data_length < data_offset )
goto exit;
#if SIZE_MAX < 0xffffffff
@ -143,7 +143,7 @@ psa_status_t psa_its_get( psa_storage_uid_t uid,
if( data_offset + data_length > info.size )
goto exit;
status = PSA_ERROR_DATA_CORRUPT;
status = PSA_ERROR_STORAGE_FAILURE;
#if LONG_MAX < 0xffffffff
while( data_offset > LONG_MAX )
{

View File

@ -142,6 +142,7 @@ add_test_suite(psa_crypto_metadata)
add_test_suite(psa_crypto_persistent_key)
add_test_suite(psa_crypto_slot_management)
add_test_suite(psa_crypto_storage_file)
add_test_suite(psa_its)
add_test_suite(shax)
add_test_suite(timing)
add_test_suite(rsa)

View File

@ -0,0 +1,65 @@
Set/get/remove 0 bytes
set_get_remove:0:0:""
Set/get/remove 42 bytes
set_get_remove:0:0:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829"
Set/get/remove 1000 bytes
set_get_remove:0:0:"6a07ecfcc7c7bfe0129d56d2dcf2955a12845b9e6e0034b0ed7226764261c6222a07b9f654deb682130eb1cd07ed298324e60a46f9c76c8a5a0be000c69e93dd81054ca21fbc6190cef7745e9d5436f70e20e10cbf111d1d40c9ceb83be108775199d81abaf0fecfe30eaa08e7ed82517cba939de4449f7ac5c730fcbbf56e691640b0129db0e178045dd2034262de9138873d9bdca57685146a3d516ff13c29e6628a00097435a8e10fef7faff62d2963c303a93793e2211d8604556fec08cd59c0f5bd1f22eea64be13e88b3f454781e83fe6e771d3d81eb2fbe2021e276f42a93db5343d767d854115e74f5e129a8036b1e81aced9872709d515e00bcf2098ccdee23006b0e836b27dc8aaf30f53fe58a31a6408abb79b13098c22e262a98040f9b09809a3b43bd42eb01cf1d17bbc8b4dfe51fa6573d4d8741943e3ae71a649e194c1218f2e20556c7d8cfe8c64d8cc1aa94531fbf638768c7d19b3c079299cf4f26ed3f964efb8fd23d82b4157a51f46da11156c74e2d6e2fd788869ebb52429e12a82da2ba083e2e74565026162f29ca22582da72a2698e7c5d958b919bc2cdfe12f50364ccfed30efd5cd120a7d5f196b2bd7f911bb44d5871eb3dedcd70ece7faf464988f9fe361f23d7244b1e08bee921d0f28bdb4912675809d099876d4d15b7d13ece356e1f2a5dce64feb3d6749a07a4f2b7721190e17a9ab2966e48b6d25187070b81eb45b1c44608b2f0e175958ba57fcf1b2cd145eea5fd4de858d157ddac69dfbb5d5d6f0c1691b0fae5a143b6e58cdf5000f28d74b3322670ed11e740c828c7bfad4e2f392012da3ac931ea26ed15fd003e604071f5900c6e1329d021805d50da9f1e732a49bcc292d9f8e07737cfd59442e8d7aaa813b18183a68e22bf6b4519545dd7d2d519db3652be4131bad4f4b0625dbaa749e979f6ee8c1b97803cb50a2fa20dc883eac932a824b777b226e15294de6a80be3ddef41478fe18172d64407a004de6bae18bc60e90c902c1cbb0e1633395b42391f5011be0d480541987609b0cd8d902ea29f86f73e7362340119323eb0ea4f672b70d6e9a9df5235f9f1965f5cb0c2998c5a7f4754e83eeda5d95fefbbaaa0875fe37b7ca461e7281cc5479162627c5a709b45fd9ddcde4dfb40659e1d70fa7361d9fc7de24f9b8b13259423fdae4dbb98d691db687467a5a7eb027a4a0552a03e430ac8a32de0c30160ba60a036d6b9db2d6182193283337b92e7438dc5d6eb4fa00200d8efa9127f1c3a32ac8e202262773aaa5a965c6b8035b2e5706c32a55511560429ddf1df4ac34076b7eedd9cf94b6915a894fdd9084ffe3db0e7040f382c3cd04f0484595de95865c36b6bf20f46a78cdfb37228acbeb218de798b9586f6d99a0cbae47e80d"
Set/get/remove with flags
set_get_remove:0:0x12345678:"abcdef"
Overwrite 0 -> 3
set_overwrite:0:0x12345678:"":0x01020304:"abcdef"
Overwrite 3 -> 0
set_overwrite:0:0x12345678:"abcdef":0x01020304:""
Overwrite 3 -> 3
set_overwrite:0:0x12345678:"123456":0x01020304:"abcdef"
Overwrite 3 -> 18
set_overwrite:0:0x12345678:"abcdef":0x01020304:"404142434445464748494a4b4c4d4e4f5051"
Overwrite 18 -> 3
set_overwrite:0:0x12345678:"404142434445464748494a4b4c4d4e4f5051":0x01020304:"abcdef"
Multiple files
set_multiple:0:5
Non-existent file
nonexistent:0:0
Removed file
nonexistent:0:1
Get 0 bytes of 10 at 10
get_at:0:"40414243444546474849":10:0:PSA_ITS_SUCCESS
Get 1 byte of 10 at 9
get_at:0:"40414243444546474849":9:1:PSA_ITS_SUCCESS
Get 0 bytes of 10 at 0
get_at:0:"40414243444546474849":0:0:PSA_ITS_SUCCESS
Get 1 byte of 10 at 0
get_at:0:"40414243444546474849":1:0:PSA_ITS_SUCCESS
Get 2 bytes of 10 at 1
get_at:0:"40414243444546474849":1:2:PSA_ITS_SUCCESS
Get 1 byte of 10 at 10: out of range
get_at:0:"40414243444546474849":10:1:PSA_ITS_ERROR_INCORRECT_SIZE
Get 1 byte of 10 at 11: out of range
get_at:0:"40414243444546474849":11:1:PSA_ITS_ERROR_INCORRECT_SIZE
Get 0 bytes of 10 at 11: out of range
get_at:0:"40414243444546474849":11:1:PSA_ITS_ERROR_INCORRECT_SIZE
Get -1 byte of 10 at 10: out of range
get_at:0:"40414243444546474849":10:-1:PSA_ITS_ERROR_INCORRECT_SIZE
Get 1 byte of 10 at -1: out of range
get_at:0:"40414243444546474849":-1:1:PSA_ITS_ERROR_INCORRECT_SIZE

View File

@ -0,0 +1,208 @@
/* BEGIN_HEADER */
#include "../library/psa_its_file.h"
/* Internal definitions of the implementation, copied for the sake of
* some of the tests and of the cleanup code. */
#define PSA_ITS_STORAGE_PREFIX ""
#define PSA_ITS_STORAGE_FILENAME_PATTERN "%08lx.psa_its"
#define PSA_ITS_STORAGE_FILENAME_LENGTH \
( sizeof( PSA_ITS_STORAGE_PREFIX ) + 16 )
#define PSA_ITS_STORAGE_TEMP PSA_ITS_STORAGE_PREFIX "tempfile.psa_its"
static void psa_its_fill_filename( uint32_t uid, char *filename )
{
snprintf( filename, PSA_ITS_STORAGE_FILENAME_LENGTH,
"%s" PSA_ITS_STORAGE_FILENAME_PATTERN,
PSA_ITS_STORAGE_PREFIX, (unsigned long) uid );
}
#define MAX( m, n ) ( ( m ) > ( n ) ? ( m ) : ( n ) )
#define ITS_ASSERT( expr ) \
TEST_ASSERT( ( expr ) == PSA_ITS_SUCCESS )
/* Maximum uid used by the test, recorded so that cleanup() can delete
* all files. 0xffffffff is excluded. */
static uint32_t uid_max = 0;
static void cleanup( void )
{
char filename[PSA_ITS_STORAGE_FILENAME_LENGTH];
uint32_t uid;
for( uid = 0; uid < uid_max; uid++ )
{
psa_its_fill_filename( uid, filename );
remove( filename );
}
psa_its_fill_filename( 0xffffffff, filename );
remove( filename );
remove( PSA_ITS_STORAGE_TEMP );
uid_max = 0;
}
static psa_its_status_t psa_its_set_wrap( uint32_t uid,
uint32_t data_length,
const void *p_data,
psa_its_create_flags_t create_flags )
{
if( uid_max != 0xffffffff && uid_max < uid )
uid_max = uid;
return psa_its_set( uid, data_length, p_data, create_flags );
}
/* END_HEADER */
/* BEGIN_DEPENDENCIES
* depends_on:MBEDTLS_PSA_ITS_FILE_C
* END_DEPENDENCIES
*/
/* BEGIN_CASE */
void set_get_remove( int uid_arg, int flags_arg, data_t *data )
{
uint32_t uid = uid_arg;
uint32_t flags = flags_arg;
struct psa_its_info_t info;
unsigned char *buffer = NULL;
ASSERT_ALLOC( buffer, data->len );
ITS_ASSERT( psa_its_set_wrap( uid, data->len, data->x, flags ) );
ITS_ASSERT( psa_its_get_info( uid, &info ) );
TEST_ASSERT( info.size == data->len );
TEST_ASSERT( info.flags == flags );
ITS_ASSERT( psa_its_get( uid, 0, data->len, buffer ) );
ASSERT_COMPARE( data->x, data->len, buffer, data->len );
ITS_ASSERT( psa_its_remove( uid ) );
exit:
mbedtls_free( buffer );
cleanup( );
}
/* END_CASE */
/* BEGIN_CASE */
void set_overwrite( int uid_arg,
int flags1_arg, data_t *data1,
int flags2_arg, data_t *data2 )
{
uint32_t uid = uid_arg;
uint32_t flags1 = flags1_arg;
uint32_t flags2 = flags2_arg;
struct psa_its_info_t info;
unsigned char *buffer = NULL;
ASSERT_ALLOC( buffer, MAX( data1->len, data2->len ) );
ITS_ASSERT( psa_its_set_wrap( uid, data1->len, data1->x, flags1 ) );
ITS_ASSERT( psa_its_get_info( uid, &info ) );
TEST_ASSERT( info.size == data1->len );
TEST_ASSERT( info.flags == flags1 );
ITS_ASSERT( psa_its_get( uid, 0, data1->len, buffer ) );
ASSERT_COMPARE( data1->x, data1->len, buffer, data1->len );
ITS_ASSERT( psa_its_set_wrap( uid, data2->len, data2->x, flags2 ) );
ITS_ASSERT( psa_its_get_info( uid, &info ) );
TEST_ASSERT( info.size == data2->len );
TEST_ASSERT( info.flags == flags2 );
ITS_ASSERT( psa_its_get( uid, 0, data2->len, buffer ) );
ASSERT_COMPARE( data2->x, data2->len, buffer, data2->len );
ITS_ASSERT( psa_its_remove( uid ) );
exit:
mbedtls_free( buffer );
cleanup( );
}
/* END_CASE */
/* BEGIN_CASE */
void set_multiple( int first_id, int count )
{
uint32_t uid0 = first_id;
uint32_t uid;
char stored[40];
char retrieved[40];
memset( stored, '.', sizeof( stored ) );
for( uid = uid0; uid < uid0 + count; uid++ )
{
mbedtls_snprintf( stored, sizeof( stored ),
"Content of file 0x%08lx", (unsigned long) uid );
ITS_ASSERT( psa_its_set_wrap( uid, sizeof( stored ), stored, 0 ) );
}
for( uid = uid0; uid < uid0 + count; uid++ )
{
mbedtls_snprintf( stored, sizeof( stored ),
"Content of file 0x%08lx", (unsigned long) uid );
ITS_ASSERT( psa_its_get( uid, 0, sizeof( stored ), retrieved ) );
ASSERT_COMPARE( retrieved, sizeof( stored ),
stored, sizeof( stored ) );
ITS_ASSERT( psa_its_remove( uid ) );
TEST_ASSERT( psa_its_get( uid, 0, 0, NULL ) ==
PSA_ITS_ERROR_KEY_NOT_FOUND );
}
exit:
cleanup( );
}
/* END_CASE */
/* BEGIN_CASE */
void nonexistent( int uid_arg, int create_and_remove )
{
uint32_t uid = uid_arg;
struct psa_its_info_t info;
if( create_and_remove )
{
ITS_ASSERT( psa_its_set_wrap( uid, 0, NULL, 0 ) );
ITS_ASSERT( psa_its_remove( uid ) );
}
TEST_ASSERT( psa_its_remove( uid ) == PSA_ITS_ERROR_KEY_NOT_FOUND );
TEST_ASSERT( psa_its_get_info( uid, &info ) ==
PSA_ITS_ERROR_KEY_NOT_FOUND );
TEST_ASSERT( psa_its_get( uid, 0, 0, NULL ) ==
PSA_ITS_ERROR_KEY_NOT_FOUND );
exit:
cleanup( );
}
/* END_CASE */
/* BEGIN_CASE */
void get_at( int uid_arg, data_t *data,
int offset, int length_arg,
int expected_status )
{
uint32_t uid = uid_arg;
unsigned char *buffer = NULL;
psa_its_status_t ist;
size_t length = length_arg >= 0 ? length_arg : 0;
unsigned char *trailer;
size_t i;
ASSERT_ALLOC( buffer, length + 16 );
trailer = buffer + length;
memset( trailer, '-', 16 );
ITS_ASSERT( psa_its_set_wrap( uid, data->len, data->x, 0 ) );
ist = psa_its_get( uid, offset, length_arg, buffer );
TEST_ASSERT( ist == (psa_its_status_t) expected_status );
if( ist == PSA_ITS_SUCCESS )
ASSERT_COMPARE( data->x + offset, length,
buffer, length );
for( i = 0; i < 16; i++ )
TEST_ASSERT( trailer[i] == '-' );
ITS_ASSERT( psa_its_remove( uid ) );
exit:
mbedtls_free( buffer );
cleanup( );
}
/* END_CASE */