Copy TOTP counter support to v2 override.
This commit is contained in:
parent
6fa8ee53cd
commit
6f4f6b8d1e
@ -73,7 +73,7 @@ static MPMasterKey mpw_masterKey_v0(
|
|||||||
MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p );
|
MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p );
|
||||||
mpw_free( &masterKeySalt, masterKeySaltSize );
|
mpw_free( &masterKeySalt, masterKeySaltSize );
|
||||||
if (!masterKey) {
|
if (!masterKey) {
|
||||||
err( "Could not allocate master key: %s\n", strerror( errno ) );
|
err( "Could not derive master key: %s\n", strerror( errno ) );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
trc( " => masterKey.id: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) );
|
trc( " => masterKey.id: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) );
|
||||||
@ -90,7 +90,7 @@ static MPSiteKey mpw_siteKey_v0(
|
|||||||
|
|
||||||
// OTP counter value.
|
// OTP counter value.
|
||||||
if (siteCounter == MPCounterValueTOTP)
|
if (siteCounter == MPCounterValueTOTP)
|
||||||
siteCounter = ((uint32_t)time(NULL) / MP_otp_window) * MP_otp_window;
|
siteCounter = ((uint32_t)time( NULL ) / MP_otp_window) * MP_otp_window;
|
||||||
|
|
||||||
// Calculate the site seed.
|
// Calculate the site seed.
|
||||||
trc( "siteSalt: keyScope=%s | #siteName=%s | siteName=%s | siteCounter=%s | #keyContext=%s | keyContext=%s\n",
|
trc( "siteSalt: keyScope=%s | #siteName=%s | siteName=%s | siteCounter=%s | #keyContext=%s | keyContext=%s\n",
|
||||||
@ -128,8 +128,9 @@ static MPSiteKey mpw_siteKey_v0(
|
|||||||
static const char *mpw_sitePasswordFromTemplate_v0(
|
static const char *mpw_sitePasswordFromTemplate_v0(
|
||||||
MPMasterKey __unused masterKey, MPSiteKey siteKey, MPResultType resultType, const char __unused *resultParam) {
|
MPMasterKey __unused masterKey, MPSiteKey siteKey, MPResultType resultType, const char __unused *resultParam) {
|
||||||
|
|
||||||
// Determine the template.
|
|
||||||
const char *_siteKey = (const char *)siteKey;
|
const char *_siteKey = (const char *)siteKey;
|
||||||
|
|
||||||
|
// Determine the template.
|
||||||
uint16_t seedByte;
|
uint16_t seedByte;
|
||||||
mpw_uint16( (uint16_t)_siteKey[0], (uint8_t *)&seedByte );
|
mpw_uint16( (uint16_t)_siteKey[0], (uint8_t *)&seedByte );
|
||||||
const char *template = mpw_templateForType_v0( resultType, seedByte );
|
const char *template = mpw_templateForType_v0( resultType, seedByte );
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#define MP_N 32768LU
|
#define MP_N 32768LU
|
||||||
#define MP_r 8U
|
#define MP_r 8U
|
||||||
#define MP_p 2U
|
#define MP_p 2U
|
||||||
|
#define MP_otp_window 5 * 60 /* s */
|
||||||
|
|
||||||
// Inherited functions.
|
// Inherited functions.
|
||||||
MPMasterKey mpw_masterKey_v0(
|
MPMasterKey mpw_masterKey_v0(
|
||||||
@ -55,8 +56,9 @@ static const char *mpw_sitePasswordFromTemplate_v1(
|
|||||||
MPMasterKey __unused masterKey, MPSiteKey siteKey, MPResultType resultType, const char __unused *resultParam) {
|
MPMasterKey __unused masterKey, MPSiteKey siteKey, MPResultType resultType, const char __unused *resultParam) {
|
||||||
|
|
||||||
// Determine the template.
|
// Determine the template.
|
||||||
const char *template = mpw_templateForType( resultType, siteKey[0] );
|
uint8_t seedByte = siteKey[0];
|
||||||
trc( "template: %u => %s\n", siteKey[0], template );
|
const char *template = mpw_templateForType( resultType, seedByte );
|
||||||
|
trc( "template: %u => %s\n", seedByte, template );
|
||||||
if (!template)
|
if (!template)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (strlen( template ) > MPSiteKeySize) {
|
if (strlen( template ) > MPSiteKeySize) {
|
||||||
@ -67,9 +69,10 @@ static const char *mpw_sitePasswordFromTemplate_v1(
|
|||||||
// Encode the password from the seed using the template.
|
// Encode the password from the seed using the template.
|
||||||
char *const sitePassword = calloc( strlen( template ) + 1, sizeof( char ) );
|
char *const sitePassword = calloc( strlen( template ) + 1, sizeof( char ) );
|
||||||
for (size_t c = 0; c < strlen( template ); ++c) {
|
for (size_t c = 0; c < strlen( template ); ++c) {
|
||||||
sitePassword[c] = mpw_characterFromClass( template[c], siteKey[c + 1] );
|
seedByte = siteKey[c + 1];
|
||||||
|
sitePassword[c] = mpw_characterFromClass( template[c], seedByte );
|
||||||
trc( " - class: %c, index: %3u (0x%02hhX) => character: %c\n",
|
trc( " - class: %c, index: %3u (0x%02hhX) => character: %c\n",
|
||||||
template[c], siteKey[c + 1], siteKey[c + 1], sitePassword[c] );
|
template[c], seedByte, seedByte, sitePassword[c] );
|
||||||
}
|
}
|
||||||
trc( " => password: %s\n", sitePassword );
|
trc( " => password: %s\n", sitePassword );
|
||||||
|
|
||||||
|
@ -18,12 +18,14 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include "mpw-util.h"
|
#include "mpw-util.h"
|
||||||
|
|
||||||
#define MP_N 32768LU
|
#define MP_N 32768LU
|
||||||
#define MP_r 8U
|
#define MP_r 8U
|
||||||
#define MP_p 2U
|
#define MP_p 2U
|
||||||
|
#define MP_otp_window 5 * 60 /* s */
|
||||||
|
|
||||||
// Inherited functions.
|
// Inherited functions.
|
||||||
MPMasterKey mpw_masterKey_v1(
|
MPMasterKey mpw_masterKey_v1(
|
||||||
@ -51,7 +53,9 @@ static MPSiteKey mpw_siteKey_v2(
|
|||||||
const char *keyScope = mpw_scopeForPurpose( keyPurpose );
|
const char *keyScope = mpw_scopeForPurpose( keyPurpose );
|
||||||
trc( "keyScope: %s\n", keyScope );
|
trc( "keyScope: %s\n", keyScope );
|
||||||
|
|
||||||
// TODO: Implement MPCounterValueTOTP
|
// OTP counter value.
|
||||||
|
if (siteCounter == MPCounterValueTOTP)
|
||||||
|
siteCounter = ((uint32_t)time( NULL ) / MP_otp_window) * MP_otp_window;
|
||||||
|
|
||||||
// Calculate the site seed.
|
// Calculate the site seed.
|
||||||
trc( "siteSalt: keyScope=%s | #siteName=%s | siteName=%s | siteCounter=%s | #keyContext=%s | keyContext=%s\n",
|
trc( "siteSalt: keyScope=%s | #siteName=%s | siteName=%s | siteCounter=%s | #keyContext=%s | keyContext=%s\n",
|
||||||
@ -78,7 +82,7 @@ static MPSiteKey mpw_siteKey_v2(
|
|||||||
MPSiteKey siteKey = mpw_hash_hmac_sha256( masterKey, MPMasterKeySize, siteSalt, siteSaltSize );
|
MPSiteKey siteKey = mpw_hash_hmac_sha256( masterKey, MPMasterKeySize, siteSalt, siteSaltSize );
|
||||||
mpw_free( &siteSalt, siteSaltSize );
|
mpw_free( &siteSalt, siteSaltSize );
|
||||||
if (!siteKey) {
|
if (!siteKey) {
|
||||||
err( "Could not allocate site key: %s\n", strerror( errno ) );
|
err( "Could not derive site key: %s\n", strerror( errno ) );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
trc( " => siteKey.id: %s\n", mpw_id_buf( siteKey, MPSiteKeySize ) );
|
trc( " => siteKey.id: %s\n", mpw_id_buf( siteKey, MPSiteKeySize ) );
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#define MP_N 32768LU
|
#define MP_N 32768LU
|
||||||
#define MP_r 8U
|
#define MP_r 8U
|
||||||
#define MP_p 2U
|
#define MP_p 2U
|
||||||
|
#define MP_otp_window 5 * 60 /* s */
|
||||||
|
|
||||||
// Inherited functions.
|
// Inherited functions.
|
||||||
MPSiteKey mpw_siteKey_v2(
|
MPSiteKey mpw_siteKey_v2(
|
||||||
@ -64,7 +65,7 @@ static MPMasterKey mpw_masterKey_v3(
|
|||||||
MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p );
|
MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p );
|
||||||
mpw_free( &masterKeySalt, masterKeySaltSize );
|
mpw_free( &masterKeySalt, masterKeySaltSize );
|
||||||
if (!masterKey) {
|
if (!masterKey) {
|
||||||
err( "Could not allocate master key: %s\n", strerror( errno ) );
|
err( "Could not derive master key: %s\n", strerror( errno ) );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
trc( " => masterKey.id: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) );
|
trc( " => masterKey.id: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) );
|
||||||
|
Loading…
Reference in New Issue
Block a user