From 03080b9ccdab8a424a67068711a196d040d0def3 Mon Sep 17 00:00:00 2001 From: Maarten Billemont Date: Tue, 1 Aug 2017 17:35:13 -0400 Subject: [PATCH] Render error messages as strings instead of internal codes. --- core/c/mpw-algorithm_v0.c | 8 ++++---- core/c/mpw-algorithm_v1.c | 8 ++++---- core/c/mpw-algorithm_v2.c | 8 ++++---- core/c/mpw-algorithm_v3.c | 8 ++++---- core/c/mpw-marshall.c | 21 +++++++++++++++++++++ core/c/mpw-marshall.h | 1 + platform-independent/cli-c/cli/mpw-bench.c | 6 +++--- platform-independent/cli-c/cli/mpw-cli.c | 22 ++++++++++++++-------- 8 files changed, 55 insertions(+), 27 deletions(-) diff --git a/core/c/mpw-algorithm_v0.c b/core/c/mpw-algorithm_v0.c index d2868e1b..c8d220ff 100644 --- a/core/c/mpw-algorithm_v0.c +++ b/core/c/mpw-algorithm_v0.c @@ -58,7 +58,7 @@ static MPMasterKey mpw_masterKeyForUser_v0(const char *fullName, const char *mas mpw_push_int( &masterKeySalt, &masterKeySaltSize, htonl( mpw_utf8_strlen( fullName ) ) ); mpw_push_string( &masterKeySalt, &masterKeySaltSize, fullName ); if (!masterKeySalt) { - ftl( "Could not allocate master key salt: %d\n", errno ); + ftl( "Could not allocate master key salt: %s\n", strerror( errno ) ); return NULL; } trc( "masterKeySalt ID: %s\n", mpw_id_buf( masterKeySalt, masterKeySaltSize ) ); @@ -68,7 +68,7 @@ static MPMasterKey mpw_masterKeyForUser_v0(const char *fullName, const char *mas const uint8_t *masterKey = mpw_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p ); mpw_free( masterKeySalt, masterKeySaltSize ); if (!masterKey) { - ftl( "Could not allocate master key: %d\n", errno ); + ftl( "Could not allocate master key: %s\n", strerror( errno ) ); return NULL; } trc( "masterKey ID: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) ); @@ -104,7 +104,7 @@ static MPSiteKey mpw_siteKey_v0( mpw_push_string( &siteSalt, &siteSaltSize, keyContext ); } if (!siteSalt || !siteSaltSize) { - ftl( "Could not allocate site salt: %d\n", errno ); + ftl( "Could not allocate site salt: %s\n", strerror( errno ) ); mpw_free( siteSalt, siteSaltSize ); return NULL; } @@ -113,7 +113,7 @@ static MPSiteKey mpw_siteKey_v0( MPSiteKey siteKey = mpw_hmac_sha256( masterKey, MPMasterKeySize, siteSalt, siteSaltSize ); mpw_free( siteSalt, siteSaltSize ); if (!siteKey) { - ftl( "Could not allocate site key: %d\n", errno ); + ftl( "Could not allocate site key: %s\n", strerror( errno ) ); return NULL; } trc( "siteKey ID: %s\n", mpw_id_buf( siteKey, MPSiteKeySize ) ); diff --git a/core/c/mpw-algorithm_v1.c b/core/c/mpw-algorithm_v1.c index b3aff97c..d08042be 100644 --- a/core/c/mpw-algorithm_v1.c +++ b/core/c/mpw-algorithm_v1.c @@ -43,7 +43,7 @@ static MPMasterKey mpw_masterKeyForUser_v1(const char *fullName, const char *mas mpw_push_int( &masterKeySalt, &masterKeySaltSize, htonl( mpw_utf8_strlen( fullName ) ) ); mpw_push_string( &masterKeySalt, &masterKeySaltSize, fullName ); if (!masterKeySalt) { - ftl( "Could not allocate master key salt: %d\n", errno ); + ftl( "Could not allocate master key salt: %s\n", strerror( errno ) ); return NULL; } trc( "masterKeySalt ID: %s\n", mpw_id_buf( masterKeySalt, masterKeySaltSize ) ); @@ -53,7 +53,7 @@ static MPMasterKey mpw_masterKeyForUser_v1(const char *fullName, const char *mas MPMasterKey masterKey = mpw_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p ); mpw_free( masterKeySalt, masterKeySaltSize ); if (!masterKey) { - ftl( "Could not allocate master key: %d\n", errno ); + ftl( "Could not allocate master key: %s\n", strerror( errno ) ); return NULL; } trc( "masterKey ID: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) ); @@ -89,7 +89,7 @@ static MPSiteKey mpw_siteKey_v1( mpw_push_string( &siteSalt, &siteSaltSize, keyContext ); } if (!siteSalt || !siteSaltSize) { - ftl( "Could not allocate site salt: %d\n", errno ); + ftl( "Could not allocate site salt: %s\n", strerror( errno ) ); mpw_free( siteSalt, siteSaltSize ); return NULL; } @@ -98,7 +98,7 @@ static MPSiteKey mpw_siteKey_v1( MPSiteKey siteKey = mpw_hmac_sha256( masterKey, MPMasterKeySize, siteSalt, siteSaltSize ); mpw_free( siteSalt, siteSaltSize ); if (!siteKey) { - ftl( "Could not allocate site key: %d\n", errno ); + ftl( "Could not allocate site key: %s\n", strerror( errno ) ); return NULL; } trc( "siteKey ID: %s\n", mpw_id_buf( siteKey, MPSiteKeySize ) ); diff --git a/core/c/mpw-algorithm_v2.c b/core/c/mpw-algorithm_v2.c index 23c24a63..9af044d3 100644 --- a/core/c/mpw-algorithm_v2.c +++ b/core/c/mpw-algorithm_v2.c @@ -43,7 +43,7 @@ static MPMasterKey mpw_masterKeyForUser_v2(const char *fullName, const char *mas mpw_push_int( &masterKeySalt, &masterKeySaltSize, htonl( mpw_utf8_strlen( fullName ) ) ); mpw_push_string( &masterKeySalt, &masterKeySaltSize, fullName ); if (!masterKeySalt) { - ftl( "Could not allocate master key salt: %d\n", errno ); + ftl( "Could not allocate master key salt: %s\n", strerror( errno ) ); return NULL; } trc( "masterKeySalt ID: %s\n", mpw_id_buf( masterKeySalt, masterKeySaltSize ) ); @@ -53,7 +53,7 @@ static MPMasterKey mpw_masterKeyForUser_v2(const char *fullName, const char *mas const uint8_t *masterKey = mpw_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p ); mpw_free( masterKeySalt, masterKeySaltSize ); if (!masterKey) { - ftl( "Could not allocate master key: %d\n", errno ); + ftl( "Could not allocate master key: %s\n", strerror( errno ) ); return NULL; } trc( "masterKey ID: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) ); @@ -89,7 +89,7 @@ static MPSiteKey mpw_siteKey_v2( mpw_push_string( &siteSalt, &siteSaltSize, keyContext ); } if (!siteSalt || !siteSaltSize) { - ftl( "Could not allocate site salt: %d\n", errno ); + ftl( "Could not allocate site salt: %s\n", strerror( errno ) ); mpw_free( siteSalt, siteSaltSize ); return NULL; } @@ -98,7 +98,7 @@ static MPSiteKey mpw_siteKey_v2( const uint8_t *siteKey = mpw_hmac_sha256( masterKey, MPMasterKeySize, siteSalt, siteSaltSize ); mpw_free( siteSalt, siteSaltSize ); if (!siteKey) { - ftl( "Could not allocate site key: %d\n", errno ); + ftl( "Could not allocate site key: %s\n", strerror( errno ) ); return NULL; } trc( "siteKey ID: %s\n", mpw_id_buf( siteKey, MPSiteKeySize ) ); diff --git a/core/c/mpw-algorithm_v3.c b/core/c/mpw-algorithm_v3.c index 4a38c861..06cb979d 100644 --- a/core/c/mpw-algorithm_v3.c +++ b/core/c/mpw-algorithm_v3.c @@ -43,7 +43,7 @@ static MPMasterKey mpw_masterKeyForUser_v3(const char *fullName, const char *mas mpw_push_int( &masterKeySalt, &masterKeySaltSize, htonl( strlen( fullName ) ) ); mpw_push_string( &masterKeySalt, &masterKeySaltSize, fullName ); if (!masterKeySalt) { - ftl( "Could not allocate master key salt: %d\n", errno ); + ftl( "Could not allocate master key salt: %s\n", strerror( errno ) ); return NULL; } trc( "masterKeySalt ID: %s\n", mpw_id_buf( masterKeySalt, masterKeySaltSize ) ); @@ -53,7 +53,7 @@ static MPMasterKey mpw_masterKeyForUser_v3(const char *fullName, const char *mas const uint8_t *masterKey = mpw_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p ); mpw_free( masterKeySalt, masterKeySaltSize ); if (!masterKey) { - ftl( "Could not allocate master key: %d\n", errno ); + ftl( "Could not allocate master key: %s\n", strerror( errno ) ); return NULL; } trc( "masterKey ID: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) ); @@ -89,7 +89,7 @@ static MPSiteKey mpw_siteKey_v3( mpw_push_string( &siteSalt, &siteSaltSize, keyContext ); } if (!siteSalt) { - ftl( "Could not allocate site salt: %d\n", errno ); + ftl( "Could not allocate site salt: %s\n", strerror( errno ) ); return NULL; } trc( "siteSalt ID: %s\n", mpw_id_buf( siteSalt, siteSaltSize ) ); @@ -97,7 +97,7 @@ static MPSiteKey mpw_siteKey_v3( MPSiteKey siteKey = mpw_hmac_sha256( masterKey, MPMasterKeySize, siteSalt, siteSaltSize ); mpw_free( siteSalt, siteSaltSize ); if (!siteKey || !siteSaltSize) { - ftl( "Could not allocate site key: %d\n", errno ); + ftl( "Could not allocate site key: %s\n", strerror( errno ) ); mpw_free( siteSalt, siteSaltSize ); return NULL; } diff --git a/core/c/mpw-marshall.c b/core/c/mpw-marshall.c index acc12b0f..abcf53a5 100644 --- a/core/c/mpw-marshall.c +++ b/core/c/mpw-marshall.c @@ -662,3 +662,24 @@ MPMarshalledUser *mpw_marshall_read( *error = MPMarshallErrorFormat; return NULL; } + +const char *mpw_explainMarshallError(const MPMarshallError error) { + switch (error) { + case MPMarshallSuccess: + return "The marshalling operation completed successfully."; + case MPMarshallErrorStructure: + return "An error in the structure of the marshall file interrupted marshalling."; + case MPMarshallErrorFormat: + return "The marshall file uses an unsupported format version."; + case MPMarshallErrorMissing: + return "A required value is missing or not specified."; + case MPMarshallErrorMasterPassword: + return "The given master password is not valid."; + case MPMarshallErrorIllegal: + return "An illegal value was specified."; + case MPMarshallErrorInternal: + return "An internal system error interrupted marshalling."; + } + + return "An unrecognized error occurred."; +} diff --git a/core/c/mpw-marshall.h b/core/c/mpw-marshall.h index f487f72c..8c00d85d 100644 --- a/core/c/mpw-marshall.h +++ b/core/c/mpw-marshall.h @@ -48,6 +48,7 @@ typedef enum( unsigned int, MPMarshallError ) { /** An internal system error interrupted marshalling. */ MPMarshallErrorInternal, }; +const char *mpw_explainMarshallError(const MPMarshallError error); typedef struct MPMarshalledQuestion { const char *keyword; diff --git a/platform-independent/cli-c/cli/mpw-bench.c b/platform-independent/cli-c/cli/mpw-bench.c index a7bcbbcf..c4043f35 100644 --- a/platform-independent/cli-c/cli/mpw-bench.c +++ b/platform-independent/cli-c/cli/mpw-bench.c @@ -25,7 +25,7 @@ static void mpw_getTime(struct timeval *time) { if (gettimeofday( time, NULL ) != 0) - ftl( "Could not get time: %d\n", errno ); + ftl( "Could not get time: %s\n", strerror( errno ) ); } static const double mpw_showSpeed(struct timeval startTime, const unsigned int iterations, const char *operation) { @@ -64,7 +64,7 @@ int main(int argc, char *const argv[]) { iterations = 3000000; masterKey = mpw_masterKey( fullName, masterPassword, MPAlgorithmVersionCurrent ); if (!masterKey) { - ftl( "Could not allocate master key: %d\n", errno ); + ftl( "Could not allocate master key: %s\n", strerror( errno ) ); abort(); } mpw_getTime( &startTime ); @@ -109,7 +109,7 @@ int main(int argc, char *const argv[]) { for (int i = 1; i <= iterations; ++i) { masterKey = mpw_masterKey( fullName, masterPassword, MPAlgorithmVersionCurrent ); if (!masterKey) { - ftl( "Could not allocate master key: %d\n", errno ); + ftl( "Could not allocate master key: %s\n", strerror( errno ) ); break; } diff --git a/platform-independent/cli-c/cli/mpw-cli.c b/platform-independent/cli-c/cli/mpw-cli.c index 978aee49..9571e727 100644 --- a/platform-independent/cli-c/cli/mpw-cli.c +++ b/platform-independent/cli-c/cli/mpw-cli.c @@ -207,9 +207,9 @@ int main(int argc, char *const argv[]) { mpwSitesFormat = MPMarshallFormatFlat; mpwSitesPath = mpwPath( fullName, "mpsites" ); if (!mpwSitesPath || !(mpwSites = fopen( mpwSitesPath, "r" ))) - dbg( "Couldn't open configuration file: %s: %d\n", mpwSitesPath, errno ); + dbg( "Couldn't open configuration file:\n %s: %s\n", + mpwSitesPath, strerror( errno ) ); } - free( mpwSitesPath ); // Read the user's sites file. if (mpwSites) { @@ -220,7 +220,8 @@ int main(int argc, char *const argv[]) { (bufPointer += (readSize = fread( buf + bufPointer, 1, readAmount, mpwSites ))) && (readSize == readAmount)); if (ferror( mpwSites )) - wrn( "Error while reading configuration file: %s: %d", mpwSitesPath, ferror( mpwSites ) ); + wrn( "Error while reading configuration file:\n %s: %d", + mpwSitesPath, ferror( mpwSites ) ); fclose( mpwSites ); // Parse file. @@ -228,7 +229,8 @@ int main(int argc, char *const argv[]) { MPMarshalledUser *user = mpw_marshall_read( buf, mpwSitesFormat, masterPassword, &marshallError ); mpw_free_string( buf ); if (!user || marshallError != MPMarshallSuccess) - wrn( "Couldn't parse configuration file: %s: %d\n", mpwSitesPath, marshallError ); + wrn( "Couldn't parse configuration file:\n %s: %s\n", + mpwSitesPath, mpw_explainMarshallError( marshallError ) ); else { // Load defaults. @@ -252,15 +254,18 @@ int main(int argc, char *const argv[]) { if (mpwSitesFormat != MPMarshallFormatJSON) { mpwSitesPath = mpwPath( fullName, "mpsites.json" ); if (!mpwSitesPath || !(mpwSites = fopen( mpwSitesPath, "w" ))) - wrn( "Couldn't create updated configuration file: %s: %d\n", mpwSitesPath, errno ); + wrn( "Couldn't create updated configuration file:\n %s: %s\n", + mpwSitesPath, strerror( errno ) ); else { buf = NULL; if (!mpw_marshall_write( &buf, MPMarshallFormatJSON, user, &marshallError ) || marshallError != MPMarshallSuccess) - wrn( "Couldn't encode updated configuration file: %s: %d", mpwSitesPath, marshallError ); + wrn( "Couldn't encode updated configuration file:\n %s: %s", + mpwSitesPath, mpw_explainMarshallError( marshallError ) ); else if (fwrite( buf, sizeof( char ), strlen( buf ), mpwSites ) != strlen( buf )) - wrn( "Error while writing updated configuration file: %s: %d\n", mpwSitesPath, ferror( mpwSites ) ); + wrn( "Error while writing updated configuration file:\n %s: %d\n", + mpwSitesPath, ferror( mpwSites ) ); mpw_free_string( buf ); fclose( mpwSites ); @@ -269,6 +274,7 @@ int main(int argc, char *const argv[]) { mpw_marshal_free( user ); } } + free( mpwSitesPath ); // Parse default/config-overriding command-line parameters. if (algorithmVersionArg) { @@ -327,7 +333,7 @@ int main(int argc, char *const argv[]) { } MPSiteKey siteKey = mpw_siteKey( masterKey, siteName, siteCounter, keyPurpose, keyContext, algorithmVersion ); - const char *sitePassword = mpw_sitePassword(siteKey, passwordType, algorithmVersion ); + const char *sitePassword = mpw_sitePassword( siteKey, passwordType, algorithmVersion ); mpw_free( masterKey, MPMasterKeySize ); mpw_free( siteKey, MPSiteKeySize ); mpw_free_string( siteName );